前情提要:
LLaMA 是由 Facebook Research 发布的开源大规模语言模型,包含7B、13B、33B、65B等模型量级,不论是在英文还是中文场景,都吸引了大量开发者和研究人员基于LLaMA展开工作。在上一篇文章中,笔者简要总结了目前开源的中文LLaMA模型,本篇是以比较过后选择的TencentPretrain框架作为基座,使用开源语料训练和部署中文LLaMA领域模型的过程
TencentPretrain 框架是一个用于对文本、图像、语音等模态数据进行预训练和微调的工具包,其特点是遵循模块化的设计原则,通过模块组合,可以灵活并快速地复现已有的预训练模型或者进行创新
通常,大模型在训练是会用到大量通用语料,其数据来源多种多样,既包括微博、社区评论、点评等用户生成数据,也包括新闻、论文等专业数据。但是具体到垂直领域时,即使模型具有该领域的基本知识,但由于领域数据只占通用数据等很小比例,模型仍面临知识匮乏的问题。需要对模型进行领域增量训练。
领域训练的目的主要有两个:
以开源的法律领域模型 Lawyer LLaMA 为例,为了提高LLaMA模型在法律问题上的表现,该工作使用多种语料混合训练模型:
在这一阶段,收集完成预训练语料后,将语料混合并随机打乱。使用与通用预训练相同的语言模型为目标进行增量预训练,设置较低的学习率(例如2e-5)。
这一阶段的训练可以在TencentPretrain中使用现成的代码来完成:
git clone http://git clone https://huggingface.co/Linly-AI/ChatFlow-7B
git clone GitHub - Tencent/TencentPretrain: Tencent Pre-training framework in PyTorch & Pre-trained Model ZooGitHub - Tencent/TencentPretrain: Tencent Pre-training framework in PyTorch & Pre-trained Model Zoo
python3 preprocess.py --corpus_path $CORPUS_PATH --spm_model_path $LLaMA_PATH/tokenizer.model \
--dataset_path $OUTPUT_DATASET_PATH --data_processor lm --seq_length 512
其中 ,--seq_length 用来指定文本长度,越长则训练时消耗的GPU内存越多。
deepspeed pretrain.py --deepspeed --deepspeed_config models/deepspeed_zero3_config.json --enable_zero3 \
--pretrained_model_path models/llama-7b.bin \
--dataset_path $OUTPUT_DATASET_PATH --spm_model_path $LLaMA_PATH/tokenizer.model \
--config_path models/llama/7b_config.json \
--output_model_path models/llama_zh_7b \
--world_size 8 --data_processor lm --deepspeed_checkpoint_activations \
--total_steps 300000 --save_checkpoint_steps 5000 --batch_size 24
这里只以一个开源模型的语料库为例,实际应用中可以参考该语料库的数据集构建方式、预处理格式及数据量大小构造所需的领域语料库
在增量预训练阶段,主要目标是让模型熟悉领域知识。由于模型还没有经过社会化训练,只能对文本进行续写,需要经过指令精调才能胜任具体的领域问答任务。指令数据主要由问答对构成,各种问题和对应的回答都可以作为指令数据,以下分别是通用指令和法律指令问答的示例 :
{
"input": "对话:男:请问,几层是卖运动商品的?女:六层是运动商品专卖店。男:六层吗?电梯在哪?女:五层到六层没有电梯,您走那边的楼梯吧。问题:男的要上几层楼?选项:六层,五层,一层,十一层:",
"output": "六层"
},
{
"input": "你是一艘货船的所有人,你决定购买一份货物运输保险,以保护你的货物免于任何潜在的损失。你想知道保险合同中需要包含哪些条款?",
"output": "在货物运输保险合同中,需要包含哪些条款? \n\n根据《海商法》的规定,在货物运输保险合同中需要包含的条款包括保险标的、保险价值、保险金额、保险责任和除外责任、保险期间和保险费等方面的内容,其中保险标的包括货物和船舶营运收入,如运费和租金等(第218条)。因此,在货物运输保险合同中应具体说明保险标的、保险金额、保险责任和除外责任等相关内容
}
有许多途径可以构建这样的问答,在通用场景中,可以将已有的有标注数据集通过人工设计的规则转换成指令问答,也可以利用已有的语言模型(例如ChatGPT)生成指令问答。在Alpaca模型方案中介绍了详细的数据构建方法,首先选择一些种子问题(简单的问题),要求ChatGPT将种子扩写成复杂问题,再要求ChatGPT进行回答。详细流程如下图所示:
对于领域指令数据,也可以使用类似的方法进行构建。以Lawyer LLaMA为例,该项目使用了国家司法考试的问题和答案,并要求ChatGPT为每个答案提供解释。同时,为了提高模型的领域问答能力,还要求ChatGPT进行多轮法律相关问答,收集多轮对话数据。
指令数据集构建完成后,对模型进行指令精调训练,其训练目标与预训练阶段大致相同,区别在于需要构造特定的prompt使模型区分预训练目标(续写)和指令精调目标(问答)。一个prompt的示例是Alpaca格式:在每个问题之前加上 ###Instruction ,在回答前添加 ###Answer。这些特殊符号不会参与loss计算,因此在指令精调中只训练问题的答案部分loss。
经过领域训练和指令精调的Lawyer LLaMA效果如图所示,其中BELLE是通用问答模型:
指令精调通用可以直接使用TencentPretrain进行训练:
基于增量增量训练后的模型,准备指令数据集并预处理,格式为每行一个jsonl文件
python3 preprocess.py --corpus_path $INSTRUCTION_PATH --spm_model_path $LLaMA_PATH/tokenizer.model \
--dataset_path $OUTPUT_DATASET_PATH --data_processor alpaca --seq_length 512
注意,--data_processor alpaca 指定了数据集的格式,这里的alpaca对应上文中指令精调格式。
启动指令精调训练,耗时较短,为数小时至数日。
deepspeed pretrain.py --deepspeed --deepspeed_config models/deepspeed_zero3_config.json --enable_zero3 \
--pretrained_model_path models/llama_zh_7b.bin \
--dataset_path $OUTPUT_DATASET_PATH --spm_model_path $LLaMA_PATH/tokenizer.model \
--config_path models/llama/7b_config.json \
--output_model_path models/chatflow_7b \
--world_size 8 --data_processor alpaca --prefix_lm_loss --deepspeed_checkpoint_activations \
--total_steps 20000 --save_checkpoint_steps 2000 --batch_size 24
原创不易,转载请注明出处
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。