超越LoRA:你能击败最流行的微调技术吗?
Beyond LoRA: Can you beat the most popular fine-tuning technique?
Hugging Face 团队(BenjaminB、Sayak Paul、Marian、Kashif Rasul)在其博客中探讨了参数高效微调(PEFT)技术中 LoRA 是否总是最佳选择。他们指出,尽管 LoRA 在 Hugging Face Hub 上占 PEFT 模型卡片的 98.4%,但基于论文结果选择 PEFT 技术存在问题。为此,团队在 PEFT 库中新增了 MetaMathQA(LLM 数学推理)和图像生成(猫玩偶概念学习)两个 benchmark,在相同条件下比较 LoRA 与其他技术。结果显示,在 LLM 任务中,LoRA 处于 Pareto Frontier 但非唯一选择,如 BEFT 内存更低(20.2 GB vs 22.6 GB),Lily 准确率更高(54.9% vs 53.2%);在图像生成任务中,OFT 在 dino similarity(0.708 vs 0.697)和内存(9.01 GB vs 9.97 GB)上均优于 LoRA。团队还支持将非 LoRA adapter 转换为 LoRA 以兼容下游包(如 vLLM)。
](https://huggingface.co/BenjaminB)

当你计划以参数高效的方式微调模型时,请跳出 LoRA 的思维定式
如果你想用自己的数据微调一个开源模型,你很可能对所谓的参数高效微调(parameter-efficient fine-tuning,简称 PEFT)感兴趣。这个术语描述的是能显著降低微调模型所需内存的技术。尽管有几十种这样的技术,但几乎所有人都会选择一种叫“LoRA”的方法。在这篇博文中,我们将探讨 LoRA 是否真的是最佳选择,有哪些工具可以帮助我们做出明智决策,以及跳出 LoRA 的局限能带来哪些好处。
什么是 PEFT,何时需要它
市面上有无数开源模型,但它们往往无法完全满足你的使用场景。Prompting 可能有所帮助,但通常还不够。与其从头训练一个新模型,不如考虑微调一个现有模型。
然而,微调非常消耗内存:你通常需要足够的内存来容纳整个模型多次。量化可以降低模型的内存占用,但量化后的模型无法直接微调。因此,出现了一系列旨在削减微调所需内存的技术,称为“参数高效微调”(PEFT)。
借助 PEFT,你只需使用一小部分内存就能微调模型,甚至可以微调量化模型。它还提供了其他优势,例如检查点体积小、对灾难性遗忘有更强的抵抗力,以及能够从同一个基础模型提供多个微调版本的服务。
在 Hugging Face,我们开发了 PEFT 库,它在统一的 API 背后实现了许多 PEFT 技术,并与生态系统(例如 Transformers 和 Diffusers)良好集成。它还支持多种量化方法,进一步提升了参数高效微调的可及性。无论你是想用自己的数据微调,还是研究新的 PEFT 方法,PEFT 都提供了一个很好的起点。
LoRA:微调技术中的女王 👑
一种早期出现并被证明非常有效的参数高效微调技术叫做“低秩适应”(Low Rank Adaptation),简称 “LoRA”。它的工作原理是在基础模型之上添加少量参数,冻结基础模型的权重,只训练这些少量参数。
在所有 PEFT 技术中,LoRA 是目前最流行的。以下是一些估算数据:
- 在 Hugging Face Hub 上提及且仅提及一种 PEFT 技术的 20,834 个模型卡片样本中,有 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>(示例查询),71.3% 的结果是 LoRA。紧随其后的是 LoHa(3.7%)和 AdaLoRA(3.5%)。
尽管这些估算并不完美,但结论仍然是 LoRA 几乎肯定是目前最常见的 PEFT 技术。
这可能仅仅意味着 LoRA 对所有人都最有效,并且这一事实反映在其使用统计数据中。然而,还有另一种可能性:LoRA 是较早出现的流行 PEFT 技术之一。因此,它的使用可能变得自我强化:LoRA 拥有最高的可见度、最多的教程/示例,并且在下游包中获得最佳支持。因此,LoRA 的流行度是自我循环的。
这一切都引出了一个问题:我们是否因为回避更好的技术而牺牲了性能? 毕竟,有无数研究人员在论文中声称他们的技术击败了 LoRA。这难道不是充分的证据,表明我们应该超越 LoRA,采用更新的技术吗?
基于论文结果选择正确的 PEFT 技术存在问题
有几十篇论文研究了 LoRA 之外的微调技术。仅在 PEFT 库中,撰写本文时就有超过 40 种不同的 PEFT 技术(如果算上 PEFT 技术的变体,数量更多)。对于其中几乎所有技术,你都会发现研究人员声称他们的技术根据其 benchmark 击败了 LoRA。
这些说法的问题在于,研究人员面临压力,需要提供击败现有 benchmark 的结果。即使没有恶意,这也可能使结果产生偏差,例如,与研究人员提出的技术相比,花在调整替代技术上的时间更少。例如,一项研究发现,通过调整学习率,LoRA 可以匹配据称更好的 PEFT 技术(https://arxiv.org/abs/2602.04998)。
另一个复杂因素是,每篇论文都选择了一组不同的 PEFT 技术进行比较,以及一组不同的 benchmark 来运行。即使在同一 benchmark 上比较相同的技术,代码通常也不可用或不易自行运行,这使得结果难以复现。
总的来说,仅通过查看论文结果很难找出最适合你的 PEFT 技术。因此,你可能会倾向于直接使用默认的 LoRA。
我们在 PEFT 中进行 benchmark 的方法
在 Hugging Face,我们思考了如何帮助用户就使用哪种 PEFT 技术做出明智的决定。通过 PEFT 库,我们已经提供了一个实现了许多 PEFT 技术并通过相同 API 暴露它们的包。下一步是提供能够更清晰地阐明上述问题的 benchmark。
我们已经有一个 benchmark 用于检查 LLM 在数学数据集上的微调一段时间了。这个 benchmark 使用一个未经过 instruction fine-tuning 的基础模型,对 LLM 进行 chain-of-thought 推理微调,以生成数学问题的答案。因此,该 benchmark 检查模型是否能够学会执行数学推理,并调整生成的输出以符合预期格式。
为了将我们的发现扩展到其他模态,我们还添加了一个图像生成 benchmark。该 benchmark 测试模型是否能够被微调以学习一个新概念(一个猫玩偶),并在不遗忘现有概念的情况下,在新上下文中生成它。
所有 PEFT 技术都在完全相同的条件下进行评估:相同的基础模型、相同的数据集、相同的训练和评估代码、相同的硬件。由于不同用户有不同需求,我们追踪的不仅仅是测试性能。除了 VRAM 使用量,我们还追踪遗忘/漂移、运行时间和检查点大小等指标。这些结果设计为在消费级硬件上运行,添加新实验只需添加一个新的 PEFT 配置并运行一个脚本。
由于我们在同等条件下比较所有 PEFT 技术,并且没有偏向性,我们相信这些 benchmark 可以客观地描绘不同 PEFT 技术的表现。我们认为,如果你有自己的数据集,可以采取类似的方法,并利用 PEFT 库来评估多种 PEFT 技术。
我们的发现:LoRA 表现良好,但不一定是最佳选择
完成 benchmark 运行后,我们发现尽管 LoRA 表现良好,但其他 PEFT 方法可以在一个或多个维度上击败它,因此应该被考虑。查看下图,该图比较了 LoRA 和其他五种 PEFT 技术的性能。
benchmark 的部分结果。在测试性能和内存使用方面,LoRA 不一定是最佳选择。左图:MetaMathQA benchmark;右图:图像生成 benchmark。请查阅此 Space 获取最新结果。
解释上述结果的一种方法是考虑权衡,例如:模型在测试集上的表现如何 vs 训练它需要多少内存?如果没有任何其他 PEFT 技术能同时在两个指标上击败它,那么它就处于 Pareto Frontier 上。换句话说:如果你想要更好的测试准确率,就需要更多内存;如果你想要更高的内存效率,就必须牺牲准确率。
让我们仔细看看 LLM 数学数据集 benchmark 的结果。在测试准确率 vs 内存方面,我们发现 LoRA 确实处于 Pareto frontier 上。它达到了 53.2% 的测试准确率,峰值需要 22.6 GB 的 VRAM。然而,还有其他 PEFT 技术也处于 Pareto Frontier 上。例如,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,这是一种以不同于默认初始化的方式缩放 LoRA 贡献的技术,提供了非常好的测试准确率(53.2%)。另一方面,我们有 LoRA-FA,它使用专门为 LoRA 优化的优化器,冻结了部分 LoRA 权重,因此内存效率更高(20.2 GB)。普通的 LoRA 在 22.5 GB 内存下仅达到 48.1% 的准确率,因此应避免使用,转而选择替代方案。
接下来让我们看看图像生成 benchmark。在 Hugging Face Space 中,在“Select Task”下拉菜单中选择“image-gen”以显示结果。该任务的目标是学习一个新概念,即一个猫玩偶,并将其泛化到新的 prompt 中。
使用在 FLUX.2-klein-base-4B 上微调的 LoRA 创建的猫玩偶图像。
对于此任务,主要指标是“dino similarity”,它衡量生成的图像与保留测试数据集中的图片的相似程度,数值越高越好。一如既往,我们还需要关注内存使用情况。在绘制这两个指标的 Pareto Frontier 时,我们发现 LoRA 低于该 frontier。让我们看具体数字:LoRA 的相似度得分为 0.697,而 OFT 得分为 0.708;在内存方面,LoRA 需要 9.97 GB,而 OFT 需要 9.01 GB。因此,在这些指标上,OFT 严格优于 LoRA。
微调 FLUX.2-klein-base-4B 并在测试集上评估的测试准确率 vs 内存使用权衡。其他 PEFT 技术(如 OFT)在测试分数和更低内存使用方面击败了 LoRA。
当然,你也应该检查其他接近 Pareto frontier 的 PEFT 方法,因为指标可能会因随机性而产生微小变化。此外,你还应该探索其他指标:运行时间性能对你重要吗?或者你关心检查点的大小?从下拉菜单中选择相关指标,情况可能会发生显著变化。对于图像生成 benchmark,请务必检查生成的样本图像,以了解微调模型的能力。
局限性
异议:但 benchmark 偏向于某种方法!
可能对 PEFT benchmark 提出的一个批评是,超参数的选择可能偏向于某种方法。这是事实,对这么多技术进行详尽且公平的超参数搜索是困难的。然而,每个人都很容易向 PEFT 贡献自己的实验:如果你认为通过选择不同的超参数可以改进特定的 PEFT 技术,请创建一个 PR!我们添加了关于如何操作的说明。类似地,如果你想贡献一个全新的 benchmark,请联系我们讨论你的想法。
benchmark 的另一个问题是,它们可能无法完全反映特定 PEFT 技术的能力。我们可以在许多不同维度上比较这些技术,并根据这些权衡发现最佳技术。但不可能通过这种方式捕捉所有方面。例如,一种名为 Cartridges 的 PEFT 技术(https://huggingface.co/docs/peft/package_reference/cartridges)是为了压缩长 prompt 而开发的,这在 benchmark 中没有被衡量。其他因素也可能影响选择,例如:
- 根据 PEFT 技术的不同,只能修改某些类型的层。
- 并非所有 PEFT 技术都支持量化基础模型(但我们正在
PEFT中积极扩展支持)。 - 一些 PEFT 技术允许合并 adapter 以减少运行时开销,但其他技术则不允许。
benchmark 不能完全免除你自行研究的责任,但它们可以成为合理的指引。
点击图片浏览 PEFT 商店,找到最适合你的 PEFT 技术。它不仅允许你按 benchmark 指标浏览,还可以按功能(如量化支持)浏览。
异议:但是 llama.cpp/vLLM/... 只支持 LoRA
使用 LoRA 以外的 PEFT 技术的一个局限性是,它们无法获得 LoRA 在下游包中的广泛支持。例如,如果你想使用 vLLM 提供模型服务,只能加载 LoRA 检查点。幸运的是,PEFT 现在支持将其他 adapter 转换为 LoRA。这样,你可以将非 LoRA 检查点转换为 LoRA,并在 vLLM 或其他下游包中使用它。
为了测试这一点,我们将一个使用 GraLoRA 技术的图像 adapter 转换为 LoRA 检查点。转换后的测试分数几乎相同(相似度 0.702 → 0.694,0.260 → 0.269)。以下是针对 prompt “sks cat at the beach” 的测试图像:
目前,我们尚未实现所有 PEFT 技术的转换,但如果有需求,我们将扩展支持。
结论与你可以做什么
在开发 PEFT 包的过程中,我们注意到 LoRA 拥有巨大的发展势头,尽管其他 PEFT 技术可能更好。因此,我们着手为 PEFT 添加 benchmark,以便更客观地描绘不同 PEFT 技术在不同指标上的表现。
根据我们得到的结果,我们可以自信地得出结论:LoRA 绝不是一个糟糕的选择,但可能存在更好的选择。特别是在检查图像生成 benchmark 时,LoRA 被其他技术击败。我们讨论了在选择正确的 PEFT 技术时,除了指标之外,还必须考虑其他因素。然而,即使如此,我们也在进一步推动 PEFT,以实现 LoRA 与这些其他技术之间的功能对等。
我们的旅程远未结束,我们希望扩展和改进现有的 benchmark,并计划在未来添加更多 benchmark。我们确保社区可以轻松贡献,因此如果你有兴趣,请打开 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)