课程4-笔记-书生浦语大模型实战营-4
1、XTuner安装
# 如果你是在 InternStudio 平台,则从本地 clone 一个已有 pytorch 2.0.1 的环境:
/root/share/install_conda_env_internlm_base.sh xtuner0.1.9
# 如果你是在其他平台:
conda create --name xtuner0.1.9 python=3.10 -y
# 激活环境
conda activate xtuner0.1.9
# 进入家目录 (~的意思是 “当前用户的home路径”)
cd ~
# 创建版本文件夹并进入,以跟随本教程
mkdir xtuner019 && cd xtuner019
# 拉取 0.1.9 的版本源码
git clone -b v0.1.9 https://github.com/InternLM/xtuner
# 无法访问github的用户请从 gitee 拉取:
# git clone -b v0.1.9 https://gitee.com/Internlm/xtuner
# 进入源码目录
cd xtuner
# 从源码安装 XTuner
pip install -e '.[all]'
注意:不管是internlm2--internlm-7b还是internlm--internlm-7b,cuda的版本应该为11.7,显卡驱动版本、torch版本、python版本也随之确定。我一开始装了最新的cuda12,最后排查问题总是怀疑版本不对降到了11.7,后面发现InternStudio官方开发机就只给了cuda11.7的镜像。
2、微调
2.1 准备配置文件
XTuner 提供多个开箱即用的配置文件,用户可以通过下列命令查看:
# 列出所有内置配置
xtuner list-cfg
配置文件名的解释:
xtuner copy-cfg internlm_chat_7b_qlora_oasst1_e3 .
模型名 internlm_chat_7b
使用算法 qlora
数据集 oasst1
把数据集跑几次 跑3次:e3 (epoch 3 )
拷贝一个配置文件到当前目录: # xtuner copy-cfg ${CONFIG_NAME} ${SAVE_PATH}
2.2 模型下载
还是用前两次课程下载的模型internlm2-chat-7b即可,对模型微调的结果会生成到其他目录,不会改变模型原始文件。
2.3 数据集下载
https://huggingface.co/datasets/timdettmers/openassistant-guanaco/tree/main
2.4 修改配置文件
其实这两处路径可以不修改,除非想换数据集,不改也不会重新下载,会引用到之前下载好的internlm2-chat-7b。微调完的新模型文件会生成到另一个目录,不会自动合并到原始模型上,模型的合并是需要手动处理的,后面有单独的小节介绍。
2.5 开始微调
可以看到每训练10个样本花费3分10秒,总共2166个样本训练3轮:
3 * (2166 / 10) * 3min10sec ≈ 34小时
eta也确实显示1 day 10 hours
期间显卡一直是满载的,显存16G都没到,QLoRA真省显存啊
最后终于训练成功了,训练期间每1000个样本训练完成会打印一次同一问题的回答,确实肉眼可见回答内容在不断丰富
训练完就得到了Adapter文件夹
后续的步骤跟课程保持一致
2.6 HuggingFace 模型转换
将得到的 PTH 模型转换为 HuggingFace 模型,即:生成 Adapter 文件夹
xtuner convert pth_to_hf ${CONFIG_NAME_OR_PATH} ${PTH_file_dir} ${SAVE_PATH}
在本示例中,为:
mkdir hf
export MKL_SERVICE_FORCE_INTEL=1
export MKL_THREADING_LAYER=GNU
xtuner convert pth_to_hf ./internlm2_chat_7b_qlora_oasst1_e3_copy.py ./work_dirs/internlm_chat_7b_qlora_oasst1_e3_copy/epoch_3.pth ./hf
此时,hf 文件夹即为我们平时所理解的所谓 “LoRA 模型文件”
3、部署与测试
3.1 将 HuggingFace adapter 合并到大语言模型
xtuner convert merge ./internlm2-chat-7b ./hf ./merged --max-shard-size 2GB
# xtuner convert merge \
# ${NAME_OR_PATH_TO_LLM} \
# ${NAME_OR_PATH_TO_ADAPTER} \
# ${SAVE_PATH} \
# --max-shard-size 2GB
3.2 与合并后的模型对话
# 加载 Adapter 模型对话(Float 16)
xtuner chat ./merged --prompt-template internlm2_chat
# 4 bit 量化加载
# xtuner chat ./merged --bits 4 --prompt-template internlm2_chat
注意:如果跟我一样使用的是internlm2-chat-7b模型,此处的对话模板也必须调整为internlm2_chat,否则可能会不停自动输出,无法交互。
3.3 运行demo
修改cli_demo.py中的模型为上一步merge的结果
这个回答实际上是第一轮微调1000个样本之后的了,最早的截图我找不到了~跟最后的结果比,仍然能看出不小的差异。