第三期书生大模型实战营 基础岛第四关 XTuner微调

141 阅读4分钟

安装XTuner

安装过程十分简单,源码安装即可

git clone https://github.com/InternLM/xtuner.git
cd xtuner
pip install -e '.[deepspeed]'

安装完成验证一下

xtuner version

image.png

模型准备

XTuner 支持多种模型参数,可以使用命令xtuner list-cfg查看。 模型下载后,目录结果如下,以模型 internlm2-chat-1_8b为例,也可自行下载其它支持的模型

image.png

首先运行模型,查看模型默认的运行效果:

2024-08-16_17-53.png 之后我们将使用XTuner对模型进行微调,以此来对比,微调后的结果

准备数据文件

编写一个脚本xtuner_generate_assistant.py,来简单创建微调数据文件:

import json

# 设置用户的名字
name = '1696-Eclipse'
# 设置需要重复添加的数据次数
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)

数据文件的内容就是两个简单问题重复至指定次数n。保存路径为datas/assistant.json

准备训练配置文件

执行命令

xtuner list-cfg -p internlm2

可以查询到xtuner关于internlm2的配置文件。

复制本次的使用的训练配置文件到当前目录:

xtuner copy-cfg internlm2_chat_1_8b_qlora_alpaca_e3 .

得到文件internlm2_chat_1_8b_qlora_alpaca_e3_copy.py,该文件类似一个默认模板,还需要调整部分内容来完成本次任务,这里直接粘贴修改后的文件,主要修改模型路径和数据文件路径。自己做的朋友可以对比其中的区别:

image.png

image.png image.png

接下来使用XTuner执行微调:

xtuner train ./internlm2_chat_1_8b_qlora_alpaca_e3_copy.py

微调时长较长,需要漫长的等待。

微调训练完成后,将生成一个work_dirs目录:

image.png

模型转换、合并

转换

模型转换的本质其实就是将原本使用 Pytorch 训练出来的模型权重文件转换为目前通用的 HuggingFace 格式文件,可以通过XTuner用以下命令来实现一键转换。

xtuner convert pth_to_hf 命令用于进行模型格式转换。该命令需要三个参数:CONFIG 表示微调的配置文件, PATH_TO_PTH_MODEL 表示微调的模型权重文件路径,即要转换的模型权重, SAVE_PATH_TO_HF_MODEL 表示转换后的 HuggingFace 格式文件的保存路径。

接下来,依次执行以下命令,转换模型文件到hf目录下:

# 先获取最后保存的一个pth文件的名称
pth_file=`ls -t ./work_dirs/internlm2_chat_1_8b_qlora_alpaca_e3_copy/*.pth | head -n 1`
# 以下INTEL相关的优化参数
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

又是一阵等待。

转换完成后,得到hf目录:

image.png

合并

对于 LoRA 或者 QLoRA 微调出来的模型其实并不是一个完整的模型,而是一个额外的层(Adapter),训练完的这个层最终还是要与原模型进行合并才能被正常的使用。

使用XTuner合并原模型和微调模型到./merged目录:

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

合并完成后得到merged目录:

image.png

部署合并模型

在模型部署代码中,修改模型路径改为merged目录的绝对路径即可。

验证模型微调结果

image.png

可以看到,模型回答结果已经得到更新。

小结

经过本次任务,可以了解了模型微调的基本流程,许多大模型也提供了自身的微调方式,XTuner提供了一个比较通用的方式对各种模型微调。