
微调大模型这件事,一直是「算力鸿沟」的重灾区:想微调一个 650 亿参数的模型,传统上需要好几张 A100 级别的显卡,小团队和个人根本负担不起。QLoRA 这篇论文就是来填这条鸿沟的——它让一个 65B 参数的模型,在一张 48GB 显存的显卡上就能微调,而且性能几乎不输全精度微调。这篇文章把这篇论文从头拆一遍,讲清楚它靠哪几招把显存省下来、为什么省了显存还不掉性能。
一、论文速览卡
| 论文标题 | QLoRA: Efficient Finetuning of Quantized LLMs |
| 作者 | Tim Dettmers, Artidoro Pagnoni, Ari Holtzman, Luke Zettlemoyer |
| 机构 | 华盛顿大学(University of Washington) |
| arXiv | 2305.14314(2023 年 5 月 23 日提交) |
| 一句话结论 | 把模型冻结并量化到 4-bit,只训练低秩适配器(LoRA),再配合 NF4 数据类型、双重量化和分页优化器三招,让 65B 模型在一张 48GB GPU 上完成接近全精度效果的微调。 |
二、为什么这篇论文值得精读
QLoRA 的价值,一句话:它把「微调大模型」从「机构级工程」变成了「个人级操作」。这个变化的分量,怎么强调都不过分。
在 QLoRA 之前,PEFT(参数高效微调)领域的明星是 LoRA——它通过「冻结原模型、只训练低秩适配器」的方式,把「可训练参数」的数量砍掉了几个数量级。但 LoRA 解决的是「可训练参数」的问题,没有解决「原模型权重本身太占显存」的问题:即便你只训练一丁点适配器,那个 65B 的原始模型还是得完整地、以 16-bit 精度加载进显存,这一下就是 130GB 起步,照样不是一般人玩得起的。
QLoRA 的贡献,就是补上了这个缺口。它的核心思想听起来简单:把「量化」和「LoRA」结合起来——既然原模型权重是冻结不训练的,那为什么还要用高精度存它?直接把它量化到 4-bit,显存瞬间缩到原来的四分之一甚至更少,然后再用 LoRA 只训练那一小撮适配器。这样,一个 65B 模型在 48GB 显卡上就能微调了。
但「量化 + 训练」这件事,其实有个众所周知的坑:量化的精度损失,通常会导致模型性能明显下降,尤其是训练时还要反向传播梯度,误差会被放大。QLoRA 真正厉害的地方,不在于「想到把两者结合」,而在于它发明了几个关键的工程技巧,让「4-bit 量化 + 反向传播训练」这个组合,性能几乎不打折。这才是它值得精读的核心。
还有一个容易被忽略的价值:QLoRA 论文不只是「提了个方法」,还用这套便宜的方法大规模地做了实证研究——微调了 1000 多个模型,系统性分析了不同指令数据集、不同模型规模、不同模型家族的效果。这种「用省下来的算力去做更彻底的科学分析」的做法,本身就是对开源社区的示范。
三、背景:为什么「量化」和「训练」一直合不来
要理解 QLoRA 的突破,得先看清它要啃的硬骨头:「量化」和「训练」这两个词,长期以来是互相排斥的。
量化(quantization)的思路,是把模型权重从高精度(比如 16-bit 的 FP16/BF16)压缩到低精度(比如 4-bit 整数),从而大幅节省显存。这招在「推理」阶段已经用得很成熟了——推理时权重只读不写,量化带来的精度损失可以接受,甚至可以通过各种技巧弥补。
但「训练」是另一回事。训练时,权重不仅要「读」,还要「写」——要通过反向传播更新参数,而梯度对精度的要求非常高。如果你把权重量化到 4-bit,那反向传播时梯度的微小变化就会「丢失」在量化的粗糙刻度里,导致模型根本学不动。所以长期以来,「量化」几乎只在推理阶段用,训练阶段仍然老老实实用高精度。
这就形成了一个死结:微调大模型需要高精度加载全部权重(显存爆炸),而量化虽然省显存,却没法用于训练(精度不够)。QLoRA 要做的,就是解开这个死结——找到一种「既能享受 4-bit 量化的省显存,又能正常反向传播训练」的办法。
它解这个结的思路,恰恰是 LoRA 给它的启发:既然 LoRA 已经把「需要训练的」和「需要冻结的」分开了,那「需要冻结的」那部分(原模型权重),为什么还要高精度存?把「冻结的」量化到 4-bit 省显存,把「要训练的」那一点点适配器保持高精度,两全其美。剩下的问题,就只是「怎么让 4-bit 的冻结权重,在反向传播时也能正常工作」。
四、核心方法:三招让 4-bit 也能训练
QLoRA 的贡献可以浓缩成三招。这三招,每一招都精准地解决了一个「量化训练」的具体痛点。
4.1 第一招:NF4——专为正态分布权重设计的数据类型
第一招是一个叫 4-bit NormalFloat(NF4) 的新数据类型。要理解它,得先知道一个事实:大模型的权重,大多服从正态分布(或者说,可以归一化成接近正态分布)。
传统的 4-bit 整数量化,是把数值范围「均匀」地切成 16 个刻度。但问题是:正态分布的数据,绝大多数都挤在「0 附近」的窄区间里,尾巴上那些极端值反而很少。用「均匀」的刻度去量化正态分布,会在「0 附近」浪费大量刻度(因为那里数据密集,刻度却一样粗),而在「尾巴」上又不够(因为那里虽然数据少,却需要更大的范围)。
NF4 的做法是:既然权重是正态分布的,那就用「信息论上对正态分布最优」的方式来分配这 16 个刻度——在数据密集的「0 附近」用更细的刻度,在数据稀疏的「尾巴」上用更粗的刻度。论文称它为「information theoretically optimal for normally distributed weights」(对正态分布权重信息论最优)。
这一招的直接效果是:同样是 4-bit,NF4 比普通整数量化能保留更多有效信息,量化误差更小。这为「4-bit 也能训练」打下了精度基础。
4.2 第二招:双重量化——连「量化常数」也一起量化
第二招叫 double quantization(双重量化)。要理解它,得先知道「量化常数」这个东西。
在分块量化里,每一块权重都有一个「缩放常数」(scale factor),用来把量化后的整数「还原」回真实的浮点数值。这些缩放常数本身,是要用浮点精度存储的——当权重被切得很细、块很多时,这些缩放常数累积起来的显存开销,居然也不小。
双重量化的思路很直接:既然这些缩放常数也占显存,那干脆把它们也量化一遍。也就是「量化」的「量化」——第一层量化压缩权重,第二层量化压缩第一层量化产生的缩放常数。论文说这一招能「reduce the average memory footprint」(进一步降低平均显存占用)。
这一招的价值在于「抠细节」:它在第一招已经省了大头的基础上,又把「量化附带的开销」也压下去了。虽然单看省得不多,但积少成多,正是这些「抠」出来的显存,才让 65B 模型恰好能塞进 48GB 显卡。
4.3 第三招:分页优化器——驯服显存「尖峰」
第三招叫 paged optimizers(分页优化器)。它解决的是另一个隐蔽的问题:训练过程中的显存占用不是恒定的,而是会有「尖峰」。
训练时,优化器(比如 Adam)要维护每个参数的「状态」(一阶矩、二阶矩等),这些状态在某个训练时刻可能会突然膨胀,产生一个显存「尖峰」。如果显卡显存刚好卡在临界点,这个尖峰就会导致 OOM(显存溢出)崩溃。
分页优化器的做法,借鉴了操作系统里「虚拟内存分页」的经典思想:当显存不够用时,把优化器状态「换页」到 CPU 内存里去,需要时再换回来。这样,显存里的尖峰就被「削平」了——即便某刻状态突然变大,也能临时「溢」到 CPU 里,不会崩。
这一招的价值在于「兜底」:它不直接省显存,但能让你在显存「临界」的情况下,训练也能稳稳跑完,而不是中途 OOM。这为「单卡微调 65B」提供了最后一块拼图。
4.4 三者合体:QLoRA 的完整训练流程
把三招合起来,QLoRA 的训练流程是这样的:
- 冻结原模型,量化到 4-bit(用 NF4 数据类型):原模型权重只读、不训练,用 NF4 压到 4-bit,显存降到原来的约四分之一。
- 叠加 LoRA 适配器(保持高精度):在量化模型上挂一小撮可训练的 LoRA 低秩适配器,只有这些适配器需要梯度、需要更新。
- 反向传播穿过冻结的 4-bit 权重:梯度「穿过」那个量化后的冻结模型,流入 LoRA 适配器——这是整个方法最精妙的地方,也是 NF4 存在的意义:让 4-bit 也能正常传梯度。
- 用双重量化 + 分页优化器进一步省显存、防 OOM:把量化常数也量化掉,把优化器状态分页到 CPU,确保单卡能跑完。
这样一来,「要训练的」和「要存着的」被彻底分开了:原模型量化到 4-bit 存着(省显存),LoRA 适配器高精度训练(保性能)。显存的大头被压了下去,训练的性能却几乎没掉。这就是 QLoRA 的核心。
五、实验结果:65B 塞进 48GB,性能还不掉
QLoRA 的实验结果相当硬核,几个关键数字我逐字列出来:
- 显存:QLoRA 把显存占用降到了「足以在单张 48GB GPU 上微调 65B 参数模型」的程度,同时保持了全 16-bit 微调的任务性能(preserving full 16-bit finetuning task performance)。
- 明星模型 Guanaco:QLoRA 微调出的最优模型家族叫 Guanaco,它在 Vicuna 基准上超越了此前所有公开模型,达到了 ChatGPT 性能的 99.3%,而且只需要单 GPU 上微调 24 小时。
- 量化精度:整个训练基于 4-bit 量化,通过冻结的量化模型反向传播梯度到 LoRA 适配器。
- 实验规模:作者用它微调了 超过 1000 个模型,覆盖 8 个指令数据集、多种模型家族(LLaMA、T5)、以及多档规模(包括 33B 和 65B 这种用常规微调根本跑不起的规模)。
这组数据里,最震撼的是「99.3%」这个数字:一个靠单卡、24 小时、4-bit 微调出来的开源模型,几乎追平了闭源的 ChatGPT。这在当时是现象级的——它第一次让「普通人用一张消费级显卡,微调出一个接近 ChatGPT 的模型」变成了现实。Guanaco 也因此在开源社区里迅速出圈。
还有一点值得注意:论文不只是「报了个好分数」,还顺带做了一件很有价值的事——用它便宜的方法,大规模地分析了「当前聊天机器人基准到底靠不靠谱」。论文指出「当前的 chatbot benchmarks 不足以可信地评估聊天机器人的真实水平」,并用 GPT-4 评估和人工评估做了交叉验证。这种「顺手把整个领域的评测问题也查一遍」的严谨,是 QLoRA 论文格外扎实的地方。
六、局限与争议:量化训练也不是免费的午餐
QLoRA 再成功,也有它的边界和争议,论文和后续研究都讨论过:
- 推理时仍要反量化:QLoRA 的训练是 4-bit,但推理时为了精度,通常要把权重反量化回 16-bit 再计算。也就是说,省的是「训练显存」,推理显存并不因 QLoRA 而自动降低(除非你额外做推理量化)。这是很多人的误解。
- 和全精度微调仍有细微差距:虽然 QLoRA 声称「保持全 16-bit 微调的任务性能」,但在一些极端任务、长尾场景或高难度推理上,4-bit 量化的信息损失仍可能带来可观测的性能下降。它不是「完全免费」,而是「几乎免费」。
- 对量化敏感的架构/任务要小心:NF4 是为「正态分布权重」优化的,对权重分布不符合假设的模型或层,效果可能打折。此外,一些对精度极敏感的数值任务,量化训练的风险更高。
- 调参仍有门槛:QLoRA 的 LoRA 秩、量化粒度、学习率等超参,对最终效果影响不小,并没有完全「傻瓜化」。用得好需要一定经验。
- 被后续方法部分超越:QLoRA 之后,出现了更多「更省、更快」的量化微调方案(比如各种 3-bit、2-bit 微调,以及更先进的量化格式),QLoRA 的「4-bit 下限」本身也在被不断下探。但它确立的「量化 + PEFT」范式,一直延续至今。
这些局限,其实为「量化训练」这条线划出了清晰的改进空间。但无论如何,QLoRA 作为「把量化微调从实验室带进千家万户」的那个工作,其范式地位是公认的。
七、横向对比:QLoRA 在「模型压缩」谱系里的位置
把 QLoRA 放进「模型压缩 / 高效微调」的演进脉络,它的位置会很清楚。
在它之前,高效微调领域有两条主线:一条是 PEFT(参数高效微调)——以 LoRA 为代表,解决「可训练参数太多」的问题,让微调不再需要更新全部参数;另一条是量化——以 GPTQ 等为代表,解决「权重存储太大」的问题,但主要用于推理。
QLoRA 的贡献,是把这两条线「缝合」在了一起:它继承了 LoRA 的「只训练适配器」,又引入了量化的「把冻结权重压到 4-bit」,让「量化」第一次真正进入了「训练」阶段。可以把它看作 「LoRA 的量化升级版」——LoRA 解决了「训练什么」的问题,QLoRA 进一步解决了「冻结的那部分怎么省显存」的问题。
和 LoRA 相比,QLoRA 的关系是「继承 + 扩能」:LoRA 让微调「参数变少」,QLoRA 让微调「显存变小」,两者叠加,才真正让「单卡微调大模型」落地。没有 QLoRA,LoRA 的省显存效果是有限的(原模型还是高精度);有了 QLoRA,才把显存这条「隐形的墙」也拆了。
它和 GPTQ 的关系也很值得一说:GPTQ 是「训练后量化」(post-training quantization),用来压缩一个「已经训好」的模型做推理;QLoRA 是「量化感知微调」(quantization-aware finetuning),在量化后的模型上继续「微调」。两者解决的是不同阶段的问题,可以配合使用——先用 GPTQ 压缩推理,或用 QLoRA 做低成本微调。
如果要给 QLoRA 一个定位,最准确的是:它是「大模型微调民主化」的临门一脚。它让「用一张消费级显卡微调 65B 模型」从「不可能」变成了「现实」,从而把微调大模型的能力,真正交到了每一个开发者和研究者手里。
八、总结与启示:QLoRA 留给我们三个判断
读完 QLoRA,我提炼出三个对实践最有价值的判断:
第一,「冻结的」就该用最低成本存。QLoRA 的核心洞察朴素但深刻:既然原模型权重不训练,为什么还要高精度存它?把「要训练的」和「要冻结的」分开,只对「要训练的」那部分保持高精度,其余全部压到极限。这个「分级对待」的思想,适用于几乎所有的工程优化。
第二,「量化」和「训练」的墙,是可以拆的。长期以来的共识是「量化不能训练」,但 QLoRA 用 NF4 + 反向传播穿过量化权重,证明了这个共识可以被打破。它提醒我们:很多「不能」其实只是「还没找到对的方法」,尤其在工程领域,换个数据表示、换个梯度路径,可能就通了。
第三,省下来的算力,应该拿去做更彻底的科学。QLoRA 最值得学习的地方,不只是「省了显存」,更是它用省下来的便宜方法,去做了 1000 多个模型的系统性分析,顺手还揭穿了「现有 benchmark 不可信」的问题。这告诉我们:工具便宜了,不是让你「刷分」,而是让你「敢去做更大规模、更诚实的验证」。
如果说 LoRA 让微调「参数变少」,那 QLoRA 就让微调「显存变小」。这一小步,把「微调大模型」从机构的机房,搬进了普通人的桌面——单卡 48GB、24 小时、99.3% 的 ChatGPT,这就是 QLoRA 交给整个社区的一张门票。
参考来源
- QLoRA 论文(arXiv:2305.14314):arxiv.org/abs/2305.14314
- 官方代码仓库:github.com/artidoro/qlora


