本帖最后由 ljg2np 于 2024-12-6 16:46 编辑
本文分享书中对“如何实现Llama模型及本地化开发”的阅读理解。
一、引言
LLM的实现基于DNN学习原理,而对于隐藏层的设计大多采用Transformer架构,通过耗费大量的算力进行训练得到预训练模型,区别之处在于数据集选择、参数规模、神经网络架构设计,最后对模型进行测试集检验,通过模型评估进一步优化和检验。
Llama是基于Transformer的人工神经网络,以一系列单词作为输入,递归的预测下一个单词来生成文本。
Llama模型作为开源模型,与闭源的GPT4还有一些差距,但相较于开源的GPT3显现出了明显的技术和性能优势,为我们学习和研究NLP技术提供了平台。
二、Llama模型的设计与实现
书中对Llama模型的实现,从LLM的开发角度进行了阐述,没有展示过多详细的技术细节,但可以让人对Llama模型的设计与实现有一个比较全面和系统的认识。概括起来,主要包括如下几个方面:
1、语料库
Llama预训练数据集的选择,采用了24种语言的语料库,并尽力避免和删除私有语料集。
2、模型组成
Llama按照LLM的一般架构进行拆分,可分为预训练模型、增量模型和微调模型,满足LLM开发和应用的灵活性,并提供了多个版本,见下表。
Llama-chat模型是在Llama预训练模型基础上经过监督微调后推出的应用模型。
3、架构与技术实现。
Transformer模型是Llama模型的核心技术实现,通过该模型对公开的数据集进行预训练,可以得到Llama预训练大模型。
通过Transformer模型加载Llama预训练大模型,就可以进入应用环节,对用户的输入进行处理,可以实现NLP的既定应用。
Meta公布的Llama模型的Python代码中,可以看到具体的实现细节,Llama2 7B采用32个Transformer层和前馈网络层,激活函数采用SwiGLU,采用分组注意力机制,是基于PyTorch架构编写和实现的。
前文《transformer架构与实现》曾介绍了Llama2 7B模型的Transformer架构和内部运作机理,并对其基于PyTorch的实现代码进行了讲解,这里不再重复。
4、参数量计算。
参数量指模型中可学习参数的总数,在LLM中,参数量的计算取决于模型的架构。
Llama2 7B的上下文长度为4096,参数指标见下表:
用Hugging Face的Transformers模块可以读取模型中的参数量:
5、Llama2权重文件夹。
模型格式是模型的对外接口,Meta发布Llama2时提供了两种格式,分为pth格式和hf格式。
pth格式是PyTorch中用于保存模型参数和优化器状态的文件格式,可以使用torch.save函数来加载和保存。
Hugging Face的模型权重文件格式已成为LLM的标准,包括Llama模型在内,几乎所有的LLM都有hf格式存在,可以通过Transformers库读取hf格式的模型结构,代码如下:
6、模型评估标准
模型评估是模型开发过程中的重要环节,对模型的选择、优化、理解和应用有重要作用。
LLM有两种常用的评估方法:自动评估和人工评估。
书中介绍了测评指标和测评模型,其中通义千问模型Qwen-72B在多个中英文下游评测任务上,效果超越现有的开源模型,下图是通义千问给出的模型测试分数比较图。
三、Llama模型开发本地系统
Llama开源模型的实现,为本地开发提供了工具和接口,书中以中文私人定制为例,解析了用Llama模型开发本地系统的实现过程和方法。实现架构图如下:
左侧黄色方框内的部分,是处理中文的LoRA增量模型开发,右侧蓝色方框内是处理私有语料的监督微调模型开发部分。
具体实现过程:
1、对于中文,通过中文语料,采用LoRA的训练方法得到增量模型,LoRA模型属于系统微调,是有监督学习,其与预训练模型结合构成中文完整模型,如下图中蓝框所示。
2、私人定制,采用私人语料库通过监督微调的训练方法来更新模型参数,得到监督微调模型,它在中文完整模型上进行训练,如下图所示。
总结起来,中文私人本地系统的开发流程图如下:
四、技术细节及第三方应用
通过Transformer模型加载Llama预训练大模型,就可以进入模型推理的应用环节。通过对用户的输入进行处理,可以实现NLP的既定应用功能。
1、Hugging Face开发者社区
Hugging Face是一个流行的NLP模型和工具库的开发者社区。
Hugging Face的datasets库,是一个用于管理和处理各种数据集的工具库,它提供了一个统一的接口,简化了数据集的处理流程,使开发者可以更专注于模型的开发和训练。
Hugging Face Transformers库,提供了一些预训练模型,如Llama、BERT、GPT2等,可以用来进行模型训练、推理。借助于Transformers库,通过导入需要的模块,就可以方便的进行量化和分词处理。
Hugging Face 提供了PEFT(参数高效微调)库,集成了LoRA,支持基础模型和LoRA模型同时加载,可以用来完成增量模型和模型微调的处理。
2、开源微调数据集
监督微调在选择预训练模型后,需要准备面向任务的有针对性的微调数据集,这个数据集通常由人工撰写,需要有标签,数量不需要很多,书中给出了一些开源微调数据集。
3、模型接口API
Llama模型的加载:
导入Transformers库里的LlamaTokenizer模块,通过调用from_pretrained()方法,实现Llama基础模型的加载。
利用PEFT库,加载多个LoRA并随时切换:
加载第一个适配器,通过PeftModel.from_pretrained()方法,继续加载使用load_adapter()方法;切换适配器,使用PeftModel的set_adapter()方法。
4、第三方应用示例。
采用第三方工具,加载Llama chat模型(这里是Llama3模型),实现对话,如图所示。
五、小结与讨论
通过这一主题的学习,我了解了Llama模型的设计与实现需要考虑的问题及着手点,加深了Llama模型内部实现机理的学习,掌握了利用Llama模型开发本地系统的方法和步骤,即分析需求,确定架构,准备语料库,本地监督微调和评估优化。
推荐阅读和参考资料:1、LoRA增量模型。
2、CLLM2模型。