Hugging Face 的 PEFT 基准测试揭示,LoRA 虽是最流行的参数高效微调技术,但在图像生成等任务上并非最优。OFT 等方法在性能和内存占用上均超越 LoRA。PEFT 库提供统一 API,让用户轻松切换和比较不同技术,避免固守默认选项。
如果你想用自己的数据微调开源模型,大概率会用到所谓的参数高效微调(PEFT)。这类技术能显著降低微调所需的内存。尽管存在数十种方法,几乎所有人都会选择名为“LoRA”的技术。本文探讨 LoRA 是否真的最佳,有哪些工具可以帮助做出明智选择,以及如何拓展视野,从 LoRA 之外获益。
市面上的开源模型虽多,但往往无法直接满足你的需求。提示词(Prompt)或许能改善,但通常不够。与其从头训练,不如考虑微调现有模型。
但微调很耗内存:通常需要能装下整个模型数倍的内存。量化能减少模型足迹,但量化后的模型无法直接微调。于是出现了一类降低微调内存需求的技术,即参数高效微调(PEFT)。
借助 PEFT,你只需少量内存即可微调模型,甚至能微调量化模型。它还带来其他优势:微小的检查点体积、更强的抗灾难遗忘能力,以及基于同一基座模型服务多个微调版本。
Hugging Face 开发了 PEFT 库,它通过统一 API 实现了多种 PEFT 技术,并与生态(如 Transformers 和 Diffusers)深度集成。它同时支持多种量化方法,进一步提升参数高效微调的可及性。无论你想用自有数据微调,还是研究新的 PEFT 方法,PEFT 都是很好的起点。
早期出现且被证明相当有效的一种 PEFT 技术叫“低秩适应”(Low Rank Adaptation,简称 LoRA)。它在基座模型上添加少量参数,冻结基座权重,只训练这小部分参数。
在所有 PEFT 技术中,LoRA 遥遥领先。粗略统计如下:
from peft import <PEFT CONFIG>(示例查询),71.3% 的结果是 LoRA。第二名 LoHa(3.7%)和 AdaLoRA(3.5%)。虽不完美,但结论毋庸置疑:LoRA 是目前最常见的 PEFT 技术。
这可能说明 LoRA 对所有人都最佳,因此反映在统计数据中。但也有另一种可能:LoRA 是较早流行的方法,其使用形成了自我循环——它拥有最高可见度、最多的教程示例,以及最好的下游支持。因此 LoRA 的流行自我强化。
这引出一个问题:我们是否因为回避更优技术而留下了性能提升的空间? 毕竟无数研究者发表论文称其方法优于 LoRA。这难道不足以证明我们应该超越 LoRA,采用更新技术吗?
数十篇论文研究了除 LoRA 外的微调技术。仅 PEFT 库目前就包含超过 40 种不同的 PEFT 技术(若计变种则更多)。几乎所有研究者都声称他们的方法在基准上超越了 LoRA。
问题在于,研究者有压力去获得优于现有基准的结果。即便没有坏心,也可能导致偏见——例如,为论文提出的方法花费更多调参时间,而较少调优对比方案。一项研究发现,通过调整学习率,LoRA 可以匹敌声称更优的 PEFT 技术(链接)。
另一个复杂因素是:每篇论文选择不同的对比 PEFT 技术和不同的基准。即使在同一基准上对比同一种技术,代码往往不公开或难以复现,导致结果难以重现。
总之,仅靠论文结果很难找出最适合你的 PEFT 技术。因此,你可能会默认选用 LoRA。
Hugging Face 思考如何帮助用户做出明智决策。PEFT 库已提供了统一 API 的多种 PEFT 技术。下一步是提供能揭示问题的基准测试。
我们已有的基准测试之一是在数学数据集上微调大语言模型。该基准使用未经指令微调的基座模型,通过思维链推理来回答数学问题,检验模型学习数学推理和调整输出格式的能力。
为扩展到另一模态,我们还添加了图像生成基准。它测试模型能否微调以学习新概念(猫玩偶)并在新场景中生成而不遗忘原有概念。
所有 PEFT 技术在完全相同条件下评估:同一基座模型、同一数据集、同一训练和评估代码、同一硬件。我们不仅跟踪测试性能,还记录 VRAM 占用、遗忘/漂移、运行时和检查点大小。结果设计在消费级硬件上运行,新增实验只需添加一个 PEFT 配置并运行脚本。
由于我们在同等条件下比较所有技术且没有偏袒,我们相信这些基准能客观展现不同 PEFT 技术的表现。如果你有自己的数据集,可以采用类似方法,利用 PEFT 库评估多种技术。
运行基准后,我们发现 LoRA 虽好,但其他 PEFT 方法可以在一个或多个维度上击败它,值得考虑。下图对比了 LoRA 和其他五种 PEFT 技术。

部分基准结果。在测试性能和内存使用方面,LoRA 并非总是最佳选择。左:MetaMathQA 基准;右:图像生成基准。查看这个 Space 获取最新结果。
可以将上述结果理解为权衡:例如,模型在测试集上的表现 vs 训练所需内存。如果一个 PEFT 技术在这两项指标上同时被其他技术超越,它就在 Pareto 前沿 之外。换句话说:若想获得更高测试准确率,需更多内存;若追求内存效率,则需牺牲准确率。
详细看 LLM 数学基准的结果。在测试准确率 vs 内存方面,LoRA 确实在 Pareto 前沿上。它达到 53.2% 测试准确率,峰值 VRAM 22.6 GB。但还有其他技术也在前沿上。例如 BEFT 达到 32.9% 准确率,仅需 20.2 GB 内存。另一端是 Lily,达到 54.9% 准确率,但需要 25.6 GB 内存。根据你的优先级,LoRA 可能并非最佳权衡。

微调 meta-llama/Llama-3.2-3B 并在 GSM8K 上评估的测试准确率 vs 内存权衡。LoRA 表现不错,但其他 PEFT 技术也一样。
另外需注意,即使 LoRA 表现好,也不是原始 LoRA。一方是有秩稳定初始化的 LoRA(rs-LoRA),它用不同缩放方式,提供很好的准确率(53.2%)。另一方是 LoRA-FA,它使用专为 LoRA 优化的优化器,冻结部分权重,因而更省内存(20.2 GB)。普通 LoRA 仅达到 48.1% 准确率,22.5 GB 内存,因此应被替代。
再看图像生成基准。在 Hugging Face Space 中,选择“image-gen”查看结果。任务是学习新概念(猫玩偶)并泛化到新提示。

使用 LoRA 微调 FLUX.2-klein-base-4B 生成的猫玩偶图像。
主要指标是“dino similarity”,衡量生成图像与保留测试图像的相似度,越高越好。结合内存使用绘制 Pareto 前沿,发现 LoRA 低于前沿。具体数据:LoRA 相似度 0.697,OFT 为 0.708;内存方面 LoRA 需 9.97 GB,OFT 仅 9.01 GB。因此 OFT 在这两项指标上严格优于 LoRA。

微调 FLUX.2-klein-base-4B 并在测试集上评估的测试准确率 vs 内存权衡。OFT 等 PEFT 技术在测试分数和更低内存上击败 LoRA。
当然,也需检查其他接近 Pareto 前沿的技术,因为指标可能因随机性有小变动。还应探索其他指标:运行时性能或检查点大小是否重要?从下拉菜单选择相关指标,图景会大不相同。对于图像生成,请仔细查看生成的示例图像以感知能力。
异议:但基准可能偏袒某方法!
一个可能的批评是超参数选择可能偏袒某些技术。确实,对这么多技术进行详尽公平的超参搜索很困难。但每个人都可以为 PEFT 贡献自己的实验:如果你认为某技术可通过调整超参数改进,欢迎提交 PR!我们提供了操作说明。同理,如果你想贡献全新的基准,请联系我们讨论想法。
另一个问题是基准可能无法完全反映某技术的全部能力。我们提供了多维度比较,但不可能捕捉所有方面。例如,一种名为 Cartridges(链接)的技术用于压缩长提示,这在基准中并未测量。其他因素也可能影响选择:
PEFT 中积极扩展支持)。基准不能完全替代你自行调研,但可以作为合理指引。

点击图片浏览 PEFT 商店,找到最适合你的技术。你可以按基准指标,也能按功能(如量化支持)浏览。
异议:但 llama.cpp/vLLM/... 只支持 LoRA
使用非 LoRA 技术的局限是下游包的支持不如 LoRA 广泛。例如,如果你想用 vLLM 服务模型,只能加载 LoRA 检查点。好消息是,PEFT 现在支持将其他适配器转换为 LoRA。这样,你可以将非 LoRA 检查点转为 LoRA,然后用于 vLLM 等下游包。
我们测试了将使用 GraLoRA 技术的图像适配器转换为 LoRA。转换后测试分数几乎相同(相似度 0.702 → 0.694,0.260 → 0.269)。下面是对提示“sks cat at the beach”的测试图像:
目前我们尚未对所有 PEFT 技术实现转换,但如有需求,将进一步扩展支持。
在开发 PEFT 包时,我们注意到 LoRA 有巨大的惯性,尽管其他技术可能更好。因此我们为 PEFT 添加了基准,希望更客观地展示不同技术的表现。
根据结果,我们可以自信地得出结论:LoRA 并非坏选择,但可能存在更好的选择。尤其在图像生成基准上,LoRA 被其他技术击败。除了指标,选择时还需考虑其他因素。但即便如此,我们正推动 PEFT 在功能上让 LoRA 与其他技术持平。
我们的旅程远未结束,计划扩展和改进现有基准,未来还会增加更多。我们鼓励社区贡献,如果你有兴趣,请在 PEFT 仓库开 issue 告诉我们。
如果本文只让你记住一点,那就是:在选择 PEFT 技术时,不应默认 LoRA。借助 PEFT 的统一 API,从一种技术切换到另一种只需改一个配置。即使你坚持使用 LoRA,也请探索 PEFT 支持的所有变体:DoRA、rs-LoRA、LoRA-FA 等。尝试这些技术,你可能会收获惊喜。
示例:使用 PEFT 从 LoRA 切换到 OFT
from transformers import AutoModelForCausalLM
from peft import LoraConfig, get_peft_model
from peft import OFTConfig, get_peft_model # 修改这一行
base_model = AutoModelForCausalLM.from_pretrained("meta-llama/Llama-3.2-3B", dtype="bfloat16")
config = LoraConfig(target_modules=["q_proj", "v_proj"])
config = OFTConfig(target_modules=["q_proj", "v_proj"]) # 修改这一行
model = get_peft_model(base_model, config)
原文链接:Hugging Face
本文由前途科技编辑整理
免费获取企业 AI 成熟度诊断报告,发现转型机会