ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

CANN ops-nn 算子量化模式详解:量化粒度与组合量化策略完全指南

CANN ops-nn 算子量化模式详解:量化粒度与组合量化策略完全指南 CANN ops-nn 算子量化模式详解量化粒度与组合量化策略完全指南【免费下载链接】ops-nn本项目是CANN提供的神经网络类计算算子库实现网络在NPU上加速计算。项目地址: https://gitcode.com/cann/ops-nn量化是深度学习模型部署与加速的核心技术之一尤其在推理场景中通过将浮点张量转换为低 bit 表示可以显著降低计算与存储开销。本文以 docs/zh/context/quant_mode_introduction.md 为骨架系统讲解 CANN ops-nn 中作用于 Matmul 等矩阵cube类算子的量化机制从静态/动态量化两大策略到 pertensor、perchannel、pertoken、pergroup、perblock 五种量化模式粒度的定义、量化参数 shape 推导再到全量化、伪量化、MX 量化等组合模式并结合 quant_batch_matmul_v3 等仓库内真实算子实现源码进行印证。读完本文你将能够准确理解 CANN 算子量化参数scale/offset/pertoken_scale/group_size 等的含义与 shape 规则并为量化模型选型与算子使用提供直接依据。量化在 CANN 算子中的定位量化广泛应用于深度学习模型中特别是在推理过程中。通过量化模型可以在硬件上更高效地运行减少计算资源的消耗和加速推理过程同时降低模型的存储需求。CANN 算子量化是指对神经网络中 Matmul 等矩阵cube类算子的输入 Tensor 从高 bit 到低 bit 转换的计算过程同时生成对应的量化参数 scale。当低 bit 的 cube 计算完成后可通过量化参数 scale 将低 bit 数值转换回高 bit 数值从而保证整体计算结果的正确性效果与直接用高 bit 计算近似等价并有效提升计算效率。根据量化参数的产生方式量化分为两类静态量化使用预先确定的量化参数进行量化。推理场景下对权重 weight 的量化一般采用静态量化量化算子性能会更好些。动态量化使用输入数据在线计算量化参数进行量化。推理场景下对激活 activation 的量化一般采用动态量化更能适应数据的变化精度更高训练场景下为了提升量化精度也一般采用动态量化。注意动态量化因为在线生成量化参数量化算子性能会略差些。从仓库实现看这两种策略对应不同的算子形态。例如 quant/ascend_quant/README.md 中定义的 AscendQuant 算子负责对输入 x 进行量化操作且 scale 和 offset 的 size 需要是 x 的最后一维或 1——这正是动态量化中在线生成量化参数的落点之一而 matmul/quant_batch_matmul_v3/README.md 中的 QuantBatchMatmulV3 则直接接收调用方传入的 scale、offset、pertoken_scale 等量化参数完成带量化的矩阵乘可承载预先标定好的静态量化权重。量化模式量化粒度总览量化模式又称量化粒度是指对算子的不同输入 Tensor 采用不同的量化计算级别。理解量化模式前先明确两个约定说明m、n、k 变量分别表示 Tensor 计算的不同轴大小。左矩阵、右矩阵分别指 cube 算子中用于矩阵乘法计算的两个输入 Tensor一般左矩阵代表激活 activation、右矩阵代表权重 weight请用户按实际情况理解和使用。在矩阵乘(m, k) (k, n)中k 为 reduce 轴归约轴左矩阵的每一行token沿 k 轴与右矩阵的每一列做内积。量化模式本质上决定了多少个数据元素共享一个量化参数以及在哪个轴上切分直接决定了量化参数的 shape 与量化精度/开销的权衡。CANN 常见量化模式包括以下五种。pertensor 量化T 量化pertensor 量化简称T 量化量化对象既可以是左矩阵也可以是右矩阵每个 Tensor 共用一个相同的量化参数。假设左矩阵 shape 为 (m, k)右矩阵 shape 为 (k, n)k 为 reduce 轴生成量化参数的 shape 为 (1, )。这是开销最小的量化粒度只引入一个 scale 值但需要整个张量的数值范围集中在同一尺度内否则精度损失较大适合数值分布均匀的权重场景。perchannel 量化C 量化perchannel 量化简称C 量化量化对象是右矩阵每个 channel 分别使用独立的量化参数。假设右矩阵 shape 为 (k, n)k 为 reduce 轴生成量化参数的 shape 为 (n, )。由于右矩阵权重的输出维度 n 对应每个输出 channelperchannel 让每个 channel 拥有独立的 scale可显著缓解权重跨 channel 数值分布不均带来的精度损失是权重静态量化中最常用的粒度。pertoken 量化K 量化pertoken 量化简称K 量化量化对象是左矩阵每个 token 分别使用独立的量化参数。假设左矩阵 shape 为 (m, k)k 为 reduce 轴生成量化参数的 shape 为 (m, )。左矩阵的每一行token对应一个 scale。由于激活的数值分布随 token 变化剧烈pertoken 是激活动态量化如 K-C 组合中的 K的常用粒度。在仓库中QuantBatchMatmulV3 算子专门提供了pertoken_scale可选输入承载该参数见下文源码印证其 kernel 模板参数中也显式区分了QUANT_BATCH_MATMUL_V3_IS_PERTOKEN与QUANT_BATCH_MATMUL_V3_NOT_PERTOKEN两种编译形态。pergroup 量化G 量化pergroup 量化简称G 量化量化对象既可以是左矩阵也可以是右矩阵在 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)。pergroup 的量化参数数量介于 pertensor 与 perchannel/pertoken 之间是精度与开销的折中方案也是当前主流大模型低 bit 量化如 INT4/INT8 group 量化的基础粒度。仓库中 QuantBatchMatmulV3 的算子定义见 quant_batch_matmul_v3_def.cpp通过group_size属性Attr(group_size).AttrType(OPTIONAL).Int(0)接收分组大小默认值为 0。perblock 量化B 量化perblock 量化简称B 量化量化对象既可以是左矩阵也可以是右矩阵在所有轴上对数据分块每块使用独立的量化参数。假设左矩阵 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)。perblock 是比 pergroup 更细的粒度pergroup 仅在 reduce 轴 k 上切分而 perblock 同时在两个维度上切分左矩阵切 m、k 两轴右矩阵切 k、n 两轴量化参数数量为分块个数。从源码结构看quant_batch_matmul_v3 的 tiling 侧针对该模式提供了专门的滑动窗口/分块实现如adaptive_sliding_window_perblock_basic_api_tiling等文件印证了 perblock 在 Cube 算子的 tiling 与 kernel 两层均需要专门处理。常见组合量化单个 Tensor 上可叠加多种量化模式CANN 中常见的组合量化包括全量化全量化一般是指对左、右矩阵均进行量化的模式包括pertensor-perchannel 量化模式简称 T-C 量化模式左矩阵 pertensor、右矩阵 perchannel是权重静态量化 激活整体量化的经典组合。pertoken-perchannel 量化模式简称 K-C 量化模式左矩阵 pertoken、右矩阵 perchannel对应 LLM 推理中激活动态 per-token 量化 权重静态 per-channel 量化的主流方案精度与性能均衡。pergroup-perblock 量化模式简称 G-B 量化模式左矩阵 pergroup、右矩阵 perblock。pertensor-perchannel-pergroup 量化模式简称 T-CG 量化模式在 perchannel-pergroup 基础上叠加 pertensor 的多级量化。perblock-perblock 量化模式简称 B-B 量化模式左右矩阵均采用 perblock。在仓库中这种左矩阵一种粒度 右矩阵一种粒度的设计直接体现在 QuantBatchMatmulV3 的接口上。其 L0 级 API 签名见 quant_matmul_v3.h同时接收scale可承载 T/C/G/B 粒度、pertokenScale承载 K 粒度、offset与bias配合groupSize属性即可组合出多种全量化形态其 README 也给出了不同组合下的完整计算公式例如无 pertoken、无 biasout x1x2 * scale offsetbias 为 INT32out (x1x2 bias) * scale offsetpertoken、无 biasout x1x2 * scale * pertokenScaleOptionalpertoken、bias 为 INT32此场景无 offsetout (x1x2 bias) * scale * pertokenScaleOptionalpertoken、bias 为 BFLOAT16/FLOAT16/FLOAT32此场景无 offsetout x1x2 * scale * pertokenScaleOptional bias从这些公式可以直观看到scale是按输出维度对应右矩阵量化粒度的缩放pertokenScaleOptional是沿 m 轴token的逐行缩放两者相乘构成K C/T/G的组合量化效果offset与bias则分别负责量化偏移修正与矩阵乘结果的累加。伪量化伪量化一般是指对权重矩阵weight进行量化的模式包括perchannel 量化模式简称 C 量化模式。它只量化右矩阵权重而不量化左矩阵激活因此得名伪——矩阵乘仍以低 bit 权重 高 bit 激活或在线反量化的方式执行。这是权重量化推理中最常见的形态典型代表是仓库中 weight_quant_batch_matmul_v2 一类权重预量化的 batch matmul 算子。MX 量化Microscaling FormatsMX 量化Microscaling Formats指由开放计算项目OCP制定的低精度数据表示方式。MX 量化属于 pergroup 量化模式表示量化参数类型为 FLOAT8_E8M0 且 group size 为 32 的特例情况。FLOAT8_E8M0一种 8 位浮点格式8 个 bit 全部用于指数8E无尾数 M0天然适合作为纯缩放因子scale使用无需额外转换即可参与后续反量化乘加。仓库中的 MX 相关算子如 anti_mx_quant/README.md 即说明缩放因子由 mxscale 提供指数位偏移对于 FLOAT8_E8M0 格式bias 127。group size 为 32MX 格式规定每 32 个元素共享一个 8 位缩放因子这与 pergroup 量化在 reduce 轴 k 上按 32 分组一致。仓库中 QuantBatchMatmulV3 对 Ascend 950 系列产品的定义见 quant_batch_matmul_v3_def.cpp中scale与pertoken_scale均支持DT_FLOAT8_E8M0数据类型且x1/x2支持 FLOAT8_E5M2、FLOAT8_E4M3FN、FLOAT4_E2M1、HIFLOAT8 等低 bit 浮点类型正是对 MX 量化数据通路低 bit 数据 FLOAT8_E8M0 缩放因子的完整支撑dual_level_quant_batch_matmul 中的二级量化算子更是将 x1/x2 的 level1 量化参数x1Level1Scale/x2Level1Scale直接定义为 FLOAT8_E8M0。源码印证量化模式在 QuantBatchMatmulV3 中的落地为帮助读者把抽象模式映射到真实代码这里以仓库中量化矩阵乘的代表算子 QuantBatchMatmulV3 为例梳理量化模式的源码落地路径1. 算子定义op_host在 quant_batch_matmul_v3_def.cpp 中x1、x2INT8/INT4/低 bit 浮点、scaleUINT64/FLOAT32/INT64/BF16/FLOAT8_E8M0、offsetFLOAT32、biasINT32/BF16/FLOAT16/FLOAT32、pertoken_scaleFLOAT32/FLOAT8_E8M0依次注册属性侧dtype必选transpose_x1/transpose_x2默认 falsegroup_size默认 0。这些输入与属性的组合即上文五种量化粒度的载体scale的 shape 决定 T/C/G/B 粒度pertoken_scale的有无决定是否叠加 K 粒度group_size决定 G 粒度的分组大小。2. 量化矩阵乘计算公式见 quant_batch_matmul_v3/README.md不同产品Atlas A2/A3、Atlas 推理系列、Ascend 950 等在 bias 类型与 pertoken 组合上略有差异但统一遵循out 反量化(低bit矩阵乘结果) offset/bias的框架与文档通过量化参数 scale 将低 bit 数值转换回高 bit 数值的定义完全一致。3. Kernel 模板特化op_kernel在 quant_batch_matmul_v3_tiling_key.h 中量化模式直接进入模板参数QUANT_BATCH_MATMUL_V3_NOT_PERTOKEN0与QUANT_BATCH_MATMUL_V3_IS_PERTOKEN1作为PERTOKEN模板参数参与 kernel 编译形态选择与转置形态TRANS、kernel 模板类型TBE/BASIC/OPT/PPMATMUL共同决定实例化出的 kernel 变体。这意味着 pertokenK 量化与非 pertoken 场景在编译期就被区分开避免运行时分支开销。4. 单元测试验证仓库的 test_quant_batch_matmul_v3.csv 与 test_quant_batch_matmul_v3_utils.h 等测试资产中覆盖了 pertensor、pertoken、pergroup 等不同 scale/pertoken_scale/group_size 组合的用例可用于对照验证各量化模式下量化参数的 shape 规则与计算结果。结语CANN ops-nn 的算子量化以高 bit → 低 bit scale 反量化为统一框架量化模式粒度决定了量化参数的 shape 与精度-开销权衡pertensor 最简、perchannel/pertoken 分别适配权重与激活的主流静态/动态量化、pergroup 与 perblock 提供更细粒度的精度控制而 T-C、K-C、G-B、T-CG、B-B 等组合量化与 MX 量化FLOAT8_E8M0 group size 32则是这些基础粒度的实际组合形态。理解这些概念后你可以对照 quant_batch_matmul_v3、ascend_quant、weight_quant_batch_matmul_v2 等算子的参数说明与实际用例为具体的量化模型选配合适的量化模式与量化参数。如需进一步了解 CANN 算子的基础概念与使用方式可参考 docs/zh/context/basic_concept.md 与 docs/zh/context/compile_and_run_sample.md。【免费下载链接】ops-nn本项目是CANN提供的神经网络类计算算子库实现网络在NPU上加速计算。项目地址: https://gitcode.com/cann/ops-nn创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表