第 1 章 效率危机:为什么要量化
第 1 章 效率危机:为什么要量化
1.1 从一道简单的算术题说起
你让模型算 0.1 + 0.2,它返回 0.30000000000000004。这不是 bug——这是 IEEE 754 浮点数在十进制和二进制之间换算时的必然误差。大多数时候这种误差无所谓,但在 AI 推理的世界里,它意味着一种巨大的浪费。
想象你有一批 FP32(32 位浮点数)的模型权重,每个数占 4 字节。一个 70 亿参数的模型(7B),光是权重就要 28GB 内存。而模型在推理时,每生成一个 token,都要把全部权重从内存搬到计算单元算一遍。搬数据这件事,比算数据贵得多。
这就是本书反复出现的第一张图——能量层级(Energy Hierarchy)。原书仓库 ch1/ch01_figures.py 里的 figure1_energy_hierarchy() 用真实数据画出了这道鸿沟:
| 操作 | 能耗(皮焦耳 pJ) |
|---|---|
| INT8 乘加(Multiply-Add) | 0.3 |
| FP16 乘加 | 1.5 |
| FP32 乘加 | 4.0 |
| L1 缓存读 | 3 |
| L2 缓存读 | 20 |
| HBM/DRAM 读 | 500 |
# ch1/ch01_figures.py 中的数据(摘录)
operations = [
'INT8\nMultiply-Add', 'FP16\nMultiply-Add', 'FP32\nMultiply-Add',
'L1 Cache\nRead', 'L2 Cache\nRead', 'HBM/DRAM\nRead'
]
energy_pj = [0.3, 1.5, 4.0, 3, 20, 500]把图换成对数坐标看,结论非常刺眼:
- 计算很便宜:一次 FP32 乘加只要 4 pJ。
- 搬数据很贵:从 DRAM 读一次数据要 500 pJ,是 FP32 乘加的 125 倍。
- INT8 更便宜:INT8 乘加只要 0.3 pJ,是 FP32 的 1/13。
图里那条从 0.3 指向 500 的双向箭头标注着 ~1,700x energy gap——从最便宜的整数计算到最贵的显存读取,能耗差距接近三个数量级。模型推理的瓶颈从来不在"算得快不快",而在"数据搬得动搬不动"。
内存墙(Memory Wall):CPU/GPU 的计算速度增长远快于内存带宽增长,导致"数据喂不饱计算单元"的现象。对 LLM 推理来说,权重必须从 DRAM/HBM 反复读取,内存带宽几乎决定了生成速度的上限。
这就是为什么要量化的第一个、也是最根本的理由:如果能把 4 字节的 FP32 权重压成 1 字节的 INT8,内存里能装下 4 倍的模型,搬运同样的数据能算 4 倍的计算量,而且每次计算本身还更省电。
1.2 量化到底在做什么
在进入第 2 章的公式之前,先建立一个直觉。原书仓库 ch1/ch01_figures.py 的 figure3_fp_vs_int_numberline() 用两条数轴把量化的本质画了出来。
浮点数数轴(上半部分):刻度是不均匀的。靠近 0 的地方密密麻麻挤满了数(大约 50% 的模型权重都落在 [-0.15, 0.15] 这个极窄区间),越往两边越稀疏。FP16 用 1 位符号 + 5 位指数 + 10 位尾数来表示数,指数位让它在小数附近能表示极其精细的增量,但在大数区域,两个相邻可表示数的间距会变得很大。
整型数轴(下半部分):刻度是均匀的。INT8 只有 256 个可表示的数(-128 到 127),从最小值到最大值等距分布。
量化的本质,就是把浮点数那条"浪费的、不均匀的"数轴,映射到整数这条"紧凑的、均匀的"数轴上。图里用三个步骤概括:
#A Choose range to cover —— 决定用哪段范围覆盖你的数据
#B Divide into 256 equal steps —— 把这段范围均匀切成 256 格
#C Map each value to nearest step —— 把每个浮点数映射到最近的格子关键洞察写在这张图底部:"You choose where to spend your 256 values. Place the grid where your weights actually live."(你来决定把 256 个值花在哪里,把格子放在权重真正分布的地方。)
这正是全书所有算法的母题:对称 vs 非对称、per-tensor vs per-channel vs per-group、校准方法的选择……本质都是在回答一个问题——"把格子放在哪、放多密,才能让量化误差最小。"
1.3 不只是省内存:量化带来的三重收益
把"省内存"当成量化的全部收获就太可惜了。一套好的量化方案能同时拿到:
1. 内存与容量:装下更大的模型。 7B 模型 FP16 占 14GB,INT8 只要 7GB,INT4 只要 3.5GB。消费级显卡(16GB)装不下的模型,量化后可能就装下了。KV cache 同理——长上下文的 KV cache 往往比权重更占显存,量化 KV cache 是支撑超长上下文的常用手段(第 3、7 章展开)。
2. 带宽与延迟:生成更快。 LLM 生成是 memory-bound(内存受限)的——计算单元大部分时间在等权重从显存搬过来。权重缩小 4 倍,同样的带宽能喂 4 倍的计算,decode 阶段(逐 token 生成)的吞吐直接受益。
3. 能耗与成本:跑得更省。 回到 1.1 的能量表:INT8 乘加只有 FP32 的 1/13。对于边缘设备(手机、IoT)、对能耗敏感的自建集群,这个差距直接体现在电费、散热和电池续航上。
1.4 什么时候量化会失效
量化不是免费的。把 256 个格子硬套到可能成千上万种取值的浮点数上,必然会损失精度。书中给了一个诚实的框架,回答"什么时候不该量化":
1. 数据分布极端不对称时。 权重通常是近似钟形分布(bell-shaped),量化误差可控;但激活(activation)经过 ReLU 后是严格非负且带尖峰的分布,用对称量化会浪费一半的格子。第 2 章会用"ReLU Trap"实验演示这个坑,并引入非对称量化。
2. 出现异常值(outlier)时。 大模型(6.7B 及以上)的激活里会出现少数巨大的异常通道,它们会把 absmax 缩放因子撑得很大,导致正常值被压到一格以内、精度崩塌。第 7 章会专门讲这个"异常值问题",以及 LLM.int8() 用混合精度分解来绕开它的思路。
3. 模型本身容错差时。 量化相当于给权重加了一层噪声。如果任务对噪声极其敏感(例如某些回归任务、长尾小概率事件),量化后的质量下降会超出可接受范围。第 4 章会讲怎么用校准验证(validation)量化前后的质量差距,而不是拍脑袋决定。
1.5 本书的路线图
在动手写第一行量化代码前,先建立全局视角。全书 12 章可以画成一条从"为什么"到"怎么做"的路线:
graph LR
A[第1章 效率危机] --> B[第2章 量化第一性原理]
B --> C[第3章 粒度选择]
C --> D[第4章 校准与PTQ]
D --> E[第5章 量化感知训练 QAT]
D --> F[第6章 量化通路 工具链]
C --> G[第7章 LLM量化实战]
G --> H[第8章 sub-8-bit格式]
F --> I[第9章 部署管线]
F --> J[第10章 GGUF 与 llama.cpp]
C --> K[第11章 边缘移动端]
I --> L[第12章 生产级交付]- 第 2 章:手写对称/非对称量化器、模拟整型点积管线,从零建立量化直觉。
- 第 3 章:per-tensor、per-channel、per-group 到底差在哪,KV cache 量化。
- 第 4 章:PTQ 的核心——怎么估计激活范围、怎么构建校准集、怎么选位宽。
- 第 5-6 章:当 PTQ 不够用时,QAT 怎么做;PyTorch / ONNX / TFLite 三条现成通路。
- 第 7-8 章:LLM 量化专场——异常值、LLM.int8()、GPTQ、AWQ、FP8/FP4/NF4/三元。
- 第 9-12 章:把量化模型真正部署上线——ORT/TensorRT/OpenVINO、GGUF/llama.cpp、Core ML/TFLite,最后用一个 4bit LLM 服务器 + 端侧视觉管线的完整案例收尾。
准备好动手了吗?第 2 章我们从第一性原理开始,亲手写出第一个量化器。
作者: itech001 来源: 公众号:AI人工智能时代(the-ai-era) 网站: https://www.theaiera.top/ 关注每日最新AI新闻和技术博客,主页有更多的文章的AI 技术参考:https://www.theaiera.top
本文首发于 AI人工智能时代,转载请注明出处。