文章目录
- 前言
- 笔记正文
- XTuner
- 支持模型和数据集
- 微调原理
- 跟随文档学习
- 快速上手
- 自定义微调
- 准备数据
- 准备配置文件
- MS-Agent微调
前言
本文是对于InternLM全链路开源体系系列课程的学习笔记。【XTuner 大模型单卡低成本微调实战】 https://www.bilibili.com/video/BV1yK4y1B75J/?share_source=copy_web&vd_source=99d9a9488d6d14ace3c7925a3e19793e
笔记正文
XTuner
地址:XTuner
一个大预言模型微调工具箱
- 傻瓜化:以配置文件的形式封装了大部分微调场景
- 轻量级:对于7B参数量的LLM,微调所需的最小显存仅为8GB。
支持模型和数据集
微调原理
- LoRA:只对玩具中某些零件记性改动,而不是对整个玩具进行全面改动
- QLoRA:LoRA的一种改进,如果你手里只有一把生锈的螺丝刀,也能改造你的玩具。
跟随文档学习
文档提供了三个微调的例子,分别叫做快速上手、自定义微调和MS-Agent微调。
快速上手
首先介绍了如何安装微调的XTuner环境,然后介绍了具有多个开箱即用的配置文件,并对于这些配置文件的名称进行了解释
例如文件名:internlm_chat_7b_qlora_oasst1_e3
模型名 | internlm_chat_7b |
---|---|
使用算法 | qlora |
数据集 | oasst1 |
把数据集跑几次 | 跑三次:e3 |
然后根据实际模型、数据集存放的位置、实际训练需求,修改配置文件中的信息。
接着就可以开始微调了。
微调训练完成后,应该在work_dirs的目录下产生pth权重,需要将其转换成hf格式的模型
xtuner convert pth_to_hf ${CONFIG_NAME_OR_PATH} ${PTH_file_dir} ${SAVE_PATH}
转换后,生成的文件应该是
|-- README.md
|-- adapter_config.json
|-- adapter_model.bin
`-- xtuner_config.py
可以理解为LoRA模型文件=Adapter
然后将hf的adapter合并到原LLM,并与之对话,这些需求xtuner都提供了相应的命令行工具。
自定义微调
这个部分演示了在实际需求下如何准备数据、修改配置文件、进行微调。
准备数据
将表格(或者其他数据格式)数据转化成jsonL格式。也就是json列表
[{
"conversation":[
{
"system": "xxx",
"input": "xxx",
"output": "xxx"
}
]
},
{
"conversation":[
{
"system": "xxx",
"input": "xxx",
"output": "xxx"
}
]
}]
然后划分训练集和测试集等。
准备配置文件
可以从下面的对配置文件的修改看出如何使用这种所谓的“自定义数据集”进行微调训练。
# 修改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)
然后和前文差不多。
MS-Agent微调
数据也是由jsonl格式的,但是与前面的input、output不同,现在的每个conversations则需要赋予不同的身份了。
- system: 表示给模型前置的人设输入,其中有告诉模型如何调用插件以及生成请求
- user: 表示用户的输入 prompt,分为两种,通用生成的prompt和调用插件需求的 prompt
- assistant: 为模型的回复。其中会包括插件调用代码和执行代码,调用代码是要 LLM 生成的,而执行代码是调用服务来生成结果的
而assistant则需要包含工具调用和返回,分别叫做思考阶段和执行阶段,这两个阶段是不输出的,具体格式如下
图片来源https://github.com/InternLM/tutorial/blob/main/xtuner/README.md
之后就是找到对应的训练配置文件,根据实际情况等进行修改即可。