书生大模型实战营第四课笔记

XTuner 大模型单卡低成本微调实战

这课不同于第三课,第三课是给模型外挂一个知识库,将用户输入的问题和知识库都传送进interlm,得到最后的输出。

这节课是微调模型,自己感觉可能微调的性能会更好(看完这节课再说)。

大语言模型是在很多很多数据上进行无监督或半监督训练。

增量预训练很好理解,指令跟随不太清楚

指令跟随,感觉是像在问问题之前,给系统设定一个某个专业方向的身份,让回答专业一些。

感觉是在用户输入之前加了很大一段设定(系统身份)的话,让回答更加准确。

这个看起来像是监督训练,给定数据和标签,然后计算输出和标签的损失,将其降到最小。

简单理解,指令微调,需要一问一答的数据。

增量预训练微调:

增量训练的数据,不需要一问一答的数据,只需要回答,都是陈述句。训练时,把system和input留空,只需要输出放到assistant。最后一样计算输出部分的损失。

XTuner中的微调原理,就是LoRA和QLoRA。

这个画图的sd中很常见,主要是在底模上套一个可以训练的模型,主要是为了减少模型训练的开销。这个就是Adapter,就是旁路分支,这个分支的参数远远小于原本的Linear,能大幅降低训练开销。 

全参数微调 vs LoRA微调 vs QLoRA微调:

全参数微调,是全部参数加载到显存中,然后优化器也要加载到显存中,很吃显存。

LoRA微调,全部参数进显存,但是优化器只需要LoRA部分就可以了。

QLoRA微调:加载模型时就是4bit量化的加载,不那么精确的加载。显存不够还能加载到内存中去,至少能跑起来。

XTuner:是个工具箱

可以加工具,类似GPT里面的plugin

建议用json

不同算法在不同卡上优化前和后的情况

作业 3:XTuner 单 GPU 微调(个人助理)

Tutorial dochttps://github.com/InternLM/tutorial/blob/main/xtuner/README.md ​​​​​​https://github.com/InternLM/tutorial/blob/main/xtuner/self.md

任务:

创建一个训练集,让模型知道他是专门为我工作的

根据文档,上传适配器模型并在 OpenXLab 上部署该模型

在终端(bash)中创建一个新环境: conda Create —— name xtuner python = 3.10-y

激活新环境 conda 激活 xtuner 之后,我们需要安装 XTuner0.1.9:

mkdir -p /root/xtuner019
cd /root/xtuner019
git clone https://github.com/InternLM/xtuner -b v0.1.9
cd xtuner
pip install -e '.[all]'

# 创建一个微调 oasst1 数据集的工作路径,进入
mkdir ~/ft-oasst1 && cd ~/ft-oasst1

2.3 微调

2.3.1 准备配置文件

XTuner 提供多个开箱即用的配置文件,用户可以通过下列命令查看:

# 列出所有内置配置
xtuner list-cfg

拷贝一个配置文件到当前目录: # xtuner copy-cfg ${CONFIG_NAME} ${SAVE_PATH}

在本案例中即:(注意最后有个英文句号,代表复制到当前路径)

cd ~/ft-oasst1
xtuner copy-cfg internlm_chat_7b_qlora_oasst1_e3 .

配置文件名的解释:

xtuner copy-cfg internlm_chat_7b_qlora_oasst1_e3 .

模型名 internlm_chat_7b
使用算法 qlora
数据集 oasst1
把数据集跑几次 跑3次:e3 (epoch 3 )

*无 chat比如 internlm-7b 代表是基座(base)模型

2.3.2 模型下载

由于下载模型很慢,用教学平台的同学可以直接复制模型。

ln -s /share/temp/model_repos/internlm-chat-7b ~/ft-oasst1/

以上是通过软链的方式,将模型文件挂载到家目录下,优势是:

  1. 节省拷贝时间,无需等待
  2. 节省用户开发机存储空间

当然,也可以用 cp -r /share/temp/model_repos/internlm-chat-7b ~/ft-oasst1/ 进行数据拷贝。

以下是自己下载模型的步骤。

不用 xtuner 默认的从 huggingface 拉取模型,而是提前从 OpenXLab ModelScope 下载模型到本地

# 创建一个目录,放模型文件,防止散落一地
mkdir ~/ft-oasst1/internlm-chat-7b

# 装一下拉取模型文件要用的库
pip install modelscope

# 从 modelscope 下载下载模型文件
cd ~/ft-oasst1
apt install git git-lfs -y
git lfs install
git lfs clone https://modelscope.cn/Shanghai_AI_Laboratory/internlm-chat-7b.git -b v1.0.3

2.3.3 数据集下载

https://huggingface.co/datasets/timdettmers/openassistant-guanaco/tree/main

由于 huggingface 网络问题,咱们已经给大家提前下载好了,复制到正确位置即可:

cd ~/ft-oasst1
# ...-guanaco 后面有个空格和英文句号啊
cp -r /root/share/temp/datasets/openassistant-guanaco .

此时,当前路径的文件应该长这样:

|-- internlm-chat-7b
|   |-- README.md
|   |-- config.json
|   |-- configuration.json
|   |-- configuration_internlm.py
|   |-- generation_config.json
|   |-- modeling_internlm.py
|   |-- pytorch_model-00001-of-00008.bin
|   |-- pytorch_model-00002-of-00008.bin
|   |-- pytorch_model-00003-of-00008.bin
|   |-- pytorch_model-00004-of-00008.bin
|   |-- pytorch_model-00005-of-00008.bin
|   |-- pytorch_model-00006-of-00008.bin
|   |-- pytorch_model-00007-of-00008.bin
|   |-- pytorch_model-00008-of-00008.bin
|   |-- pytorch_model.bin.index.json
|   |-- special_tokens_map.json
|   |-- tokenization_internlm.py
|   |-- tokenizer.model
|   `-- tokenizer_config.json
|-- internlm_chat_7b_qlora_oasst1_e3_copy.py
`-- openassistant-guanaco
    |-- openassistant_best_replies_eval.jsonl
    `-- openassistant_best_replies_train.jsonl

2.3.4 修改配置文件

修改其中的模型和数据集为 本地路径

cd ~/ft-oasst1
vim internlm_chat_7b_qlora_oasst1_e3_copy.py

在vim界面完成修改后,请输入:wq退出。假如认为改错了可以用:q!退出且不保存。当然我们也可以考虑打开python文件直接修改,但注意修改完后需要按下Ctrl+S进行保存。

减号代表要删除的行,加号代表要增加的行。

# 修改模型为本地路径
- pretrained_model_name_or_path = 'internlm/internlm-chat-7b'
+ pretrained_model_name_or_path = './internlm-chat-7b'

# 修改训练数据集为本地路径
- data_path = 'timdettmers/openassistant-guanaco'
+ data_path = './openassistant-guanaco'
常用超参
参数名 解释
data_path 数据路径或 HuggingFace 仓库名
max_length 单条数据最大 Token 数,超过则截断
pack_to_max_length 是否将多条短数据拼接到 max_length,提高 GPU 利用率
accumulative_counts 梯度累积,每多少次 backward 更新一次参数
evaluation_inputs 训练过程中,会根据给定的问题进行推理,便于观测训练状态
evaluation_freq Evaluation 的评测间隔 iter 数
...... ......

如果想把显卡的现存吃满,充分利用显卡资源,可以将 max_length 和 batch_size 这两个参数调大。

2.3.5 开始微调

训练:

xtuner train ${CONFIG_NAME_OR_PATH}

也可以增加 deepspeed 进行训练加速:

xtuner train ${CONFIG_NAME_OR_PATH} --deepspeed deepspeed_zero2

例如,我们可以利用 QLoRA 算法在 oasst1 数据集上微调 InternLM-7B:

# 单卡
## 用刚才改好的config文件训练
xtuner train ./internlm_chat_7b_qlora_oasst1_e3_copy.py

# 多卡
NPROC_PER_NODE=${GPU_NUM} xtuner train ./internlm_chat_7b_qlora_oasst1_e3_copy.py

# 若要开启 deepspeed 加速,增加 --deepspeed deepspeed_zero2 即可

可以看到需要4个小时。

若要加速,用 -- deepspeed

微调得到的 PTH 模型文件和其他杂七杂八的文件都默认在当前的 ./work_dirs 中。

跑完训练后,当前路径应该长这样:

|-- internlm-chat-7b
|-- internlm_chat_7b_qlora_oasst1_e3_copy.py
|-- openassistant-guanaco
|   |-- openassistant_best_replies_eval.jsonl
|   `-- openassistant_best_replies_train.jsonl
`-- work_dirs
    `-- internlm_chat_7b_qlora_oasst1_e3_copy
        |-- 20231101_152923
        |   |-- 20231101_152923.log
        |   `-- vis_data
        |       |-- 20231101_152923.json
        |       |-- config.py
        |       `-- scalars.json
        |-- epoch_1.pth
        |-- epoch_2.pth
        |-- epoch_3.pth
        |-- internlm_chat_7b_qlora_oasst1_e3_copy.py
        `-- last_checkpoint

此时,路径中应该长这样:

|-- internlm-chat-7b
|-- internlm_chat_7b_qlora_oasst1_e3_copy.py
|-- openassistant-guanaco
|   |-- openassistant_best_replies_eval.jsonl
|   `-- openassistant_best_replies_train.jsonl
|-- hf
|   |-- README.md
|   |-- adapter_config.json
|   |-- adapter_model.bin
|   `-- xtuner_config.py
`-- work_dirs
    `-- internlm_chat_7b_qlora_oasst1_e3_copy
        |-- 20231101_152923
        |   |-- 20231101_152923.log
        |   `-- vis_data
        |       |-- 20231101_152923.json
        |       |-- config.py
        |       `-- scalars.json
        |-- epoch_1.pth
        |-- epoch_2.pth
        |-- epoch_3.pth
        |-- internlm_chat_7b_qlora_oasst1_e3_copy.py
        `-- last_checkpoint

此时,hf 文件夹即为我们平时所理解的所谓 “LoRA 模型文件”

可以简单理解:LoRA 模型文件 = Adapter

接下来是守护进程:

tmux:

apt update

apt install tmux

创建会话:

tmux new -s fine

ctrl B.  然后 d退出

再回去:

tmux attach -t fine

在守护进程中训练模型:(等一个小时看结果)

完成之后,把模型转换成hf的格式

2.3.6 将得到的 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 ./internlm_chat_7b_qlora_oasst1_e3_copy.py ./work_dirs/internlm_chat_7b_qlora_oasst1_e3_copy/epoch_1.pth ./hf


xtuner convert pth_to_hf ./internlm_chat_7b_qlora_oasst1_e3_copy.py ./work_dirs/internlm_chat_7b_qlora_oasst1_e3_copy/epoch_1.pth ./hf --max-shard-size 2GB

训练完成

2.4 部署与测试

2.4.1 将 HuggingFace adapter 合并到大语言模型:
xtuner convert merge ./internlm-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
2.4.2 与合并后的模型对话:
# 加载 Adapter 模型对话(Float 16)
xtuner chat ./merged --prompt-template internlm_chat

# 4 bit 量化加载
# xtuner chat ./merged --bits 4 --prompt-template internlm_chat

2.4.3 演示
  • 修改cli_demo.py中的模型路径
- model_name_or_path = "/root/model/Shanghai_AI_Laboratory/internlm-chat-7b"
+ model_name_or_path = "merged"
  • 运行cli_demo.py以目标测量效果
python ./cli_demo.py

效果:

O23QD48iFSZMfbr.png

L1sqmGgE6h2exWP.png

xtuner chat 的启动参数

启动参数 干哈滴
--提示模板 指定对话模板
- 系统 指定SYSTEM文本
--系统模板 指定SYSTEM模板
- - 法学硕士
--机器人名称 机器人名称
--带插件 指定要使用的插件
--无流媒体 是否启用流式传输
--拉特 是否使用代理
--命令停止词 命令停止词
--答案停用词 回答停止词
--卸载文件夹 搭建模型权重的文件夹(或者已经卸载模型权重的文件夹)
--最大新令牌 生成文本中允许的最大token数量
- 温度 温度值
--top-k 保留用于顶k筛选的最高概率的标注标记数
--顶部-p 如果设置为小于1的浮点数,则仅保留概率相加top_p的最小一组最有可能的标记
- 种子 用于可重置文本生成的随机种子

自定义微调:

3.1 概述

3.1.1需求需求

基于InternLM-chat-7B模型,用MedQA数据集进行调整,将其往医学问答领域校准。

3.1.2真实数据预览
问题 答案
什么是酮咯酸滴眼液?(什么是酮咯酸滴眼液?) 眼科酮咯酸用于治疗过敏引起的眼睛发痒。它还用于治疗白内障手术后可能出现的肿胀和发红(炎症)。酮咯酸属于一类称为非甾体抗炎药 (NSAID) 的药物。它的作用是阻止引起过敏症状和炎症的物质的释放。
哪些药物会升高血糖?(什么药物会高血压?) 一些治疗糖尿病以外疾病的药物可能会升高血糖水平。当您患有糖尿病时,这是一个问题。确保您去看的每位医生都了解您服用的所有药物、维生素或草药补充剂。这意味着您在有或没有处方的情况下服用的任何药物。例子包括: 巴比妥类药物。噻嗪类利尿剂。皮质类固醇。避孕药(口服避孕药)和黄体酮。儿茶酚胺。含有β-肾上腺素能药物的减充血剂,例如伪麻黄碱。B族维生素烟酸。服用烟酸几个月后,引起高血糖的风险就会降低。抗精神病药奥氮平(Zyprexa)。

3.2 数据准备

 药物 QA 数据集为例

原格式:(.xlsx)

gjKLFUNWAx2dZDS.png

问题 药物类型 问题类型 回答 主题 网址
啊啊 bbb ccc 滴滴 伊伊 FF

3.2.1 将数据转为XTuner的数据格式

目标格式:(.jsonL)

[{
    "conversation":[
        {
            "system": "xxx",
            "input": "xxx",
            "output": "xxx"
        }
    ]
},
{
    "conversation":[
        {
            "system": "xxx",
            "input": "xxx",
            "output": "xxx"
        }
    ]
}]

🧠通过 python 脚本:将.xlsx中的问题和回答两列提取出来,再放入.jsonL文件的每个会话的输入和输出中。

这一步的 python 脚本可以请 ChatGPT 来完成。

<span style="background-color:var(--bgColor-muted, var(--color-canvas-subtle))"><span style="color:#1f2328"><span style="color:var(--fgColor-default, var(--color-fg-default))"><span style="background-color:var(--bgColor-muted, var(--color-canvas-subtle))"><code>Write a python file for me. using openpyxl. input file name is MedQA2019.xlsx
Step1: The input file is .xlsx. Exact the column A and column D in the sheet named "DrugQA" .
Step2: Put each value in column A into each "input" of each "conversation". Put each value in column D into each "output" of each "conversation".
Step3: The output file is .jsonL. It looks like:
[{
    "conversation":[
        {
            "system": "xxx",
            "input": "xxx",
            "output": "xxx"
        }
    ]
},
{
    "conversation":[
        {
            "system": "xxx",
            "input": "xxx",
            "output": "xxx"
        }
    ]
}]
Step4: All "system" value changes to "You are a professional, highly experienced doctor professor. You always provide accurate, comprehensive, and detailed answers based on the patients' questions."
</code></span></span></span></span>

ChatGPT生成的python代码见本仓库的xlsx2jsonl.py

执行python脚本,获得整理后的数据集:

python xlsx2jsonl.py

同时,当然也可以对数据进行训练集和测试集的分割,同样可以让 ChatGPT 写 python 代码。当然如果你没有严格的科研需求、无数“训练集丢失”的问题,也可以不做训练集与测试集的分割。

3.2.2 划分训练集和测试集
<span style="background-color:var(--bgColor-muted, var(--color-canvas-subtle))"><span style="color:#1f2328"><span style="color:var(--fgColor-default, var(--color-fg-default))"><span style="background-color:var(--bgColor-muted, var(--color-canvas-subtle))"><code>my .jsonL file looks like:
[{
    "conversation":[
        {
            "system": "xxx",
            "input": "xxx",
            "output": "xxx"
        }
    ]
},
{
    "conversation":[
        {
            "system": "xxx",
            "input": "xxx",
            "output": "xxx"
        }
    ]
}]
Step1, read the .jsonL file.
Step2, count the amount of the "conversation" elements.
Step3, randomly split all "conversation" elements by 7:3. Targeted structure is same as the input.
Step4, save the 7/10 part as train.jsonl. save the 3/10 part as test.jsonl
</code></span></span></span></span>

生成的python代码见split2train_and_test.py

3.3 开始自定义数据集

这时,我们重新建一个文件夹来玩“角色自定义数据集”

mkdir ~/ft-medqa && cd ~/ft-medqa

把前面下载的好的internlm-chat-7b模型文件夹拷贝过来。

cp -r ~/ft-oasst1/internlm-chat-7b .

别忘了把自定义数据集,即几个.jsonL,也传到服务器上。

git clone https://github.com/InternLM/tutorial
cp ~/tutorial/xtuner/MedQA2019-structured-train.jsonl .
3.3.1 准备配置文件
# 复制配置文件到当前目录
xtuner copy-cfg internlm_chat_7b_qlora_oasst1_e3 .
# 改个文件名
mv internlm_chat_7b_qlora_oasst1_e3_copy.py internlm_chat_7b_qlora_medqa2019_e3.py

# 修改配置文件内容
vim internlm_chat_7b_qlora_medqa2019_e3.py

减号代表要删除的行,加号代表要增加的行。

# 修改import部分
- from xtuner.dataset.map_fns import oasst1_map_fn, template_map_fn_factory
+ from xtuner.dataset.map_fns import template_map_fn_factory

# 修改模型为本地路径
- pretrained_model_name_or_path = 'internlm/internlm-chat-7b'
+ pretrained_model_name_or_path = './internlm-chat-7b'

# 修改训练数据为 MedQA2019-structured-train.jsonl 路径
- data_path = 'timdettmers/openassistant-guanaco'
+ data_path = 'MedQA2019-structured-train.jsonl'

# 修改 train_dataset 对象
train_dataset = dict(
    type=process_hf_dataset,
- dataset=dict(type=load_dataset, path=data_path),
+ dataset=dict(type=load_dataset, path='json', data_files=dict(train=data_path)),
    tokenizer=tokenizer,
    max_length=max_length,
- dataset_map_fn=alpaca_map_fn,
+ dataset_map_fn=None,
    template_map_fn=dict(
        type=template_map_fn_factory, template=prompt_template),
    remove_unused_columns=True,
    shuffle_before_pack=True,
    pack_to_max_length=pack_to_max_length)

修改完成:

用tmux训练,

转成hf格式

4【补充】用MS-Agent数据集赋予LLM以Agent能力

4.1 概述

MSAgent 数据集每条样本包含一个对话列表(conversations),其里面包含了系统、用户、助理空格。其中:

  • system: 表示给模型前置的人设置输入,其中告诉模型如何调用插件以及生成请求

  • user: 表示用户的输入提示,分为两种,通用生成的提示和调用插件需求的提示

  • Assistant: 为模型的回复。其中会包括插件调用代码和执行代码,调用代码是要LLM生成的,而执行代码是调用服务来生成结果的

一条调用网页搜索插件查询“上海明天天气”的数据样本示例如下图所示:

 

4.2 张力步骤

4.2.1 准备工作

xtuner 是国内从 ModelScope 平台下载 MS-Agent 数据集,因此提前不用手动下载数据集文件。

# 准备工作
mkdir ~/ft-msagent && cd ~/ft-msagent
cp -r ~/ft-oasst1/internlm-chat-7b .

# 查看配置文件
xtuner list-cfg | grep msagent

# 复制配置文件到当前目录
xtuner copy-cfg internlm_7b_qlora_msagent_react_e3_gpu8 .

# 修改配置文件中的模型为本地路径
vim ./internlm_7b_qlora_msagent_react_e3_gpu8_copy.py 
- pretrained_model_name_or_path = 'internlm/internlm-chat-7b'
+ pretrained_model_name_or_path = './internlm-chat-7b'
4.2.2 开始配置
xtuner train ./internlm_7b_qlora_msagent_react_e3_gpu8_copy.py --deepspeed deepspeed_zero2

4.3 直接使用

由于完成 msagent 的训练非常费时,大家如果想加速把本教程跟上,可以直接从 modelScope 拉取我们已经变得好了的 Adapter。如下演示。

4.3.1 下载适配器
cd ~/ft-msagent
apt install git git-lfs
git lfs install
git lfs clone https://www.modelscope.cn/xtuner/internlm-7b-qlora-msagent-react.git

OK,现在目录应该长这样:

  • internlm_7b_qlora_msagent_react_e3_gpu8_copy.py
  • internlm-7b-qlora-msagent-反应
  • 实习生聊天-7b
  • work_dir(可有可无)

有了这个在 msagent 上训练得到的适配器,模型现在已经有了代理能力了!就可以加上 --lagent 以调用来自 lagent 的代理功能了!

4.3.2 添加serper环境变量

开始聊天之前,还要加个蛇的环境变量:

去serper.dev免费注册一个账号,生成自己的api key。这个东西是用来给lagent去获取google搜索的结果的。相当于是serper.dev 帮助去访问google,而不是从你自己本地去访问google了。

添加 serper api key 到环境变量:

export SERPER_API_KEY=abcdefg
4.3.3 xtuner + 代理,启动!
xtuner chat ./internlm-chat-7b --adapter internlm-7b-qlora-msagent-react --lagent
4.3.4 报错处理

xtuner chat 增加 --lagent 参数后,报错TypeError: transfomers.modelsauto.auto factory. BaseAutoModelClass.from pretrained() got multiple values for keyword argument "trust remote code"

注释掉已安装包中的代码:

vim /root/xtuner019/xtuner/xtuner/tools/chat.py
vim中,使用/可以找东西,h可以到开头。

NfHAV1b4zqYv5kR.png

好像出问题了

修改启动命令:

xtuner chat ./internlm-chat-7b --adapter internlm-7b-qlora-msagent-react --lagent --prompt-template internlm_chat

基础作业:

构建数据集,使用 XTuner 变量 InternLM-Chat-7B 模型,让模型学习到它就是你的智能小助手,效果如下图所示,本作业训练出来的模型的输出需要将葱不要姜蒜大佬替换成自己的名字或昵称!

2.实操

2.1微调环境准备

# InternStudio 平台中,从本地 clone 一个已有 pytorch 2.0.1 的环境(后续均在该环境执行,若为其他环境可作为参考)
# 进入环境后首先 bash
# 进入环境后首先 bash
# 进入环境后首先 bash
bash
conda create --name personal_assistant --clone=/root/share/conda_envs/internlm-base
# 如果在其他平台:
# conda create --name personal_assistant python=3.10 -y

# 激活环境
conda activate personal_assistant
# 进入家目录 (~的意思是 “当前用户的home路径”)
cd ~
# 创建版本文件夹并进入,以跟随本教程
# personal_assistant用于存放本教程所使用的东西
mkdir /root/personal_assistant && cd /root/personal_assistant
mkdir /root/personal_assistant/xtuner019 && cd /root/personal_assistant/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]'

2.2数据准备

创建data文件夹用于存放用于训练的数据集

mkdir -p /root/personal_assistant/data && cd /root/personal_assistant/data

data目录下创建一个json文件personal_assistant.json作为本次微调所使用的数据集。json中内容可参考下方(复制粘贴n次做数据增广,数据量小无法有效微调,下面仅用于展示格式,下面也有生成脚本)

其中conversation表示一次对话的内容,input为输入,即用户会问的问题,output为输出,即想要模型回答的答案。


  

以下是一个python脚本,用于生成数据集。在data目录下新建一个generate_data.py文件,将以下代码复制进去,然后运行该脚本即可生成数据集。


  
import json

# 输入你的名字
name = 'Zihao_z'
# 重复次数
n = 10000

data = [
    {
        "conversation": [
            {
                "input": "请做一下自我介绍",
                "output": "我是{}的私人助手,内在是上海AI实验室书生·浦语的7B大模型哦".format(name)
            }
        ]
    },
    {
    "conversation":[
        {
            "system": "你是{}的私人助手,你总是提到你为他工作".format(name),
            "input": "你是谁",
            "output": "我是{}的私人助手,我为他服务".format(name)
        }
    ]
},
{
    "conversation":[
        {
            "system": "你是{}的私人助手,你总是提到你为他工作".format(name),
            "input": "你为谁工作",
            "output": "我为{}工作,我是他的私人助手".format(name)
        }
    ]
}
]

for i in range(n):
    data.append(data[0])

with open('personal_assistant.json', 'w', encoding='utf-8') as f:
    json.dump(data, f, ensure_ascii=False, indent=4)

配置准备

下载模型InternLM-chat-7B

InternStudio 平台的 share 目录下已经为我们准备了全系列的 InternLM 模型,可以使用如下命令复制internlm-chat-7b

mkdir -p /root/personal_assistant/model/Shanghai_AI_Laboratory
cp -r /root/share/temp/model_repos/internlm-chat-7b /root/personal_assistant/model/Shanghai_AI_Laboratory

XTuner 提供多个开箱即用的配置文件,用户可以通过下列命令查看:

# 列出所有内置配置
xtuner list-cfg
#创建用于存放配置的文件夹config并进入
mkdir /root/personal_assistant/config && cd /root/personal_assistant/config

拷贝一个配置文件到当前目录:xtuner copy-cfg ${CONFIG_NAME} ${SAVE_PATH} 在本例中:(注意最后有个英文句号,代表复制到当前路径)

xtuner copy-cfg internlm_chat_7b_qlora_oasst1_e3 .

修改拷贝后的文件internlm_chat_7b_qlora_oasst1_e3_copy.py,修改下述位置: (这是一份修改好的文件internlm_chat_7b_qlora_oasst1_e3_copy.py)

# PART 1 中
# 预训练模型存放的位置
pretrained_model_name_or_path = '/root/personal_assistant/model/Shanghai_AI_Laboratory/internlm-chat-7b'

# 微调数据存放的位置
data_path = '/root/personal_assistant/data/personal_assistant.json'

# 训练中最大的文本长度
max_length = 512

# 每一批训练样本的大小
batch_size = 2

# 最大训练轮数
max_epochs = 3

# 验证的频率
evaluation_freq = 90

# 用于评估输出内容的问题(用于评估的问题尽量与数据集的question保持一致)
evaluation_inputs = [ '请介绍一下你自己', '请做一下自我介绍' ]


# PART 3 中
dataset=dict(type=load_dataset, path='json', data_files=dict(train=data_path))
dataset_map_fn=None

开始训练:

微调启动

xtuner train命令启动训练、

xtuner train /root/personal_assistant/config/internlm_chat_7b_qlora_oasst1_e3_copy.py

微调后参数转换/合并

训练后的pth格式参数转Hugging Face格式

# 创建用于存放Hugging Face格式参数的hf文件夹
mkdir /root/personal_assistant/config/work_dirs/hf

export MKL_SERVICE_FORCE_INTEL=1

# 配置文件存放的位置
export CONFIG_NAME_OR_PATH=/root/personal_assistant/config/internlm_chat_7b_qlora_oasst1_e3_copy.py

# 模型训练后得到的pth格式参数存放的位置
export PTH=/root/personal_assistant/config/work_dirs/internlm_chat_7b_qlora_oasst1_e3_copy/epoch_3.pth

# pth文件转换为Hugging Face格式后参数存放的位置
export SAVE_PATH=/root/personal_assistant/config/work_dirs/hf

# 执行参数转换
xtuner convert pth_to_hf $CONFIG_NAME_OR_PATH $PTH $SAVE_PATH

Merge模型参数

export MKL_SERVICE_FORCE_INTEL=1
export MKL_THREADING_LAYER='GNU'

# 原始模型参数存放的位置
export NAME_OR_PATH_TO_LLM=/root/personal_assistant/model/Shanghai_AI_Laboratory/internlm-chat-7b

# Hugging Face格式参数存放的位置
export NAME_OR_PATH_TO_ADAPTER=/root/personal_assistant/config/work_dirs/hf

# 最终Merge后的参数存放的位置
mkdir /root/personal_assistant/config/work_dirs/hf_merge
export SAVE_PATH=/root/personal_assistant/config/work_dirs/hf_merge

# 执行参数Merge
xtuner convert merge \
    $NAME_OR_PATH_TO_LLM \
    $NAME_OR_PATH_TO_ADAPTER \
    $SAVE_PATH \
    --max-shard-size 2GB

网页DEMO

安装网页Demo所需依赖

pip install streamlit==1.24.0

下载InternLM项目代码(欢迎Star)

# 创建code文件夹用于存放InternLM项目代码
mkdir /root/personal_assistant/code && cd /root/personal_assistant/code
git clone https://github.com/InternLM/InternLM.git

将 /root/code/InternLM/web_demo.py 中 29 行和 33 行的模型路径更换为Merge后存放参数的路径 /root/personal_assistant/config/work_dirs/hf_merge

效果:

作业参考答案:https://github.com/InternLM/tutorial/blob/main/xtuner/self.md

进阶作业:

相关推荐

最近更新

  1. TCP协议是安全的吗?

    2024-02-21 21:26:01       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-02-21 21:26:01       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-02-21 21:26:01       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-02-21 21:26:01       20 阅读

热门阅读

  1. LeetCode209长度最小子数组

    2024-02-21 21:26:01       34 阅读
  2. 线阵相机参数介绍---变频参数控制

    2024-02-21 21:26:01       26 阅读
  3. 08MARL深度强化学习——模型种类

    2024-02-21 21:26:01       23 阅读
  4. CSP-J 2023 复赛第2题:公路 ← 贪心算法

    2024-02-21 21:26:01       31 阅读
  5. `Box<T>`

    2024-02-21 21:26:01       28 阅读
  6. Discuz3.5 数据库批量添加内容

    2024-02-21 21:26:01       26 阅读
  7. tidb流式读取配置

    2024-02-21 21:26:01       25 阅读
  8. [精通linux]-302- linux 高级命令

    2024-02-21 21:26:01       29 阅读
  9. 大珩助手相较于其他办公软件插件的独特之处

    2024-02-21 21:26:01       34 阅读
  10. C语言:查找回文数

    2024-02-21 21:26:01       35 阅读