LLM.int8 量化
面向大语言模型线性层的 8-bit 推理/加载方法:主体矩阵乘使用 int8,并把少量幅值异常的特征维留在较高精度路径,以兼顾内存与数值质量。
对一组浮点数做 absmax 量化,可取:
单一全局 scale 容易被极端值支配。vector-wise quantization 按行或按列分别计算 scale,使每个向量更充分利用 int8 范围。
LLM.int8 的关键:异常特征分解
Section titled “LLM.int8 的关键:异常特征分解”大模型 activation 中可能出现少量幅值很大的 feature。若与普通值共用 int8 scale,普通值会被压缩到很少的离散级别。LLM.int8 的思路是:
- 识别超过阈值的 outlier feature;
- 普通部分走 int8 矩阵乘;
- outlier 部分保留 FP16 等较高精度计算;
- 合并两条路径的结果。
因此它不是“所有输入和权重无条件都变成 int8”。
bitsandbytes / Transformers 实践
Section titled “bitsandbytes / Transformers 实践”课程通过 load_in_8bit=True、bitsandbytes 的 Linear8bitLt 和相关权重结构展示 8-bit 模型加载。与 LoRA(低秩适配) 结合时,可以冻结量化基座,只训练少量 adapter 参数。
这能显著降低基座加载内存,但训练还包含激活、LoRA 参数、梯度和优化器状态;显存不能只按“权重从 16 bit 变 8 bit”线性估算。
与其他“量化”的区别
Section titled “与其他“量化”的区别”- LLM.int8:线性层权重/activation 的数值量化,目标是大模型计算与加载效率。
- VQ-VAE / FSQ / RVQ:离散潜变量或码本,目标是学习表示与生成。
- QLoRA:典型方法使用 4-bit NF4、double quantization、paged optimizer 等;“8-bit base + LoRA”不能自动称为 QLoRA。
- 第 8 讲围绕论文机制与 bitsandbytes 实现;outlier 阈值和性能结论依赖模型与版本。
- bitsandbytes 示例以 CUDA 环境为主,不能在当前 macOS 上原样执行。
- 课程引用的内部 API 属于当时版本,不应固化为当前库的永久调用栈。
- int8 一定损失一半显存并加速一倍:实际还受 kernel、scale、outlier 路径和非权重内存影响。
- 量化等于压缩文件:量化同时改变运行时表示与矩阵乘路径,不只是存盘压缩。
- load_in_8bit 适合所有硬件:依赖后端与算子支持。