参考视频:XTuner 微调 LLM:1.8B、多模态、Agent_哔哩哔哩_bilibili
参考项目:Tutorial/xtuner/personal_assistant_document.md at camp2 · InternLM/Tutorial · GitHub和Tutorial/xtuner/llava/xtuner_llava.md at camp2 · InternLM/Tutorial · GitHub
4.0 概念:微调的两种范式和一条数据的一生
增量式预训练:格式要求不高,无监督一条数据。拟合数据分布
指令跟随微调:一问一答格式,有监督
效果:
4.1 部署环境
4.1.1. 从GitHub 克隆XTuner 的源码,并把相关的配套库也通过 pip 的方式进行了安装
创建conda环境xtuner0.1.17、在root下创建文件夹xtuner0117存放该项目的所有过程文件、git拉取xtuner源码、安装所需包
# 如果你是在 InternStudio 平台,则从本地 clone 一个已有 pytorch 的环境:
# pytorch 2.0.1 py3.10_cuda11.7_cudnn8.5.0_0
studio-conda xtuner0.1.17
# 如果你是在其他平台:
# conda create --name xtuner0.1.17 python=3.10 -y
# 激活环境
conda activate xtuner0.1.17
# 进入家目录 (~的意思是 “当前用户的home路径”)
cd ~
# 创建版本文件夹并进入,以跟随本教程
mkdir -p /root/xtuner0117 && cd /root/xtuner0117
# 拉取 0.1.17 的版本源码
git clone -b v0.1.17 https://github.com/InternLM/xtuner
# 无法访问github的用户请从 gitee 拉取:
# git clone -b v0.1.15 https://gitee.com/Internlm/xtuner
# 进入源码目录
cd /root/xtuner0117/xtuner
# 从源码安装 XTuner
pip install -e '.[all]'
4.2 明确微调目标,进行前期准备
4.2.1 利用脚本准备好一份关于调教模型认识自己身份弟位的数据集
在/root文件夹下创建文件夹ft,ft下创建data;
data下创建generate_data.py
文件,以生成数据集;
# 前半部分是创建一个文件夹,后半部分是进入该文件夹。
mkdir -p /root/ft && cd /root/ft
# 在ft这个文件夹里再创建一个存放数据的data文件夹
mkdir -p /root/ft/data && cd /root/ft/data
# 创建 `generate_data.py` 文件
touch /root/ft/data/generate_data.py
generate_data.py里的内容:
import json
# 设置用户的名字
name = '不要姜葱蒜大佬'
# 设置需要重复添加的数据次数
n = 10000
# 初始化OpenAI格式的数据结构
data = [
{
"messages": [
{
"role": "user",
"content": "请做一下自我介绍"
},
{
"role": "assistant",
"content": "我是{}的小助手,内在是上海AI实验室书生·浦语的1.8B大模型哦".format(name)
}
]
}
]
# 通过循环,将初始化的对话数据重复添加到data列表中
for i in range(n):
data.append(data[0])
# 将data列表中的数据写入到一个名为'personal_assistant.json'的文件中
with open('personal_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)
完成后文件结构应该为:
4.2.2 将 InternLM2-chat-1.8B 这个模型复制到我们的文件夹里
创建/root/ft/model文件夹,把/root/share/new_models/Shanghai_AI_Laboratory/internlm2-chat-1_8b中保存的模型参数复制到model里。/或建立软链接。
# 创建目标文件夹,确保它存在。
# -p选项意味着如果上级目录不存在也会一并创建,且如果目标文件夹已存在则不会报错。
mkdir -p /root/ft/model
# 复制内容到目标文件夹。-r选项表示递归复制整个文件夹。
cp -r /root/share/new_models/Shanghai_AI_Laboratory/internlm2-chat-1_8b/* /root/ft/model/
# 删除/root/ft/model目录
rm -rf /root/ft/model
# 创建符号链接
ln -s /root/share/new_models/Shanghai_AI_Laboratory/internlm2-chat-1_8b /root/ft/model
4.2.3 根据微调方法、数据集和模型挑选出最合适的 XTuner 配置文件并复制到我们新建的文件夹中
配置文件(config),定义和控制模型训练和测试过程中各个方面的参数和设置的工具。准备好的配置文件只要运行起来就代表着模型就开始训练或者微调了。
通过命令查看xtuner的配置文件。创建文件夹,复制配置文件
# 列出所有内置配置文件
# xtuner list-cfg
# -p 或 --pattern ,后面输入的内容将会在所有的 config 文件里进行模糊匹配搜索,然后返回最有可能得内容
# 假如我们想找到 internlm2-1.8b 模型里支持的配置文件
xtuner list-cfg -p internlm2_1_8b
# 创建一个存放 config 文件的文件夹
mkdir -p /root/ft/config
# 使用 XTuner 中的 copy-cfg 功能将 config 文件复制到指定的位置
xtuner copy-cfg internlm2_1_8b_qlora_alpaca_e3 /root/ft/config
4.3 修改
微调最重要的还是要自己准备一份高质量的数据集,这个才是能否真微调出效果最核心的利器。微调经常被戏称为炼丹。
炼丹的时候得思考好用什么样的材料、用多大的火候、烤多久的时间以及用什么丹炉去烧。这里的丹炉其实我们可以想象为 XTuner ,只要丹炉的质量过得去,炼丹的时候不会炸,一般都是没问题的。但是假如炼丹的材料(就是数据集)本来就是垃圾,那无论怎么炼(微调参数的调整),炼多久(训练的轮数),炼出来的东西还只能且只会是垃圾。因此,学会如何构建一份高质量的数据集是至关重要的。
假如想要了解更多关于数据集制作方面的内容,可以加入书生.浦语的 RolePlay SIG 中,里面会有各种大佬手把手教学,教你如何制作一个自己喜欢角色的数据集出来。也期待更多大佬加入讲述自己制作数据集的想法和过程!
4.3.1 对该配置文件进行调整,使其能够满足我们实际训练的要求
(1)修改/root/ft/config/internlm2_1_8b_qlora_alpaca_e3_copy.py
文件
完整代码、修改方式和参数解释见Tutorial/xtuner/personal_assistant_document.md at camp2 · InternLM/Tutorial · GitHub和书生·浦语大模型 实战营(第二期)-第四节 XTuner 微调个人小助手认知及多模态 – MSTG-Blog。
# Copyright (c) OpenMMLab. All rights reserved.
import torch
from datasets import load_dataset
from mmengine.dataset import DefaultSampler
from mmengine