XTuner大模型单卡低成本微调实战
XTuner大模型单卡低成本微调实战
by 汪周谦 | XTuner社区贡献者 (目前致力于使用大语言模型与CV模型构建多模态的诊疗体系的研究)
1. Finetune简介
LLM的下游应用中,增量预训练和指令跟随是经常会用到的两种微调模式。
增量预训练
使用场景:让基座模型学习到一些新知识,如某个垂类领域的常识。
训练数据:文章、书籍、代码等。
指令跟随
使用场景:让模型学会对话模版,根据人类指令进行对话。
训练数据:高质量的对话、问答数据。
海量预训练数据训出来一个base(pretrained)模型,在微调前并不能意识到你是在问一个问题,会单纯的去拟合训练数据集中的分布。需要通过pretrained方式让模型知道我们的意图。通过指令微调可以获得instructed大模型。
指令跟随微调
指令跟随微调是为了得到能够实际对话的LLM
介绍指令跟随微调前,需要先了解如何使用LLM进行对话
在实际对话时,通常会有三种角色
- System 给定一些上下文信息,比如“你是一个安全的AI助手”
- User 实际用户,会提出一些问题,比如“世界第一高峰是?”
- Assistant 根据User的输入,结合System的上下文信息,做出回答,比如“珠穆拉玛峰”
在使用对话模型时,通常是不会感知到这三种角色的
指令跟随微调
对话模板
对话模板是为了能够让LLM区分出,System、User和Assistant
不同的模型会有不同的模板
LlaMa
- <> System上下文开始
- <> System上下文结束
- [INST] User指令开始
- [/INST] User指令结束
InternLM
- <|System|> :System上下文开始
- <|User|> :User指令开始
- :End of Human,User指令结束
- <|Bot|> :Assistant开始回答
- :End of Assistant,Assistant回答结束
指令跟随微调
不同于增量预训练微调,数据中会有Input和Output希望模型学会的是答案(Output),而不是问题(Input)训练时只会对答案(Output)部分计算Loss。
训练时,会和推理时保持一致,对数据添加相应的对话模板。
增量预训练微调
为了让LLM知道什么时候开始一段话,什么时候结束一段话,实际训练时需要对数据添加起始符(BOS)和结束符(EOS);大多数的模型都是使用作为起始符,作为结束符。
LoRA & QLoRA
LoRA:LOW-RANK ADAPATION OF LARGE LANGUAGE MODELS
LLM的参数量主要集中在模型中的Linear,训练这些参数会耗费发亮的显存。
LoRA通过在原本的Linear旁,新增一个支路,包含两个连续的小Linear,新增的这个支路通常叫做Adapter。
Adapter参数量远小于原本的Linear,能大幅度降低训练的显存消耗。
LoRA & QLoRA
- Full Finetuning(No Adapters):
- Base Model参与训练并更新参数;
- 需要保存Base Model中参数的优化器状态;
- LoRA:
- Base Model只参与Forward;
- 只有Adapter部分Backward更新参数;
- 只需保存Adapter中参数的优化器状态;
- QLoRA:
- Base Model量化为4-bit;
- 优化器状态在CPU与GPU间Offload;
- Base Model只参与Forward;
- 只有Adapter部分Backward更新参数;
- 只需保存Adapter中参数的优化器状态;
2. XTuner介绍
- 傻瓜化:以配置文件的形式封装了大部分微调场景,0基础的非专业人员也能一键开始微调。
- 轻量级:对于7B参数量的LLM,维泰所需的最小显存仅为8GB:消费级显卡,colab。
XTuner简介
功能亮点
- 适配多种生态:
- 多种微调算法:多种微调策略与算法,覆盖各类SFT场景;
- 适配多种开源生态:支持加载HuggingFace、ModelScope模型或数据集;
- 自动优化加速:开发者无需关注复杂的显存优化与计算加速细节;
- 适配多种硬件:
- 训练方案覆盖NVIIDA 20系以上的所有显卡;
- 最低只需8GB显存即可微调7B模型。
XTuner快速上手
- 安装
pip install xtuner
- 挑选配置模版
xtuner list-cfg -p internlm_20b
- 一键训练
xtuner train internlm_20b_qlora_oasst1_512_e3
Config命名规则
模型名:Internlm_20b 无chat代表是基座模型
使用算法:qlora
数据集:oasst1
数据长度:512
Epock:e3,epoch 3
自定义训练
- 拷贝配置模版
xtuner copy-cfg internlm_20b_qlora_oasst1_512_e3 ./
- 修改配置模版
vi internlm_20b_qlora_oasst1_512_e3_copy.py
- 启动训练
xtuner train internlm_20b_qlora_oasst1_512_e3_copy.py
常用超参
data_path: 数据路径或HuggingFace仓库名。
max_length: 单条数据最大Token数,超过则截断。
pach_to_max_length: 是否将多条短数据拼接到max_length,提高GPU利用率。
accumulative_counts:梯度累积,每多少次backward更新一次参数。
evaluation_inputs: 训练过程中,会根据给定的问题进行推理,便于观测训练状态。
evaluation_freq: Evaluation的评测间隔iter数。
对话
为了便于开发者查看训练效果,XTuner提供了一键对话接口。
Float16 模型对话
xtuner chat internlm/internlm-chat-20b
4bit 模型对话
xtuner chat internlm/internlm-chat-20b --bits 4
加载Adapter模型对话
xtuner chat internlm/internlm-chat-20b --adapter $ADAPTER_DIR
XTuner还支持工具类模型的对话,更多详见HuggingFace(xtuner/Llama-2-7b-qlora-moss-003-sft)类似于GPT中的plugin
XTuner数据引擎
数据处理流程
数据集映射函数:XTuner内置了多种热门数据集的映射函数。
对话模板映射函数:XTuner内置了多种对话模板映射函数。
开发者可以专注于数据内容,不必花费精力处理复杂的数据格式!
多数据样本拼接(Pack Dataset)
增强并行性,充分利用GPU资源!
- 拷贝配置模板
xtuner copy-cfg internlm_20b_qlora_alpaca_e3 ./
- 修改配置模板
iv internlm_20b_qlora_alpaca_e3_copy.py
- 启动训练
xtuner train internlm_20b_qlora_alpaca_e3_copy.py
3. 8GB显卡玩转LLM
Flash Attention和DeepSpeed ZeRO是XTuner最重要的两个优化技巧。
Flash Attention
Flash Attention将Attention计算并行化,避免了计算过程中Attention Score NxN的显存占用(训练过程中的N都比较大)
DeepSpeed ZeRO
ZeRO优化,通过将训练过程中的参数、梯度和优化器状态切片保存,能够在多GPU训练时显著节省显存。
除了将训练中状态切片外,DeepSpeed训练时使用FP16的权重,相较于Pytorch的AMP训练,在单GPU上也能大幅节省显存。
DeepSpeed和Flash Attention虽然能够大幅降低训练成本,但使用门槛相对较高,需要复杂的配置,甚至修改代码。
XTuner会自动dispatch Flash Attention,并一键启动DeepSpeed ZeRO。
xtuner train internlm_20b_qlora_oasst1_512_e3 \ --deepspeed deepspeed_zero3