LLM微调方法热门对比榜单
LLM微调技术全解析:7种主流方法及叠加策略详解
进入正题前,先理清几个关键判断。本文系统梳理当前主流的LLM微调技术,涵盖量化、LoRA、Unsloth、SFT、ORPO、DPO和GA-LoRA七种方法。其中部分技术可组合使用,例如量化与LoRA融合即形成QLoRA,后续会深入拆解。
一、量化(Quantization)
为降低资源消耗,微调阶段可将模型参数转换为低精度数据类型(如8位或4位),从而显著减少内存占用并加速计算。核心逻辑很简单:将32位的全部可能值映射到更小范围的有限集合(例如8位表示256个不同值)。这一过程相当于将高精度数值围绕若干固定点聚类,每个固定点代表其周围的数值。
关于量化的对比此前已有大量文章,本文不再重复。今天聚焦一个实际痛点:Q-LoRA与先训练FP-16的LoRA再通过GPTQ量化,两者究竟有何本质区别?
Q-LoRA:量化和低秩适应(LoRA)同步执行。模型以4bit加载,训练时将数值反量化回bf16进行计算。最终存储的模型是4bit格式,但计算时临时还原至bf16精度。目标是在参数效率与模型性能之间取得平衡。
先LoRA微调再GPTQ量化:先对FP-16模型进行LoRA微调,针对特定任务优化性能,再对已微调模型应用GPTQ量化,压缩模型体积、降低计算需求,提升推理速度。
两者在流程和侧重上差异明显。Q-LoRA试图在量化引入的信息损失与LoRA微调带来的增益之间找到折中点;而先LoRA后GPTQ的路径,通常需要在量化后用额外微调弥补性能损失。目前Hugging Face上两种方案均存在,选型取决于实际应用场景。
二、LoRA
LoRA通过矩阵降维技术实现模型权重的更新。大型语言模型(LLM)中广泛使用的Transformer结构高度依赖矩阵运算,因此该技术极具实用价值。
传统微调更新权重时,需调整矩阵内部参数。概念上,这一调整可表示为向原始矩阵添加更新矩阵:W’ = W + ΔW。LoRA的做法是将更新矩阵分解为两个较小的矩阵,两者相乘可近似还原更新矩阵。微调过程中,LoRA直接创建这两个小矩阵进行相乘,而非先构造再分解。
LoRA的核心优势在于:近似结果精度略有降低,但内存和计算效率大幅提升。举例来说,一个1000×1000的矩阵含100万个参数,分解为1000×100和100×1000两个矩阵后,参数量降至2×100k,降幅达80%。
LoRA相关介绍已有很多,此处不赘述。强调一点:量化与LoRA常组合使用,形成QLoRA。当前主流Q-LoRA实现基于bnb量化。
三、Unsloth
Unsloth是一个Python库,专为LLM微调过程提供多种优化方案。支持Mistral、Llama 3、Gemma等主流模型。共有三个版本,Free版针对单GPU,后续讨论基于该开源版本。
主要特性:LLM微调速度提升2–5倍,内存占用减少80%,兼容2018年以来的NVIDIA GPU(从Tesla T4到H100),遵循Apache-2.0开源许可。
关键点:Unsloth并非替代现有微调方法,而是在其基础上进一步提效降本。因本文此前未介绍Unsloth,此处展开说明。
先看模型加载部分的代码实现,直观清晰:
from unsloth import FastLanguageModel
import torch
max_seq_length = 2048
dtype = None
load_in_4bit = True
model, tokenizer = FastLanguageModel.from_pretrained(
model_name = "unsloth/llama-3-8b-bnb-4bit",
max_seq_length = max_seq_length,
dtype = dtype,
load_in_4bit = load_in_4bit,
)
显存开销如下图所示。
设置LoRA配置时,比普通LoRA多一个参数——use_gradient_checkpointing = "unsloth"。该参数能使显存使用减少30%,批次规模扩大2倍。
model = FastLanguageModel.get_peft_model(
model,
r = 16,
target_modules = ["q_proj", "k_proj", "v_proj", "o_proj",
"gate_proj", "up_proj", "down_proj"],
lora_alpha = 16,
lora_dropout = 0,
bias = "none",
use_gradient_checkpointing = "unsloth",
random_state = 3407,
use_rslora = False,
loftq_config = None,
)
数据准备部分与标准Alpaca格式一致,务必添加EOS_TOKEN,否则生成会无限持续。
定义Trainer时,使用SFTTrainer配合TrainingArguments,参数设置相当标准。训练仅耗时54秒完成,从内存占用看,资源控制表现优秀。
保存模型后进行推理验证。加载模型时需设置FastLanguageModel.for_inference(model)以启用2倍原生推理加速。观察推理结果,回答准确且详细。但需注意,中文提问的准确率低于英文提问。
四、SFT
有监督微调(Supervised Fine-Tuning,SFT)是一个广义概念,涵盖多种微调策略,旨在优化模型在特定任务上的表现。这些方法包括但不限于:
全量微调:最直接的微调方式,调整预训练模型所有参数。虽需大量计算资源,但能在新任务上达到最佳性能。
参数高效微调(PEFT):旨在降低微调计算开销,同时尽量保持或提升模型性能。技术包括Adapter模块、Prompt Tuning、BitFit、差分学习率、重参数化和LoRA等。
因此,SFT是一个包含全量微调和PEFT的更大框架。开发者可根据需求、计算资源和性能目标灵活选择最合适的策略。
通俗理解Adapter与LoRA的区别:
把预训练模型想象成一辆车,不同任务对应不同赛道。Adapter和LoRA是让车适应新赛道的两种方式,但做法截然不同。
Adapter:如同给车加装专用配件或调节装置,比如更换特制轮胎或调整引擎设置。车的主体结构保持不变,靠新增的小配件适应新环境。
LoRA:更像是对车内现有机械部件进行重新配置,而非加装新零件——调整引擎或传动系统的组件,使它们以更高效率运行。
总结:Adapter像加装专为新环境设计的小配件,LoRA则是对现有部件进行精细化调校。
五、比值比偏好优化(ORPO)
2024年3月提出的优势比偏好优化(ORPO)方法,将监督微调与偏好调整合二为一。受篇幅所限,具体内容将在后续文章中详细展开。
六、DPO
LLM训练中,人类反馈强化学习(RLHF)常采用近端策略优化(PPO),能有效对齐模型行为与人类偏好。但RLHF过程既不稳定又复杂。
DPO(Direct Preference Optimization)直接偏好优化需要两个模型:一个用SFT在指令数据集上精调得到的参考模型,另一个是待训练的基础模型。相比RLHF,DPO省去了奖励模型和价值模型,流程更简洁稳定。
七、GA-LoRA
GaLore(Gradient Low-Rank)通过低秩投影提升训练过程中的内存效率,同时允许模型全部参数参与学习和更新。这与典型的PEFT方法不同——PEFT通常仅微调模型一部分参数,而GaLore对梯度进行低秩投影以节省内存,但仍实现全参数更新。
因此,GaLore可视为介于全量微调和PEFT之间的策略。它通过低秩投影技术优化内存使用,而非限制参数更新范围。这意味着即使参数规模庞大的模型,也能在普通消费级硬件上完成全量微调,且不牺牲性能。实践中,GaLore能够在消费级硬件上实现7B LLM的预训练和全面微调。