目录
1.增量预训练(Incremental Pretraining)
2. 指令微调(Instructional Fine-tuning)
1. 指令微调(Instructional Fine-tuning)
2. 增量预训练(Incremental Pretraining)
2. 三种模式的对比Full Finetuning、LoRA、QLoRA
①. XTuner两个优化技巧Flash Attention和 DeepSpeedZeRO
一、Finetune简介
①微调中在中小型应用中常用的训练数据处理的两种模式介绍:
图解:
1.增量预训练(Incremental Pretraining):
增量预训练是一种微调模式,它通过逐步添加新的层或参数来扩展预训练模型。在增量预训练中,首先使用预训练模型在新任务的数据集上进行初步训练,然后逐层或逐步添加新的层或参数,并继续训练模型。这种微调模式适用于具有相似任务特征的不同数据集,可以有效地利用预训练模型的已有知识,提高模型的泛化能力。
使用场景:让基座模型学习到一些新知识,如某个垂类领域的常识训练数据:文章、书籍、代码等
2. 指令微调(Instructional Fine-tuning):
指令微调是一种微调模式,它通过将预训练模型与特定任务的指令相结合来进行训练。在指令微调中,首先使用预训练模型在新任务的数据集上进行初步训练,然后使用特定任务的指令(如文本描述、图像标签等)来指导模型进行进一步的训练。这种微调模式适用于具有明确任务目标的新数据集,可以有效地利用预训练模型的已有知识,并利用特定任务的指令来提高模型的性能。
使用场景:让模型学会对话模板,根据人类指令进行对话训练数据:高质量的对话、问答数据
指令微调的图解样例:
②微调的在中小型应用中常用的两种模式工作流程
1. 指令微调(Instructional Fine-tuning):
一个问题一个回答
-
a. 模型内部角色的指定及其对话模板的角色构建
![我们使用大模型看到的界面](https://i-blog.csdnimg.cn/blog_migrate/47c28cd7263e60969d5f665aac071c60.png)
![大模型内部的流程:](https://i-blog.csdnimg.cn/blog_migrate/4312b385df426956210936262af85940.png)
对话模板:为了让模型可以识别出system、user、assistant
- 下图是不同模型的模板:
-
b. 构建的数据输入模型计算Loss然后微调
流程如下图所示:
2. 增量预训练(Incremental Pretraining):
陈述句式
a. 增量预训练的流程类似指令微调,不同之处是不需要system和user这两个“角色”。
二、XTuner介绍
①XTuner的基本介绍
1. 高效的数据引擎
XTuner 适配了多个热门开源数据集格式,开发者如已有对应格式的数据集,可以直接使用,并支持多种格式数据源的混合使用:
- Alpaca 格式,斯坦福大学开源数据集的格式,也是社区开源项目使用较多的一种格式
- MOSS 格式,复旦大学开源指令微调数据集的格式,包含多轮对话和工具调用
- Gunacao 格式,QLoRA 项目中所使用数据集的格式
- OpenAI 格式,GPT-3.5-Turbo Finetune 接口要求的数据集格式
2.多种训练引擎
XTuner 首次尝试将 HuggingFace 与 OpenMMLab 进行结合,兼顾易用性和可配置性。支持使用 MMEngine Runner 和 HuggingFace Trainer 两种训练引擎,开发者如有深度定制化需求,可根据使用习惯灵活配置。
pip install xtuner
# 使用 MMEngine Runner 训练
xtuner train internlm_7b_qlora_oasst1_e3
# 使用 HugingFace Trainer 训练
xtuner train internlm_7b_qlora_oasst1_e3_hf
3.一键启动训练
XTuner 内置了增量预训练、单轮&多轮对话指令微调、工具类指令微调的标准化流程,让开发者只需聚焦于数据本身。
同时, XTuner 集成了 QLoRA、DeepSpeed 和 FSDP 等技术,提供各种尺寸模型在各种规格硬件下的训练解决方案,通过XTurner一键式启动训练,仅需8GB显存即可微调7B模型。
pip install 'xtuner[deepspeed]'
# 8G 显存微调 Llama2-7B
xtuner train llama2_7b_qlora_oasst1_512_e3 --deepspeed deepspeed_zero2
详细简介如图:
②XTuner中的两种微调原理LoRA和QLoRA
1. LORA的原理
LoRA通过在原本的Linear旁,新增一个支路,包含两个连续的小Linear,新增的这个支路通常叫做Adapter(LORA)
Adapter参数量远小于原本的 Linear,能大幅降低训练的显存消耗。
课程中老师的描述挺形象的:
想象一下,你有一个超大的玩具,现在你想改造这个超大的玩具。但是,对整个玩具进行全面的改动会非常昂贵。
①因此,你找到了一种叫 LoRA 的方法:只对玩具中的某些零件进行改动,而不是对整个玩具进行全面改动。
② 而 QLoRA 是 LoRA 的一种改进:如果你手里只有一把生锈的螺丝刀,也能改造你的玩具。
2. 三种模式的对比Full Finetuning、LoRA、QLoRA
三、8GB显卡玩转LLM
①. XTuner两个优化技巧Flash Attention和 DeepSpeedZeRO
1. Flash Attention
Flash Attention将Attention计算并行化,避免了计算过程中Attention Score NxN的显存占用(训练过程中的N都比较大)。
2. DeepSpeed ZeRO:
ZeRO优化,通过将训练过程中的参数、梯度和优化器状态切片保存,能够在多GPU训练时显著节省显存,除了将训练中间状态切片外,DeepSpeed 训练时使用FP16的权重,相较于Pytorch的AMP训练,在单GPU上也能大幅节省显存。
其并非自动启动需要加 --deepspeed deepspeed zero3
QLoRA后面加上 --deepspeed deepspeed zero2
xtuner train internlm_20b_qlora__oasst1_512_e3 --deepspeed deepspeed zero3
四、动手实战环节
模型微调的流程看官方的文档超详细:xtuner单卡微调
①大模型微调样例1
下载了三个多小时终于下好了
1. 将得到的 PTH 模型即LoRA模型文件转换为 HuggingFace 模型
2. 将 HuggingFace adapter 合并到大语言模型
3. 与合并后的模型对话:
注意:prompt-template后的参数需要根据自己选择的底座模型进行更改
可以使用xtuner chat --help参看
# 加载 Adapter 模型对话(Float 16)
xtuner chat ./merged --prompt-template internlm_chat
4. 微调和测试效果
②微调一个属于自己的大模型
1. 符合大模型微调格式的数据集
创建data
文件夹用于存放用于训练的数据集
mkdir -p /root/personal_assistant/data && cd /root/personal_assistant/data
使用脚本生成正确格式的数据集
import json
# 输入你的名字
name = 'Shengshenlan'
# 重复次数
n = 10000
data = [
{
"conversation": [
{
"input": "请做一下自我介绍",
"output": "我是{}的小助手,内在是上海AI实验室书生·浦语的7B大模型哦".format(name)
}
]
}
]
for i in range(n):
data.append(data[0])
with open('personal_assistant.json', 'w', encoding='utf-8') as f:
json.dump(data, f, ensure_ascii=False, indent=4)
2. 微调的配置文件
下载模型InternLM-chat-7B
InternStudio 平台的 share
目录下已经为我们准备了全系列的 InternLM
模型,可以使用如下命令复制internlm-chat-7b
:
mkdir -p /root/personal_assistant/model/Shanghai_AI_Laboratory
cp -r /root/share/temp/model_repos/internlm-chat-7b /root/personal_assistant/model/Shanghai_AI_Laboratory
下载配置文件
拷贝一个配置文件到当前目录:xtuner copy-cfg ${CONFIG_NAME} ${SAVE_PATH}
(注意最后有个英文句号,代表复制到当前路径)
xtuner copy-cfg internlm_chat_7b_qlora_oasst1_e3 .
修改配置文件即: 修改拷贝后的文件internlm_chat_7b_qlora_oasst1_e3_copy.py
训练模型
xtuner train /root/personal_assistant/config/internlm_chat_7b_qlora_oasst1_e3_copy.py
3. 将得到的 PTH 模型转换为 HuggingFace 模型
将得到的 PTH 模型转换为 HuggingFace 模型,即:生成 Adapter 文件夹
xtuner convert pth_to_hf ${CONFIG_NAME_OR_PATH} ${PTH_file_dir} ${SAVE_PATH}
例如:
成功标志如下:
将 HuggingFace adapter 合并到大语言模型:
xtuner convert merge ./internlm-chat-7b ./hf ./merged --max-shard-size 2GB
# xtuner convert merge \
# ${NAME_OR_PATH_TO_LLM} \
# ${NAME_OR_PATH_TO_ADAPTER} \
# ${SAVE_PATH} \
# --max-shard-size 2GB
例如:
4. 验证和测试
与合并后的模型对话:
# 加载 Adapter 模型对话(Float 16)
xtuner chat ./merged --prompt-template internlm_chat
# 4 bit 量化加载
# xtuner chat ./merged --bits 4 --prompt-template internlm_chat
到此为止我们得到了属于自己的专属模型
QAQ翻车,训练轮数太少,导致并没有安装咱设定好的来,不过也和原来的不一样。大家可以看一下下面的两张图片: 【建议大家多训练几轮,我由于怕数据多训练时间长把10000数据变为了1000,大家想要达到自己的预期效果请增加数据集和训练轮数】
原模型的回复:
毕竟是第一次生成专属自己的模型,所以我又重新跑了一遍
但是好像过拟合了,只会回答这一个问题了,哈哈,不过还是成功微调了!!!!