前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >TencentPretrain框架实战之训练中文领域模型

TencentPretrain框架实战之训练中文领域模型

原创
作者头像
siri
发布2023-09-26 23:51:33
6230
发布2023-09-26 23:51:33
举报
文章被收录于专栏:siri的开发之路

前情提要:

LLaMA 是由 Facebook Research 发布的开源大规模语言模型,包含7B、13B、33B、65B等模型量级,不论是在英文还是中文场景,都吸引了大量开发者和研究人员基于LLaMA展开工作。在上一篇文章中,笔者简要总结了目前开源的中文LLaMA模型,本篇是以比较过后选择的TencentPretrain框架作为基座,使用开源语料训练和部署中文LLaMA领域模型的过程

TencentPretrain 框架是一个用于对文本、图像、语音等模态数据进行预训练和微调的工具包,其特点是遵循模块化的设计原则,通过模块组合,可以灵活并快速地复现已有的预训练模型或者进行创新


领域增量训练

通常,大模型在训练是会用到大量通用语料,其数据来源多种多样,既包括微博、社区评论、点评等用户生成数据,也包括新闻、论文等专业数据。但是具体到垂直领域时,即使模型具有该领域的基本知识,但由于领域数据只占通用数据等很小比例,模型仍面临知识匮乏的问题。需要对模型进行领域增量训练。

领域训练的目的主要有两个

  • 对模型注入领域知识:通过大量领域语料,为模型提供领域相关知识。
  • 将模型的分布从通用模型转移到领域模型:将模型的语言习惯迁移到垂直领域,避免领域术语和通用词汇产生的歧义

以开源的法律领域模型 Lawyer LLaMA 为例,为了提高LLaMA模型在法律问题上的表现,该工作使用多种语料混合训练模型:

  • 多语言通用语料。由于LLaMA模型是英文预训练模型,在中文化过程中已经经过一次迁移学习,因此在领域化时进一步对之前学习过的数据进行回放,避免发生灾难性遗忘(模型失去通用预训练阶段学习到的知识)
  • 法律语料库。由法院网站上收集的判决书、普法文章、法律新闻和各种法律条款解释。这部分语料提供了全面的领域知识

在这一阶段,收集完成预训练语料后,将语料混合并随机打乱。使用与通用预训练相同的语言模型为目标进行增量预训练,设置较低的学习率(例如2e-5)。

这一阶段的训练可以在TencentPretrain中使用现成的代码来完成:

  • 首先下载基础模型和训练框架,可以使用已经在中文上训练过的Chinese-LLaMA,以7B模型为例:
代码语言:txt
复制
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
  • 将预训练语料处理成txt文件,每行一个样本,使用脚本进行预处理
代码语言:txt
复制
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 ZeRO3 进行加速
代码语言:txt
复制
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

这里只以一个开源模型的语料库为例,实际应用中可以参考该语料库的数据集构建方式、预处理格式及数据量大小构造所需的领域语料库

领域指令精调

在增量预训练阶段,主要目标是让模型熟悉领域知识。由于模型还没有经过社会化训练,只能对文本进行续写,需要经过指令精调才能胜任具体的领域问答任务。指令数据主要由问答对构成,各种问题和对应的回答都可以作为指令数据,以下分别是通用指令和法律指令问答的示例 :

代码语言:txt
复制
{

"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文件

代码语言:txt
复制
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

原创不易,转载请注明出处

我正在参与2023腾讯技术创作特训营第二期有奖征文,瓜分万元奖池和键盘手表

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 领域增量训练
  • 领域指令精调
相关产品与服务
GPU 云服务器
GPU 云服务器(Cloud GPU Service,GPU)是提供 GPU 算力的弹性计算服务,具有超强的并行计算能力,作为 IaaS 层的尖兵利器,服务于生成式AI,自动驾驶,深度学习训练、科学计算、图形图像处理、视频编解码等场景。腾讯云随时提供触手可得的算力,有效缓解您的计算压力,提升业务效率与竞争力。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档