书生浦语实战营第四节课:XTuner 微调 LLM - robinlubin12/InternLM2-OpenCamp GitHub Wiki

书生浦语实战营第四节课:XTuner 微调 LLM image

作为整个体系中重要的一环,支持微调,就看Xtuner!

image

既然是微调(基于现有模型上往某个目标改进),至少也是个训练和使用模型(小模型)的过程,在 XTuner 的配置库中找到合适的配置文件(决定如何选设置项,微调的程度)并进行对应的修改。修改完成后即可一键启动训练!

整体流程图

LoRA(Low-Rank Adaptation) 技术

LoRA 的思想很简单,即在原始 Pretrained Weights 旁边增加一个旁路,做一个降维再升维的操作,来模拟所谓的 intrinsic rank 。训练的时候固定 Pretrained Weights 的参数,只训练降维矩阵 与升维矩阵 。而模型的输入输出维度不变,输出时将 与 Pretrained Weights 的参数叠加。用随机高斯分布初始化 ,用0矩阵初始化 ,保证训练的开始此旁路矩阵依然是 0 矩阵。

具体来看,假设预训练的矩阵为,它的更新可表示为: image

数据集、基础模型和配置文件----->新模型文件

Part one:开启实验跟做过程

环境准备

开启一个30%的机器,准备conda虚拟环境 如果你是在 InternStudio 平台,则从本地 clone 一个已有 pytorch 的环境: pytorch 2.0.1 py3.10_cuda11.7_cudnn8.5.0_0

studio-conda xtuner0.1.17 激活环境 conda activate xtuner0.1.17 cd ~

mkdir -p /root/xtuner0117 && cd /root/xtuner0117 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]' -i https://mirrors.aliyun.com/pypi/simple/

image image

数据集准备

前半部分是创建一个文件夹,后半部分是进入该文件夹。 mkdir -p /root/ft && cd /root/ft

在ft这个文件夹里再创建一个存放数据的data文件夹 mkdir -p /root/ft/data && cd /root/ft/data vim /root/ft/data/generate_data.py 将下面的内容复制进去,目的是写一个JSON文件,python /root/ft/data/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)

image

查看文件,里面就包含了 10000 条 input 和 output 的数据对。{除了我们自己通过脚本的数据集,其实网上也有大量的开源数据集可以供我们进行使用。有些时候我们可以在开源数据集的基础上添加一些我们自己独有的数据集,也可能会有很好的效果}

复制基础模型文件

# 创建目标文件夹,确保它存在。 # -p选项意味着如果上级目录不存在也会一并创建,且如果目标文件夹已存在则不会报错。 mkdir -p /root/ft/model

# 复制内容到目标文件夹。-r选项表示递归复制整个文件夹。 cp -r /root/share/new_models/Shanghai_AI_Laboratory/internlm2-chat-1_8b/* /root/ft/model/ image

配置文件

所谓配置文件(config),其实是一种用于定义和控制模型训练和测试过程中各个方面的参数和设置的工具。准备好的配置文件只要运行起来就代表着模型就开始训练或者微调了。

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

开箱即用意味着假如能够连接上 Huggingface 以及有足够的显存,其实就可以直接运行这些配置文件,XTuner就能够直接下载好这些模型和数据集然后开始进行微调

# 列出所有内置配置文件,学习下命令行 # xtuner list-cfg

# 假如我们想找到 internlm2-1.8b 模型里支持的配置文件 xtuner list-cfg -p internlm2_1_8b

# 创建一个存放 config 文件的文件夹 mkdir -p /root/ft/config

# 使用 XTuner 中的 copy-cfg 功能将 config 文件(一个python可执行文件),在xtuner项目源码目录下,复制到指定的位置 xtuner copy-cfg internlm2_1_8b_qlora_alpaca_e3 /root/ft/config

image

可以看到Python代码,分为几个大的步骤,有兴趣可以读一读 image 至此,模型、数据、配置(工具)齐活。 image 实际上,数据集质量很重要,配置代码要调整,微调本身就是个不断微调的工作。在选择了一个最匹配的配置文件并准备好其他内容后,下面我们要做的事情就是根据我们自己的内容对该配置文件进行调整,使其能够满足我们实际训练的要求。 image

# 使用 xtuner train 命令,指定配置文件-python文件,指定模型的保存路径 xtuner train /root/ft/config/internlm2_1_8b_qlora_alpaca_e3_copy.py --work-dir /root/ft/train

执行报错~~(由于我们的数据集不再是原本的 aplaca 数据集,因此我们也要进入 PART 3 的部分对相关的内容进行修改。包括说我们数据集输入的不是一个文件夹而是一个单纯的 json 文件以及我们的数据集格式要求改为我们最通用的 OpenAI 数据集格式。也可以设置为文件夹) image

调整后运行(显存使用并不大,对于 7B 参数量的LLM,微调所需的最小显存仅为 8GB ):

image

  • 使用 deepspeed 来加速训练
  • 模型续训指南 过程截图: image

image

Part two:模型转换和使用

模型转换的本质其实就是将原本使用 Pytorch 训练出来的模型权重文件转换为目前通用的 Huggingface 格式文件,那么我们可以通过以下指令来实现一键转换。 # 创建一个保存转换后 Huggingface 格式的文件夹 mkdir -p /root/ft/huggingface

# 模型转换 # xtuner convert pth_to_hf ${配置文件地址} ${权重文件地址} ${转换后模型保存地址} xtuner convert pth_to_hf /root/ft/train/internlm2_1_8b_qlora_alpaca_e3_copy.py /root/ft/train/iter_768.pth /root/ft/huggingface

参数名 | 解释 -- | -- LoRA 模型文件 | Adapter --fp32 | 代表以fp32的精度开启,假如不输入则默认为fp16 --max-shard-size {GB} | 代表每个权重文件最大的大小(默认为2GB)

pth_to_hf模型文件格式转化 xtuner convert pth_to_hf /root/ft/train/internlm2_1_8b_qlora_alpaca_e3_copy.py /root/ft/train/iter_768.pth /root/ft/huggingface --fp32 --max-shard-size 2GB image

在 XTuner 中也是提供了一键整合的指令,但是在使用前我们需要准备好三个地址,包括原模型的地址、训练好的 adapter 层的地址(转为 Huggingface 格式后保存的部分)以及最终保存的地址。 创建一个名为 final_model 的文件夹存储整合后的模型文件

mkdir -p /root/ft/final_model

解决一下线程冲突的 Bug export MKL_SERVICE_FORCE_INTEL=1 进行模型整合xtuner convert merge ${NAME_OR_PATH_TO_LLM} ${NAME_OR_PATH_TO_ADAPTER} ${SAVE_PATH} xtuner convert merge /root/ft/model /root/ft/huggingface /root/ft/final_model image

还可能会遇到sentencepiece  库未安装报错: pip3 install sentencepiece 

合并挺快速的,检查最终合并后模型目录:

image

对话测试

在 XTuner 中也直接的提供了一套基于 transformers 的对话代码,让我们可以直接在终端与 Huggingface 格式的模型进行对话操作。我们只需要准备我们刚刚转换好的模型路径并选择对应的提示词模版(prompt-template)即可进行对话。假如 prompt-template 选择有误,很有可能导致模型无法正确的进行回复。 与模型进行对话 xtuner chat /root/ft/final_model --prompt-template internlm2_chat

可能遇到pip3 install pytz

image

image

对比一下两个模型的输出、对于特备训练的token,输出已经过度拟合,知识库可以从OpenXLab上获取更多!

Ending

固定知识, XTuner 的数据格式,目标格式:(.jsonL) [{ "conversation":[ { "system": "xxx", "input": "xxx", "output": "xxx" } ] },

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

动态知识,MSAgent 数据集: MSAgent 数据集每条样本包含一个对话列表(conversations),其里面包含了 system、user、assistant 三种字段。其中:

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

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

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

xtuner commands: (See more by using -h for specific command!)

    1. List all predefined configs:
        xtuner list-cfg
    2. Copy a predefined config to a given path:
        xtuner copy-cfg $CONFIG $SAVE_FILE
    3-1. Fine-tune LLMs by a single GPU:
        xtuner train $CONFIG
    3-2. Fine-tune LLMs by multiple GPUs:
        NPROC_PER_NODE=$NGPUS NNODES=$NNODES NODE_RANK=$NODE_RANK PORT=$PORT ADDR=$ADDR xtuner dist_train $CONFIG $GPUS
    4-1. Convert the pth model to HuggingFace's model:
        xtuner convert pth_to_hf $CONFIG $PATH_TO_PTH_MODEL $SAVE_PATH_TO_HF_MODEL
    4-2. Merge the HuggingFace's adapter to the pretrained base model:
        xtuner convert merge $LLM $ADAPTER $SAVE_PATH
        xtuner convert merge $CLIP $ADAPTER $SAVE_PATH --is-clip
    4-3. Split HuggingFace's LLM to the smallest sharded one:
        xtuner convert split $LLM $SAVE_PATH
    5-1. Chat with LLMs with HuggingFace's model and adapter:
        xtuner chat $LLM --adapter $ADAPTER --prompt-template $PROMPT_TEMPLATE --system-template $SYSTEM_TEMPLATE
    5-2. Chat with VLMs with HuggingFace's model and LLaVA:
        xtuner chat $LLM --llava $LLAVA --visual-encoder $VISUAL_ENCODER --image $IMAGE --prompt-template $PROMPT_TEMPLATE --system-template $SYSTEM_TEMPLATE
    6-1. Preprocess arxiv dataset:
        xtuner preprocess arxiv $SRC_FILE $DST_FILE --start-date $START_DATE --categories $CATEGORIES
    6-2. Preprocess refcoco dataset:
        xtuner preprocess refcoco --ann-path $RefCOCO_ANN_PATH --image-path $COCO_IMAGE_PATH --save-path $SAVE_PATH
    7-1. Log processed dataset:
        xtuner log-dataset $CONFIG
    7-2. Verify the correctness of the config file for the custom dataset:
        xtuner check-custom-dataset $CONFIG

【XTuner 微调个人小助手认知】的文档,来微调你人生中的第一个大模型吧~

微调小助手课程文档:https://github.com/InternLM/Tutorial/blob/camp2/xtuner/personal_assistant_document.md

基础作业:https://github.com/InternLM/Tutorial/blob/camp2/xtuner/homework.md 第 4 节课作业 记录复现过程并截图 基础作业(结营必做) 训练自己的小助手认知(记录复现过程并截图)

进阶作业 将自我认知的模型上传到 OpenXLab,并将应用部署到 OpenXLab(优秀学员必做) 复现多模态微调(优秀学员必做)

⚠️ **GitHub.com Fallback** ⚠️