XTuner大模型单卡低成本微调实战
本节参考文档为:XTuner 大模型单卡低成本微调实战
视频教程为:XTuner 大模型单卡低成本微调实战
理论内容:
XTuner是由 MMRazor 和 MMDeploy 联合开发的大语言模型微调工具箱。具有傻瓜化和轻量级的特点
大模型海量的文本内容赋予了大语言模型各行各业的知识,但是将大语言模型实际的用到具体的生产或科研中往往会发现模型的回答不尽如人意,这时就需要对模型进行微调,使得模型在具体的使用场景或者是具体的领域中输出更好的回答
训练流程:海量的预训练数据训练出来的模型叫做base模型或者pretrained模型。为了让模型知道我们的意图,更加服从我们的指令,就在PRETRAIN模型上进行额外的这种指令微调,产生instructed大模型,最终instructed模型对肺癌有比较好的理解
指令跟随微调:对角色进行指定,三个角色"System":设置上下文信息,”User“:会提出问题的用户,”Assistant“:根据System设置的上下文回答User提出的问题
对话模板是为了能够让LLM区分出,System、User和 Assistant不同的模型会有不同的模板
loss损失计算过程:对答案部分进行loss计算
增量微调:不需要问题,只需要关于事实的陈述句,根据对话模板,把system和input留空,但仍需要计算答案的损失
XTuner 训练原理:LoRA 使用linear旁支降低显存开销,QLoRA是对LoRA的改进
全量微调,LORA,QLoRA三者比较
XTuner介绍
统一了问答对格式
多种映射函数,支持很多开源的数据集,减少处理复杂数据格式的时间
自定义数据格式建议json或者jsonl
加速训练:Flash Attention和 DeepSpeed ZeRO,默认为Flash Attentio
开启 DeepSpeed ZeRO 后边只需添加 --deepspeed 参数,这样可以使用QLoRA方法
LoRA与QLoRA 现存开销对比:
1.快速上手
安装XTuner并从ModelScope下载internlm-chat-7b模型
下载openassistant数据集[地址][https://huggingface.co/datasets/timdettmers/openassistant-guanaco/tree/main]
将模型地址和数据集地址加入到微调脚本
vim internlm_chat_7b_qlora_oasst1_e3_copy.py
# 修改模型为本地路径
pretrained_model_name_or_path = './internlm-chat-7b'
# 修改训练数据集为本地路径
data_path = './openassistant-guanaco'
xtuner train ./internlm_chat_7b_qlora_oasst1_e3_copy.py
训练完成后在./work dirs /internlm chat_ 7b_qlora_oasst1_e3_copy 会输出训练过程和epoch权重
将得到的 PTH 模型生成 Adapter 文件夹(转换为 HuggingFace 模型),并将 HuggingFace adapter 合并到大语言模型。
export MKL_SERVICE_FORCE_INTEL=1
xtuner convert pth_to_hf ./internlm_chat_7b_qlora_oasst1_e3_copy.py ./work_dirs/internlm_chat_7b_qlora_oasst1_e3_copy/epoch_1.pth ./hf
如果报错Error: nkl-service + Intel(R) MKL: AKL_THREADIAG_LAYER=INTEL is incompatible with libaomp.so.1 library. 要注意 export MKL_SERVICE_FORCE_INTEL=1
xtuner convert merge ./internlm-chat-7b ./hf ./merged --max-shard-size 2GB
最后与合并后的模型对话
直接加载 Adapter 模型对话,可以看到机器人的名字变成了 ‘Open Assistant’
4 bit 量化加载,与直接加载 Adapter 模型对话效果差不多。
注意最好还是多训练几个轮次,否则很可能因为训练不充分导致,输出错误。
如微调前:机器人只知道自己是一个“AI Assistant”
在经过3个epoch微调后,知道自己叫做“'Open Assistant",“Open Assistant"来源于数据集openassistant-guanaco dataset:
2. 自定义微调**–Medication QA**
基于 InternLM-chat-7B 模型,用 MedQA 数据集进行微调,将其往医学问答
领域对齐。数据集格式如下:
之后,使用xlsx2jsonl.py
格式化数据集,使用split2train_and_test.py
划分训练集和测试集
与第1节设置类似,开始自定义微调
xtuner train internlm_chat_7b_qlora_medqa2019_e3.py --deepspeed deepspeed_zero2
之后 pth 转 huggingface,并部署与测试
3.用 MS-Agent 数据集 赋予 LLM 以 Agent 能力
开始 chat 之前,还要加个 serper 的环境变量:
去 serper.dev 免费注册一个账号,生成自己的 api key。这个东西是用来给 lagent 去获取 google 搜索的结果的。等于是 serper.dev 帮你去访问 google,而不是从你自己本地去访问 google 了。(因此注意要有科学上网的能力)
export SERPER_API_KEY=abcdefg
xtuner chat ./internlm-chat-7b --adapter internlm-7b-qlora-msagent-react --lagent