土法炼钢兴趣小组的算法知识备份

【GPU 算子工程】量化与多精度算子:INT8 / FP8、反量化与 per-channel

文章导航

分类入口
gpuarchitecture
标签入口
#cuda#quantization#int8#fp8#fp16#dequantization#per-channel#dp4a

目录

量化与多精度算子:INT8 / FP8、反量化与 per-channel

低精度是大模型推理和训练的标配,原因有两个,都和本系列的主线对应:Tensor Core 篇 说过低精度的算力屋顶更高(FP16 比 FP32 快约 4.5 倍),访存篇 的逻辑则是低精度的数据更小、HBM 流量更少。这一篇讲量化算子的工程细节:量化怎么做、反量化在哪做、不同粒度的权衡、各种精度的硬件路径,以及容易踩的精度坑。

一、低精度的两个收益

收益一:减少访存(memory-bound 算子)

数据从 FP32(4 字节)换成 FP16(2 字节)或 INT8(1 字节),HBM 搬运量直接减半、减到四分之一。对 memory-bound 算子,耗时几乎正比于字节数。

实测一个逐元素算子在 FP32 和 FP16 下的耗时(RTX 3060 Ti,\(n=2^{26}\)):

精度 耗时 加速
FP32(4 字节/元素) 1.363 ms 1.00×
FP16(2 字节/元素) 0.752 ms 1.81×

FP16 快 1.81 倍,接近字节减半带来的 2 倍上限。这就是为什么大模型推理几乎都跑在 FP16/BF16/INT8 上——很多算子卡在带宽,精度减半就接近翻倍提速。

收益二:提高算力(compute-bound 算子)

GEMM 这类 compute-bound 算子,低精度走 Tensor Core 的更高算力屋顶(第 11 篇 实测 FP16 约 73 TFLOP/s vs FP32 16 TFLOP/s)。INT8 在 Tensor Core 上吞吐更高,是推理 GEMM 的常见选择。

二、量化的基本形式

量化把浮点值映射到低位宽整数。最常见的线性量化:

\[ q = \text{round}(x / s) + z, \qquad x \approx s \cdot (q - z) \]

其中 \(s\) 是 scale(缩放因子),\(z\) 是 zero-point(零点)。两种形式:

INT8 GEMM 的核心:\(x \approx s_x(q_x - z_x)\)\(w \approx s_w(q_w - z_w)\),于是 \(x \cdot w\) 展开成整数点积 \(\sum q_x q_w\) 加上几个修正项。整数点积在硬件上跑,最后用 \(s_x s_w\) 反量化回浮点。

三、量化粒度:per-tensor 还是 per-channel

scale 用多细的粒度,直接影响精度:

粒度越细,精度越好,但 scale 的存储和反量化的索引开销越大。算子实现要把”按哪个维度取 scale”和数据布局对齐,避免反量化时的非合并访问(第 05 篇)。

四、反量化在哪做:算子设计的关键

反量化(dequant)把整数结果转回浮点。它放在哪一步,决定了算子的访存和精度:

设计量化算子时,“什么时候转精度”要服从一个目标:让大块数据以低精度搬运,反量化尽量晚、尽量在片上做

五、各精度的硬件路径

精度 硬件路径(本卡 / 通用) 说明
FP16 / BF16 Tensor Core HMMA 训练/推理主力,本卡支持
TF32 Tensor Core FP32 范围、降低尾数,训练用,本卡支持
INT8 Tensor Core IMMA;CUDA core __dp4a __dp4a 一条指令做 4 路 INT8 点积累加到 INT32
INT4 Tensor Core(部分架构)/ 解包后算 LLM weight-only 量化常用
FP8 (E4M3/E5M2) Hopper sm_90+ Tensor Core 本卡(Ampere)不支持,需 H100 及以后

__dp4a(a, b, c) 是 CUDA core 上的 INT8 点积内建:把两个打包成 int32 的 4×INT8 向量点积,累加到 INT32。它适合没有 IMMA 的场景或小规模 INT8 计算;大规模 INT8 GEMM 还是走 Tensor Core 的 IMMA,吞吐高得多。FP8 是当前 LLM 训练/推理的前沿精度,但需要 Hopper 及更新的硬件,本系列测试卡跑不了,相关讨论见 第 21 篇

六、精度对齐的工程坑

量化算子最容易出问题的是数值正确性,几个常见坑:

这些都要靠和高精度参考实现逐元素对齐来验证,方法见 调试与数值正确性篇

七、小结与下一步

单卡算子讲完。下一篇跨出单卡,看多卡场景下 通信与计算重叠:NCCL collective 与 kernel overlap

同主题继续阅读

把当前热点继续串成多页阅读,而不是停在单篇消费。


By .