L1 第五关 XTuner 微调个人小助手认知
task1
基础任务(完成此任务即完成闯关并获得 100 算力点)
使用 XTuner 微调 InternLM2-Chat-1.8B 实现自己的小助手认知,如下图所示(图中的伍鲜同志需替换成自己的昵称),记录复现过程并截图。
1.1 开发机准备
配置选择Cuda12.2-conda
、10%A100
即可
这里直接选择之前创建的开发机了~
打开虚拟机,克隆Tutorial仓库的资料到本地
1.2 创建虚拟环境
利用Anaconda
创建虚拟环境并安装必要库
# 创建虚拟环境
conda create -n xtuner0121 python=3.10 -y
# 激活虚拟环境(注意:后续的所有操作都需要在这个虚拟环境中进行)
conda activate xtuner0121
# 安装一些必要的库
conda install pytorch==2.1.2 torchvision==0.16.2 torchaudio==2.1.2 pytorch-cuda=12.1 -c pytorch -c nvidia -y
# 安装其他依赖
pip install transformers==4.39.3
pip install streamlit==1.36.0
1.3 安装XTuner
首先从Github下载源码,然后进入目录进行安装,
# 创建一个目录,用来存放源代码
mkdir -p /root/InternLM/code
cd /root/InternLM/code
git clone -b v0.1.21 https://github.com/InternLM/XTuner /root/InternLM/code/XTuner
执行安装
# 进入到源码目录
cd /root/InternLM/code/XTuner
conda activate xtuner0121
# 执行安装
pip install -e '.[deepspeed]'
这里有个bug
原因是numpy版本过高,试了下不同版本,最后换成了1.26.0
pip install numpy==1.26.0
1.4 模型准备
准备微调模型
# 创建一个目录,用来存放微调的所有资料,后续的所有操作都在该路径中进行
mkdir -p /root/InternLM/XTuner
cd /root/InternLM/XTuner
mkdir -p Shanghai_AI_Laboratory
ln -s /root/share/new_models/Shanghai_AI_Laboratory/internlm2-chat-1_8b Shanghai_AI_Laboratory/internlm2-chat-1_8b
使用tree
命令查看目录
apt-get install -y tree
tree -l
从目录结构中可以看出,internlm2-chat-1_8b 是一个符号链接。
下面用 internlm2-chat-1_8b 模型,通过 QLoRA 的方式来微调模型
2.1 微调前的模型对话
微调前模型并未达到预期
下面开始微调
2.2 指令跟随微调
- 准备数据文件
datas/assistant.json
通过脚本生成的方式来准备数据,创建一个脚本文件 xtuner_generate_assistant.py :
运行脚本文件后目录结构如下:
- 准备配置文件
配置文件是一种用于定义和控制模型训练和测试过程中各个方面的参数和设置的工具,下面根据微调方法结合微调方案来找到最匹配的配置文件,从而减少对配置文件的修改量。
xtuner list-cfg
列出支持的配置文件
命名规则为:模型名称_使用的算法_数据集名称_把数据集跑几次
由于我们是对internlm2-chat-1_8b模型进行指令微调,所以与我们的需求最匹配的配置文件是 internlm2_chat_1_8b_qlora_alpaca_e3,复制该配置文件后目录结构如下:
- 修改配置文件
配置文件包括:Settings& Model &Dataset & Scheduler &Runtime
由于修改了配置文件中的模型和数据集,所以需要更改前三部分,后面两部分为官方优化好的部分
下面是文档给的一些准则:
在 PART 1 的部分,由于我们不再需要在 HuggingFace 上自动下载模型,因此我们先要更换模型的路径以及数据集的路径为我们本地的路径。
为了训练过程中能够实时观察到模型的变化情况,XTuner 贴心的推出了一个 evaluation_inputs 的参数来让我们能够设置多个问题来确保模型在训练过程中的变化是朝着我们想要的方向前进的。我们可以添加自己的输入。
在 PART 3 的部分,由于我们准备的数据集是 JSON 格式的数据,并且对话内容已经是 input 和 output 的数据对,所以不需要进行格式转换。
这里采用了写好的配置文件:
- 启动微调
cd /root/InternLM/XTuner
conda activate xtuner0121
xtuner train ./internlm2_chat_1_8b_qlora_alpaca_e3_copy.py
微调后文件结构:
- 模型格式转换:将 Pytorch 训练出来的模型权重文件转换为目前通用的 HuggingFace 格式文件
cd /root/InternLM/XTuner
conda activate xtuner0121
# 先获取最后保存的一个pth文件
pth_file=`ls -t ./work_dirs/internlm2_chat_1_8b_qlora_alpaca_e3_copy/*.pth | head -n 1`
export MKL_SERVICE_FORCE_INTEL=1
export MKL_THREADING_LAYER=GNU
xtuner convert pth_to_hf ./internlm2_chat_1_8b_qlora_alpaca_e3_copy.py ${pth_file} ./hf
- 模型合并:对于 LoRA 或者 QLoRA 微调出来的模型其实并不是一个完整的模型,而是一个额外的层(Adapter),训练完的这个层最终还是要与原模型进行合并才能被正常的使用。
2.3 微调后的模型对话
修改xtuner_streamlit_demo.py
脚本中模型路径
对话结果,微调成功: