大数跨境

双量化(Double Quantization):QLoRA节省显存的隐藏杀手锏

双量化(Double Quantization):QLoRA节省显存的隐藏杀手锏 ai算法芯片与系统
2026-07-07
5
导读:双量化将QLoRA的量化常数从32-bit压缩至8-bit,使每参数常数开销由0.5bit降至0.127bit,65B模型节省约3GB显存,速度略有牺牲。

 

揭开NF4量化背后那个被压缩的"压缩器"


📖 本文目录

  1. 1. 前言
  2. 2. 量化基础:从FP32到4-bit
  3. 3. 被忽视的"元数据"问题
  4. 4. 双量化是什么?
  5. 5. 双量化如何工作?
  6. 6. 显存节省有多大?
  7. 7. 端到端流程示意
  8. 8. 双量化的局限与权衡
  9. 9. 结语

📝 前言

QLoRA让大模型微调变得人人可及——一张8GB显存的消费级GPU就能微调70亿参数的模型。这个奇迹的背后,除了LoRA的低秩适配,还有一个常被忽视的"隐藏功臣":双量化(Double Quantization)。🧠

从LoRA到QLoRA:大模型高效微调的技术演进

当你听到"QLoRA把模型压缩到4-bit"时,你可能以为事情很简单:FP32 → 4-bit,显存直接除以8。但实际上,量化过程本身会产生额外的显存开销。如果不处理这个开销,显存节省会大打折扣。💔

双量化就是解决这个问题的精妙设计——它相当于给"压缩器"又做了一次压缩。本文将深入剖析双量化的原理、机制和收益,用具体数字和公式让你看到它到底省了多少显存。📊


🔢 量化基础:从FP32到4-bit

什么是量化?

量化(Quantization)是把高精度数值映射到低精度表示的过程。在QLoRA中,模型权重从 FP32(32-bit) 或 BF16(16-bit) 压缩到 4-bit


   
   
   
    
   
   
   FP32: 0.123456789  →  4-bit: 某个索引值(0~15)

这就像把一张高清照片压缩成缩略图——体积小了,但关键信息还在。🖼️

量化的核心问题:如何还原?

4-bit数值本身是无法直接用于计算的。模型在做前向传播时,必须把4-bit权重反量化回高精度(如BF16)才能进行矩阵乘法。为了能够反量化,必须保存量化常数(Quantization Constants)。

分块量化(Block-wise Quantization)

如果对整个矩阵用同一个量化常数,精度损失会非常严重——因为不同位置的权重分布差异很大。QLoRA采用了分块量化:把权重矩阵分成小块(如每 64个权重 一组),对每个块独立计算量化常数。


   
   
   
    
   
   
   权重矩阵 (4096 x 4096)

├── 块1 (64个权重) → 量化常数 c₁
├── 块2 (64个权重) → 量化常数 c₂
├── 块3 (64个权重) → 量化常数 c₃
│   ...
└── 块N (64个权重) → 量化常数 cₙ

这样做的好处是精度更高——每个块都有自己的缩放因子和零点,能够更好地匹配局部分布。但问题也随之而来:这些量化常数本身也占显存! 😰


⚠️ 被忽视的"元数据"问题

量化常数有多大?

每个量化块需要保存两个常数:

  • • 缩放因子(Scale):通常是 FP32(32-bit)
  • • 零点偏移(Zero Point):通常是 FP32(32-bit)

或者更简单地说,每组需要保存一个 32-bit 的绝对最大值(Absmax)用于反量化。

算一笔账 💰

假设把权重矩阵分成每64个权重一块

  • • 每64个权重 → 需要存1个 32-bit 常数
  • • 每个参数平均分摊的额外显存:

这意味着:

  • • 名义上:每个参数从32-bit降到4-bit,节省了 28-bit
  • • 实际上:因为常数的存在,每个参数的实际显存是 

对于一个 70亿参数 的模型:

  • • 预期显存(纯4-bit):
  • • 实际显存(含常数):

凭空多出了约 0.44 GB!😱

为什么这值得关注?

对于一个700亿参数的模型(如LLaMA 70B):

  • • 每组64个权重,需要约 10.9亿个 量化常数(
  • • 每个常数32-bit → 约 4.36 GB 额外开销
  • • 这几乎相当于模型权重本身(4-bit下约3.5GB)的 1.25倍!😱

如果我们不解决这个问题,量化节省的显存会被严重侵蚀


🎯 双量化是什么?

双量化(Double Quantization) 就是:对这些量化常数再做一次量化。🔁

💡 通俗理解:你已经把衣服(权重)压缩进了行李箱(4-bit),但行李箱的标签(量化常数)本身也占地方。双量化就是把标签也折叠一下。🧳

核心思路

既然量化常数本身也是数值,而且数量很大,为什么不对它们也做一次量化呢?🤔

  • • 第一次量化:模型权重   → 4-bit  ,产生 32-bit 的量化常数 
  • • 第二次量化:量化常数   → 8-bit 的  ,产生 32-bit 的二次量化常数 

为什么能省显存?

关键在于分组大小的差异:

层级
分组大小
常数精度
每个元素分摊
第一次量化
每64个权重一组
32-bit
0.5 bit/权重
第二次量化
每256个常数一组
8-bit
0.03125 bit/常数

二次量化的常数(32-bit)分摊到每个权重时,影响微乎其微(因为每组256个常数才共享一个32-bit二次常数)。

双量化后的每参数开销 📉

对比不启用双量化:

每个参数节省了 0.373 bit! 🎉


⚙️ 双量化如何工作?

端到端流程 🔄

反量化过程(前向传播时)🔄

前向传播需要把4-bit权重还原为BF16进行计算,完整公式如下:

其中:

  • •  :以NF4格式存储的4-bit权重
  • •  :第一次量化的8-bit常数(已被二次量化压缩)
  • •  :第二次量化的32-bit常数(用于还原 

具体流程:

关键点 ⚡

⚠️ 反量化后的BF16权重只在当前前向传播计算时临时存在,计算完成后立即释放,不长期占用显存。这就是QLoRA能在低显存下运行的关键!


📊 显存节省有多大?

数学推导 ✏️

让我们用公式精确计算:

不启用双量化:

每64个权重需要1个32-bit常数。

启用双量化:

  • • 第一层:每64个权重 → 1个8-bit常数(而不是32-bit)
  • • 第二层:每256个8-bit常数 → 1个32-bit二次常数

每参数净节省:

实际模型收益 🏆

以 LLaMA 65B(650亿参数) 为例:

权重本身:

不启用双量化的常数开销:

启用双量化的常数开销:

节省对比 📉

项目
无双量化
启用双量化
节省
权重(4-bit)
32.5 GB
32.5 GB
常数开销
4.06 GB
1.03 GB 3.03 GB
 💾
总计 36.56 GB 33.53 GB ~3 GB
 🎉

💡 3 GB的显存节省意味着什么?

  • • 可以从 A100 40GB 降到 A100 40GB 更舒适地运行
  • • 或者在 RTX 4090(24GB) 上容纳更大的模型
  • • 对于多卡训练,节省的成本成倍增加

百分比视角 📈


   
   
   
    
   
   
   常量开销占比(65B模型):
├── 无双量化:4.06 / 36.56 = 11.1%
└── 启用双量化:1.03 / 33.53 = 3.1%

双量化把常数的显存占比从 11% 压缩到了 3%! 🚀


🔄 端到端流程示意

下图展示了从原始权重到最终存储的完整流程,突出显示双量化在其中的位置:

数据量变化一览 📊

阶段
数据
数量
精度
大小
原始
权重
650亿
FP32
260 GB
一次量化后
权重 + 常数
650亿 + 10.9亿
4-bit + 32-bit
32.5 GB + 4.36 GB
双量化后
权重 + 8-bit常数 + 二次常数
650亿 + 10.9亿 + 4.3万
4-bit + 8-bit + 32-bit
32.5 GB + 1.09 GB + 0.17 MB

二次常数的大小可以忽略不计:

节省了约 3.27 GB! 🎉


⚖️ 双量化的局限与权衡

它不是免费的 🕐

双量化带来了额外的计算开销:

  • • 加载模型时:需要做两次反量化(8-bit → 32-bit → 应用缩放)
  • • 前向传播时:每次计算前都要做同样的反量化流程
  • • 训练速度:QLoRA比标准LoRA慢约 30~40%,部分原因就是双量化

反量化的计算量:

但权衡是值得的 ⚖️

维度
损失
收益
训练速度
慢 30~40%
显存占用
减少 3GB+(65B模型)
 💾
模型精度
几乎无损
硬件门槛
消费级GPU可行
 🏆

💡 核心权衡:用少量速度换大量显存。对于绝大多数用户,这个交易是稳赚不赔的。

双量化 vs 其他技术 🔄

技术
解决的问题
额外开销
节省效果
NF4量化
权重体积
需要常数
4倍压缩
双量化
常数体积
需要二次常数
额外~0.37 bit/参数
分页优化器
显存尖峰
CPU-GPU传输
防止OOM

量化误差的累积效应

虽然双量化节省了显存,但它引入了额外的量化误差(8-bit量化常数的误差)。不过,由于:

  1. 1. 常数本身的数值范围较小,分布更集中
  2. 2. 8-bit量化比4-bit量化精度高得多(256个量化级别 vs 16个)

双量化引入的额外误差远小于4-bit权重量化本身的误差,对模型质量的影响可以忽略不计。✅


✨ 结语

双量化(Double Quantization)是QLoRA中一个容易被忽略但极其精巧的设计。它不是简单地"再次压缩",而是通过对量化过程的元数据进行再量化,在不牺牲精度的前提下,额外节省了约 3GB 的显存(以650亿参数模型计)。💾

核心要点速记 📌

  • • 🎯 解决的问题:量化常数本身占显存
  • • 🧠 核心机制:对32-bit量化常数做8-bit二次量化
  • • 📊 关键数字
  • • 🏆 最大收益:65B模型节省约 3GB 显存
  • • ⚖️ 权衡代价:训练速度慢约 30~40%

公式总结 🧮

没有双量化,QLoRA仍然是一个优秀的4-bit微调方案;有了双量化,它变成了在消费级硬件上微调百亿参数模型的革命性工具。🚀

这就是为什么一张 RTX 4090(24GB) 或甚至 RTX 3060(12GB) 可以运行QLoRA微调——双量化压榨出了每一比特的显存潜力。🎉

 


【声明】内容源于网络
0
0
ai算法芯片与系统
长期关注ai领域,算法,芯片,软件(系统,框架,编译器,算子库)等联合设计
内容 213
粉丝 0
ai算法芯片与系统 长期关注ai领域,算法,芯片,软件(系统,框架,编译器,算子库)等联合设计
总阅读3.1k
粉丝0
内容213