11.3 QLoRA:单卡微调大模型
11.2 讲的 LoRA 解决了”训练参数太多”的问题。但还有一个问题没解决:基座模型本身就要占用大量显存,哪怕参数冻结不训练。 一个 70B 参数的模型,用 float16 精度存储就需要 140GB 显存。一张 RTX 4090 只有 24GB——连模型都装不下,别说训练了。
2023 年,华盛顿大学的 Dettmers 等人提出了 QLoRA(Quantized LoRA,量化低秩适配)1。它把 LoRA 和模型量化结合起来,让单张 24GB 显卡微调 70B 模型成为可能。
打个比方:LoRA 是在一本厚重的百科全书旁边贴几张便利贴(只训练便利贴,不动书)。但问题是——这本书本身要放到桌子上,桌面不够大就放不下。QLoRA 的做法:先把百科全书压缩成一本口袋书(量化),再在旁边贴便利贴(LoRA)。 桌面小也没关系了。
为什么 LoRA 不够:显存都去哪了
普通 LoRA 微调一个模型时,显存被以下东西瓜分:
| 显存占用 | 全量微调 70B | 普通 LoRA 70B | 说明 |
|---|---|---|---|
| 模型权重 | 140 GB (fp16) | 140 GB (fp16) | 基座模型本身 |
| 梯度 | 140 GB | 0 | LoRA 不计算基座模型梯度 |
| 优化器状态 | 280 GB (Adam) | 约 0.5 GB | Adam 需要存两倍参数量的动量数据 |
| 激活值 | 视 batch 和长度而定 | 同左 | 前向计算时暂存的中间结果 |
| 合计 | 约 560 GB 以上 | 约 140 GB 以上 |
LoRA 把”梯度”和”优化器状态”两栏几乎砍掉了,但模型权重 140GB 这一栏纹丝不动。如果不解决模型权重本身的加载问题,单卡微调大模型还是不可能。
核心创新一:NF4 数据类型
把 float16 精度降到 4-bit(即每个参数只占 0.5 字节),70B 模型从 140GB 压缩到约 35GB。但量化不是简单的”四舍五入”——直接把模型参数截断到 4-bit 会严重损害效果。
QLoRA 的第一个关键技术是 NF4(NormalFloat 4-bit) 数据类型2。
普通的 INT4 量化把数值均匀映射到 16 个整数值(-8 到 7)。但神经网络权重不是均匀分布的——它们近似正态分布(钟形曲线,大部分值集中在 0 附近,极端值很少)。
NF4 的设计思路:既然权重集中在 0 附近,就在 0 附近多放几个”刻度”(量化值),在两端少放几个,让信息保留最多。 数学上,NF4 的 16 个量化值是从正态分布的分位数中选取的——信息论上这是最优的 4-bit 表示方式 3。
| 量化格式 | 设计思路 | 适用数据 | 对神经网络权重的效果 |
|---|---|---|---|
| INT4 | 均匀量化,16 个值等间距 | 均匀分布 | 损失大,0 附近精度不足 |
| FP4 | 浮点(符号+指数+尾数) | 需要大范围 | 表达精度不足,浪费 |
| NF4 | 正态分布分位数量化 | 近似正态的神经网络权重 | 最优,信息损失最小 |
打个比方:拍照时,画面中人脸占大部分,天空背景占小部分。均匀分配像素的话,人脸和天空一样清晰。NF4 的做法是”人脸区域给更多像素,天空区域给更少”——反正天空细节本来就不重要。类比到权重:值密集的区域(0 附近)量化精度高,值稀疏的区域(极端值)量化精度低。
核心创新二:双重量化
量化不仅要存量化后的权重值,还要存”缩放因子”(scaling factor)——告诉计算机怎么把量化后的整数变回原来的浮点数。QLoRA 用分块量化:每 64 个参数为一组,共享一个缩放因子。
对于 70B 参数的模型,每 64 个一组,约 10 亿个组,每组一个 float32 缩放因子,光缩放因子就占约 4GB 显存。
双重量化(Double Quantization)4 的思路:对缩放因子本身再做一次量化——把缩放因子从 float32 压缩到 8-bit。
| 量化策略 | 每参数平均位数 | 70B 模型显存 |
|---|---|---|
| 单次量化 (NF4 + float32 缩放因子) | 约 4.5 bits | 约 38 GB |
| 双重量化 (NF4 + 8-bit 缩放因子) | 约 4.13 bits | 约 35 GB |
节省约 3GB。对 24GB 显卡来说,这 3GB 可能就是能不能跑起来的差别——可以用它来增大一次处理的文本量或批次大小。
核心创新三:分页优化器
训练时,优化器(如 Adam)需要额外存两份动量数据(一阶动量和二阶动量)。当显存快满时,QLoRA 的分页优化器(Paged Optimizer)5 灵感来自操作系统:把暂时不用的优化器状态从 GPU 显存换到 CPU 内存里,需要时再换回来。
就像桌面上放不下了,把暂时不用的书放到旁边的书架上,用的时候再拿过来。代价是速度——GPU 和 CPU 之间来回搬运数据有延迟,训练会慢约 20-30%。但比起”跑不起来”,慢一点总比不能跑强。
QLoRA 的显存计算
以 70B 参数模型为例,对比三种方案的显存需求:
| 方案 | 模型权重 | LoRA 参数 | 优化器 | 总显存 | 能在 24GB 上跑吗 |
|---|---|---|---|---|---|
| 全量微调 | 140 GB (fp16) | - | 280 GB | 约 560 GB | 不能 |
| LoRA | 140 GB (fp16) | 约 0.3 GB | 约 0.6 GB | 约 140 GB | 不能 |
| QLoRA | 35 GB (NF4) | 约 0.3 GB | 约 0.6 GB | 约 44 GB | 配合梯度检查点+CPU offloading 可以 |
44GB 仍超 24GB,为什么实际能跑?因为还配合了两个”以时间换空间”的策略:
- 梯度检查点(Gradient Checkpointing):不保存所有中间计算结果,需要时重新算一遍。省显存,慢 15-25%。
- CPU Offloading:把一部分激活值放到 CPU 内存而非 GPU 显存里。
三个技术叠在一起(NF4 + 梯度检查点 + CPU Offloading),70B 模型最终能在单张 24GB 显卡上跑起来。
对于 7-13B 的小模型,QLoRA 完全在单卡舒适区运行:
| 模型大小 | QLoRA 总显存 | 消费级显卡举例 |
|---|---|---|
| 7B | 约 6 GB | RTX 3060 (12GB) 轻松 |
| 13B | 约 10 GB | RTX 4070 (12GB) 刚好 |
| 33B | 约 20 GB | RTX 4090 (24GB) 可跑 |
| 70B | 约 44 GB (优化后约 20GB+) | RTX 4090 (24GB) 需 offloading |
QLoRA vs LoRA:决策指南
| 场景 | 推荐 | 理由 |
|---|---|---|
| 模型 7B 以内,显存充裕 (24GB+) | LoRA (fp16) | 不需要量化,精度无损 |
| 模型 13B-70B,单卡 24GB | QLoRA | 不量化根本装不下 |
| 模型 70B 以上,有多张 A100 | LoRA (fp16) + DeepSpeed | 多卡分担显存 |
| 推理部署 | QLoRA 训练后合并为 fp16 或转为 GGUF 格式 | 训练省显存,推理按需选精度 |
核心原则:显存够就不用 QLoRA,显存不够再上。量化会引入微小精度损失——如果你的任务对精度极度敏感(如数学推理、代码生成),优先加卡而非上量化。但实际上,几乎所有个人开发者的起点都是 QLoRA——因为绝大多数人只有一张显卡。
QLoRA 的常见坑
计算精度不匹配。 量化模型用 4-bit 存储,但计算时要转回 16-bit。如果计算精度和训练精度不一致(比如量化用 fp16 但训练用 bf16),会导致计算结果异常,loss 无法正常下降。
合并权重时的额外误差。 QLoRA 训练完后把 LoRA 权重合并回基座模型时,如果基座仍是 4-bit 量化的,合并过程可能引入额外精度误差。建议合并前先把基座转回 fp16。
NF4 不是万能药。 对于数学推理、代码生成这类对精度敏感的任务,4-bit 量化的损失可能比通用对话任务更大。这时候考虑用 8-bit 量化(LLM.int8())作为折中 6。
没有校准数据可能导致量化效果差。 NF4 量化依赖对模型权重分布的假设(正态分布)。某些模型(特别是非 Transformer 架构或特殊初始化的模型)的权重分布可能偏离正态,NF4 效果会打折扣。
2026 年 QLoRA 的演进
- QDoRA(2025):把 QLoRA 的量化训练和 DoRA 的方向分解结合——量化的基座加方向-幅度分解的 LoRA,进一步缩小与全量微调的差距 7。
- 1 位量化训练(2025-2026):微软的 BitNet b1.58 尝试把模型压到极致(每个参数不到 2 bit),但训练稳定性仍是挑战,2026 年尚未成为主流。
- HQQ+(2025):不用校准数据的即时量化,省去量化前准备校准数据步骤,配合 LoRA 训练更省事。
- Unsloth(2024-2026):通过定制 Triton 内核让 QLoRA 训练速度提升 2-5 倍,已成为社区事实标准。
上一节:11.2 全量微调与LoRA | 下一节:11.4 SFT:让模型学会"回答"而不是"续写"
注释
-
Dettmers et al., “QLoRA: Efficient Finetuning of Quantized Language Models”, NeurIPS 2023, https://arxiv.org/abs/2305.14314 ↩
-
Dettmers et al., “QLoRA”, 2023; HuggingFace QLoRA 教程 2025 ↩
-
Dettmers et al., 2023, Section 3.1 ↩
-
Dettmers et al., 2023, Section 3.2 ↩
-
Dettmers et al., 2023, Section 3.3 ↩
-
Dettmers et al., “LLM.int8()”, 2022 ↩
-
结合 Dettmers 2023 与 Liu et al. 2024 ↩