你决定用自己的数据对一个 7B 模型做微调。然后就撞上了第一个真正的分岔口:三个方法名称,每个都带着不同的答案。Unsloth 的文档说先从 QLoRA 开始。Axolotl 说这取决于你的硬件。你翻过的一半博客文章说“大多数情况用 LoRA 就行”,然后就没了。而你手头只有一块 GPU,甚至不确定它能不能跑得动其中任何一种方法。
这是决定一切的上游选择。你选的方法定了显存预算,显存预算定了硬件,硬件定了成本。方法选错了,你要么在不需要的显卡内存上白花钱,要么花一整个周末在一块本来就扛不住这活儿的显卡上追查显存不足导致的崩溃。
那就来把这个问题讲清楚。以下是 LoRA、QLoRA 和全量微调之间真正的区别,每种方法在显存和效果质量上要付出什么代价,以及一条能帮你把自己的情况对应到其中一种方法的规则。
简短版本
- 默认选择是 QLoRA。 对于大多数单卡微调,先从 QLoRA 开始。按照 Axolotl 的表格,一次 7-8B 的 QLoRA 训练大约需要 10-14 GB 显存,前提是上下文较短、微批次较小。这适合许多 12-24 GB 的消费级或专业级显卡,但不是每一块低显存显卡都够用。当你显存富余、想要更快的训练步骤时,可以选择普通的 LoRA;全量微调则留给真正需要它的少数情况。
- 显存差距非常大。 根据 Axolotl 公布的数据,微调一个 7B 模型,全量微调大约需要 60-80 GB,LoRA 需要 16-24 GB,QLoRA 需要 10-14 GB。这个差距正是参数高效方法存在的全部理由。
- 质量损失取决于任务,并非一成不变。 在大多数指令跟随和结构化输出任务中,LoRA 和 QLoRA 与完整微调的差距只有几个百分点。在数学等复杂推理任务上,差距会拉大——这正是完整微调仍然值得其成本的地方。
- 完整微调是例外,不是基准做法。 只有在出现较大的分布偏移、预训练规模级别的变化,或基准测试显示明显差距的推理关键型任务中,才需要用到它——而不是把它当作安全的默认选项。
本指南不涉及的内容
本文是方法选择指南,而不是实现教程。以下几点有意不在讨论范围内:
- LoRA 变体 (DoRA、VeRA、LoRA+)。三种核心方法才是首先要做的决策;这些变体是之后才会用到的改进方案。
- 逐步代码演示。 这里不涉及安装命令或训练脚本。那是另一份单独的实操教程,本文不涉及。
- 多 GPU 训练 (FSDP、DeepSpeed ZeRO) 和 数据集准备:这两个话题本身就足够大了。
- RLHF、DPO 以及偏好优化。 这些属于和监督微调不同的目标类别。
- 是否应该做微调这件事本身。 如果你不确定微调是否比检索(retrieval)更合适,这个比较本身就值得单独解答,然后才轮到在这里挑选具体方法。
LoRA、QLoRA 与全参数微调之间到底有什么区别?
全参数微调会更新模型中的每一个参数。LoRA 则冻结基础模型,转而训练体积很小的低秩适配器矩阵(大约占参数总量的 0.1%-2%)。QLoRA 在 LoRA 的基础上又多做了一步:它把冻结的基础模型量化到 4 位精度(使用一种叫 NF4,即 NormalFloat 的数据类型),这样在训练适配器时,基础模型占用的内存要少得多。
记住这三种方法最清晰的方式,是把它们想象成一把梯子,每一级都比下面那一级少一项开销。
全参数微调 是最底层,也是最重的一档。每个权重都可训练,因此优化器必须为模型中的每个参数追踪梯度和优化器状态。这就是内存开销的来源,下一节我们会讲具体的计算方式。
LoRA (低秩适配)冻结原始权重,并在模型的各层中注入小型可训练矩阵。只有这些矩阵在学习,基础模型只是跟着搭车。LoRA论文报告称,对于175B模型,这将可训练参数最多削减10,000倍,并在该规模下将GPU内存降低约3倍,同时在作者测试的模型上,性能"与微调持平或更优"。由于变化的参数如此之少,训练出来的结果体积极小。Hugging Face的 PEFT 博客 给出了两个有用的参考点:一个针对 bigscience/mt0-xxl的完整检查点,大小为40 GB;另一个是单独的LoRA示例,其中保存的adapter只有19 MB。重点依然不变:与完整模型检查点相比,PEFT检查点通常都很小。
QLoRA 在LoRA的基础上进一步缩小LoRA未触及的那部分:被冻结的基础模型。将这些权重量化为4位NF4意味着基础模型占用的内存只是16位时的一小部分,而adapter仍在其之上以全精度进行训练。QLoRA论文将NF4描述为"对于正态分布的权重在信息理论上是最优的",这是一种精确的说法,意思是选择4位表示是为了匹配模型权重实际的分布方式,因此比起简单粗暴的4位舍入,损失更小。
这就是整个概念栈:全参数微调训练所有内容,LoRA冻结基础模型并训练adapter,QLoRA压缩被冻结的基础模型并训练adapter。其他一切(显存、质量、何时该用哪种方法)都源自这三个选择。
每种方法需要多少 VRAM?
对于 7B 模型,大致数字是 full fine-tuning 需要 60-80 GB,LoRA 需要 16-24 GB,QLoRA 需要 10-14 GB,根据 Axolotl 发布的表格。实际的结果是:QLoRA 通常能在许多单卡 12-24 GB 的消费级或专业级 GPU 上运行,适用于短上下文、小批量的设置,而 7B 模型的 full fine-tuning 则需要数据中心级内存或多 GPU 配置。
为什么 full fine-tuning 这么吃显存?简单算一下。当你训练每一个参数时,GPU 需要为每个参数保存三份东西:权重本身、它的梯度,以及优化器状态(Adam 类优化器会为每个权重额外保存两个值)。这就是为什么显存开销会是模型本身大小的好几倍。LoRA 冻结了基座模型,所以这份梯度和优化器的开销只发生在很小的适配器矩阵上。QLoRA 还会把冻结的基座以 4-bit 而不是 16-bit 存储,进一步削减了剩余最大的一块开销。
以下是这三种方法在不同模型规模下的对比,数据来自 Axolotl 的文档,以及大模型部分数据来自 QLoRA 论文:
| 方法 | 1-3B 模型 | 7-8B 模型 | 70B+ 模型 |
|---|---|---|---|
| Full fine-tuning (bf16 + AdamW) | 24-32 GB | 60-80 GB | 4-8x 80 GB |
| LoRA (bf16) | 8-12 GB | 16-24 GB | 2x 80 GB |
| QLoRA (4-bit NF4) | 6-8 GB | 10-14 GB | 40-48 GB |
来源:Axolotl文档涵盖了不同模型规模下的这三种方法;QLoRA论文独立报告了在单张48 GB GPU上对65B模型进行微调,“同时保持了完整16位微调的任务性能”,这与70B QLoRA的数据一致。Hugging Face的 4位量化博客 还分别展示了在单张16 GB T4上训练的13B模型,以及使用QLoRA在24 GB GPU上训练的33B模型。如果你的目标介于表格行之间,这些都是有用的参考点。
唯一值得记住的数字:一块48 GB显卡跑一个65B模型。这就是QLoRA的标志性成果,它重新定义了“我只有一块GPU”这句话的含义。
本节要点: VRAM占用等级是full >> LoRA > QLoRA,从full到QLoRA的跨度足够大,能把一项任务从多GPU机架搬到单张显卡上完成。
LoRA或QLoRA真的会让你损失质量吗?
对于大多数指令跟随和结构化输出任务,LoRA和QLoRA的表现只比完全微调低几个百分点。在复杂推理(尤其是数学)上,差距会拉大,完全微调仍明显领先。所以答案不是“几乎相当”,也不是“更差”。这取决于任务本身,任务类型会告诉你自己站在这条分界线的哪一侧。
按任务类型来看最清晰的证据来自2023年9月Anyscale针对 Anyscale针对Llama 2的研究。在ViGGO(一项结构化功能表示任务)上,LoRA在7B和13B模型上达到了完整微调准确率的约95%:作者认为这2%的差距是可以接受的权衡。在SQL生成任务上,LoRA几乎与完整微调持平,而LoRA 13B模型实际上击败了完整微调的7B模型。在GSM8k(一项数学推理基准测试)上,LoRA在7B和13B上始终表现不如完整微调,差距只在70B时才缩小。Anyscale团队的解读是,LoRA的低秩近似可能无法捕捉像多步数学这样复杂的能力。
关于这些数字有一点需要说明:该研究是在2023年9月针对Llama 2进行的。按任务类型呈现的模式(结构化输出差距小,复杂推理差距大)是从那时起大体上保持不变的持久结论。但确切的百分比在Llama 3或Mistral等更新的基础模型上可能有所不同,所以应把这些数字当作权衡的形状,而不是对你模型的保证。
QLoRA的质量表现自成一体。QLoRA论文报告称,其用QLoRA训练的65B模型Guanaco在Vicuna基准测试中达到了ChatGPT性能的99.3%。这很出色,但仅限于那个特定基准测试和2023年的那次比较,并非泛泛地宣称"QLoRA等同于ChatGPT"。与普通LoRA相比,Axolotl将QLoRA描述为存在"由于量化噪声导致的轻微性能下降":4比特基座会引入一些小错误,而LoRA的全精度基座没有这个问题。对大多数工作来说这是察觉不到的;但对于对精度微小变化敏感的任务,这是值得检验而非想当然的事。
小贴士: 最常见的质量意外不是QLoRA与LoRA之争。而是微调后的模型表现反而比你一开始的基础模型更差。这通常意味着训练做了你没打算做的事:在狭窄数据集上过于激进,或者只在新任务上评估,而通用能力在悄悄退化。在信任微调模型之前,一定要用训练分布之外的几个提示词测试它。那里出现的退化就是该收手的信号,而不是该发布的信号。
本节要点: 质量对等性取决于任务类型。结构化输出和指令遵循对LoRA/QLoRA来说是安全的;复杂推理才是完整微调仍然值得其成本的地方。
什么时候该选择每种方法?
对于大多数单GPU微调,从QLoRA开始。当你有VRAM余量并想要更快的步骤或稍高的质量上限时,升级到普通LoRA。把完整微调留给真正需要它的场景:大规模分布偏移、预训练级别的变化,或者基准差距确实存在的推理关键型任务。按顺序参考三个输入:可用VRAM、任务类型和质量要求,然后是速度。
以下是"这样做,而不是那样做"的分流方式:
1. 先检查你的显存(VRAM)。 如果你只有一张显存24 GB或更小的卡(大多数消费级和专业消费级GPU都是这样),QLoRA就是你默认应该用的方法,因为在三种方法里,只有它能可靠地把一个7B模型塞进这个显存范围。不要在单张消费级显卡上尝试full fine-tuning;上表已经告诉你7B任务根本放不下,你会花整个周末用惨痛的方式学到这一点。
2. 然后看你的任务类型和质量要求。 如果你的任务是指令跟随、结构化输出、SQL,或者通用领域适配,Anyscale的证据表明LoRA和QLoRA能给你接近满血的质量,用默认方案就行。但如果你的任务对推理能力要求很高(多步数学、复杂逻辑链),而质量又没有商量的空间,这才是你第一次有理由认真考虑上full fine-tuning,因为这是唯一一种基准测试持续显示明显差距的任务类型。
3. 然后再权衡速度。 QLoRA用一部分单步速度换取显存节省:4比特的基础模型必须在运行时实时反量化。如果你的显存足够跑普通LoRA(7B模型需要16到24 GB),你会获得更快的单步速度,还能避开量化带来的噪声,这使得LoRA在显存不是限制因素、而你又需要频繁迭代的情况下是更好的选择。
那么什么时候 is full fine-tuning才是正确答案?Axolotl的建议很直接:预训练(pre-training)阶段必须用它,而它适用的场景是"当你有充足的GPU显存或多GPU配置,并且需要最高性能的时候"。除此之外(也就是绝大多数实践中的fine-tuning场景,即让已有模型适配特定行为或领域),参数高效方法能用一小部分硬件资源就获得大部分的质量。
Unsloth把默认方案说得很直白:
"我们建议从 QLoRA 开始,因为它是训练模型中最易上手、最有效的方法之一。"
规则就是这样:默认使用 QLoRA,内存充足时可升级到 LoRA 以提升速度,只有当任务需求或规模迫使你这么做时,才升级到全量微调(full fine-tuning)。
本节要点: QLoRA是默认选择——LoRA是追求速度和余量的升级——全量微调则是例外,需要用分布偏移、预训练或推理基准测试来证明其必要性。
人们对微调(fine-tuning)方法最容易产生哪些误解?
大多数被浪费的周末都源于两个误解。第一个是把微调当作教模型学习新事实的方式,而它的主要作用其实是塑造行为。第二个是以为拧一个旋钮就能买到质量:以为更高的 LoRA rank,或者用 full fine-tuning 代替 QLoRA,就能自动换来更好的模型。这两种说法都只对了一半,而这恰恰是它们误导人的原因。
微调真的能让模型学到新事实吗?
这一点在专家之间确实存在真正的分歧,所以更值得弄清楚其中的细微差别,而不是简单站队。多份实践指南把"微调能教会新事实"列为头号误解:他们的观点是,微调在塑造模型的响应方式上远比在可靠地注入预训练阶段从未见过的具体事实上更有效。Unsloth 的文档则直接反驳,称微调无法教授新知识的说法"不成立",并将微调描述为一种"注入并学习新的领域特定信息"的方式。
两种说法都各有一部分道理,能够调和它们的理解是这样的:微调在塑造行为、强化基础模型中已经潜藏的知识方面是可靠的,也能编码特定领域的模式。它不可靠的地方在于植入那些在预训练阶段完全不存在的孤立事实。你的目标越接近"记住这份特定文档",就越有可能是用错了工具,而检索(retrieval)可能更适合你。因此,实用的建议在这场争论中依然站得住:在行为和风格上依赖微调,但对把它当作事实注入机制这一点要持怀疑态度。
更高的 LoRA rank 是否总能提升质量?
不会,而这恰恰是最容易被过度调高的一个旋钮。直觉上,更高的 rank 给适配器(adapter)更大的容量,所以理应"越多越好"。 Databricks 对此进行了实证测试 并发现将 rank 加倍"似乎并未带来任何可感知的输出质量提升"。在他们的实验中真正起作用的是他们针对哪些层(调整所有线性层,而不仅仅是注意力模块),而不是调高 rank 数值。值得吸取的经验是:在把调优精力花在拉高 rank 之前,先把它花在目标模块和数据质量上。
LoRA的质量总是等同于全参数微调吗?
并非总是如此,一篇近期的研究论文指出了一种具体的失效模式。"LoRA vs Full Fine-tuning: An Illusion of Equivalence"作者Shuttleworth等人发现,LoRA训练可能引入"入侵维度"(即完全微调模型中不存在的高阶奇异向量),并将其与持续学习场景中的遗忘现象联系起来,即同一模型被反复微调的情况。这是一个具体的警示,而非全面的否定:如果你只针对一个任务做一轮微调,广泛的质量对等证据依然成立。如果你在链式微调,并且关心保留基础模型的通用能力,这就是需要留意的失效模式。
常见问题
LoRA、QLoRA和全参数微调之间有什么区别?
全参数微调会更新模型中的每一个参数。LoRA则冻结基础模型,转而训练小型的低秩适配器矩阵,大约只占参数总量的0.1-2%。QLoRA在LoRA的基础上,还将冻结的基础模型量化为4位NF4精度,这样在训练适配器时基础模型占用的内存要少得多。结果形成了清晰的内存梯度:全参数微调最重,LoRA较轻,QLoRA最轻。
微调一个7B模型需要多少VRAM?
对于一个7B模型,Axolotl给出的数据显示,全参数微调大约需要60-80 GB,LoRA需要16-24 GB,QLoRA需要10-14 GB。在这三者中,只有QLoRA通常能装进单张12-24 GB的消费级或专业级GPU;而7B模型的全参数微调则需要数据中心级的内存或多张GPU。
QLoRA的质量比LoRA或全参数微调更差吗?
这取决于任务。对于大多数指令遵循和结构化输出工作,QLoRA与完整微调的差距只有几个百分点,Axolotl将其描述为相比普通LoRA仅有"由量化噪声导致的轻微性能下降"。而在数学等复杂推理任务上差距会拉大,2023年Anyscale针对Llama 2的研究显示完整微调在这方面有稳定的优势。
完整微调到底什么时候才值得?
对于预训练、大规模分布偏移,以及基准测试显示真实质量差距的推理关键型任务,完整微调值得其成本。当你有充足的GPU内存或多GPU配置并需要最高质量时,这也是应走的路径。对于常见情况(将现有模型适配到特定行为或领域),LoRA或QLoRA能以一小部分硬件成本给你带来大部分质量。
微调真的能让模型学到新事实吗?
部分正确。微调在塑造行为和强化基础模型中已潜藏的知识方面是可靠的,并且能够编码特定领域的模式。但在植入训练前数据中完全缺失的离散事实方面则不可靠。这里确实存在专家间的分歧。Unsloth的文档主张微调可以教授新知识,而其他指南则称这是头号误解,折中的观点是把微调用于行为和风格,而当目标是回忆特定事实时则求助于检索。
这留给你的结论
方法的选择归结为一个默认选项和两条退路:从QLoRA开始,当内存不是限制因素且你想要更快的步骤时升级到LoRA,只有当分布偏移、预训练或推理基准测试迫使你这样做时才升级到完整微调。
方法确定后,下一个决定就是它所暗示的硬件。你的方法选择刚刚告诉了你,你要找的是单块消费级显卡还是数据中心级内存。如果你想比较适用于AI工作负载的具体显卡,我们的 H100 vs RTX 4090 基准测试 涵盖了这方面。为你选择的方法确定GPU规格,以及运行训练任务本身的分步指南,都是各自独立的指南。