书生浦语训练营第三期--XTuner微调

基础任务

使用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

最后效果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值