完整中文大语言模型训练流程实践
MINI_LLM项目展示了完整的中文大语言模型训练流程,涵盖预训练、SFT指令微调和DPO优化阶段。该项目基于QWEN模型,利用多种数据集训练出1.4B参数规模的模型。项目详细介绍了数据处理方法、提供训练脚本,并包含多GPU训练指南,为中文大语言模型开发提供了实用参考。
由Lil2J创建
本项目是我个人对一个小规模中文大语言模型的实践复现。
主要参考了以下两个开源项目:
1.https://github.com/charent/Phi2-mini-Chinese
2.https://github.com/DLLXW/baby-llama2-chinese
3.https://github.com/charent/ChatLM-mini-Chinese
包括:预训练、SFT指令微调、DPO、PPO(待完成)的完整流程。
希望与大家分享,也欢迎大家一起完善!
# 1. 从"Baby-llama2-chinese Corpus"的百度网盘下载维基百科和百度百科的预训练语料以及aplca数据。 # 从https://huggingface.co/datasets/Skywork/SkyPile-150B/tree/main 下载数据 # 从https://huggingface.co/BelleGroup 下载train_2M_CN、train_1M_CN和train_0.5M_CN # 由于算力资源有限,我只下载了前20个数据文件 # 将所有数据tokenize后,token数量大约为8b # 2. 将下载的数据放到指定目录 # 3. 切换到dataset_utils目录,运行generate_data.py,运行前修改py文件,取消处理数据函数的注释以启用 # 4. 运行generate_data.py,在./datasets/目录下生成parquet文件 cd dataset_utils python3 generate_data.py # 5. 修改train.sh文件。单卡运行时,去掉--multi_gpu,并将--config_file后面改为accelerate_one_gpu.yaml。多卡运行时,修改accelerate_multi_gpu.yaml中的num_processes为实际卡数 # 开始预训练 sh train.sh pre_train.py # 多机多卡训练 # 使用accelerate_multi_gpus_on_multi_nodes.yaml文件,其中: # 采用deepspeed standard任务提交模式,num_machines为节点数量,num_processes为总可用GPU数量 # 多机多卡训练需要确保以下几点: # 1. 多节点免密登录,且节点登录用户名一致,同时将节点的访问用户名写入各节点host文件 # 2. 多节点环境一致,主要是cuda版本、nccl版本、pytorch版本等,三者之间的版本也有相互依赖关系 # 3. 各节点运行命令行:accelerate launch --config_file accelerate_multi_gpus_on_multi_nodes.yaml --machine_rank {rank} --main_process_ip {MasterIP} --main_process_port {MasterPort} pre_train.py # 其中,rank为用户自定义的机器排序,主节点为0,MasterIP为主节点IP,MasterPort为主节点Port,提交命令时各节点仅需修改rank accelerate launch --config_file accelerate_multi_gpus_on_multi_nodes.yaml --machine_rank {rank} --main_process_ip {MasterIP} --main_process_port {MasterPort} pre_train.py # 6. 预训练完成后,修改sft.py中的模型权重加载路径 # 开始sft微调 sh train.sh sft.py # 7. 修改test.py的权重路径,即可进行测试 python3 test.py
模型基础:使用了qwen的模型作为基础,选择原因:1.它是一个成熟的中文大模型开源项目 2.为了省去自己构建tokenizer的麻烦,我发现qwen的tokenizer压缩率很好,就直接使用了,既然使用了tokenizer,就也直接使用它的模型
预训练语料: 本次预训练使用了以下几个经典数据集:
中文维基百科:wikipedia-cn-20230720-filtered
百度百科:百度网盘 提取码: bwvb
天工数据集:https://huggingface.co/datasets/Skywork/SkyPile-150B/tree/main/data
数据预处理采用QWEN的通用做法,在末尾添加结束符号<|im_end|>
,与下一篇文章区分。
如果文章超过规定长度,将其截断,截断部分作为下一 个样本
LLM微调的目的是引导出预训练模型中的知识,通俗地说就是教会模型说人话。
微调方法:自然语言处理目前存在一个重要范式:在一般领域数据上进行大规模预训练,然后对特定任务或领域进行适应。因此,为了让预训练模型在特定任务或领域表现良好,需要对模型进行微调。
SFT微调数据:LLM在垂直领域的适应已成为2023年的主要趋势,因此各个领域的SFT语料和微调模型层出不穷。目前已有大佬整理并持续更新这方面的最新进展,有需要的可以自行访问。
本项目主要针对两类SFT语料进行模型微调,如下:
日常问答SFT数据:
SFT语料 | 描述 |
---|---|
alpaca-zh:alpaca-zh | 该数据集是参考Alpaca方法基于GPT4得到的self-instruct数据,约5万条。 |
bell:bell | 源自BelleGroup的一部分SFT数据。包含约300万条由BELLE项目生成的中文指令数据。 |
由于SFT语料通常较小,我们无需提前分词,而是在构建Dataloader时进行分词并构建batch送给模型。具体请参考sft.py!
DPO算法称为直接偏好优化(Direct Preference Optimization),DPO的代码参考了中文对话0.2B小模型 ChatLM-Chinese-0.2B
整个构建分为四步:
{ "instruction": "描述原子的结构。", "input": "", "output": "原子是物质的基本单位,它由三种基本粒子组成:质子、中子和电子。质子和中子形成原子核,位于原子中心,核外的电子围绕着原子核运动。\n\n原子结构具有层次性。原子核中,质子带正电,中子不带电(中性)。原子核非常小且致密,占据了原子总质量的绝大部分。电子带负电,通常围绕核运动,形成若干层次,称为壳层或电子层。电子数量与质子数量相等,使原子呈电中性。\n\n电子在每个壳层中都呈规律分布,并且不同壳层所能容纳的电子数也不同。在最里面的壳层一般只能容纳2个电子,其次一层最多可容纳8个电子,再往外的壳层可容纳的电子数逐层递增。\n\n原子核主要受到两种相互作用力的影响:强力和电 磁力。强力的作用范围非常小,主要限制在原子核内,具有极强的吸引作用,使核子(质子和中子)紧密结合在一起。电磁力的作用范围较大,主要通过核外的电子与原子核相互作用,发挥作用。\n\n这就是原子的基本结构。原子内部结构复杂多样,不同元素的原子核中质子、中子数量不同,核外电子排布分布也不同,形成了丰富多彩的化学世界。" }
{ "prompt": "描述原子的结构。", "chosen": "原子是物质的基本单位,它由三种基本粒子组成:质子、中子和电子。质子和中子形成原子核,位于原子中心,核外的电子围绕着原子核运动。\n\n原子结构具有层次性。原子核中,质子带正电,中子不带电(中性)。原子核非常小且致密,占据了原子总质量的绝大部分。电子带 负电,通常围绕核运动,形成若干层次,称为壳层或电子层。电子数量与质子数量相等,使原子呈电中性。\n\n电子在每个壳层中都呈规律分布,并且不同壳层所能容纳的电子数也不同。在最里面的壳层一般只能容纳2个电子,其次一层最多可容纳8个电子,再往外的壳层可容纳的电子数逐层递增。\n\n原子核主要受到两种相互作用力的影响:强力和电磁力。强力的作用范围非常小,主要限制在原子核内,具有极强的吸引作用,使核子(质子和中子)紧密结合在一起。电磁力的作用范围较大,主要通过核外的电子与原子核相互作用,发挥作用。\n\n这就是原子的基本结构。原子内部结构复杂多样,不同元素的原子核中质子、中子数量不同,核外电子排布分布也不同,形成了丰富多彩的化学世界。" },
{ 'prompt': '描述原子的结构。', 'reject': '一个原子由质子、中子和电子组成,它们以特定的方式排列成一个原子核。' }
{ "prompt": "描述原子的结构。", "chosen": "原子是物质的基本单位,它由三种基本粒子组成:质子、中子和电子。质子和中子形成原子核,位于原子中心,核外的电子围绕着原子核运动。\n\n原子结构具有层次性。原子核中,质子带正电,中子不带电(中性)。原子核非常小且致密,占据了原子总质量的绝大部分。电子带负电,通常围绕核运动,形成若干层次,称为壳层或电子层。电子数 量与质子数量相等,使原子呈电中性。\n\n电子在每个壳层中都呈规律分布,并且不同壳层所能容纳的电子数也不同。在最里面的壳层一般只能容纳2个电子,其次一层最多可容纳8个电子,再往外的壳层可容纳的电子数逐层递增。\n\n原子核主要受到两种相互作用力的影响:强力和电磁力。强力的作用范围非常小,主要限制在原子核内,具有极强的吸引作用,使核子(质子和中子)紧密结合在一起。电磁力的作用范围较大,主要通过核外的电子与原子核相互作用,发挥作用。\n\n这就是原子的基本结构。原子内部结构复杂多样,不同元素的原子核中质子、中子数量不同,核外电子排布分布也不同,形成了丰富多彩的化学世界。", "reject": "一个原子由质子、中子和电子组成,它们以特定的方式排列成一个原子核。" },
class DpoConfig: max_seq_len: int = 1024 + 8 # 8用于eos标记 sft_model_file: str = '/MINI_LLM/model_save/checkpoint_sftmodel' # SFT后的模型路径 tokenizer_dir: str = '/MINI_LLM/model_save/checkpoint_sftmodel' # tokenizer通常与模型权重放在同一文件夹 dpo_train_file: str = r'/MINILLM\MINI_LLM/datasets/my_dpo_train.json' # dpo的训练集 dpo_eval_file: str = r'/MINILLM\MINI_LLM/datasets/my_dpo_eval.json' # dpo的测试集 adapter_file: str = '/MINILLM\MINI_LLM//dpo/adapter_model.safetensors' log_dir: str = '/MINILLM\MINI_LLM/logs' ... output_dir: str = '/MINILLM\MINI_LLM//dpo' # dpo模型输出路径 ...
因需要配合sft模型才能看差别,因为其本质是让sft的模型更好地对齐你的目标数据而已,min(Π,Π*);可以在下面的链接中下载对应dpo数据和待优化的sft模型,链接如下: 链接:https://pan.baidu.com/s/1GYeR6qrUhjsmpgh8-ABDpQ 提取码:dba9
权重下载
预训练权重:https://huggingface.co/Lil2J/mini_llm/tree/main
sft模型权重:https://huggingface.co/Lil2J/mini_llm_sft/tree/main
dpo模型权重:https://huggingface.co/wtxfrancise/mini_llm_dpo/tree/main
我首先先跑了Wiki中文百科 + BaiduBaiKe
预训练语料:Wiki中文百科 + BaiduBaiKe
然后再跑天工的数据
预训练语料:天工数据集前20个文件
微调语料:aplca数据+bell:train_2M_CN,train_1M_CN和train_0.5M_CN
#SFT微调模型的推理:test.py。 python3 test.py
有什么问题和想一起搞大模型的可以加微信:ForeverM1LAn 进行交流
一键生成PPT和Word,让学习生活更轻松
讯飞智文是一个利用 AI 技术的项目,能够帮助用户生成 PPT 以及各类文档。无论是商业领域的市场分析报告、年度目标制定,还是学生群体的职业生涯规划、实习避坑指南,亦或是活动策划、旅游攻略等内容,它都能提供支持,帮助用户精准表达,轻松呈现各种信息。
深度推理能力全新升级,全面对标OpenAI o1
科大讯飞的星火大模型,支持语言理解、知识问答和文本创作等多功能,适用于多种文件和业务场景,提升办公和日常生活的效率。讯飞星火是一个提供丰富智能服务的平台,涵盖科技资讯、图像创作、写作辅助、编程解答、科研文献解读等功能,能为不同需求的用户提供便捷高效的帮助,助力用户轻松获取信息、解决问题,满足多样化使用场景。
一种基于大语言模型的高效单流解耦语音令牌文本到语音合成模型
Spark-TTS 是一个基于 PyTorch 的开源文本到语音合成项目,由多个知名机构联合参与。该项目提供了高效的 LLM(大语言模型)驱动的语音合成方案,支持语音克隆和语音创建功能,可通过命令行界面(CLI)和 Web UI 两种方式使用。用户可以根据需求调整语音的性别、音高、速度等参数,生成高质量的语音。该项目适用于多种场景,如有声读物制作、智能语音助手开发 等。
字节跳动发布的AI编程神器IDE
Trae是一种自适应的集成开发环境(IDE),通过自动化和多元协作改变开发流程。利用Trae,团队能够更快速、精确地编写和部署代码,从而提高编程效率和项目交付速度。Trae具备上下文感知和代码自动完成功能,是提升开发效率的理想工具。
AI助力,做PPT更简单!
咔片是一款轻量化在线演示设计工具,借助 AI 技术,实现从内容生成到智能设计的一站式 PPT 制作服务。支持多种文档格式导入生成 PPT,提供海量模板、智能美化、素材替换等功能,适用于销售、教师、学生等各类人群,能高效制作出高品质 PPT,满足不同场景演示需求。
选题、配图、成文,一站式创作,让内容运营更高效
讯飞绘文,一个AI集成平台,支持写作、选题、配图、排版和发布。高效生成适用于各类媒体的定制内容,加速品牌传播,提升内容营销效果。
专业的AI公文写作平台,公文写作神器
AI 材料星,专业的 AI 公文写作辅助平台,为体制内工作人员提供高效的公文写作解决方案。拥有海量公文文库、9 大核心 AI 功能,支持 30 + 文稿类型生成,助力快速完成领导讲话、工作总结、述职报告等材料,提升办公效率,是体制打工人的得力写作神器。
OpenAI Agents SDK,助力开发者便捷使用 OpenAI 相关功能。
openai-agents-python 是 OpenAI 推出的一款强大 Python SDK,它为开发者提供了与 OpenAI 模型交互的高效工具,支持工具调用、结果处理、追踪等功能,涵盖多种应用场景,如研究助手、财务研究等,能显著提升开发效率,让开发者更轻松地利用 OpenAI 的技术优势。
高分辨率纹理 3D 资产生成
Hunyuan3D-2 是腾讯开发的用于 3D 资产生成的强大工具,支持从文本描述、单张图片或多视角图片生成 3D 模型,具备快速形状生成能力,可生成带纹理的高质量 3D 模型,适用于多个领域,为 3D 创作提供了高效解决方案。
一个具备存储、管理和客户端操作等多种功能的分布式文件系统相关项目。
3FS 是一个功能强大的分布式文件系统项目,涵盖了存储引擎、元数据管理、客户端工具等多个模块。它支持多种文件操作,如创建文件和目录、设置布局等,同时具备高效的事件循环、节点选择和协程池管理等特性。适用于需要大规模数据存储和管理的场景,能够提高系统的性能和可 靠性,是分布式存储领域的优质解决方案。
最新AI工具、AI资讯
独家AI资源、AI项目落地
微信扫一扫关注公众号