《XTuner 微调 LLM:1.8B、多模态、Agent》课程笔记及作业
课程笔记
课程目录
为什么要微调:现在的大模型通常用于应对一般性任务,当面对特定下游任务时,表现通常不如特定领域专用工具,因此需要面对特定下游领域进行微调
微调范式包括增量预训练微调和指令跟随微调,增量预训练只需要给普通数据,例如文章、书籍等即可,指令跟随微调则需要高质量的对话和问答数据
微调数据处理流程
步骤一:将原始数据处理成标准格式数据,例如json格式文件
步骤二:添加对话模版
包括起止符
微调方案,基座模型不变,在此基础上微调出一个LoRA 模型,原因是此方法显存开销更小,不需要调整整个模型
三种微调方法比较,全参数微调、LoRA微调和QLoRA微调
XTuner以配置文件形式封装了大部分微调场景,支持消费级显卡
XTuner数据引擎内置了多种数据集映射函数和对话模版映射函数,可以自动进行数据集和对话模版映射,让开发者不必花费精力处理复杂的数据格式
XTuner使用了两种微调方法,Flash Attention是默认开启的, DeepSpeed ZeRO可以指定开启
多模态LLM原理:将文本和图像同时输入给LLM,将文本单模态模型微调成文本+图像多模态模型的过程,其实就是训练Image Projector
LLaVa方案,类似LoRA微调方案,在已有LLM的基础上,用新的数据训练一个新的组成部分,结合到原有LLM基础上
LLaVA过程,分为两个阶段:1、Pretrain阶段,训练数据为图像和描述图像的短文本组成的图像-文本对,将其输入到文本单模态LLM中进行训练,得到Pretrained LLaVA模型,类似增量预训练阶段 2、微调数据为图像和复杂对话文本组成的图像-文本对,对 Pretrained LLaVA进行微调,得到Finetuned LLaVA模型,相当于指令微调阶段
作业
作业一:训练自己的小助手认知
准备数据集
利用如下python程序生成数据集
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)
修改配置文件后进行训练
训练后的部分结果文件
模型转换的本质其实就是将原本使用 Pytorch 训练出来的模型权重文件转换为目前通用的 Huggingface 格式文件,转换完成后,可以看到模型被转换为 Huggingface 中常用的 .bin 格式文件,这就代表着文件成功被转化为 Huggingface 格式了。
我们通过视频课程的学习可以了解到,对于 LoRA 或者 QLoRA 微调出来的模型其实并不是一个完整的模型,而是一个额外的层(adapter)。那么训练完的这个层最终还是要与原模型进行组合才能被正常的使用。整合完成后可以查看在 final_model 文件夹下的内容。
经过上述步骤后,就可以对微调后的模型进行对话测试了,如图是对话测试运行结果(这里因为发生了过拟合,所以模型会不停重复之前的话)
和微调之前的模型结果进行对比
可以看到在没有进行本次的数据微调前,原模型是能够输出有逻辑的回复,并且也不会认为他是我们特有的小助手。因此我们可以很明显的看出两者之间的差异性。
作业二:多模态微调
微调前
微调后