· 参数高效微调

QLoRA 原理图解:三个组件把微调显存压下来

4-bit 量化冻结基座 + 16-bit LoRA 适配器,按「传统量化 → NF4 → 双重量化 → 分页优化器」的顺序逐层拆开。

参数高效微调 · 图文笔记
24:43录屏时长
58静止画面
3关键技术组件
4-bit基座权重精度
一句话主线:QLoRA 不改微调算法,只改基座模型存在显存里的精度。把预训练权重压到 4-bit 并冻结,再在其上挂 16-bit 的 LoRA 适配器做训练——这是它与 LoRA 唯一的结构差别,也是显存下降的主因。

01 QLoRA 在讲什么

QLoRA(Quantized Low-Rank Adaptation)是 LoRA 的量化增强版本,2023 年由华盛顿大学与微软研究院提出。它在 LoRA 的基础上引入 4-bit 量化,在几乎不损失性能的前提下把大语言模型微调的硬件门槛大幅降低,使数十亿参数级别的模型可在单张消费级 GPU(如 RTX 3090 / 4090)上完成高效微调。讲义原文

核心思想同样是一句话:讲义原文 先对预训练模型权重进行 4-bit 量化以压缩显存占用,再在其上应用 LoRA 进行参数高效微调。

放在具体硬件上看这个差别的量级:原片口述 移动端单卡走全参微调连 0.6B 参数都吃力,同一张卡走 QLoRA 则可以调 8B 的模型。

图 1 · 三种微调形态的显存占用结构(同比例示意)
三种微调形态的显存占用结构Optimizer State(32 bit)Adapters(16 bit)Base Model全参微调 Full FTLoRAQLoRA32 bit 全量副本无适配器16-bit Transformer16-bit Transformer(冻结)4-bit TransformerCPU参数更新 Parameter Updates梯度流 Gradient Flow分页流 Paging FlowQLoRA 与 LoRA 的唯一结构差别在 Base Model:从 16-bit 变为 4-bit
  • 全参微调:优化器状态是 32-bit 的全量副本,方框面积最大。
  • LoRA:优化器状态大幅缩小(要训的参数少了),但 Base Model 仍要按 16-bit 完整加载——权重冻结也依然要参与前向计算与梯度回流;此外还额外多出 Adaptors(A、B 两个低秩矩阵)这一块显存。
  • QLoRA:Base Model 换成 4-bit,这一块的显存面积才是真的降下来。图里从优化器状态牵向 CPU 的洋红虚线,是第三个组件的预示——优化器状态按页在 CPU 与显存之间往返。

02 先把传统 4-bit 量化讲清楚

NF4 是从传统 4-bit 量化发展来的,所以先看基线流程。讲义原文 传统 4-bit 量化通常采用三步:

  • 使用权重的最大绝对值(absmax)把权重归一化到区间 [-1, 1];
  • 将该区间均匀划分为 24 = 16 个等距格点;
  • 每个权重被映射到最近的格点,并以对应的 4-bit 索引存储。
图 2 · 量化与反量化的完整链路(以 4 个权重为一组示意)
传统 4-bit 量化的完整链路(以 4 个权重为一组示意)quantiles = [-1.00, -0.87, -0.73, -0.60, -0.47, -0.33, -0.20, -0.07, 0.07, 0.20, 0.33, 0.47, 0.60, 0.73, 0.87, 1.00]QuantizeDequantizeFP16 16×4=64bit[0.27, 0.58, -0.75, 1.52]absmax = 1.52[0.18, 0.38, -0.49, 1.00]Find Nearest[0.2, 0.33, -0.47, 1.0]Quant Index(存索引,不存数值)[9, 10, 4, 15]INT4 4×4=16bit[9, 10, 4, 15]Find value[0.2, 0.33, -0.47, 1.0]× Multi Absmax 1.52[0.304, 0.5016, -0.7144, 1.52]精度损失不可避免:0.27 → 0.304,-0.75 → -0.71444 个 FP16 权重 64 bit → 量化后 4×4 bit 索引 + 16 bit absmax = 32 bit
  • 为什么要按组归一:模型参数按 64 个一组切分,每组找自己的 absmax。组内每个权重除以这个 absmax,结果必然落进 [-1, 1]。
  • 16 个格点 = 15 个间距:间距 = 2 / 15 ≈ 0.1333,所以格点表从 -1.00 起步、每次加 0.1333。
  • 存索引而不是存格点:16 个格点是固定的,直接存格点数值等于没压缩。退一步存它在格点表里的下标(0~15),正好一个 4-bit 二进制数装得下:0000 → 0,1111 → 15。
  • 反量化 = 查表 × absmax:索引 9 查到格点 0.2,再乘回该组的 absmax 1.52,得到 0.304。
  • 位宽账:量化前 4 个 FP16 权重 = 64 bit;量化后 4×4 bit 索引 = 16 bit,再加一个 16 bit 的 absmax,合计 32 bit。组越大,absmax 被摊得越薄,节省比例越高。
代价是精度损失,而且是不可逆的:0.27 → 0.304,-0.75 → -0.7144。反量化回来的值永远不会等于原值,只能逼近。原片在这里停下来抛了问题:怎么把这个误差降下去?

03 NF4:把格点从「等距」改成「等概率」

原片现场讨论出两条路,每条各有代价:

换更细的位宽(8-bit)

  • 格点更密,量化误差更小
  • 每个参数要 8 bit,压缩比变差
  • 市面上确实有 8-bit 量化方案在跑

换切分方式的假设

  • 均匀切分隐含假设「权重在 [-1,1] 内均匀分布」
  • 真实权重近似正态分布:0 附近密、两端疏
  • 格点错配,导致 0 附近精度丢得最狠

NF4 选了第二条路。讲义原文 将标准正态分布按累积概率均分为若干等概率区间,每个区间选取其中位数值作为该区间的量化代表值。

图 3 · 均匀切分与 NF4 的格点分布对比(曲线为分布示意)
NF4 的格点怎么放:均匀切分 vs 按累积概率等分权重近似正态分布,0 附近最密密度-10+1① 均匀切分:15 个等间距格点,间距恒为 2/15 ≈ 0.1333② NF4:按累积概率等分取中位,0 附近密、两端疏两种方案的位宽都是 4 bit / 权重,差别只在格点放在哪里
  • 0 附近(数值最集中的地方)格点变密,量化误差显著下降;
  • 两端格点变疏,把有限的码位花在真正有数据的地方;
  • 格点数不变、位宽不变,仍然是 4 bit 存一个权重。
三个容易搞混的点:
  • NF4 不是一种新的量化位宽。它与传统 4-bit 位宽完全一样,改的只是 16 个格点取自哪里。
  • 「4-bit 基座 + 16-bit 适配器」里的 16-bit 不能省。可训练的 LoRA 适配器与优化器状态仍是 16-bit / 32-bit,这一部分压不得。
  • 量化误差不会在训练里被消掉。前向与反向都在「量化-反量化」构成的近似空间里进行,这正是 QLoRA 与全参微调之间存在性能差距的来源。

04 双重量化:连缩放因子一起压

为了让精度可控,通常让每 64 个权重共享一个 32-bit 的缩放因子(absmax)。问题在于模型一大,absmax 的数量就跟着炸。原片口述 以 671B 参数的模型估算:671B ÷ 64 = 10.48B,也就是上百亿个 absmax 常量——它们本身就成了新的显存瓶颈。

做法很直白,讲义原文 把这些高精度的缩放因子以 256 个为一组,使用 8-bit 数据类型做二次量化。原片对它的形容是:这就是个套娃。

图 4 · 双重量化前后的辅助开销对比
双重量化:给缩放因子本身再压一次① 只做一次量化(基线)32 bit每 64 个权重共享 1 个 absmax辅助开销 = 32 / 64 =0.5 bit / 参数② 双重量化:缩放因子再分组量化32 bit每 256 个 absmax 一组 → 组内每个只存 8 bit辅助开销 = 8 / 64 + 32 / (64 × 256) =0.127 bit / 参数缩放因子的辅助开销一次量化0.5 bit/参数双重量化0.127 bit/参数降到原来的 25.4%,即省下约 0.373 bit / 参数只为省缩放因子本身的存储,不改权重的量化方式
一次量化的辅助开销0.5 bit/参数
双重量化后0.127 bit/参数
降到25.4%
省下0.373 bit/参数

适用范围要划清楚:原片口述 双重量化是针对超大模型的优化,不是强制项。一般规模的小模型可以不开,收益有限。

05 分页优化器:优化器状态不再独占显存

瓶颈在优化器状态:Adam 的一阶矩、二阶矩往往比模型权重本身更占显存。即使 LoRA 已经把可训练参数压得很小,优化器状态仍可能撑爆消费级 GPU。

图 5 · 分页优化器:优化器状态按页在显存与内存间搬运
分页优化器:优化器状态在显存与内存之间按需搬运GPU 显存只保留当前正在更新的 pagepagepagepage其余 page 不在显存里CPU 内存存放完整的优化器状态pagepagepagepagepagepagepagepage载入卸载核心思路1把完整的优化器状态拆成多个小块(pages)2仅在需要更新某一层时,临时把对应的 page 载入显存3更新完成后立即把 page 写回内存,并从显存中释放显存只需容纳当前正在使用的那部分优化器状态
  • 效果:显存只需容纳「当前正在使用的」那部分优化器状态,占用随之显著下降。
  • 这是个通用套路原片口述 分页思想在整个计算机领域用得极多,后续讲 VLM 推理时还会再遇到,这里先建立印象即可。

06 三个组件收口

图 6 · 三个关键技术组件对照
三个关键技术组件对照关键技术压的是什么做法什么时候才需要NF4 量化预训练权重本身按累积概率等分取中位,4-bit 存索引QLoRA 的默认动作,始终启用双重量化每 64 个权重共享的 absmax缩放因子 256 个一组,二次量化到 8-bit只在超大模型上划算,小模型可不启用分页优化器优化器状态(Adam 一阶/二阶矩)拆成 pages,按需在显存与内存之间搬运显存吃紧时才需要
收口一句话:三个组件各管一段显存——NF4 管基座权重,双重量化管缩放因子,分页优化器管优化器状态。三者叠加之后,「我这张卡能不能微调」这个问题,答案从看模型多大,变成了看你怎么切格点、怎么搬数据。
取材与还原方式
  • 素材:本机课程录像第 06 讲(时长 24:43,1920×1080,无内嵌字幕), 主题为 QLoRA 的介绍;同目录未附带独立讲义文件,正文以画面中的文档内容为准。
  • 画面还原:按 1 fps 采样成灰度帧、计算相邻帧平均绝对差,切出 58 屏静止画面, 逐屏按原始分辨率导出 PNG;先拼联络表通读,再对含公式、数字、小字的页面单独放大逐字核对。
  • 语音转写:faster-whisper small(CPU / int8)转写全片音频,用于补足画面里没有的推导与结论。 中文转写存在系统性同音错字,引用前已按画面原文校正,例如 「低致适配」→ 低秩适配、「居住分布 / 距离分布」→ 均匀分布、「复算个」→ 服从、 「孙叶油花气」→ 分页优化器、「巴比特」→ 8-bit。
  • 数字的来源:671B ÷ 64 ≈ 10.48B 为原片现场估算(录制时用计算器复核); 0.5 bit/参数 与 0.127 bit/参数 是按「64 权重 / 32-bit absmax」与「256 absmax 组 / 8-bit」复算得出, 原片对这两项只作了定性描述,未给出具体数值。
  • 两种口径的处理:画面里的文档负责术语与流程的准确性,口述负责强调点与适用边界。 两者不一致时取更保守的一侧,并在正文用角标标出来源。
  • 配图:全部按内容重绘为矢量 SVG,未使用录像画面截图,也未描摹原图。

本笔记为个人学习用途的结构化整理与图解重绘,未使用原视频画面。术语与流程依据画面中的配套文档原文,口语化的结论与举例标注为「原片口述」。

原视频及其配套文档的版权归其权利人所有。

分享:
返回文章列表

相关文章

全部文章 »