LoRA 和 QLoRA 是什么?

LoRA 和 QLoRA 是什么?为什么可以降低大模型微调成本?
你用 RLHF 调教出了一个更听话的大模型。但问题是——这只是让它学会了"什么该做、什么不该做"。如果你想让它学会写你公司的文案风格、分析你手里的专业数据、甚至扮演你的虚拟助手呢?
靠人类一条条标注偏好数据?成本太高。靠 Prompt 工程?上下文长度有限制。
真正可行的路,是微调——让模型在你自己的数据上再训练一段时间。但一想到微调的硬件需求,很多人都默默关掉了浏览器:7B 模型要 16GB 显存,65B 模型要 120GB 以上,一张消费级显卡根本跑不动。
LoRA 和 QLoRA 就是来解决这个问题的。它们让"用自己的数据微调大模型"这件事,从需要机房级别算力,变成了你桌上的游戏显卡也能搞定。
大模型微调为什么这么贵?
微调的本质,是让模型在新的数据上做一轮训练。
训练需要什么?算力、显存、时间。其中最要命的,是显存。
拿 7B 模型举个例子。全参数微调时,显存被三样东西瓜分:
模型权重本身约占 14GB。这是必须要有的,模型参数就摆在那儿。
梯度值需要 14GB。每更新一次参数,都得记住怎么改。梯度要存,而且必须是高精度(float32),否则训练直接崩。
优化器状态需要 28GB。Adam 优化器要维护两个动量参数,每个参数都要跟一份。
三个加起来,7B 模型微调需要 56GB 显存,比模型本身大了三倍。
65B 模型更夸张。模型本身 130GB,梯度 130GB,优化器 260GB,加起来超过 500GB。
这什么概念?英伟达消费级旗舰 RTX 4090 是 24GB。A100 专业卡是 80GB。普通人想微调?门都没有。

更让人绝望的是,这还只是训练时的显存。实际跑起来,还要算上激活值、中间计算结果、批量数据。显存不够,根本跑不起来。
有人会说:那就让模型小一点嘛。问题是,小模型能力不够。大模型几十亿参数学到的知识和能力,小模型复制不了。
有没有办法,既保留大模型的能力,又不用把整个模型都塞进显存?
这就是 LoRA 要解决的问题。
LoRA:不改全部,只改低秩
LoRA(Low-Rank Adaptation)的思路非常巧妙。
研究者发现:大模型在微调时,参数的变化其实没那么"自由散漫"。虽然模型有几十亿个参数,但真正重要的变化,集中在少数几个方向上。
换句话说,微调后权重矩阵的变化 ΔW,几乎是低秩的——信息高度冗余,很多维度其实在"打酱油"。
这就好比一本书微调后,99% 的内容没变,只是几个关键章节改了。那我们为什么要把整本书都重新打印一遍?只改那几页关键的不就行了?
LoRA 的做法是:不直接训练 ΔW,而是把它分解成两个小矩阵的乘积。
原矩阵维度是 d×d,比如 10000×10000,参数量是 1 亿。
LoRA 把它分解成 A(d×r)和 B(r×d)的乘积,其中 r 远小于 d。
如果 r=8,A 就是 10000×8,B 就是 8×10000,参数量是多少?
10000×8 + 8×10000 = 16 万。
对比原来的 1 亿,减少了 625 倍。
这就是 LoRA 的核心:低秩分解。用两个小矩阵的乘积,代替原来的大矩阵。
训练时,只有 A 和 B 的参数在更新。大矩阵 W 保持冻结。
训练完成后,把 A×B 的结果加到原始权重上,整个模型就能用了。推理时没有任何额外开销——因为它本质上就是在原模型上加了一层"补丁"。

参数减少了 600 多倍,显存自然也省了。
梯度不用存了——大矩阵不更新,梯度就是零。
优化器状态也不用存了——A 和 B 参数量太小,Adam 的动量占不了多少空间。
7B 模型用 LoRA 微调,显存从 56GB 降到 24GB 左右。一张 RTX 3090 就能跑起来。
效果呢?研究者做了大量实验,在多个任务上,LoRA 的效果和全参数微调几乎持平。有时候甚至更好——因为更新的参数少了,过拟合的风险反而低。
这就很离谱了。改动 0.1% 的参数,达到 99% 的效果。LoRA 凭什么?
答案就在"低秩"这两个字上。大模型微调时真正需要调整的方向,其实就那么几个。LoRA 精准地抓住了这些方向,其他的根本不用动。
QLoRA:给 LoRA 再加个压缩引擎
LoRA 已经很强了,但还有进步空间。
问题在哪?LoRA 解决了"梯度"和"优化器"占用显存的问题,但模型权重本身还是要完整加载到显存里。
7B 模型要 14GB。13B 要 26GB。30B 要 60GB。
有没有办法把模型权重也压缩一下?
QLoRA 干的就是这件事。它的全称是 Quantized Low-Rank Adaptation,在 LoRA 的基础上加了量化。
量化的原理很简单:模型权重本来用 32 位或 16 位浮点数存储,精度高但占地方大。能不能压缩到 4 位?
4 位只能表示 16 个值,精度肯定有损失。但 QLoRA 的研究者发现,只要量化方法选得对,损失可以做到非常小。
他们设计了一种专门针对神经网络权重分布的 4 位量化方法:4-bit NormalFloat(NF4)。
这个方法的原理比较复杂,简单说就是:神经网络权重分布不均匀,中间值多、极端值少。NF4 针对这个分布优化,用 4 位精确表示常见值,略微粗糙地表示罕见值。整体误差反而比均匀量化小。
除了 NF4,QLoRA 还有两个关键技术。
双重量化。量化本身需要存储"量化常数"——每个参数块有一个缩放因子。QLoRA 把这些常数再做一次量化,进一步省显存。
分页优化器。训练过程中,如果显存突然不够了(比如某个 batch 特别大),分页优化器会把优化器状态临时存到 CPU 内存里,等显存宽松了再拿回来。防止训练中途崩掉。
整个流程是这样的:
原始模型先量化成 4 位存储在显存里。
计算时,把需要参与运算的部分反量化为 16 位。
然后加上 LoRA 的低秩适配器做训练。
推理时,4 位模型加 LoRA 补丁,直接输出结果。

效果怎么样?
65B 模型原本需要 520GB 显存,用 QLoRA 只需要 78GB。
这是质的飞跃。原来只有 A100 80GB 乘以 6 才能跑,现在两张消费级卡并联就能跑 65B 模型。
精度损失呢?在多个 benchmark 上,QLoRA 和全参数微调的差距在 1% 以内,基本可以忽略。
代价是训练速度会慢一些——因为有量化、反量化的开销。但换来的硬件门槛降低,完全值得。
三种微调方式,怎么选?
全参数微调、LoRA、QLoRA,三种方式各有适用场景。
全参数微调,显存需求最高。7B 要 56GB,65B 要 520GB。普通人别想了,只有专业计算集群才能跑。好处是效果上限最高——所有参数都在调,模型能力能完全释放。
LoRA,显存中等。7B 模型 24GB,13B 模型 40GB。RTX 3090/4090 单卡能跑。效果和全参基本持平,训练速度也快。大多数场景下的首选。
QLoRA,显存最低。7B 模型 6GB,65B 模型 78GB。消费级显卡的极限微调方案。效果接近 LoRA,训练速度稍慢,但硬件门槛最低。

做个类比:
全参数微调是包专机。最快、最舒服,但成本上天。
LoRA 是打车。灵活方便,成本可接受,大多数人这么选。
QLoRA 是骑共享单车。门槛最低,到哪都能骑,就是慢点。
不是越贵越好,是合适最重要。
你的显卡能微调多大模型?
说几个具体数字,方便大家对号入座。
8GB 显存(RTX 3060 移动版):勉强能用 QLoRA 微调 1-3B 的小模型。比如 TinyLlama、Phi-2。更大的模型塞不进去。
12-16GB(RTX 4060 Ti、RTX 3080):QLoRA 微调 7B 模型。比如 LLaMA-7B、Qwen-7B、ChatGLM3-6B。日常玩一玩足够了。
24GB(RTX 3090、RTX 4090):两个选择。可以 QLoRA 微调 13B 模型,或者直接用 LoRA 微调 7B。LoRA 比 QLoRA 训练速度快不少,有条件尽量选 LoRA。
48GB(专业双卡工作站):LoRA 微调 30B 模型没什么问题。MOSS 7B、Baichuan 13B 都能玩。
80GB 以上(A100、V100):LoRA 微调 65B+ 的模型,或者干脆全参数微调 7-13B。这是企业级配置。

选模型的时候也要注意,不一定是越大越好。
7B 模型推理速度快,显存占用小,部署方便。很多场景下足够用了。
13B 模型能力提升明显,显存需求还在消费级显卡范围内。目前最平衡的选择。
30B 以上模型,除非你有明确的大参数需求,否则训练和部署成本会让人头疼。
结合自己的硬件和需求,选择合适的模型规模,比一味追求大参数更重要。
LoRA 超参数怎么调?
LoRA 有几个关键参数,调得好不好直接影响效果。
r 值。这是最核心的参数,决定了低秩矩阵的秩有多大。
r=8:参数量最少,训练最快,但表达能力可能受限。适合数据量小、任务简单的场景。
r=16-32:最常用的范围。大多数任务选这个就对了。
r=64-128:参数量大了,表达能力更强,但过拟合风险也高。适合数据量充足、任务复杂的场景。
怎么选?没有标准答案。建议从 r=16 开始,效果不好再往上调。
有一个经验公式:r 的值和数据集的质量成反比。数据质量越高,r 可以越小。垃圾数据太多,就得多给点参数让它慢慢学。
Alpha 值。这是 LoRA 层的学习率缩放因子,和 r 共同决定 LoRA 的影响力度。
常见的做法是设 Alpha = 2r。比如 r=16,Alpha 就设 32。
原理是:学习率缩放后,LoRA 的初始影响相当于"训练 r/2 个方向",符合经验值。
启用哪些层。LoRA 默认只加在 Q 和 V 的投影层上(q_proj、v_proj)。
研究表明,至少启用 Q 和 V 层。这是捕捉指令遵循能力的核心。
如果你的任务需要更精细的控制,可以加上 K 和 O 投影层(k_proj、o_proj)。
更激进的做法是加上 FFN 层(gate_proj、up_proj、down_proj),能捕捉更多知识,但参数量也会增加。
Target Modules 的选择,根据任务来:
对话类任务:q_proj、v_proj 够了。
知识密集型任务(问答、摘要):加上 FFN 层。
风格迁移类任务:可以全加,但 r 值要设小一点防止过拟合。

最后,也是最重要的——数据质量比超参数重要一百倍。
LoRA 训练的本质是从数据中学习。如果数据是垃圾,参数调得再花哨也没用。
Alpaca 数据集(5.2 万条指令数据)按今天的标准已经落伍了,质量参差不齐。
LIMA 数据集只有 1000 条,但由专家精心筛选,微调效果反而更好。
数据清洗、格式规范、噪声过滤,这些工作比调参值得花十倍时间。
让微调真正落地
LoRA 和 QLoRA 的出现,把大模型微调的门槛从"需要机房"降到了"需要一张游戏显卡"。
这意味着什么?
意味着每个开发者都可以拥有自己的专属 AI。不是调调 Prompt 那种专属,是真正能在私有数据上训练、真正学到特定知识的那种专属。
企业可以用自己的业务数据微调客服模型。
研究者可以用公开数据集微调专业领域助手。
个人开发者可以微调自己的写作风格模型。
技术的民主化,从来都是这样发生的——不是等高端技术变得便宜,而是有人专门为降低门槛而设计。
但技术只是工具。真正决定效果的,还是你有什么数据、你想解决什么问题、你愿不愿意花时间打磨。
下一步,可以去试试 HuggingFace 的 PEFT 库,里面有完整的 LoRA 实现。也可以研究一下 Adapter、Prompt Tuning 等其他参数高效微调方法,对比它们的优缺点。
或者,直接动手微调一个属于自己的 AI 助手。
你会发现,这个过程没有想象中那么难。
而这,才是真正的开始。
上下文窗口限制了模型能"看到"的字数上限。但你有没有想过——即使给模型喂了足够长的上下文,它真的能"记住"并"理解"所有内容吗?下一篇文章我们来聊聊:上下文窗口的原理,以及长上下文背后的真相。
