arXiv | https://arxiv.org/abs/2403.13372
GitHub | https://github.com/hiyouga/LLaMA-Factory
AutoDL 镜像 | https://www.bilibili.com/video/BV1a3aQeuEou/?vd_source=24d4d4da4ef3f2f6e5fac26ffedb510c
摘要:
高效微调对于将大型语言模型(LLMs)适应下游任务至关重要。然而,在不同模型上实现这些方法需要付出不小的努力。我们提出了 LLAMAFACTORY ,一个集成了多种前沿高效训练方法的统一框架。它通过内置的 Web 界面 LLAMABOARD,为灵活定制 100 多种 LLMs 的微调提供了无需编码的解决方案。我们在语言建模和文本生成任务上实证验证了该框架的效率和有效性。
一、引言
大型语言模型(LLMs)展现出卓越的推理能力,并赋能了广泛的应用,如问答系统、机器翻译以及信息抽取。在资源有限的情况下微调极大量的参数 ,成为将LLM适应下游任务的主要挑战。我们开发了 LLAMAFACTORY 框架,该框架旨在普及大型语言模型(LLMs)的微调过程。通过可扩展模块统一多种高效微调方法,LLAMAFACTORY 使得在资源有限的情况下也能以高吞吐量对数百种LLMs进行微调。此外,该框架简化了常用的训练方法,包括生成式预训练 、监督式微调(SFT) 、基于人类反馈的强化学习(RLHF)以及直接偏好优化(DPO) 。用户可通过命令行或网页界面,以极少甚至无需编写代码的方式,定制并微调其LLMs。
其他针对特定目的调整LLM的框架:
- LLaMAAdapter 采用零初始化注意力机制,高效地对 Llama 模型进行微调。
- FastChat 是一个专注于训练和评估用于聊天完成任务的 LLM 的框架。
- LitGPT 提供了生成模型的实现,并支持多种训练方法。
- Open-Instruct 提供了训练指令模型的方案。
- Colossal AI 采用了先进的并行策略进行分布式训练。
- LMFlow 持为特定领域或任务训练 LLM。
- GPT4All 使得 LLM 能够在消费级设备上运行,同时提供微调功能。

二、高效的微调技术
高效的LLM微调技术可分为两大类:一类侧重于优化,另一类旨在计算。高效优化技术 的主要目标是在最小化成本的同时微调LLM的参数。另一方面,高效计算方法则致力于减少LLM所需计算的时间或空间。

2.1 高效优化
**冻结调优(Freeze-tuning):**冻结大部分参数,同时在小部分解码器层中微调剩余参数。
**梯度低秩投影(GaLore):**将梯度投影到低维空间,以内存高效的方式促进全参数学习。类似地,BAdam 利用块坐标下降(BCD)来高效优化大量参数。
**低秩适应(LoRA):**冻结所有预训练权重,并在指定层引入一对可训练的低秩矩阵。
- **QLoRA:**与量化结合时,进一步减少了内存使用。
- **DoRA:**将预训练权重分解为幅度和方向分量,并更新方向分量以提高性能。
- **LoRA+:**克服 LoRA 的次优性。
- **PiSSA:**使用预训练权重的主成分初始化适配器,以实现更快的收敛。
2.2 高效计算
常用的技术包括混合精度训练(mixed precision training)和激活检查点(activation checkpointing)。
**Flash attention:**通过对注意力层输入输出(IO)成本的分析,一种硬件友好的方法来增强注意力计算。
**S2 attention:**通过移位稀疏注意力解决了长上下文挑战,从而减少了长上下文大语言模型(LLMs)微调中的内存使用。
**量化策略:**通过使用低精度表示权重,降低了大语言模型(LLMs)的内存需求。 然而,量化模型的微调仅限于基于适配器的技术,如 LoRA。
**Unsloth:**结合了 Triton 来实现 LoRA 的反向传播,从而减少了梯度下降过程中的浮点运算(FLOPs),并加速了LoRA的训练。
三、LLAMAFACTORY 框架
LLAMAFACTORY由三个主要模块构成:模型加载器(Model Loader) 、数据处理器(Data Worker)和训练器(Trainer)。
- **模型加载器:**负责操作多种模型架构以适应微调需求,既支持大型语言模型(LLMs),也支持视觉语言模型(VLMs)。
- **数据处理器:**通过精心设计的流程处理来自不同任务的数据,兼容单轮对话与多轮对话场景。
- **训练器:**针对不同的训练方法应用高效的微调技术,涵盖预训练、指令调优及偏好优化等领域。

3.1 模型加载器 Model Loader
3.1.1 模型初始化 Model Initialization
利用 Transformers 的 Auto Classes 加载预训练模型并初始化参数:
- 使用 AutoModelForVision2Seq 类加载视觉语言模型;
- 使用 AutoModelForCausalLM 类加载其余模型;
- 分词器与模型一同通过 AutoTokenizer 类加载。
在分词器的词汇表大小超过嵌入层容量的情况下,我们会调整该层大小,并以噪声均值初始化新参数。为了确定RoPE缩放的比例因子,我们将其计算为最大输入序列长度与模型上下文长度之比。
3.1.2 模型修补 Model Patching
- **S2 attention:采用了一种猴子补丁(monkey patch)**技术来替换模型的前向计算过程。
- **Flash attention:**直接使用了原生类,因为自 Transformers 4.34.0 版本以来,该功能已得到广泛支持。
为了防止动态层过度分割,在 DeepSpeed ZeRO 第三阶段下优化混合专家(MoE)模型时,我们将MoE块设置为叶模块。
3.1.3 模型量化 Model Quantization
通过 bitsandbytes 库实现通过 LLM.int8 动态地将模型量化为8位或4位。对于4位量化,我们采用双量化和4位正态浮点数,如 QLoRA 所述。
我们还支持对**通过训练后量化(PTQ)**方法量化的模型进行微调,包括GPTQ、AWQ 和 AQLM。需要注意的是,我们无法直接对量化后的权重进行微调,因此量化后的模型仅适用于基于适配器的方法。
3.1.4 适配器附加 Adapter Attaching
通过遍历模型层自动识别合适的层以附加适配器。
- 低秩适配器被附加到所有线性层,以实现更好的收敛。PEFT 库提供了一种极其便捷的方式来实现基于适配器的方法,如LoRA、rsLoRA、DoRA 和 PiSSA。我们使用 Unsloth 的反向计算来替换原有的计算,以加速训练。
- 为了执行基于人类反馈的强化学习(RLHF),在 Transformer 模型的顶部附加了一个价值头层,将每个标记的表示映射为一个标量。
3.1.5 精度适配 Precision Adaptation
根据计算设备的能力处理预训练模型的浮点精度。
- 对于 NVIDIA GPU,如果计算能力为 8.0 或更高,则采用 bfloat16 精度;否则采用float16。
- 对于 昇腾Ascend NPU 和 AMD GPU,采用 float16。
- 对于非 CUDA 设备,则采用 float32。
在混合精度训练中,为了训练稳定性,我们将所有可训练参数设置为float32。然而,在半精度训练中,我们仍将可训练参数保留为bfloat16。
3.2 数据处理器 Data Worker
3.2.1 数据集加载 Dataset Loading
利用 Datasets 库来加载数据,该库允许用户从 Hugging Face Hub 加载远程数据集,或通过脚本或文件读取本地数据集。Datasets 库显著减少了数据处理过程中的内存开销,并利用 Arrow 加速了样本查询。
默认情况下,整个数据集会被下载到本地磁盘。然而,如果数据集过大而无法存储,我们的框架提供了数据集流式处理功能,可以在不下载的情况下对其进行迭代。
3.2.2 数据集对齐 Dataset Aligning
为了统一数据集格式,我们设计了一种数据描述规范来表征数据集的结构,根据数据描述规范将数据集转换为兼容多种任务的标准结构。

3.2.3 数据集合并 Dataset Merging
统一的数据集结构为合并多个数据集提供了一种高效的方法。非流式模式 下的数据集,我们只需在训练期间对数据集进行洗牌之前将它们连接起来。流式模式下,简单地连接数据集会阻碍数据的洗牌。因此,我们提供了交替读取不同数据集数据的方法。
3.2.4数据集预处理 Dataset Pre-processing
LLAMAFACTORY 旨在微调文本生成模型,主要用于聊天完成 。聊天模板 是这些模型中的关键组成部分,因为它与这些模型的指令遵循能力高度相关。因此,我们提供了数十种聊天模板,可以根据模型类型自动选择。我们在应用聊天模板后使用分词器对句子进行编码。默认情况下,我们仅计算完成部分 的损失,而忽略提示部分 。可选地,我们可以利用序列打包来减少训练时间,该功能在执行生成预训练时会自动启用。
3.3 训练器 Trainer
3.3.1 高效训练 Efficient Training
将最先进的微调方法,包括 LoRA+、GaLore 和 BAdam,通过替换默认组件集成到训练器中。这些微调方法独立于训练器,使其易于应用于各种任务。
-
利用 Transformers 的训练器进行预训练和 SFT
-
采用 TRL 的训练器进行 RLHF 和 DPO。
-
从 TRL 库中引入了先进的偏好优化方法的训练器,如 KTO 和 ORPO。为了匹配偏好数据训练器的输入格式,我们在一个批次中构建 2n 个样本,其中前 n 个样本为被选中的示例,后 n 个样本为被拒绝的示例。
3.3.2 模型共享 RLHF
提出了模型共享 RLHF 方法,使得整个 RLHF 训练过程仅需不超过一个预训练模型即可完成。
- 首先针对奖励建模的目标函数训练一个适配器 和一个价值头,使模型能够计算奖励分数。
- 随后初始化另一个适配器和价值头,并利用 PPO 算法对其进行训练。在训练过程中,通过 PEFT 的 set_adapter 和 disable_adapter 方法动态切换适配器和价值头,使得单个预训练模型能够同时充当策略模型、价值模型、参考模型和奖励模型。
3.3.3 分布式训练 Distributed Training
可以将上述训练器与 DeepSpeed 结合使用,以实现分布式训练。采用数据并行策略,以充分利用计算设备的能力。通过利用 DeepSpeed 的 ZeRO 优化器,内存消耗可以通过分区或卸载进一步减少。
3.4 实用工具 Utilities
3.4.1 模型推理 Model Inference
在推理阶段,我们复用数据工作者的聊天模板来构建模型输入。我们支持使用Transformers(Wolf等,2020)和vLLM(Kwon等,2023)对模型输出进行采样,两者均支持流式解码。此外,我们实现了一个OpenAI风格的API,该API利用vLLM的异步LLM引擎和分页注意力机制,以提供高吞吐量的并发推理服务,从而促进将微调后的LLM部署到各种应用中。
3.4.2 模型评估 Model Evaluation
**多向选择题任务:**MMLU、CMMLU 和 C-Eval
**计算文本相似度分数:**BLEU-4、ROUGE
3.5 LLAMABOARD
LLAMABOARD 是一个基于 Gradio 的统一用户界面,允许用户在不编写任何代码的情况下自定义大型语言模型(LLMs)的微调。
**简易配置:**能够通过与网页界面的交互来自定义微调参数。我们为大多数用户推荐的大多数参数提供了默认值,从而简化了配置过程。此外,用户可以在网页用户界面上预览数据集以进行验证。
**可监控的训练过程:**在训练过程中,训练日志和损失曲线会实时可视化并更新,使用户能够监控训练进度。这一功能为分析微调过程提供了有价值的见解。
**灵活评估:**支持在数据集上计算文本相似度分数,以自动评估模型,或通过与模型对话进行人工评估。
**多语言支持:**提供本地化文件,便于集成新语言以渲染界面。目前我们支持三种语言:英语、俄语和中文,这使得更广泛的用户能够利用LLAMABOARD进行大语言模型的微调。
四、实证研究
4.1 训练效率
**数据:**PubMed 数据集,包含超过3600万条生物医学文献记录。我们从文献摘要中提取了约 40 万个 tokens 以构建训练语料库。
**模型:**Gemma-2B、Llama2-7B、Llama2-13B
**微调方法:**全参数微调(full-tuning)、冻结微调(freeze-tuning)、GaLore、LoRA、4-bit QLoRA
**评估指标:**困惑度(perplexity)
**参数设置:**学习率为 10^-5,标记批量大小为 512,使用 8-bit AdamW 优化器在bfloat16精度下进行微调,并启用激活检查点以减少内存占用。
- 冻结微调:仅微调模型的最后3个解码器层。
- GaLore:将其秩(rank)和缩放因子(scale)分别设置为 128 和 2.0。
- LoRA、QLoRA:在所有线性层上附加适配器(adapters),并将秩和alpha分别设置为 128 和 256。
在所有实验中启用了Flash Attention,并在LoRA和QLoRA实验中使用了Unsloth优化。
**设备:**NVIDIA A100 40GB GPU

"内存 Memory"指训练期间消耗的峰值内存;
"吞吐量 Throughput"按每秒训练的令牌数计算;
"PPL"表示模型在训练语料上的困惑度。
- QLoRA 始终具有最低的内存占用,这是因为预训练权重以较低精度表示。
- LoRA 通过 Unsloth 在 LoRA 层上的优化展现了更高的吞吐量。
- GaLore 在大型模型上实现了更低的 PPL,而 LoRA 在较小模型上具有优势。
4.2 对下游任务的微调
**数据:**从三个具有代表性的文本生成任务中分别选取 2000 个样本作为训练集和 1000 个样本作为测试集,这些任务包括 CNN/DM、XSum、AdGen。
**模型:**Gemma-2B、Llama2-7B、Llama2-13B
**微调方法:**全参数微调(full-tuning)、GaLore、LoRA、4-bit QLoRA
**评估指标:**ROUGE 分数
**参数设置:**学习率为 10^-5,批量大小设为4,最大输入长度设为2048,使用 8-bit AdamW 优化器在bfloat16精度下进行微调,并启用激活检查点以减少内存占用。
- GaLore:将其秩(rank)和缩放因子(scale)分别设置为 128 和 2.0。
- LoRA、QLoRA:在所有线性层上附加适配器(adapters),并将秩和alpha分别设置为 128 和 256。
在所有实验中启用了Flash Attention,并在LoRA和QLoRA实验中使用了Unsloth优化。
**设备:**NVIDIA A100 40GB GPU

- 除了在 CNN/DM 和 AdGen 数据集上的 ChatGLM3-6B 和 Llama2-7B 模型外,LoRA 和 QLoRA 在大多数情况下表现最佳。
- Llama3-8B 在这些模型中表现最佳,而 Yi-6B 和 Mistral-7B 在相同规模的模型中表现出竞争力。
oth优化。
**设备:**NVIDIA A100 40GB GPU
[外链图片转存中...(img-QqVS0Epf-1739195233067)]
- 除了在 CNN/DM 和 AdGen 数据集上的 ChatGLM3-6B 和 Llama2-7B 模型外,LoRA 和 QLoRA 在大多数情况下表现最佳。
- Llama3-8B 在这些模型中表现最佳,而 Yi-6B 和 Mistral-7B 在相同规模的模型中表现出竞争力。