CANN ops-math 量化模式详解:从 T/C/K/G/B 量化粒度到全量化、伪量化与 MX 量化
【免费下载链接】ops-math本项目是CANN提供的数学类基础计算算子库,实现网络在NPU上加速计算。项目地址: https://gitcode.com/cann/ops-math
本文基于 CANN ops-math 开源算子库《量化介绍》系统展开,讲解 NPU 上 Matmul 等 cube(矩阵)类算子的量化原理、静态/动态量化差异,以及 pertensor(T)、perchannel(C)、pertoken(K)、pergroup(G)、perblock(B)五种量化粒度的参数 shape 推导规则,并梳理全量化、伪量化与 MX 量化等常见组合方案。读完本文,你将能正确理解量化参数 scale 的 shape 与 reduce 轴的关系,看懂仓库中量化相关算子(如 weight_quant_preprocess)的接口文档与源码实现。
为什么需要量化:cube 算子的高 bit 到低 bit 转换
量化广泛应用于深度学习模型中,特别是在推理过程中。通过量化,模型可以在硬件上更高效地运行,减少计算资源的消耗并加速推理过程,同时降低模型的存储需求。
在 CANN 算子层面,量化特指对神经网络中 Matmul 等矩阵(cube)类算子的输入 Tensor 从高 bit 到低 bit 转换的计算过程,同时生成对应的量化参数 scale。整体计算流程为:
- 高 bit 输入 Tensor 经过量化,转换为低 bit 数值,并同步计算得到量化参数 scale;
- 低 bit 数据送入 cube 单元完成矩阵乘计算(低 bit 计算在 NPU 硬件上吞吐更高、能耗更低);
- cube 计算完成后,通过量化参数 scale 将低 bit 结果转换回高 bit 数值。
经过上述闭环,整体计算结果的正确性得到保证(效果与直接用高 bit 计算近似等价),同时有效提升计算效率。这就是量化作为 NPU 加速关键手段的价值所在。
静态量化与动态量化
按量化参数的确定时机,量化分为两类,二者在推理与训练场景下的选型原则不同:
| 量化类型 | 量化参数来源 | 适用场景 | 性能特点 |
|---|---|---|---|
| 静态量化 | 使用预先确定的量化参数 | 推理场景下对权重 weight 的量化一般采用静态量化 | 量化算子性能更好 |
| 动态量化 | 使用输入数据在线计算量化参数 | 推理场景下对激活 activation 的量化,以及训练场景(为提升量化精度) | 因在线生成量化参数,量化算子性能略差,但更能适应数据变化、精度更高 |
简言之:静态量化以性能见长,动态量化以精度和自适应能力见长,实际部署中常对 weight 走静态量化、对 activation 走动态量化。
量化模式(量化粒度)总览
量化模式(又称量化粒度)是指对算子的不同输入 Tensor 采用不同的量化计算级别。理解该部分前需先约定两个概念:
- m、n、k 变量分别表示 Tensor 计算的不同轴大小;
- 左矩阵、右矩阵分别指 cube 算子中用于矩阵乘法计算的两个输入 Tensor,一般左矩阵代表激活 activation、右矩阵代表权重 weight,请按实际情况理解和使用。
CANN ops-math 支持的五种基础量化模式如下表:
| 量化模式 | 简称 | 量化对象 | 量化参数 shape(左矩阵 (m, k) / 右矩阵 (k, n)) |
|---|---|---|---|
| pertensor | T | 左矩阵或右矩阵 | (1, ) |
| perchannel | C | 右矩阵 | (n, ) |
| pertoken | K | 左矩阵 | (m, ) |
| pergroup | G | 左矩阵或右矩阵 | 左:(m, k/gs);右:(k/gs, n) |
| perblock | B | 左矩阵或右矩阵 | 左:(m/bs, k/bs);右:(k/bs, n/bs) |
各模式在 reduce 轴(k 轴)上的处理方式各不相同,下面逐一展开。
pertensor 量化(T 量化)
pertensor 量化中,量化对象既可以是左矩阵,也可以是右矩阵,每个 Tensor 共用一个相同的量化参数,是最粗粒度的量化方式。
假设左矩阵 shape 为 (m, k)、右矩阵 shape 为 (k, n),k 为 reduce 轴,则生成的量化参数 shape 为 (1, ),即整个 Tensor 仅维护一个 scale:
T 量化实现最简单、开销最小,但精度损失也相对较大,通常用于对精度不敏感或参数分布均匀的场景。
perchannel 量化(C 量化)
perchannel 量化中,量化对象是右矩阵(即 weight),每个 channel 分别使用独立的量化参数。
假设右矩阵 shape 为 (k, n),k 为 reduce 轴,则生成的量化参数 shape 为 (n, ),即沿 n 轴为每个输出 channel 维护一个 scale:
C 量化对权重按输出通道分别缩放,能更好地适配 weight 的逐通道分布差异,是伪量化 Matmul 中权重量化的主流选择。
pertoken 量化(K 量化)
pertoken 量化中,量化对象是左矩阵(即 activation),每个 token 分别使用独立的量化参数。
假设左矩阵 shape 为 (m, k),k 为 reduce 轴,则生成的量化参数 shape 为 (m, ),即沿 m 轴为每个 token 维护一个 scale:
K 量化能动态适应激活数据逐 token 的分布变化,与动态量化配合常用于大模型推理中的激活量化。
pergroup 量化(G 量化)
pergroup 量化中,量化对象既可以是左矩阵,也可以是右矩阵,在 reduce 轴上对数据分组,每组使用独立的量化参数。
- 假设左矩阵 shape 为 (m, k),k 为 reduce 轴,在 k 轴上分组,group size 为 gs,则生成的量化参数 shape 为 (m, k/gs);
- 假设右矩阵 shape 为 (k, n),k 为 reduce 轴,在 k 轴上分组,group size 为 gs,则生成的量化参数 shape 为 (k/gs, n)。
G 量化在粒度和开销之间取得较好平衡,是当前低 bit 权重量化(如 INT4、FP8 场景)中应用最广泛的模式之一。
perblock 量化(B 量化)
perblock 量化中,量化对象既可以是左矩阵,也可以是右矩阵,在所有轴上对数据分块,每块使用独立的量化参数。
- 假设左矩阵 shape 为 (m, k),k 为 reduce 轴,在 m、k 轴上分别按 (bs, bs) 块对数据分组,bs 为 block size,则生成的量化参数 shape 为 (m/bs, k/bs);
- 假设右矩阵 shape 为 (k, n),k 为 reduce 轴,在 k、n 轴上分别按 (bs, bs) 块对数据分组,bs 为 block size,则生成的量化参数 shape 为 (k/bs, n/bs)。
B 量化的量化粒度最细,理论上精度表现最好,但量化参数数量也最多,需在存储开销与精度之间权衡。
常见组合量化
在实际模型中,左右矩阵往往采用不同的量化模式,形成组合量化方案:
全量化
全量化一般指对左、右矩阵均进行量化的模式,常见组合包括:
- pertensor-perchannel 量化模式(简称 T-C 量化模式):左矩阵 T 量化、右矩阵 C 量化;
- pertoken-perchannel 量化模式(简称 K-C 量化模式):左矩阵 K 量化、右矩阵 C 量化,是大模型权重量化 + 激活动态量化的经典组合;
- pergroup-perblock 量化模式(简称 G-B 量化模式);
- pertensor-perchannel-pergroup 量化模式(简称 T-CG 量化模式);
- perblock-perblock 量化模式(简称 B-B 量化模式)。
伪量化
伪量化一般指仅对权重矩阵(weight)进行量化的模式,包括 perchannel 量化模式(简称 C 量化模式)。伪量化 Matmul 中权重在离线阶段完成低 bit 转换并配套量化参数,运行时仅需对权重做格式与参数的预处理,即可在不改动高 bit 激活计算路径的前提下获得量化加速收益。
MX 量化
MX 量化(Microscaling Formats)指由开放计算项目(OCP)制定的低精度数据表示方式,属于 pergroup 量化模式,表示量化参数类型为 FLOAT8_E8M0 且 group size 为 32 的特例情况。仓库的数据类型定义(见 data_type.md)中已包含 ACL_FLOAT8_E8M0 对应的 FLOAT8_E8M0 类型,为 MX 量化的量化参数提供了类型支撑。
仓库中的量化工程实践
《量化介绍》是 CANN ops-math 基本概念文档(basic_concept.md)体系中的一员,与两段式接口、数据结构、数据类型、数据格式、sparse 模式等文档并列,用于支撑开发者理解仓库中各类量化相关算子。
在开源仓库中可以直接找到量化的落地实现。以伪量化 Matmul 的配套算子aclnnWeightQuantPreprocess(见 aclnnWeightQuantPreprocess.md 及 源码目录)为例:
- 功能上,它完成伪量化 Matmul(包括 QuantBatchMatmulV5、GroupedMatmul-伪量化、WeightQuantBatchMatmulV2)的参数预处理:主要将 weight 从 ND 格式转换为 FRACTAL_NZ 格式(MM_A16S4 数据流的 pertensor 及 perchannel/pergroup 转置场景为 ND 直拷透传),并在需要时对 weightScale、weightOffsetOptional、biasOptional 进行同步处理;
- 接口上遵循两段式调用:先调用
aclnnWeightQuantPreprocessGetWorkspaceSize获取 workspace 大小及执行器,再调用aclnnWeightQuantPreprocess执行计算,输出张量需按接口约束中的 shape 计算公式自行构造; - 该算子在当前仓库中支持 Ascend 950 系列产品,A3/A2 及早期训练推理系列产品不支持,产品支持矩阵可在其接口文档中查看。
结合本文的量化粒度知识即可理解其实现:pertensor/perchannel/pergroup 等不同权重量化粒度,对应 weightScale 不同的 shape 与转置处理路径,预处理算子正是围绕这些粒度差异完成格式转换与参数同步的。
小结
量化是 NPU 上提升模型推理与训练效率的关键技术。本文从 CANN 算子的角度梳理了静态/动态量化的选型原则,以及 T、C、K、G、B 五种量化粒度的量化对象与量化参数 shape 推导规则,并介绍了 T-C、K-C、G-B、T-CG、B-B 等全量化组合、C 伪量化以及 MX 量化特例。理解这些基础概念后,再阅读仓库中 weight_quant_preprocess 等量化算子源码与文档,即可快速建立"量化粒度 → 参数 shape → 底层实现"的完整认知链路。
【免费下载链接】ops-math本项目是CANN提供的数学类基础计算算子库,实现网络在NPU上加速计算。项目地址: https://gitcode.com/cann/ops-math
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考