跳到正文
原文
Hugging Face Blog·· 2026-06-18精选AI 评分62

Hugging Face 实测:LoRA 之外还有哪些更好的微调技术

Beyond LoRA: Can you beat the most popular fine-tuning technique?

AI 摘要

Hugging Face 在 PEFT 库中加入统一条件的基准测试,比较 LoRA 与其他参数高效微调技术的表现。

正文 · AI 翻译

Is LoRA the best PEFT technique?

当你计划以参数高效的方式微调模型时,不要只想着 LoRA

如果你想在自己的数据上微调一个开放模型,你可能对所谓的参数高效微调感兴趣,简称 PEFT。这个术语描述的是能显著降低微调模型所需内存的技术。尽管这类技术有几十种,但几乎所有人都会选择一种叫做“LoRA”的方法。在这篇博客文章中,我们将探讨 LoRA 是否真的是最佳选择,有哪些工具可以帮助你做出明智的决定,以及如何通过将视野扩展到 LoRA 之外而获益。

什么是 PEFT,何时需要它

有无数开放模型可用,但它们往往对你的用例来说不够好。提示可能有帮助,但通常不够。与其从头训练一个新模型,你应该考虑微调一个现有模型。

然而,微调非常耗费内存:你通常需要足够的内存来容纳整个模型好几次。量化可以减少模型的内存占用,但量化模型无法直接微调。因此出现了一系列减少微调所需内存的技术,称为“参数高效微调”,简称 PEFT。

使用 PEFT,你可以仅用其中一小部分内存来微调模型,甚至可以微调量化模型。它还提供了其他优势,例如极小的检查点大小、更强的抗灾难性遗忘能力,以及能够从同一个基础模型提供多个微调版本。

在 Hugging Face,我们开发了 PEFT 库,它在统一的 API 背后实现了许多 PEFT 技术,并与生态系统良好集成,例如 Transformers 和 Diffusers。它还支持 多种量化方法,进一步提升了参数高效微调的可及性。PEFT 提供了一个很好的起点,无论你想在自己的数据上微调,还是正在研究一种新的 PEFT 方法。

LoRA:微调技术中的女王 👑

一种早期出现并被证明相当有效的参数高效微调技术叫做“低秩适应”,简称 “LoRA”。它的工作原理是在基础模型之上添加少量参数,冻结基础模型权重,只训练这少量参数。

在所有 PEFT 技术中,LoRA 是迄今为止最流行的。以下是一些估计:

  • 在 Hugging Face Hub 上 20,834 个恰好提到一种 PEFT 技术的模型卡片样本中,有 20,509 个提到了 LoRA(98.4%)。
  • 我们还在一个外部网站上检查了哪些 PEFT 技术在图生成中流行。使用 10,000 个检查点的样本,我们发现 7,111 个是 LoRA。其他识别出的 PEFT 技术是 LoCon(363)和 DoRA(11,可以说是 LoRA 的变体)。这意味着 95.0% 的 PEFT 检查点是 LoRA。
  • 在 GitHub 上搜索代码片段 from peft import <PEFT CONFIG>(示例 GH 查询),71.3% 的结果是 LoRA。紧随其后的是 LoHa(3.7%)和 AdaLoRA(3.5%)。

尽管这些估计并不完美,但结论仍然是:LoRA 几乎肯定是迄今为止最常见的 PEFT 技术。

这可能只是意味着 LoRA 对所有人来说效果最好,而这一事实也反映在其使用统计数据中。然而,还有另一种可能性:LoRA 是较早流行的 PEFT 技术之一。所以也许它的使用变得自我强化:LoRA 的可见度最高,教程/示例数量最多,并且在下游软件包中拥有最好的支持。因此,LoRA 的流行会自我滋养。

这一切引出了一个问题:我们是否因为回避更好的技术而让性能白白流失? 毕竟,有无数的研究者的论文声称他们的技术优于 LoRA。这难道不足以证明我们应该超越 LoRA,转而采用更新的技术吗?

根据论文结果选择正确的 PEFT 技术是有问题的

有数十篇论文研究了 LoRA 以外的微调技术。仅在 PEFT 库中,撰写本文时就有 40 多种不同的 PEFT 技术(如果算上 PEFT 技术的变体,则数量更多)。对于几乎所有这些技术,你都会发现研究者声称根据他们的基准测试,他们的技术优于 LoRA。

这些说法的问题在于,研究者面临着提供超越现有基准的结果的压力。即使没有恶意,这也可能导致结果出现偏差,例如,与研究者提出的技术相比,他们花在调整替代技术上的时间更少。一项研究发现,例如,通过调整学习率,LoRA 可以匹敌据称更好的 PEFT 技术。

另一个复杂因素是,每篇论文选择比较的 PEFT 技术集合不同,运行的基准测试集合也不同。而且即使在同一基准上比较同一技术,代码通常也不可用或不易自行运行,这使得结果难以复现。

总的来说,仅通过查看论文结果很难找出最适合你的 PEFT 技术。因此,你可能会倾向于直接使用默认的 LoRA。

我们在 PEFT 中进行基准测试的方法

在 Hugging Face,我们思考了如何帮助用户就使用哪种 PEFT 技术做出明智的决定。通过 PEFT 库,我们已经提供了一个实现了许多 PEFT 技术并以相同 API 暴露它们的软件包。下一步是提供能够进一步阐明所讨论问题的基准测试。

我们之前已经有一个基准测试,检查在数学数据集上对 LLM 进行微调。该基准测试采用一个 LLM,并在思维链推理上对其进行微调,以使用未经过指令微调的基础模型生成数学问题的结果。因此,该基准测试检查模型是否能学会执行数学推理,并调整生成的输出以符合预期格式。

为了将我们的发现扩展到另一种模态,我们还添加了一个图像生成基准测试。这个测试检验模型是否可以被微调以学习一个新概念——一个猫毛绒玩具,并在不忘记现有概念的情况下在新情境中生成它。

所有 PEFT 技术都在完全相同的条件下进行评估:相同的基础模型、相同的数据集、相同的训练和评估代码、相同的硬件。由于不同用户有不同的需求,我们追踪的不仅仅是测试性能。除了显存使用量,我们还追踪遗忘/漂移、运行时间和检查点大小等指标。这些结果旨在消费级硬件上运行,添加新实验只需添加一个新的 PEFT 配置并运行一个脚本。

由于我们在平等的基础上比较所有 PEFT 技术,并且没有偏袒任何一方,我们相信这些基准测试能够客观地描绘出不同 PEFT 技术的效果。我们认为,如果你有自己的数据集,你可以采用类似的方法,并利用 PEFT 库来评估多种 PEFT 技术。

我们的发现:LoRA 效果不错,但不一定是最佳选择

完成基准测试运行后,我们发现尽管 LoRA 效果不错,但其他 PEFT 方法可以在一个或多个维度上超越它,因此应当予以考虑。请查看下图,其中比较了 LoRA 和其他五种 PEFT 技术的性能。

基准测试的部分结果。在测试性能和内存使用方面,LoRA 不一定是最佳选择。左:MetaMathQA 基准测试;右:图像生成基准测试。请查阅此 Space 获取最新结果。

解读上述结果的一种方式是考虑权衡取舍,例如:模型在测试集上的表现如何,与训练它需要多少内存相比?如果一种 PEFT 技术在这两个指标上无法被任何其他技术同时超越,那么它就处于帕累托前沿上。换句话说:如果你想要更好的测试准确率,就需要更多内存;如果你想要更高的内存效率,就必须放弃准确率。

让我们更仔细地看看 LLM Math 数据集基准测试的结果。在测试准确率与内存的权衡方面,我们发现 LoRA 确实处于帕累托前沿上。它达到了 53.2% 的测试准确率,峰值时需要 22.6 GB 的显存。然而,帕累托前沿上还有其他 PEFT 技术。例如,BEFT 达到了 32.9% 的测试准确率,最多只需要 20.2 GB 的内存。在另一端,我们有 Lily,它达到了 54.9% 的测试准确率,但需要 25.6 GB 的内存。取决于对你而言什么更重要,你可能会得出结论:LoRA 对你来说并不是最佳的权衡取舍。

微调 meta-llama/Llama-3.2-3B 并在 GSM8K 上评估的测试准确率与内存使用量的权衡。LoRA 表现不错,但其他 PEFT 技术也是如此。

同样值得注意的是,尽管 LoRA 在这项任务上表现良好,但我们讨论的并不是原版 LoRA。一方面,我们使用的是带有秩稳定初始化的 LoRA,这是一种以不同于默认初始化的方式缩放 LoRA 贡献的技术,能提供非常好的测试准确率(53.2%)。另一方面,我们使用的是 LoRA-FA,它使用专为 LoRA 设计的优化器,冻结了部分 LoRA 权重,因此内存效率更高(20.2 GB)。普通 LoRA 在 22.5 GB 内存下仅达到 48.1% 的准确率,因此应当避免使用它,转而选择其他替代方案。

接下来我们来看看图像生成基准测试。在 Hugging Face Space 中,在“Select Task”下拉菜单中选择“image-gen”即可显示结果。该任务的目标是学习一个新概念,即一只猫咪毛绒玩具,并将其泛化到新的提示词上。

使用在 FLUX.2-klein-base-4B 上微调的 LoRA 生成的猫咪毛绒玩具图像。

对于此任务,主要指标是“dino similarity”,它衡量生成图像与留出测试数据集中的图片的相似程度,数值越高越好。一如既往,我们也要关注内存使用情况。绘制这两个指标的帕累托前沿时,我们发现 LoRA 位于该前沿之下。让我们看具体数字:LoRA 的相似度得分为 0.697,而 OFT 为 0.708;在内存方面,LoRA 需要 9.97 GB,OFT 需要 9.01 GB。因此,在这些指标上,OFT 严格优于 LoRA。

微调 FLUX.2-klein-base-4B 并在测试集上评估的测试准确率与内存使用量的权衡。其他 PEFT 技术如 OFT 在测试得分和更低内存使用方面优于 LoRA。

当然,你也应该检查其他接近帕累托前沿的 PEFT 方法,因为指标可能会因随机性而出现小幅波动。此外,你还应探索其他指标:运行时性能对你重要吗,还是你更关心检查点的大小?从下拉菜单中选择相关指标,图像可能会发生显著变化。对于图像生成基准测试,请务必查看生成的样本图像,以感受微调模型的能力。

局限性

异议:但基准测试偏袒某一种方法!

对 PEFT 基准测试的一个批评是,超参数的选择可能偏袒某一种技术。确实如此,对这么多技术进行详尽且公平的超参数扫描是很困难的。然而,每个人都很容易向 PEFT 贡献自己的实验:如果你认为通过选择不同的超参数可以改进某种特定的 PEFT 技术,请创建一个 PR!我们添加了相关操作说明。同样,如果你想贡献一个全新的基准测试,请联系我们讨论你的想法。

基准测试的另一个问题是,它们可能无法完全反映某种特定 PEFT 技术的能力。我们使得能够沿许多不同维度比较这些技术,并根据这些权衡发现最佳技术。但这种方式不可能涵盖所有方面。例如,一种名为 Cartridges 的 PEFT 技术是为了压缩长提示词而开发的,这在基准测试中并未衡量。其他因素也可能影响选择,例如:

  • 根据 PEFT 技术的不同,只能修改某些层类型。
  • 并非所有 PEFT 技术都支持量化基础模型(但我们正在 PEFT 中积极扩展支持)。
  • 一些 PEFT 技术允许合并适配器以减少运行时开销,但其他技术则不行。

基准测试不能完全免除你做研究的责任,但它们可以是有用的指引。

点击图片浏览 PEFT 商店,找到最适合你的 PEFT 技术。它允许你不仅按基准指标浏览,还可以按功能浏览,例如量化支持。

异议:但 llama.cpp/vLLM/... 只支持 LoRA

使用 LoRA 以外的 PEFT 技术的一个局限是,它们在下游包中不像 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 技术可能更好。因此,我们着手为 PEFT 添加基准测试,以便更客观地展现不同 PEFT 技术在不同指标上的表现。

鉴于我们得到的结果,我们可以自信地得出结论:LoRA 完全不是一个糟糕的选择,但可能存在更好的选择。特别是在图像生成基准测试中,LoRA 被其他技术击败。我们讨论过,除了指标之外,在选择合适的 PEFT 技术时还必须考虑其他因素。然而,即便如此,我们仍在进一步推动 PEFT,以实现 LoRA 与其他技术之间的功能对等。

我们的旅程远未结束;我们希望扩展和改进现有的基准测试,并且还计划在未来添加更多基准测试。我们确保社区可以轻松贡献,所以如果你愿意参与,请在 PEFT 仓库上开一个 issue,告诉我们你想如何贡献。

如果你从这篇文章中只记住一件事,那就是在为你的用例选择 PEFT 技术时,LoRA 不应成为自动默认选项。鉴于 PEFT 提供的统一 API,从一种 PEFT 技术切换到另一种就像在代码中切换一个配置一样简单。即使你坚持使用 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 Blog · huggingface.co

00