第四节 XTuner 大模型单卡低成本微调实战
介绍Finetune和XTunner的概念。并微调Xtuner
两种微调模式:增量预训练、指令跟随
增量预训练:用文章、数据、代码等让基座模型学到一些新知识
指令跟随:用高质量的对话和问答数据让模型学会对话模板
指令微调之前,模型不知道自己要回答一个问题
给定三个角色:
这个指定角色的过程已经被Xtuner打包好了,可以一键运行
不同的LLM角色指定的模板会有所不同
在指令微调时,只需要计算output(assistant)部分计算loos
不存在问答的场景,需要把system和user模板留空,只保留assistant部分
增加一个adapter,以少量的参数微调,减小显存消耗
QLoRa是LoRa的进一步优化
支持热门数据集的映射
支持多数据的样本拼接
配置环境并安装xtuner
/root/share/install_conda_env_internlm_base.sh xtuner0.1.9
mkdir xtuner019
cd xtuner019
it clone -b v0.1.9 https://github.com/InternLM/xtuner
cd xtuner
pip install -e '.[all]'
创建数据集目录
oasst1数据集是一个对话数据集,包含了 35 种语言编写的 161,443 条消息以及 461,292 个质量评估
mkdir ~/ft-oasst1 && cd ~/ft-oasst1
拷贝配置文件
cd ~/ft-oasst1
xtuner copy-cfg internlm_chat_7b_qlora_oasst1_e3 .
表示复制7b模型,用oasst1模型,qlora方法,跑3个epoch
拷贝模型文件
cp -r /root/share/temp/model_repos/internlm-chat-7b ~/ft-oasst1/
拷贝数据集
cp -r /root/share/temp/datasets/openassistant-guanaco .
修改配置文件,把模型和数据集路径改成相对路径
开始训练
xtuner train ./internlm_chat_7b_qlora_oasst1_e3_copy.py
tumx后台运行
创建tumx窗口后可以使用ctrl+B,+D回到终端,或者输入tmux detach
使用tmux attach -t xtuner
回到刚刚的窗口
apt update -y # 更新apt
apt install tmux # 安装tmux
tmux new -s xtuner # 创建一个叫xtuner的tmux窗口
修改配置文件中的max_epoch为1,并添加–deepspeed deepspeed_zero2,缩短训练时间
此时预估时间是1小时多。显著缩短了
跑完训练后:
在ft-oasst1文件夹下运行如下指令,将PTH转换成HuggingFace模型
mkdir hf
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
必须要运行export MKL_SERVICE_FORCE_INTEL=1
,否则将会报错
将hf中的adapter合并到大语言模型中:
xtuner convert merge ./internlm-chat-7b ./hf ./merged --max-shard-size 2GB
实现demo
修改InternLM中的cli_demo.py,把模型路口修改为“merged‘’
然后运行cli_demo.py
提问一个oasst1数据集中的问题,发现给出的回答跟数据集中基本一致
也可以直接用xtuner chat ./merged --prompt-template internlm_chat
与模型对话
加上-- bits 4
之后,模型加载和回复的速度江湖更快
如果要用别的数据集进行微调,需要将数据转换成Xtuner的格式
准备配置文件
运行xtuner微调
然后把pth转换成Huggingface格式
也可以使用MAAgent数据集微调,让LLM具有Agent的能力,这样一来模型就可以根据需要决定是否要调用插件
主要学习了Xtuner的基本功能,并基于oasst1数据集做了微调demo