LLM微调
LLM微调是一个将预训练模型在较小、特定数据集上进一步训练的过程,目的是精炼模型的能力,提高其在特定任务或领域上的性能。微调的目的是将通用模型转变为专用模型,弥合通用预训练模型与特定应用需求之间的差距,确保语言模型更贴近人类的期望。
XTuner 微调个人小助手认知
相应的详细教程见链接:Tutorial/xtuner/personal_assistant_document.md at camp2 · InternLM/Tutorial · GitHub
环境安装
首先我们需要先安装一个 XTuner 的源码到本地来方便后续的使用。
前期准备
数据集准备
为了让模型能够认清自己的身份弟位,知道在询问自己是谁的时候回复成我们想要的样子,我们就需要通过在微调数据集中大量掺杂这部分的数据。
首先我们先创建一个文件夹来存放我们这次训练所需要的所有文件。
# 前半部分是创建一个文件夹,后半部分是进入该文件夹。 mkdir -p /root/ft && cd /root/ft # 在ft这个文件夹里再创建一个存放数据的data文件夹 mkdir -p /root/ft/data && cd /root/ft/data
之后我们可以在 data
目录下新建一个 generate_data.py
文件,将以下代码复制进去,然后运行该脚本即可生成数据集。假如想要加大剂量让他能够完完全全认识到你的身份,那我们可以吧 n
的值调大一点。
# 创建 `generate_data.py` 文件 touch /root/ft/data/generate_data.py
模型准备
在准备好了数据集后,接下来我们就需要准备好我们的要用于微调的模型。
配置文件选择
在准备好了模型和数据集后,我们就要根据我们选择的微调方法方法结合前面的信息来找到与我们最匹配的配置文件了,从而减少我们对配置文件的修改量。
所谓配置文件(config),其实是一种用于定义和控制模型训练和测试过程中各个方面的参数和设置的工具。准备好的配置文件只要运行起来就代表着模型就开始训练或者微调了。
小结
完成以上内容后,我就已经完成了所有的准备工作了。我们再来回顾一下我们做了哪些事情:
- 我们首先是在 GitHub 上克隆了 XTuner 的源码,并把相关的配套库也通过 pip 的方式进行了安装。
- 然后我们根据自己想要做的事情,利用脚本准备好了一份关于调教模型认识自己身份弟位的数据集。
- 再然后我们根据自己的显存及任务情况确定了使用 InternLM2-chat-1.8B 这个模型,并且将其复制到我们的文件夹里。
- 最后我们在 XTuner 已有的配置文件中,根据微调方法、数据集和模型挑选出最合适的配置文件并复制到我们新建的文件夹中。
配置文件修改
在选择了一个最匹配的配置文件并准备好其他内容后,下面我们要做的事情就是根据我们自己的内容对该配置文件进行调整,使其能够满足我们实际训练的要求。
模型训练
当我们准备好了配置文件好,我们只需要将使用 xtuner train
指令即可开始训练。
# 指定保存路径 xtuner train /root/ft/config/internlm2_1_8b_qlora_alpaca_e3_copy.py --work-dir /root/ft/train
模型转换、整合、测试及部署
模型转换
模型转换的本质其实就是将原本使用 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 或者 QLoRA 微调出来的模型其实并不是一个完整的模型,而是一个额外的层(adapter)。那么训练完的这个层最终还是要与原模型进行组合才能被正常的使用。
而对于全量微调的模型(full)其实是不需要进行整合这一步的,因为全量微调修改的是原模型的权重而非微调一个新的 adapter ,因此是不需要进行模型整合的。
对话测试
在 XTuner 中也直接的提供了一套基于 transformers 的对话代码,让我们可以直接在终端与 Huggingface 格式的模型进行对话操作。我们只需要准备我们刚刚转换好的模型路径并选择对应的提示词模版(prompt-template)即可进行对话。
可以看到模型已经严重过拟合,回复的话就只有 “我是Donlald Trump的小助手,内在是上海AI实验室书生·浦语的1.8B大模型哦” 这句话。我们下面可以通过对比原模型的能力来看看差异。
可以看到在没有进行我们数据的微调前,原模型是能够输出有逻辑的回复,并且也不会认为他是我们特有的小助手。因此我们可以很明显的看出两者之间的差异性。
Web demo 部署
除了在终端测试对话外,还可以在网页端的 demo 进行对话。
XTuner多模态训练与测试
多模态LLM原理简介
教程地址如下:
Tutorial/xtuner/llava/xtuner_llava.md at camp2 · InternLM/Tutorial (github.com)
文本单模态
文本+图像多模态
对比Finetune前后的性能差异
Finetune前:只会打标题
Finetune后:会回答问题了