跳转到内容

输入关键词开始搜索

    资料摘要:personal chatgpt 08 — LLM.int8 量化细节 (load_in_8bit)以及 bitsandbytes 库

    视频摘要更新 2026-08-02置信度 high待阅读原始来源 ↗#深度#大模型#课程#personal-chatgpt

    本讲由真实视频转录与作者 notebook/代码交叉整理。原始层:🔒 带时间戳视频转录;课程总览:personal chatgpt — LLMs 实践系列

    本讲从简单 absmax 量化出发,说明大模型激活中的 outlier feature 会放大量化误差;随后介绍 LLM.int8 的两项关键思想:

    1. vector-wise quantization:按激活向量/权重向量分别选择缩放常数,而不是整个 tensor 共用一个 scale;
    2. mixed-precision decomposition:regular features 走 INT8 矩阵乘,outlier features 保留 16-bit 计算,最后相加。

    课程最后用 Hugging Face + bitsandbytes 加载 OPT-6.7B,观察 Linear8bitLt、混合 INT8/FP16 参数和文本生成。

    对张量 X

    c=max(X)c=\max(|X|)

    量化:

    Xq=round(127cX)X_q=\operatorname{round}\left(\frac{127}{c}X\right)

    反量化:

    X^=c127Xq\hat X=\frac{c}{127}X_q

    notebook 用随机 FP16 张量演示量化前后平均误差。

    若同一 tensor 中插入一个远大于其他元素的值,统一 absmax scale 会由这个极值决定。结果是普通小值被映射到很少的整数刻度,rounding 后信息损失显著。

    课程示例把一个元素设为 -2.3952 后,平均误差明显高于无 outlier 情况。这说明问题不只是“INT8 位数少”,还与量化粒度和数值分布有关。

    课程引用 LLM.int8 论文,强调大到一定规模的 Transformer 会出现跨 token 持续存在的大幅值 feature dimensions:

    • 它们集中在少数 hidden dimensions;
    • 对模型能力可能重要,不能简单裁剪;
    • 若与 regular values 共用统一 scale,会造成大误差。

    课程把“规模约 6.7B 后出现”作为论文观察背景;这不是所有架构都必然在同一参数规模出现的硬阈值。

    设:

    X: m × h activation matrix
    W: h × n weight matrix
    • X 的每一行求 absmax:C_x ∈ R^m
    • W 的每一列求 absmax:C_w ∈ R^n
    • 分别量化后做 INT8 GEMM;
    • C_xC_w 的外积恢复每个输出位置的 scale。

    公式:

    Xq=127XCx,Wq=127WCwX_q=\frac{127X}{C_x}, \qquad W_q=\frac{127W}{C_w}

    Y^=XqWq1272(CxCwT)\hat Y =\frac{X_qW_q}{127^2} \odot(C_xC_w^T)

    notebook 用 numpy.kron/reshape 构造逐输出缩放矩阵,概念上等价于两个 scale 向量的外积。

    把 hidden dimensions 分为 regular 集合 R 与 outlier 集合 O

    XW=XRWR+XOWOXW=X_RW_R+X_OW_O

    • X_RW_R:vector-wise INT8 quantization + INT8 matrix multiplication;
    • X_OW_O:保留 FP16;
    • 最终把两路输出相加。

    代码示例取 regular indices [0,2,4]、outlier indices [1,3],演示分块后重构原矩阵乘结果。

    重要边界:该矩阵分解示例在关键步骤没有实际 round 成整数,因此“完全恢复原结果”证明的是代数分块/缩放关系,不是现实 INT8 rounding error 为零。

    model = AutoModelForCausalLM.from_pretrained(
    "facebook/opt-6.7b",
    device_map="auto",
    load_in_8bit=True,
    )
    tokenizer = AutoTokenizer.from_pretrained("facebook/opt-6.7b")

    保存输出显示:

    • 模型线性层替换为 Linear8bitLt
    • 参数 dtype 混合 INT8 与 FP16;
    • 模型在 CUDA,输入 initially 在 CPU,Transformers 给出设备不一致警告;
    • 尽管生成成功,正确代码仍应把输入移动到模型入口设备。

    Per-tensor absmax:

    c = torch.abs(x).max()
    x_q = torch.round(127 * x / c)
    x_hat = x_q * c / 127

    Mixed-precision decomposition:

    Y=XW=XRWRINT8 regular path+XOWOFP16 outlier pathY = XW = \underbrace{X_RW_R}_{\text{INT8 regular path}}

    • \underbrace{X_OW_O}_{\text{FP16 outlier path}}
    • 00:00:课程范围:LLM.int8、bitsandbytes、8-bit 模型加载。
    • 00:59:回顾 FP16/BF16 与 INT8 的表示差异。
    • 01:27:论文中的 vector-wise quantization、mixed precision、outlier features。
    • 03:18:随机张量 absmax → scale → round → dequant。
    • 05:35:人为加入 outlier 后误差增大。
    • 07:03:vector-wise quantization 与按行/按列缩放。
    • 09:01:regular/outlier feature 分解为两路矩阵乘。
    • 10:34C_xC_w 的行/列 normalization constants。
    • 11:02:小矩阵代码构造 regular 与 outlier 路径。
    • 13:30:反量化并合并两路输出。
    • 16:31:Transformers load_in_8bit=True 加载 OPT-6.7B。
    • 17:00Linear8bitLt、混合 dtype、设备警告与生成结果。
    • 小矩阵数学示例可在 CPU/macOS 运行。
    • OPT-6.7B 8-bit 推理依赖 CUDA/bitsandbytes、约十余 GB checkpoint 下载和足够显存,不能在当前 Mac 上按原样运行。
    • notebook 硬编码 HTTP_PROXY/HTTPS_PROXY=http://127.0.0.1:7890;没有该本地代理时会阻断下载。
    • 保存输出警告 input IDs 在 CPU、模型在 CUDA;生成成功不代表设备放置写法正确。
    • 课程小矩阵 mixed-decomposition 代码没有在关键步骤做整数 rounding,不能用它量化真实误差。
    • “6.7B 出现 emergent outlier”应理解为论文/课程观察背景,而不是无条件阈值定律。
    • ASR 把 LLM.int8、bitsandbytes、outlier、vector-wise、dequantization、OPT 等识别为近音词;本稿按 notebook/论文校正。
    • 第 5 讲:从 FP16/BF16 的动态范围/精度转向 INT8 scale 和 rounding error。
    • 第 6 讲:解释 8-bit LLaMA 加载为何仍保留 FP16 参数/路径。
    • 第 7 讲:AMP 是训练期动态混合精度;LLM.int8 主要针对大模型矩阵乘和推理/加载。
    • 第 9 讲:课程从“权重/激活如何压缩表示”转向“文本如何压缩为 token”。
    1. 为什么 per-tensor absmax 量化遇到少数 outlier 时会增大普通值误差?
    2. vector-wise quantization 对 activation 和 weight 分别沿哪个方向求 scale?
    3. LLM.int8 为什么要把 regular 和 outlier features 分成两条精度路径?
    4. notebook 的小矩阵分解为何不能证明真实 INT8 量化误差为零?
    5. load_in_8bit=True 后为什么模型参数仍可能包含 FP16?
    • 滴答清单抓取时学习状态:已完成
    • 视频正文采用自动语音识别;关键术语已用标题、notebook 与源码校正,无法确认的口语细节不扩写。
    • notebook 未执行的 CUDA、权重下载、训练或外部 API 单元,不表述为已复现实验。