精读笔记 · QLoRA: Efficient Finetuning of Quantized LLMs
基本信息
| 项目 | 内容 |
|---|---|
| 论文标题 | QLoRA: Efficient Finetuning of Quantized LLMs |
| arXiv 编号 | 2305.14314 |
| 发表会议 | NeurIPS 2023 |
| 作者 | Tim Dettmers, Artidoro Pagnoni, Ari Holtzman, Luke Zettlemoyer |
| 机构 | University of Washington(华盛顿大学) |
| 发布时间 | 2023 年 5 月 |
阅读地图
本文建议按以下顺序理解:
LoRA(精读-08)
↓
LoRA 的问题:训练参数确实少了,但底座大模型仍以 16-bit 加载
→ 65B 模型底座权重仍需 ~130 GB 显存,消费级显卡完全装不下
↓
QLoRA 的解法:把冻结的底座权重量化到 4-bit 再加载
↓
三大核心技术:NF4 + Double Quantization + Paged Optimizers
↓
结果:单张 48 GB 专业卡 / 消费级卡即可微调 65B 模型
前置知识:从 LoRA 到 QLoRA 的动机
LoRA 回顾(精读-08 核心结论)
LoRA 把每个权重矩阵的更新量分解为两个低秩小矩阵 A、B 的乘积。训练时只更新 A 和 B,底座权重完全冻结。这让训练参数量从数十亿降到数千万,GPU 显存中存储梯度和优化器状态的部分大幅减少。
LoRA 仍然存在的瓶颈
LoRA 解决了"训练参数"的显存问题,但底座模型权重本身还是要加载进显存(只是不需要梯度)。以 LLaMA-65B 为例:
- 65B 个参数 × 2 字节(16-bit float)≈ 130 GB 显存
- 全球顶级消费级显卡(如 RTX 4090)只有 24 GB 显存
- 专业卡 A100 80GB 也装不下
QLoRA 的核心思路(一句话)
把那本"不常翻的厚书"(冻结的底座权重)压缩存档(量化到 4-bit),只在需要时临时解压,腾出桌面空间来做笔记(跑 LoRA 训练)。
术语速查表(首次出现时均会解释)
| 术语 | 含义 |
|---|---|
| 量化(Quantization) | 用更少的 bit 表示一个数字,有一定精度损失 |
| bit(位) | 计算机存储的最小单位,1 bit = 0 或 1 |
| 16-bit float | 半精度浮点数,每个数字用 16 个 bit 存储,精度较高 |
| 4-bit | 每个数字只用 4 个 bit 存储,精度较低但显存占用是 16-bit 的 1/4 |
| NF4 | 4-bit NormalFloat,本文提出的新 4-bit 数据类型 |
| LoRA | Low-Rank Adaptation,低秩适配,训练小矩阵代替全量微调 |
| frozen(冻结) | 训练时参数不更新、不计算梯度 |
| 优化器(Optimizer) | 训练时根据梯度更新参数的算法,如 Adam,需要存储"动量"状态 |
| BF16 | BFloat16,另一种 16-bit 浮点格式,用于实际计算 |
| perplexity(困惑度) | 衡量语言模型质量的指标,越低越好 |
Abstract(摘要)精译
原文:We present QLoRA, an efficient finetuning approach that reduces memory usage enough to finetune a 65B parameter model on a single 48GB GPU while preserving full 16-bit finetuning task performance. QLoRA backpropagates gradients through a frozen, 4-bit quantized pretrained language model into Low Rank Adapters (LoRA).
翻译:我们提出 QLoRA,一种高效的微调方法,能够将显存占用降低至足以在单张 48 GB GPU 上微调 650 亿参数模型,同时保持与完整 16-bit 微调相当的任务性能。QLoRA 将梯度通过一个被冻结的、经过 4-bit 量化的预训练语言模型反向传播到低秩适配器(LoRA)中。
讲解:这句话是全文精华所在,分两层理解:
第一层——目标:"单张 48 GB GPU 微调 65B 模型"。65B 模型正常以 16-bit 加载需要 130 GB 以上显存,QLoRA 把这个需求压缩到 48 GB 以内。
第二层——机制:"梯度通过冻结的 4-bit 量化模型反向传播到 LoRA"。底座权重被量化到 4-bit 冻结起来(不更新),但梯度可以流过它,最终落到 LoRA 小矩阵上。类比:图书馆里有一本压缩存档的参考书(4-bit 冻结权重),你不能在上面写字(冻结),但你可以读它的内容,然后把笔记写在自己的小本子上(LoRA 适配器)。
原文:Our best models, the Guanaco family, outperform all previously released open-source models on the Vicuna benchmark, reaching 99.3% of the performance level of ChatGPT while only requiring 24 hours of finetuning on a single GPU.
翻译:我们最好的模型——Guanaco 系列——在 Vicuna 基准测试中超越了此前所有公开发布的开源模型,达到 ChatGPT 性能水平的 99.3%,而且只需在单张 GPU 上微调 24 小时。
讲解:这是结果的"头条新闻"。Guanaco(羊驼的一种)是用 QLoRA 微调出来的聊天模型系列。ChatGPT(当时指 GPT-3.5)是公认的强基线,Guanaco 65B 在评测中达到其 99.3% 的水平——差距几乎可以忽略。更惊人的是代价:只需一张 GPU、24 小时,而 ChatGPT 背后是数千张 GPU 训练数月。
原文:QLoRA introduces a number of innovations to save memory without sacrificing performance: (a) 4-bit NormalFloat (NF4), a new data type that is information theoretically optimal for normally distributed weights, (b) Double Quantization to reduce the average memory footprint by quantizing the quantization constants, and (c) Paged Optimizers to manage memory spikes.
翻译:QLoRA 引入了若干创新以节省显存而不损失性能:(a) 4-bit NormalFloat(NF4),一种专为正态分布权重设计的信息论最优新数据类型;(b) 双重量化(Double Quantization),通过对量化常数再次量化来降低平均显存占用;(c) 分页优化器(Paged Optimizers),用于管理显存峰值。
讲解:三个创新是本文的核心贡献,后面会逐一深讲。这里先给一个直觉:
- NF4:如果要把数字压缩到 4-bit,应该怎么分配这 16 个可能的值?NF4 的答案是"按神经网络权重的实际分布来分配",比通用的压缩方式更精准。
- Double Quantization:量化本身需要存一些"辅助参数"(量化常数),QLoRA 把这些辅助参数也再压缩一遍,进一步省显存。
- Paged Optimizers:训练时偶尔会有显存峰值(如处理长序列时),此时自动借用 CPU 内存,避免"显存溢出"崩溃。
原文:We find that data quality is far more important than dataset size, e.g. we show that even 9,000 high-quality instruction samples are sufficient to achieve state-of-the-art performance.
翻译:我们发现数据质量远比数据集大小重要,例如我们证明,仅 9,000 条高质量指令样本就足以达到最优性能。
讲解:这个结论对实践者非常有价值。以往人们认为"指令微调需要几十万条数据",本文证明如果数据质量足够高,9,000 条就够了。这意味着小团队、小预算也能做出高质量的指令微调模型。
Introduction(引言)核心段落精译
原文:Finetuning large language models (LLMs) is a highly effective way to improve their performance, and to add desirable or remove undesirable behaviors. However, finetuning very large models is prohibitively expensive; regular 16-bit finetuning of a LLaMA 65B parameter model requires more than 780 GB of GPU memory.
翻译:对大型语言模型(LLM)进行微调是提升其性能、增添期望行为或消除不良行为的高效手段。然而,对超大模型进行微调代价极高;对 LLaMA 65B 参数模型进行常规的 16-bit 微调需要超过 780 GB 的 GPU 显存。
讲解:为什么全量微调 65B 模型要 780 GB 而不是 130 GB?
存储模型权重本身:65B × 2 字节 ≈ 130 GB
加上梯度(同等大小):+130 GB
加上 Adam 优化器状态(两个动量,各同等大小):+260 GB
合计超过 520 GB,再加上激活值、中间计算结果等,780 GB 甚至更多。
全球最贵的 H100 80GB 显卡也需要 10 张才能装下。
原文:We demonstrate for the first time that it is possible to finetune a quantized 4-bit model without any performance degradation. Our method, QLoRA, uses 4-bit quantization to compress a pretrained language model. The LM parameters are then frozen and a relatively small number of trainable parameters are added to the model in the form of Low-Rank Adapters (LoRA), which are trained by backpropagating gradients through the 4-bit quantized LM.
翻译:我们首次证明,对量化到 4-bit 的模型进行微调而不损失任何性能是可行的。我们的方法 QLoRA 使用 4-bit 量化来压缩预训练语言模型。随后,语言模型参数被冻结,并以低秩适配器(LoRA)的形式向模型中加入数量相对较少的可训练参数,通过将梯度反向传播过 4-bit 量化的语言模型来对其进行训练。
讲解:"首次证明"是关键词。在此之前,学界普遍认为量化到 4-bit 会损失太多精度,导致微调效果变差。QLoRA 用实验打破了这个认知:只要量化方式选对(NF4),加上精心设计的辅助技术,4-bit 量化模型微调出来的效果完全能和 16-bit 媲美。
类比整个流程:
1. 把一本厚书扫描压缩(量化到 4-bit),存档在书架最深处(GPU 显存的低优先级区域)。
2. 锁上书(冻结,不允许修改原书内容)。
3. 在空出来的桌子上放一个小笔记本(LoRA 适配器),边读书边做笔记。
4. 所有学习成果都记在小笔记本上,书本身不变。
原文:QLoRA reduces the average memory requirements of finetuning a 65B parameter model from >>780GB of GPU memory to <<48GB without degrading the runtime or predictive performance compared to a 16-bit fully finetuned baseline.
翻译:QLoRA 将微调 650 亿参数模型的平均显存需求从远超 780 GB 压缩到不足 48 GB,同时与 16-bit 全量微调基线相比,不降低运行速度或预测性能。
讲解:数字对比一目了然。780 GB → 48 GB,缩减到约原来的 1/16。这使得原本只有顶级研究机构才能做的事情,变成了普通研究者用一张专业显卡(A6000 48GB)甚至消费级显卡就能完成的事情。"不降低运行速度"很重要——量化虽然省了显存,但计算时需要解压,如果这个解压太慢,实际训练时间会大幅增加,QLoRA 声称这个开销很小。
原文:Using QLoRA, we train the Guanaco family of models. Guanaco models are the best-performing open-source models we are aware of, as they achieve 99.3% of ChatGPT's performance while requiring only 24 hours of finetuning on a single consumer GPU. The smallest Guanaco model (7B parameters, with only 5 GB memory footprint) outperforms a 26 GB Alpaca model by more than 20 percentage points.
翻译:利用 QLoRA,我们训练了 Guanaco 系列模型。据我们所知,Guanaco 模型是性能最强的开源模型,仅需在单张消费级 GPU 上微调 24 小时,即可达到 ChatGPT 性能的 99.3%。最小的 Guanaco 模型(7B 参数,仅占 5 GB 显存)比占用 26 GB 的 Alpaca 模型高出超过 20 个百分点。
讲解:两个令人印象深刻的对比:
1. Guanaco-65B vs ChatGPT:99.3% 的性能,但 ChatGPT 背后是天价算力,Guanaco 只需一张消费级显卡(如 RTX 3090/4090)跑 24 小时。
2. Guanaco-7B(5 GB)vs Alpaca(26 GB):更小、更省内存,却性能更好,提升超过 20 个百分点。Alpaca 是斯坦福的同类工作,Guanaco 吊打它,说明方法上有实质进步。
Section 2:背景知识——量化与 LoRA
2.1 什么是量化(Block-wise k-bit Quantization)
原文:Quantization is the process of discretizing an input from a representation that holds more information to one that holds less information. A common example is to take 32-bit floats and quantize them into 8-bit integers. To achieve this, we perform a scaling transformation...
翻译:量化是将一个表示中的输入离散化为信息量更少的表示的过程。一个常见例子是将 32-bit 浮点数量化为 8-bit 整数。为此,我们执行缩放变换……
讲解:量化是本文的基础概念,必须理解透。
直觉类比:假设你要记录一个人的身高,精确值是 175.683 厘米。
- 32-bit float 版本:记录 175.683(小数点后3位,精确)
- 16-bit float 版本:记录 175.7(小数点后1位,轻微损失)
- 8-bit int 版本:记录 176(四舍五入到整数,有损失但还能接受)
- 4-bit int 版本:只有 0~15 共 16 个格子能用,可能映射到"高个子/中等/矮个子..."这种粗粒度,损失明显神经网络中的量化:模型权重本质上是很多浮点数。用更少的 bit 存储,内存占用等比下降:
- 16-bit → 4-bit:显存减少到 1/4
- 65B × 2 字节(16-bit)= 130 GB → 65B × 0.5 字节(4-bit)= 32.5 GB分块量化(Block-wise):不是对整个权重矩阵用同一个缩放比例,而是把权重分成小块(如每 64 个数一块),每块独立计算缩放比例。这样局部的数值范围差异不会互相干扰,量化精度更高。
2.2 LoRA 简要回顾
原文:Low-rank adapters (LoRA) reduce the number of trainable parameters by learning pairs of rank-decomposition matrices while keeping the original weights frozen, and has since been adapted for other modalities. LoRA adds a small number of trainable parameters, in addition to the original model weights, which remain fixed.
翻译:低秩适配器(LoRA)通过在保持原始权重冻结的同时学习一对秩分解矩阵来减少可训练参数的数量,并已被扩展到其他模态。LoRA 在原始模型权重(保持固定)之外,额外添加少量可训练参数。
讲解:LoRA 精读笔记已有详细讲解(精读-08),此处简要回顾。
- 原始权重矩阵 W(维度 d×d):冻结,不训练
- LoRA 添加两个小矩阵:A(d×r)和 B(r×d),其中 r 远小于 d(如 r=8 vs d=4096)
- 计算时:输出 = Wx + BAx(原始输出加上低秩更新)
- 训练时:只更新 A 和 B,参数量从 d² 降到 2drLoRA 的残余问题:LoRA 减少了需要梯度的参数,但底座权重 W 本身必须加载进显存(虽然不算梯度)。65B 模型的 W 就是 130 GB,仍然装不进消费级显卡。QLoRA 正是要解决这个问题。
Section 3:QLoRA 方法核心
3.0 QLoRA 整体公式
原文:QLoRA has one low-precision storage data type, in our case 4-bit NormalFloat, and one computation data type, in our case 16-bit BrainFloat. We dequantize the storage data type to the computation data type to perform the forward and backward pass, but we only compute weight gradients for the LoRA parameters which use 16-bit BrainFloat.
翻译:QLoRA 使用一种低精度存储数据类型(在我们的方案中为 4-bit NormalFloat),以及一种计算数据类型(在我们的方案中为 16-bit BrainFloat)。我们在执行前向和反向传播时将存储数据类型解量化为计算数据类型,但只为使用 16-bit BrainFloat 的 LoRA 参数计算权重梯度。
讲解:这段描述了 QLoRA 的双数据类型设计,是理解整个系统的关键。
存储 vs 计算分离:
- 存储时(放在 GPU 显存里,不运算):用 4-bit NF4,显存占用最小
- 计算时(实际做矩阵乘法):临时解压到 16-bit BF16,精度有保证
- 计算完后结果丢掉,下次用时再解压类比:压缩文件(4-bit)存在硬盘里省空间,每次需要编辑时解压到内存(16-bit)操作,编辑完再压缩回去存档。
只有 LoRA 参数有梯度:底座权重(4-bit 冻结)在反向传播时只是"梯度的通道",梯度流过它到达 LoRA 矩阵,LoRA 矩阵才实际更新。
用数学式子简洁表示 QLoRA 的前向计算:
输出 = (解量化(W_4bit) + B × A) × 输入
= W_BF16 × 输入 + B × A × 输入
其中 W_4bit 是存储在显存的 4-bit 冻结权重,运算前临时解量化为 W_BF16;B 和 A 是可训练的 LoRA 矩阵,始终以 16-bit 存储。
3.1 技术一:4-bit NormalFloat(NF4)
原文:The NormalFloat (NF) data type builds on Quantile Quantization, which is an information-theoretically optimal data type that assumes a specific input tensor distribution. Quantile Quantization works by ensuring that each quantization bin has an equal number of values assigned from the input tensor.
翻译:NormalFloat(NF)数据类型建立在分位数量化(Quantile Quantization)的基础上,这是一种信息论意义上最优的数据类型,它假设输入张量服从特定分布。分位数量化的工作原理是确保每个量化桶从输入张量中分配到数量相等的值。
讲解:理解 NF4 的关键,先理解"为什么普通 4-bit 量化不好"。
普通量化的问题:4-bit 整数(Int4)把数值均匀分成 16 份,比如 [-1, 1] 范围均匀切成:-1.0, -0.867, -0.733, ..., 0.867, 1.0。但神经网络权重不是均匀分布的!大多数权重集中在 0 附近,很少有权重接近 -1 或 +1。结果:靠近 0 的权重精度很差(格子太宽),靠近边缘的格子却完全空着(浪费)。
分位数量化的思路:根据数据的实际分布来分配格子。如果 30% 的权重在 [-0.1, 0.1] 之间,就给这个范围多分配格子,精度高;极端值很少,就少分配格子甚至合并。这样每个格子里分到的权重数量大致相等,信息利用率最高(信息论最优)。
原文:Since pretrained neural network weights typically follow a zero-centered normal distribution with standard deviation σ, we can transform all weights to a single fixed distribution by normalizing the weights... This reduces the problem to a single normal distribution N(0,1), from which we can then derive a data type for zero-centered normally distributed data through estimating the quantiles of N(0,1).
翻译:由于预训练神经网络的权重通常服从以零为中心、标准差为 σ 的正态分布,我们可以通过对权重进行归一化,将所有权重变换到同一固定分布……这将问题简化为单一的正态分布 N(0,1),然后我们可以通过估计 N(0,1) 的分位数,推导出适用于以零为中心的正态分布数据的数据类型。
讲解:这是 NF4 的核心洞见,来自一个关于神经网络的经验性观察:预训练模型的权重近似服从正态分布(钟形曲线)。
利用这个知识:
1. 正态分布有已知的数学形式,我们可以精确计算"哪些区间包含 1/16 的概率质量"(即分位数)
2. 把权重归一化到 [-1, 1](通过除以绝对值最大值)
3. 用标准正态分布 N(0,1) 的 16 个等概率分位点作为 NF4 的量化点结果:NF4 的 16 个量化点不是均匀分布的,而是在 0 附近密集(大多数权重在这里),在边缘稀疏(很少权重在这里)。这正好匹配神经网络权重的实际分布,所以精度最高。
NF4 vs 其他 4-bit 类型的实验数据(来自论文 Table 2):在 Pile Common Crawl 数据集上评测困惑度(perplexity,越低越好):
- NF4:27.41(最佳)
- Float4:29.48(差 2 点)
- Int4:34.34(差近 7 点)数据说话:NF4 明显优于通用 4-bit 类型,且差距在所有测试模型尺寸(125M ~ 13B)上一致出现。
原文:We create an asymmetric data type which uses 2^(k-1) for the negative part and 2^(k-1)+1 for the positive part, ensuring an exact representation of zero while using all 2^k datatype values efficiently.
翻译:我们创建了一种非对称数据类型,负数部分使用 2^(k-1) 个量化点,正数部分使用 2^(k-1)+1 个量化点,这样既能精确表示零,又能高效利用全部 2^k 个数据类型值。
讲解:为什么正负两侧格子数不一样?因为需要精确表示 0!
对于 k=4,共有 2^4 = 16 个格子:
- 如果对称:负数 8 个,正数 8 个,没有专门的 0(0 只是负数区间的边界或正数区间的边界)
- NF4 的方案:负数 8 个 + 零 1 个 + 正数 7 个 = 16 个,确保 0 被精确表示为什么 0 很重要?神经网络权重中有相当比例接近 0 甚至恰好为 0(L1/L2 正则化、Dropout 等原因),精确表示 0 减少了这部分权重的量化误差。
3.2 技术二:双重量化(Double Quantization)
原文:To further reduce the memory footprint, we introduce Double Quantization (DQ), the process of quantizing the quantization constants for additional memory savings. More specifically, we treat the first level of quantization constants as inputs to a second quantization. This yields the quantized quantization constants c2_FP8 and a second level of quantization constants c2_FP32.
翻译:为了进一步减少显存占用,我们引入双重量化(DQ),即对量化常数本身再次量化以节省额外显存。具体而言,我们将第一层量化常数作为第二次量化的输入。这产生了量化后的量化常数 c2_FP8,以及第二层量化常数 c2_FP32。
讲解:双重量化是一个"连辅助工具本身也压缩"的思路,需要先理解什么是"量化常数"。
量化常数是什么?
分块量化的每个小块都需要一个缩放因子(scale)来记录"这块权重的数值范围",否则量化后的 4-bit 数字就不知道代表多大的实际值。这个缩放因子就是量化常数。量化常数的代价:
- 假设每 64 个权重用 1 个量化常数
- 量化常数本身用 32-bit float 存储
- 65B 模型有 65B/64 ≈ 10 亿个量化常数
- 10 亿 × 4 字节(32-bit)= 4 GB 额外开销
- 相对于每个权重:4 GB / 65 B = 约 0.5 bit/参数 额外开销双重量化的操作:
1. 第一轮:把模型权重量化到 4-bit,得到量化常数(32-bit,每 64 个权重一个)
2. 第二轮:把这些量化常数本身也量化,从 32-bit 压缩到 8-bit,再每 256 个量化常数共用一个 32-bit 的二级常数节省多少?
论文原文数据:
- 第一轮量化常数:32-bit,blocksize=64 → 每参数 0.5 bit
- 双重量化后:8-bit,blocksize=256 → 每参数 8/256 + 32/(256×64) ≈ 0.127 bit
- 节省:0.5 - 0.127 = 每参数约 0.373 bit
- 65B 模型:0.373 × 65B / 8 ≈ 3 GB 节省3 GB 不算大,但当你在 24 GB 或 48 GB 显卡上工作时,每一 GB 都弥足珍贵。
原文:Using 32-bit constants and a blocksize of 64 for the first level of quantization, as is standard practice in LoRA finetuning, amounts to 32/64=0.5 bits per parameter. Double Quantization reduces this to 8/256 + 32/(256*64) ≈ 0.127 bits per parameter. This saves 0.373 bits per parameter which, for a 65B parameter model, amounts to approximately 3 GB of memory.
翻译:如果使用 32-bit 常数、blocksize=64 进行第一轮量化(这是 LoRA 微调的标准做法),每参数开销为 32/64=0.5 bit。双重量化将其降低至 8/256 + 32/(256×64) ≈ 0.127 bit。这为每个参数节省了 0.373 bit,对于 650 亿参数模型而言,约节省 3 GB 显存。
讲解:论文给出了精确的计算过程,我们逐步验证:
第一轮量化的量化常数开销:
- 每 64 个权重 → 1 个 32-bit 常数
- 每参数开销 = 32 bit / 64 = 0.5 bit/参数 ✓双重量化后的开销:
- 第二层量化把第一层常数从 32-bit 压缩到 8-bit,每 256 个第一层常数共用一个 32-bit 二级常数
- 第一层常数开销:8 bit / 256(每个第一层常数服务于 256 个原始参数)= 8/256 bit/参数
等等——这里每个第一层常数服务 64 个参数,而不是 256 个。让我解释得更准确:
每 256 个一级常数(每个管 64 个权重),用一个 8-bit 二级常数代替原来的 32-bit
→ 256 个一级常数 × 8 bit/常数 管 256×64=16384 个权重
→ 8/64 = 0.125 bit/参数(来自量化后的一级常数)
→ 加上二级常数:32 bit / 16384 ≈ 0.002 bit/参数
→ 合计 ≈ 0.127 bit/参数 ✓总节省:0.5 - 0.127 = 0.373 bit/参数
65B 模型节省:65×10^9 × 0.373 / 8 ≈ 3.03 GB ✓
3.3 技术三:分页优化器(Paged Optimizers)
原文:We use the NVIDIA unified memory feature which does automatic page-to-page transfers between the CPU and GPU for error-free GPU processing in the scenario where the GPU would otherwise run out of memory. The feature works similarly to regular memory paging between CPU memory and disk. We use this feature to allocate paged memory for the optimizer states which are then automatically evicted to CPU RAM when the GPU runs out of memory and paged back into GPU memory when the memory is needed for the optimizer update step.
翻译:我们利用 NVIDIA 统一内存(unified memory)功能,该功能能在 GPU 面临显存溢出的情况下,自动在 CPU 和 GPU 之间进行页面传输,确保 GPU 处理不出错。该功能的工作方式类似于 CPU 内存与磁盘之间的常规内存分页。我们利用此功能为优化器状态分配分页内存,当 GPU 显存耗尽时,这些状态会自动换出到 CPU RAM;当优化器更新步骤需要这些状态时,再自动换入 GPU 显存。
讲解:理解分页优化器,先了解"优化器状态"为什么占那么多显存。
Adam 优化器的显存开销:最常用的 Adam 优化器除了参数本身,还需要为每个参数存储两个"动量"值(一阶动量 m 和二阶动量 v)。以 LoRA 参数为例:
- LoRA 参数本身:小(几千万)
- 但 Adam 需要额外存 2× LoRA 参数量的动量,都是 32-bit float
- 处理长序列时,激活值(中间计算结果)也会临时占用大量显存显存峰值的问题:即使平均显存够用,训练中某些批次(如特别长的句子)可能导致瞬间显存峰值,触发 OOM(Out of Memory,显存溢出)错误,训练崩溃。
分页优化器的解法:类似操作系统的虚拟内存。操作系统会把暂时不用的内存页"换到"磁盘(swap),需要时再换回来。分页优化器做的是:
- 把优化器状态(Adam 动量)放在"分页内存"区域
- 正常情况下在 GPU 显存中运行
- 显存快满时,自动把不用的优化器状态"换出"到 CPU RAM(CPU 内存一般有几百 GB)
- 需要更新参数时,再把对应的优化器状态"换入"GPU代价:CPU↔GPU 数据传输有延迟,但这只在显存峰值时发生,大部分时间不影响速度。论文指出这只在需要时才触发,不会成为训练瓶颈。
类比:你的书桌(GPU 显存)空间有限,平时常用的书放桌上,不常用的暂时放到身后的书架(CPU RAM)。需要某本书时伸手去拿,虽然比桌上慢一点,但不会因为桌子太小就没法工作。
Section 4:实验结果关键段落
4.1 量化方法对比:NF4 确实最优
原文:In Table 2, we compare the performance of different 4-bit data types across different model sizes. We can observe that NF4 with double quantization significantly outperforms standard 4-bit float (Float4) and 4-bit integer (Int4) data types, with NF4 achieving a mean perplexity of 27.41 compared to Float4's 29.48 and Int4's 34.34 on Pile Common Crawl.
翻译:在表 2 中,我们对比了不同 4-bit 数据类型在不同模型规模下的性能。可以观察到,带双重量化的 NF4 在标准 4-bit 浮点(Float4)和 4-bit 整数(Int4)数据类型上均有显著优势:在 Pile Common Crawl 数据集上,NF4 的平均困惑度为 27.41,Float4 为 29.48,Int4 为 34.34。
讲解:这是验证 NF4 技术有效性的核心实验。
困惑度(Perplexity):衡量语言模型质量的指标。直觉上,给模型一段文本,模型要预测每个词,困惑度反映了模型"有多困惑"——越低说明模型预测越准确,模型质量越好。
数字对比:
| 数据类型 | 困惑度 | 相对 NF4 差距 |
|---------|--------|-------------|
| NF4(本文) | 27.41 | 基准 |
| Float4 | 29.48 | +2.07(差约 7.5%) |
| Int4 | 34.34 | +6.93(差约 25%) |Int4 比 NF4 差 25% 的困惑度,这意味着量化数据类型的选择至关重要。NF4 充分利用了"神经网络权重服从正态分布"的先验知识,取得了显著优势。
4.2 QLoRA 与 16-bit 基线的对比
原文:In Table 3, we compare 16-bit full finetuning, 16-bit LoRA finetuning and 4-bit QLoRA. We find that 4-bit QLoRA with NF4 data type matches 16-bit full finetuning and 16-bit LoRA finetuning performance on academic benchmarks with well-established evaluation setups.
翻译:在表 3 中,我们对比了 16-bit 全量微调、16-bit LoRA 微调和 4-bit QLoRA。我们发现,使用 NF4 数据类型的 4-bit QLoRA 在具有完善评估设置的学术基准上,与 16-bit 全量微调和 16-bit LoRA 微调性能相当。
讲解:这是最关键的结论之一:量化到 4-bit 的模型,微调后性能和 16-bit 基线相当。
这打破了"量化会不可避免地损失性能"的直觉。原因在于:
1. NF4 对正态分布权重的量化误差非常小
2. LoRA 微调本来就不改变底座权重,对底座权重的量化误差不敏感
3. 解量化到 BF16 再计算,计算本身没有额外误差对实践者的意义:用 QLoRA 微调出来的模型,不需要"打折扣",性能完全可以与昂贵的 16-bit 全量微调相比。
4.3 Guanaco vs ChatGPT:最震撼的实验结果
原文:The Guanaco 65B model, trained in 24 hours on a single GPU, achieves 99.3% of the performance level of ChatGPT on the Vicuna benchmark, according to GPT-4 evaluation. The Guanaco 33B model, trained on a single consumer GPU (RTX 3090 24GB) in under 12 hours, achieves 97.8% of ChatGPT performance.
翻译:Guanaco 65B 模型在单张 GPU 上训练 24 小时,根据 GPT-4 评估,在 Vicuna 基准上达到了 ChatGPT 性能水平的 99.3%。Guanaco 33B 模型在单张消费级 GPU(RTX 3090 24GB)上训练不到 12 小时,达到了 ChatGPT 性能的 97.8%。
讲解:这个结果在 2023 年 5 月发布时引起了广泛关注,因为它实质性地民主化了大模型微调。
对比视角:
| 模型 | 显卡 | 训练时间 | vs ChatGPT |
|------|------|---------|-----------|
| Guanaco-65B | 1× A100 48GB | 24 小时 | 99.3% |
| Guanaco-33B | 1× RTX 3090 24GB(消费级!) | <12 小时 | 97.8% |
| Guanaco-13B | 1× RTX 3090 24GB | <6 小时 | 91.1% |
| Guanaco-7B | 1× RTX 3090 24GB | <5 小时 | 具体数字略 |RTX 3090 是面向游戏玩家的消费级显卡,售价约 1500-2000 美元。这意味着任何个人研究者、小型创业公司,只要有一台高端游戏电脑,就能微调出接近 ChatGPT 水平的聊天模型。
评估方法说明:使用 GPT-4 作为评判者,比较 Guanaco 和 ChatGPT 在相同问题上的回答,GPT-4 判断哪个更好。这种"LLM-as-judge"评估方法也是本文的一个贡献,论文中讨论了它与人工评估的一致性(Kendall Tau 相关系数 0.43,中度一致)。
4.4 数据质量的关键发现
原文:We find that a model finetuned on OASST1 (9,000 samples) outperforms a model finetuned on FLAN v2 (450,000 samples). This shows that data quality is far more important than data quantity for instruction following.
翻译:我们发现,在 OASST1(9,000 条样本)上微调的模型优于在 FLAN v2(45 万条样本)上微调的模型。这表明,对于指令遵循任务,数据质量远比数据数量重要。
讲解:这个结论颠覆了很多人的直觉,也是论文的一个重要副产品。
- OASST1:Open Assistant 数据集,约 9,000 条,人工标注的高质量多轮对话
- FLAN v2:Google 的大规模指令微调数据集,45 万条,来自多种任务的半自动构建
9,000 条高质量数据 > 450,000 条一般质量数据,差距接近 50 倍。
对实践者的意义:与其花时间收集大量平庸的训练数据,不如花力气筛选和构建小规模高质量数据集。这与很多人的直觉("大数据就是王道")相反,但实验证据明确。
方法汇总:三大技术如何协同工作
原始预训练模型(65B,130 GB @ 16-bit)
↓
① NF4 量化(按正态分布设计的 4-bit 类型)
↓
量化后模型(65B,约 32.5 GB @ 4-bit)
↓
② Double Quantization(连量化常数也再压一遍)
↓
量化后模型(约 32.5 - 3 = 29.5 GB)
↓ 冻结,不再更新
↓
[计算时临时解量化到 BF16]
↓
③ 在上面挂 LoRA 适配器
+ 分页优化器(Paged Optimizers,应对显存峰值)
↓
训练时:梯度流过量化权重 → 落到 LoRA 矩阵
最终总显存:< 48 GB(含激活值、优化器状态等)
三大技术各解决什么问题:
| 技术 | 解决的核心问题 | 节省显存量 |
|---|---|---|
| NF4 | 底座权重存储(130 GB → 32.5 GB) | ~97.5 GB |
| Double Quantization | 量化常数的额外开销 | ~3 GB |
| Paged Optimizers | 训练时的显存峰值崩溃 | 防止 OOM,非直接节省 |
论文影响与意义
技术贡献
- 证明了 4-bit 量化 + LoRA 无损等价:打破了"量化会损失微调性能"的迷思
- NF4 数据类型:为后续量化研究提供了新的基准数据类型,已被广泛采用
- 端到端内存管理方案:NF4 + Double Quantization + Paged Optimizers 的组合成为高效微调的标准工具箱
工程影响
- QLoRA 实现已集成进
bitsandbytes库(Tim Dettmers 本人维护) - Hugging Face
transformers和PEFT库原生支持 QLoRA - 后续大量工作(如 GPTQ、AWQ、GGUF 等量化方法)都以 QLoRA 为基线或参考
民主化影响
| 之前 | 之后 |
|---|---|
| 微调 65B 模型需 10+ 张 A100,价格百万级 | 单张 A100 48GB 或多张消费级 GPU |
| 普通研究者无法触及 | 小团队、个人研究者可以参与 |
| 开源社区只能用小模型 | 开源社区可以在大模型上做工作 |
与 LoRA(精读-08)的对比总结
| 维度 | LoRA | QLoRA |
|---|---|---|
| 底座模型精度 | 16-bit(fp16/bf16) | 4-bit(NF4) |
| 底座模型显存 | 全量加载,如 130 GB | 压缩 4x,如 32.5 GB |
| 训练参数 | 只有 LoRA 矩阵 | 只有 LoRA 矩阵(相同) |
| 性能损失 | 接近无损 | 接近无损(本文核心贡献) |
| 65B 显存需求 | ~160 GB(含优化器) | <48 GB |
| 微调 65B 的硬件门槛 | 需多张 A100 | 单张 A100 48GB |
关键数字速查
| 指标 | 数值 |
|---|---|
| 全量 16-bit 微调 65B 所需显存 | >780 GB |
| QLoRA 微调 65B 所需显存 | <48 GB |
| 显存降低比例 | >16x |
| NF4 困惑度(Pile CC) | 27.41 |
| Float4 困惑度(Pile CC) | 29.48 |
| Int4 困惑度(Pile CC) | 34.34 |
| Double Quantization 节省 | ~3 GB(65B 模型) |
| Guanaco-65B vs ChatGPT | 99.3% |
| Guanaco-33B 训练时间 | <12 小时(RTX 3090) |
| 数据量对比(OASST1 vs FLAN v2) | 9,000 > 450,000(高质量胜过大规模) |
扩展阅读建议
| 方向 | 推荐 |
|---|---|
| QLoRA 的前置工作 | LoRA(Hu et al. 2021,精读-08) |
| 量化推理(不微调,只做推理加速) | GPTQ(Frantar et al. 2022)、AWQ(Lin et al. 2023) |
| 更进一步的量化微调 | LoftQ(2023)、QA-LoRA(2023) |
| 消费级部署 | llama.cpp、Ollama(使用 GGUF 量化格式) |
| 数据质量研究 | LIMA(Zhou et al. 2023,"less is more")、Alpaca-GPT4 |
精读笔记完成 · 基于 arXiv:2305.14314 原文