当你计划以参数高效的方式微调模型时,请将目光放远,不要只局限于 LoRA。
如果你想用自己的数据微调一个开源模型,你很可能对所谓的参数高效微调(简称 PEFT)感兴趣。这个术语描述了一系列能显著降低模型微调内存需求的技术。尽管有数十种此类技术,但几乎所有人都会选择一种名为“LoRA”的方法。在这篇博文中,我们将探讨 LoRA 是否真的是最佳选择,有哪些工具可以帮助我们做出明智的决策,以及将视野拓展到 LoRA 之外能带来哪些好处。
什么是 PEFT,以及何时需要它
市面上有无数开源模型可用,但它们往往无法完全满足你的特定用例需求。提示词可能会有所帮助,但通常还不够。与其从头开始训练一个新模型,不如考虑对现有模型进行微调。
然而,微调非常消耗内存:你通常需要足够的内存来容纳整个模型数倍的大小。量化可以降低模型的内存占用,但量化后的模型无法直接进行微调。因此,出现了一系列旨在削减微调所需内存的技术,称为“参数高效微调”,即 PEFT。
借助 PEFT,你只需使用其中一小部分内存就能微调模型,甚至可以对量化后的模型进行微调。它还提供了其他优势,例如检查点文件极小、对灾难性遗忘有更强的抵抗力,以及能够基于同一个基础模型提供多个微调版本的服务。
在 Hugging Face,我们开发了 PEFT 库,该库在统一的 API 背后实现了多种 PEFT 技术,并与生态系统(例如 Transformers 和 Diffusers)良好集成。它还支持多种量化方法,进一步提升了参数高效微调的可及性。无论你是想用自己的数据进行微调,还是正在研究新的 PEFT 方法,PEFT 都是一个很好的起点。
LoRA:微调技术中的女王 👑
一种早期出现且被证明非常有效的参数高效微调技术,称为“低秩自适应”,简称“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>`(示例 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 暴露它们的软件包。下一步是提供能够进一步阐明所讨论问题的基准测试。
我们之前已经有一个基准测试,用于检查在数学数据集上对大语言模型进行微调。该基准测试选取一个大语言模型,并使用一个未经指令微调的基础模型,在思维链推理上进行微调,以生成数学问题的答案。因此,该基准测试检查模型是否能够学会执行数学推理,并调整生成的输出以符合预期的格式。
为了将我们的发现扩展到另一种模态,我们还增加了一个图像生成基准测试。该测试考察模型能否通过微调学习一个新概念(一只猫咪玩偶),并在不遗忘已有概念的情况下,在新的场景中生成该概念。
![]() | ![]() |
| 左图:来自 MetaMathQA 数据集的示例问题和答案。右图:来自猫咪玩偶数据集的示例图像。 | |
所有 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 中,在“选择任务”下拉菜单中选择“image-gen”以显示结果。该任务的目标是学习一个新概念,即一个猫咪玩偶,并将其泛化到新的提示词上。
![]() |
| 使用基于 FLUX.2-klein-base-4B 微调的 LoRA 创建的猫咪玩偶图像。 |
对于此任务,主要指标是“恐龙相似度”,它衡量生成的图像与保留测试数据集中图片的相似程度,数值越高越好。与往常一样,我们还需要关注内存使用情况。在绘制这两个指标的帕累托前沿时,我们发现 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(https://huggingface.co/docs/peft/package_reference/cartridges)的 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”的测试图像:
![]() | ![]() |
| 左图:由 GraLoRA 生成的图像。右图:由同一 GraLoRA 检查点转换为 LoRA 检查点后生成的图像。图像质量相当。 | |
目前,我们尚未实现所有 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)
本文提及的 Spaces 1
本文提及的论文 3
合作
diffusers
LoRA 训练脚本的世界,联合起来!
2024 年 1 月 2 日
nlp
tgi
LLM
TGI Multi-LoRA:一次部署,服务 30 个模型
2024 年 7 月 18 日







