基础任务
使用XTuner微调InternLM2-Chat-1.8B,来帮助自己的小助手认知。
1.将XTuner的Tutorial仓库的代码拷贝到本地
mkdir -p /root/InternLM/Tutorial
git clone -b camp3 https://github.com/InternLM/Tutorial /root/InternLM/Tutorial
拷贝好所需的代码之后就可以进行XTuner的微调了,首先要创建虚拟环境并安装所需的依赖
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
当我们安装好依赖之后,就可以去安装XTuner了
首先我们要新建一个目录用来存放源代码,进入到新建的文件夹中去拷贝XTuner的代码
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
pip install -e '.[deepspeed]'
安装好依赖之后,可以通过以下命令查看是否安装成功
xtuner version
xtuner help
xtuner version 查看你安装的信息
xtuner help查看在xtuner中常使用的命令有哪些
当我们的软件安装完成之后,就可以下载模型来准备进行微调了
对于使用InternStudio的开发者而言,可以不通过HuggingFace或者ModelScope来下载模型,在开发机中已经提供了模型的文件,我们只需要使用就好了;对于模型的使用推荐使用软链接来进行,节省了空间,也方便管理。
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
第一步来安装tree包,之后进行查看目录结构
安装好这些之后,就可以开始进行微调了
首先,我们可以查看下微调之前的模型的输出效果
conda activate xtuner0121
streamlit run /root/InternLM/Tutorial/tools/xtuner_streamlit_demo.py
通过上面代码可以在web页面和模型进行对话
对话之后的输出效果不好
要通过指令跟随微调,来让模型输出我们想要的效果,对于微调而言,最初要构造合适的数据集,因为想要让模型能得到合适的认知,所以在数据集中要大量加入这样的数据。对于简单的微调,可以利用脚本来生成数据。
在XTuner来创建一个文件来保存数据集,文件内容是对话数据。
cd /root/InternLM/XTuner
mkdir -p datas
touch datas/assistant.json
利用脚本生成来准备数据,创建一个脚本文件来生成数据xtuner_generate_assistant.py
import json
# 设置用户的名字
name = '伍鲜同志'
# 设置需要重复添加的数据次数
n = 8000
# 初始化数据
data = [
{"conversation": [{"input": "请介绍一下你自己", "output": "我是{}的小助手,内在是上海AI实验室书生·浦语的1.8B大模型哦".format(name)}]},
{"conversation": [{"input": "你在实战营做什么", "output": "我在这里帮助{}完成XTuner微调个人小助手的任务".format(name)}]}
]
# 通过循环,将初始化的对话数据重复添加到data列表中
for i in range(n):
data.append(data[0])
data.append(data[1])
# 将data列表中的数据写入到'datas/assistant.json'文件中
with open('datas/assistant.json', 'w', encoding='utf-8') as f:
# 使用json.dump方法将数据以JSON格式写入文件
# ensure_ascii=False 确保中文字符正常显示
# indent=4 使得文件内容格式化,便于阅读
json.dump(data, f, ensure_ascii=False, indent=4)
其中的name后面的内容修改为你想要的名称
# 在文件中的第4行
name = '伍鲜同志'(原数据)
name = "你自己的名称"(自己的名称)
准备好脚本文件之后就可以运行得到微调的数据集
python xtuner_generate_assistant.py
生成微调的数据集之后,我们就可以tree来查看目录结构的变化
准备好模型和数据集之后,就要选择合适的配置文件,配置文件查看
xtuner list-cfg -p internlm2
其中这些配置文件的含义,例如: internlm2_1_8b_full_custom_pretrain_e1 和 internlm2_chat_1_8b_qlora_alpaca_e3
internlm2_1_8b是指模型的名称
full和qlora是指微调的算法,full是指全量微调,qlora是指量化的lora
custom_pretrain和aplaca是指数据集名称
e1和e3是数据集要进行几个轮次
之后选用合适的匹配文件,将其拷贝到目录之下
选用好合适的匹配文件之后,就是对配置文件进行修改,将模型的路径和数据集的路径修改为我们的路径等
修改之后,将配置文件放入到微调的目录就可以启动微调了
cd /root/InternLM/XTuner
conda activate xtuner0121
xtuner train ./internlm2_chat_1_8b_qlora_alpaca_e3_copy.py
进入微调目录下,启动微调,微调之后,要先保存最后一个pth文件,之后要进行模型格式转换将pytorch权重文件转换为通用的HuggingFace格式文件。
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层,训练完之后这个层要和原本的权重层合并。
Lora原理图
cd /root/InternLM/XTuner
conda activate xtuner0121
export MKL_SERVICE_FORCE_INTEL=1
export MKL_THREADING_LAYER=GNU
xtuner convert merge /root/InternLM/XTuner/Shanghai_AI_Laboratory/internlm2-chat-1_8b ./hf ./merged --max-shard-size 2GB
XTuner 中提供了一键合并的命令 xtuner convert merge,之后的三个路径分别是,原模型的路径、微调训练好的Adapter层的路径和最终保存的路径。
合并之后可以通过tree来查看当前目录结构
微调完成后,我们可以再次运行xtuner_streamlit_demo.py
脚本来观察微调后的对话效果,我们要在运行之前将模型路径更改为合并之后的模型路径
# 直接修改脚本文件第18行
model_name_or_path = "/root/InternLM/XTuner/Shanghai_AI_Laboratory/internlm2-chat-1_8b"(原模型路径)
model_name_or_path = "/root/InternLM/XTuner/merged"(合并之后模型路径)
修改之后,运行即可
conda activate xtuner0121
streamlit run /root/InternLM/Tutorial/tools/xtuner_streamlit_demo.py
最后效果