超越 LoRA:如何选择最佳参数高效微调技术?
Beyond LoRA: Can you beat the most popular fine-tuning technique?
参数高效微调(PEFT)技术中,LoRA 占据绝对主导:Hugging Face Hub 上 20,834 张提及单一 PEFT 技术的模型卡中 20,509 张指向 LoRA(98.4%);外部站点 10,000 个检查点中 95.0% 是 LoRA;GitHub 搜索 `from peft import` 代码片段的 71.3% 结果为 LoRA。但研究者宣称其他技术超越 LoRA 的论文结果具备偏向性——调整学习率即可让 LoRA 匹配更优技术。Hugging Face 的 PEFT 库提供统一 API 实现 40 余种 PEFT 技术,并开始建立基准测试:在数学数据集上对 LLM 进行思维链推理微调,以帮助用户做出更优选择。
HuggingFace 的 PEFT 团队用公平基准把 LoRA 拉下神坛,图像生成任务上 OFT 表现更好,而且切换只需改一行配置。对微调选型有实打实的参考价值,但数据集有限,别全信。
当你计划以参数高效的方式微调模型时,思路不要局限于 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 个 checkpoint 的样本,我们发现其中 7,111 个是 LoRA。其他识别出的 PEFT 技术是 LoCon(363)和 DoRA(11,可以说是 LoRA 的变体)。这意味着 95.0% 的 PEFT checkpoint 是 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 技术(https://arxiv.org/abs/2602.04998)。
另一个复杂之处在于,每篇论文选择的对比 PEFT 技术集合不同,运行的基准集合也不同。而且,即使是在同一基准上对比同一技术,代码往往也不可得,或者不容易自己运行,这使得结果难以复现。
总体而言,仅凭论文结果很难弄清楚哪种 PEFT 技术最适合你。因此,你可能会倾向于直接采用默认选项,也就是 LoRA。
我们如何在 PEFT 中进行基准测试
在 Hugging Face,我们思考了如何帮助用户就使用哪种 PEFT 技术做出明智决策。借助 PEFT 库,我们已经提供了一个实现了众多 PEFT 技术并以相同 API 暴露它们的软件包。下一步是提供基准测试,以便对上述问题有更深入的了解。
我们此前已经有一个基准,用于检验 LLM 在数学数据集上的微调效果,并已运行了一段时间。该基准会取一个 LLM,使用一个未经指令微调的基础模型,通过思维链推理对其进行微调,使其能给出数学问题的答案。因此,该基准检验的是模型能否学会进行数学推理,并同时将生成的输出调整为期望的格式。
为了将我们的发现扩展到另一种模态,我们还加入了一个图像生成基准。该基准测试模型能否通过微调学会一个新概念——一只猫咪毛绒玩具——并在新的情境中生成它,同时不遗忘已有的概念。
![]() | ![]() |
| 左:来自 MetaMathQA 数据集的示例问题与答案。右:来自猫咪毛绒玩具数据集的示例图像。 | |
所有 PEFT 技术都在完全相同的条件下进行评估:相同的基础模型、相同的数据集、相同的训练与评估代码、相同的硬件。由于不同用户有不同的需求,我们追踪的不仅仅是测试性能。除了 VRAM 占用之外,我们还追踪遗忘/漂移、运行时间和检查点大小等指标。这些结果被设计为可在消费级硬件上运行,而新增一个实验只需添加一个新的 PEFT 配置并运行一个脚本。
由于我们在完全对等的基础上比较所有 PEFT 技术,且不偏袒任何一方,我们相信这些基准测试能够客观地描绘出不同 PEFT 技术的实际效果。我们认为,如果你有自己的数据集,可以采取类似的方法,并利用 PEFT 库来评估多种 PEFT 技术。
我们的发现:LoRA 效果不错,但不一定是最佳选择
完成基准测试运行后,我们发现尽管 LoRA 表现良好,但其他 PEFT 方法可以在一个或多个维度上超越它,因此应当纳入考虑。请看下图,其中比较了 LoRA 与另外五种 PEFT 技术的表现。
![]() |
| 基准测试的部分结果。在测试性能和内存占用方面,LoRA 不一定是最佳选择。左图:MetaMathQA 基准测试;右图:图像生成基准测试。请查阅这个 Space 获取最新结果。 |
解读上述结果的一种方式是权衡取舍,例如:模型在测试集上的表现如何 vs 训练它需要多少内存?如果一种 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 并在测试集上评估的测试准确率与内存使用量的权衡。OFT 等其他 PEFT 技术在测试得分和更低内存使用方面均优于 LoRA。 |
当然,你也应该查看其他接近帕累托前沿的 PEFT 方法,因为指标可能会因随机性而出现小幅波动。此外,你还应该探索其他指标:运行时性能对你重要吗,还是你更关心检查点的大小?从下拉菜单中选择相关的指标,图表可能会发生显著变化。对于图像生成基准,请务必查看生成的样本图像,以感受微调模型的能力。
局限性
异议:但基准测试偏袒了某一种方法!
有人可能会对 PEFT 基准提出批评,认为超参数的选择可能偏袒某一种技术。这确实是事实,在这么多技术中进行详尽且公平的超参数扫描是很困难的。然而,每个人都可以非常容易地向 PEFT 贡献自己的实验:如果你认为某种特定的 PEFT 技术可以通过选择不同的超参数来改进,那就创建一个 PR!我们添加了 相关操作说明。同样地,如果你想贡献一个全新的基准,请联系我们讨论你的想法。
基准测试的另一个问题是,它们可能无法完全反映某种特定 PEFT 技术的能力。我们让用户能够沿许多不同维度比较这些技术,并根据这些权衡发现最优选择。但这种方式无法捕捉所有方面。例如,一种名为 Cartridges 的 PEFT 技术(https://huggingface.co/docs/peft/package_reference/cartridges)是为了压缩长提示词而开发的,而这一点并未在基准测试中衡量。其他因素也可能影响选择,例如:
- 取决于具体的 PEFT 技术,只有某些层类型可以被修改。
- 并非所有 PEFT 技术都支持量化基础模型(但我们正在积极扩展支持范围,见
PEFT)。 - 有些 PEFT 技术允许合并适配器以减少运行时开销,但另一些则不行。
基准测试无法完全免除你自己做调研的责任,但它们可以成为合理的参考指引。
反对意见:但 llama.cpp/vLLM/……只支持 LoRA
使用 LoRA 以外的 PEFT 技术的一个局限在于,它们无法像 LoRA 那样获得下游包的广泛支持。例如,如果你想用 vLLM 来部署模型,只能加载 LoRA checkpoint。所幸,PEFT 现在支持将其他适配器转换为 LoRA。这样,你就可以把非 LoRA checkpoint 转换为 LoRA,并在 vLLM 或其他下游包中使用它。
为了验证这一点,我们使用 GraLoRA 技术将一个图像适配器转换为 LoRA checkpoint。转换后的测试分数几乎完全相同(相似度 0.702 → 0.694,0.260 → 0.269)。以下是提示词“sks cat at the beach”的测试图像:
![]() | ![]() |
| 左:由 GraLoRA 生成的图像。右:由同一个 GraLoRA checkpoint 转换为 LoRA checkpoint 后生成的图像。图像质量相当。 | |
目前,我们尚未实现所有 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(RSS) · huggingface.co







