首页/新闻资讯/正文详情

CANN ops-nn 量化矩阵乘算子 QuantBatchMatmulV4 全解析:计算原理与 aclnnQuantMatmulV5 调用实战

发布时间:2026/9/23 12:21:27 来源:云帆数科 栏目:资讯中心
CANN ops-nn 量化矩阵乘算子 QuantBatchMatmulV4 全解析:计算原理与 aclnnQuantMatmulV5 调用实战
CANN ops-nn 量化矩阵乘算子 QuantBatchMatmulV4 全解析计算原理与 aclnnQuantMatmulV5 调用实战【免费下载链接】ops-nn本项目是CANN提供的神经网络类计算算子库实现网络在NPU上加速计算。项目地址: https://gitcode.com/cann/ops-nn本篇技术指南以 CANN ops-nn 仓库中的 QuantBatchMatmulV4 算子说明 为核心系统讲解该量化矩阵乘算子在 NPU 上的计算语义、支持的产品与量化模式、全部输入输出参数约定、数据类型组合约束并结合仓库中的 aclnnQuantMatmulV5 接口文档 与可运行示例源码完整演示两段式 aclnn 接口的调用流程。读完本文你将能够判断自己的量化 GEMM 场景是否适用于该算子、如何按量化模式正确配置 scale/offset/bias/groupSize 等参数并能够基于仓库示例写出可运行的调用代码。一、算子定位与产品支持情况QuantBatchMatmulV4 是 CANN ops-nn 中用于完成**量化矩阵乘Quantized Batch Matmul**计算的核心算子左矩阵 x1 与右矩阵 x2 以 INT4/INT8/FLOAT8/FLOAT4/HIFLOAT8 等低比特类型参与 cube 计算再通过 x1Scale、x2Scale、x2Offset、yScale、bias 等量化参数完成反量化输出 FLOAT16/BFLOAT16/FLOAT32/INT8/INT32 精度的结果。它承接并扩展了 QuantBatchMatmulV3/V4 的接口能力对外统一由 aclnnQuantMatmulV5 接口调用。该算子的产品支持情况以当前仓库文档为准产品是否支持Ascend 950PR/Ascend 950DT√Atlas A3 训练系列产品/Atlas A3 推理系列产品√Atlas A2 训练系列产品/Atlas A2 推理系列产品√Atlas 200I/500 A2 推理产品×Atlas 推理系列产品×Atlas 训练系列产品×Kirin X90 处理器系列产品√Kirin 9030 处理器系列产品√从算子 IR 注册quant_batch_matmul_v4_def.cpp可以看到算子为ascend950、ascend350、ascend910b、ascend910_93分别注册了 AICore 配置且均开启了动态 shape、动态 format、动态 rank 支持与精度降低PrecisionReduce标志这与上表支持 Ascend 950PR/950DT、Atlas A2/A3 系列产品的事实相互印证。二、功能说明与计算公式QuantBatchMatmulV4 的核心功能是在矩阵乘结果上叠加量化参数的反量化运算。不同产品系列、不同量化模式下参与运算的参数组合不同计算公式也不同。2.1 Atlas A2 / Atlas A3 训练与推理系列该系列支持 K-C K-T、T-C T-T、G-B、K-G 等量化模式主要公式如下x1 为 INT8x2 为 INT32x1Scale 为 FLOAT32x2Scale 为 UINT64yOffset 为 FLOAT32out 为 FLOAT16/BFLOAT16K-G 量化$$ out ((x1 (x2 \times x2Scale)) yOffset) \times x1Scale $$无 x1Scale、无 biasT-C T-T$$ out x1x2 \times x2Scale x2Offset $$bias 为 INT32$$ out (x1x2 bias) \times x2Scale x2Offset $$bias 为 BFLOAT16/FLOAT32此场景无 offset$$ out x1x2 \times x2Scale bias $$有 x1Scale、无 biasK-C K-T$$ out x1x2 \times x2Scale \times x1Scale $$有 x1Scale、bias 为 INT32此场景无 offset$$ out (x1x2 bias) \times x2Scale \times x1Scale $$有 x1Scale、bias 为 BFLOAT16/FLOAT16/FLOAT32此场景无 offset$$ out x1x2 \times x2Scale \times x1Scale bias $$x1、x2 为 INT8x1Scale、x2Scale 为 FLOAT32bias 为 FLOAT32out 为 FLOAT16/BFLOAT16pertoken-pergroup 量化即 G-B 量化$$ out (x1 x2) \times x1Scale \times x2Scale bias $$x1、x2 为 INT4x1Scale、x2Scale 为 FLOAT32x2Offset 为 FLOAT16out 为 FLOAT16/BFLOAT16pertoken-pergroup 非对称量化即 K-G 量化$$ out x1Scale \times x2Scale (x1 x2 - x1 x2Offset) $$需要特别说明的是接口层还支持一种纯量化累加的退化场景当 x1、x2 为 INT8out 为 INT32bias 为 INT32 或 nullptr 时各 scale 实际不参与计算公式退化为out x1x2 bias或out x1x2参见 aclnnQuantMatmulV5.md。2.2 Ascend 950PR / Ascend 950DT该系列在 A2/A3 基础上新增支持 G-B、B-B、T-CG、MX 等量化模式x1、x2 扩展支持 FLOAT8_E4M3FN、FLOAT8_E5M2、HIFLOAT8、FLOAT4_E2M1 等浮点低比特类型主要公式如下x1、x2 为 FLOAT8_E4M3FN/FLOAT8_E5M2/HIFLOAT8无 x1Scalex2Scale 为 INT64/UINT64无 x2Offset可选 bias 为 FLOAT32out 为 FLOAT16/BFLOAT16/FLOAT32$$ out (x1x2 bias) \times x2Scale $$MX 量化模式x1、x2 为 FLOAT4_E2M1/FLOAT8_E4M3FN/FLOAT8_E5M2x1Scale 为 FLOAT8_E8M0x2Scale 为 FLOAT8_E8M0无 x2Offset可选 bias 为 FLOAT32$$ out (x1 \times x1Scale)(x2 \times x2Scale) bias $$x1、x2 为 FLOAT8_E4M3FN/FLOAT8_E5M2/HIFLOAT8x1Scale 为 FLOAT32x2Scale 为 FLOAT32无 x2Offset可选 bias 为 FLOAT32$$ out (x1x2 bias) \times x2Scale \times x1Scale $$G-B B-B 量化模式x1、x2 为 FLOAT8_E4M3FN/FLOAT8_E5M2/HIFLOAT8x1Scale、x2Scale 为 FLOAT32无 x2Offset、无 bias当 x1 为 (a0, a1)、x2 为 (b0, b1) 时x1Scale 为 (ceil(a0 / 128), ceil(a1 / 128)) 或 (a0, ceil(a1 / 128))x2Scale 为 (ceil(b0 / 128), ceil(b1 / 128))$$ out_{pq} \sum_{0}^{\left \lfloor \frac{k}{blockSize} \right \rfloor} (x1_{pr}x2_{rq} \times (x1Scale_{pr} \times x2Scale_{rq})) $$x1 为 FLOAT8_E4M3FNx2 为 FLOAT4_E2M1x1Scale 为 FLOAT8_E8M0x2Scale 为 FLOAT8_E8M0无 offset可选 bias 为 BFLOAT16/FLOAT16out 为 BFLOAT16/FLOAT16MX 伪量化$$ out (x1 \times x1Scale)(x2 \times x2Scale) bias $$x1 为 FLOAT8_E4M3FNx2 为 FLOAT4_E2M1无 x1Scalex2Scale 为 BFLOAT16/FLOAT16无 offset、无 biasyScale 为 UINT64out 为 BFLOAT16/FLOAT16T-CG 量化$$ out (x1(x2 \times x2Scale)) \times yScale $$2.3 量化模式速览理解上述公式前建议先建立量化粒度的概念。仓库中的 量化模式介绍 给出了权威定义pertensorT 量化每个 Tensor 共用一个量化参数scale shape 为 (1, )perchannelC 量化右矩阵每个 channel 独立参数scale shape 为 (n, )pertokenK 量化左矩阵每个 token 独立参数scale shape 为 (m, )pergroupG 量化在 reduce 轴 k 上分组scale shape 为 (m, k/gs) 或 (k/gs, n)perblockB 量化在 m、k 或 k、n 轴上按块分组MX 量化Microscaling FormatsOCP 制定的低精度表示量化参数为 FLOAT8_E8M0 且 group size 为 32 的特例。QuantBatchMatmulV4 中的K-C K-TT-C T-TG-BB-BT-CGK-GMX等量化模式即由上述基础粒度组合而来公式中的 x1Scale/x2Scale 究竟取 (m,)/(n,)/(m, k/gs) 还是 (k/gs, n) 等 shape完全由量化模式决定这与 2.1、2.2 中的 shape 说明一一对应。三、参数说明QuantBatchMatmulV4 算子共有 10 个输入/输出参数下表完整列出了各参数的输入输出属性、描述、数据类型与数据格式与 README 一致参数名输入/输出/属性描述数据类型数据格式x1输入矩阵乘运算中的左矩阵。FLOAT8_E5M2, FLOAT8_E4M3FN, INT4, INT8NDx2输入矩阵乘运算中的右矩阵。FLOAT4_E2M1, INT4, INT8ND, FRACTAL_NZbias输入矩阵乘运算后累加的偏置对应公式中的 bias。BFLOAT16, FLOAT16, FLOAT32NDx1_scale输入矩阵乘计算时量化参数的缩放因子对应公式的 x1Scale。BFLOAT16, FLOAT16, FLOAT32, FLOAT8_E8M0NDx2_scale输入矩阵乘计算时量化参数的缩放因子对应公式的 x2Scale。BFLOAT16, FLOAT16, FLOAT32, UINT64, FLOAT8_E8M0NDy_scale输入矩阵乘运算后量化参数的缩放因子对应公式的 yScale。UINT64NDx1_offset输入矩阵乘计算时量化参数的偏置因子对应公式的 x1Offset。BFLOAT16, FLOAT16NDx2_offset输入矩阵乘计算时量化参数的偏置因子对应公式的 x2Offset。BFLOAT16, FLOAT16NDy_offset输入矩阵乘运算后量化参数的偏置因子对应公式的 yOffset。BFLOAT16, FLOAT16, FLOAT32NDy输出矩阵乘运算的计算结果。BFLOAT16, FLOAT16ND在 aclnn 接口层面见 aclnnQuantMatmulV5.md 的函数原型这些参数以const aclTensor*形式传入其中 x1Scale、yScale、x1Offset、x2Offset、yOffset、bias 均为可选输入不使用时可传入 nullptrx1Offset 为预留参数当前版本不支持必须传 nullptr。接口原型如下aclnnStatus aclnnQuantMatmulV5GetWorkspaceSize( const aclTensor *x1, const aclTensor *x2, const aclTensor *x1Scale, const aclTensor *x2Scale, const aclTensor *yScale, const aclTensor *x1Offset, const aclTensor *x2Offset, const aclTensor *yOffset, const aclTensor *bias, bool transposeX1, bool transposeX2, int64_t groupSize, aclTensor *out, uint64_t *workspaceSize, aclOpExecutor **executor);aclnnStatus aclnnQuantMatmulV5( void *workspace, uint64_t workspaceSize, aclOpExecutor *executor, aclrtStream stream);3.1 属性与 groupSize 编码规则接口层还包含三个重要控制参数transposeX1 / transposeX2bool表示 x1 / x2 的输入 shape 是否转置。以 2 维为例transposeX1 为 false 时 x1 为 (m, k)为 true 时 x1 为 (k, m)x2 同理。groupSizeint64_t用于指定 m、n、k 三个方向的量化分组大小仅 MX、G-B、B-B、K-G、T-CG 量化模式中生效。它由 groupSizeM、groupSizeN、groupSizeK 三个值拼接而成每个值占 16 位共占用 int64_t 的低 48 位高 16 位无效$$ groupSize groupSizeK ;|; groupSizeN 16 ;|; groupSizeM 32 $$例如 aclnnQuantMatmulV5.md 中给出的常见取值G-B 量化 [gsM, gsN, gsK] [1, 128, 128] 对应 groupSize 4303356032B-B 量化 [128, 128, 128] 对应 groupSize 549764202624MX 全量化 [1, 1, 32] 对应 groupSize 4295032864。当 groupSize 中某方向为 0 时接口会根据输入 shape 自动推导推导原则为假设 groupSizeM 0则 groupSizeM m / scaleM需保证 m 能被 scaleM 整除m 与 x1 的 m 一致scaleM 与 x1Scale 的 m 一致。只有 x1Scale 与 x2Scale 均为 2 维及以上时 groupSize 取值才有效其他场景需传入 0。3.2 返回值与常见错误两段式接口均返回aclnnStatus状态码。第一段接口aclnnQuantMatmulV5GetWorkspaceSize完成入参校验常见报错如下返回值错误码描述ACLNN_ERR_PARAM_NULLPTR161001传入的 x1、x2、x2Scale 或 out 是空指针。ACLNN_ERR_PARAM_INVALID161002x1、x2、bias、x1Scale、x2Scale、x2Offset 或 out 是空 tensor或数据类型、数据格式不在支持范围或 shape 不满足校验条件或传入的 groupSize 不满足校验条件groupSize 为 0 时无法从 x1、x2 与 x1Scale、x2Scale 的 shape 关系推断。四、调用示例从工程骨架到完整运行仓库 examples 目录提供了覆盖不同平台与数据类型的可直接编译的示例源码包括test_aclnn_quant_matmul_v5_at2_at3.cppAtlas A2/A3 系列x1 为 INT8、x2 为 INT32K-G 量化arch35/test_aclnn_quant_matmul_v5_f8f4_nd.cppAscend 950x1 为 FLOAT8_E4M3FN、x2 为 FLOAT4_E2M1T-CG 量化arch35/test_aclnn_quant_matmul_v5_dynamic_scale.cpp、arch35/test_aclnn_quant_matmul_v5_hif8hif8.cpp、arch35/test_aclnn_quant_matmul_v5_int4_int4.cpp 等。调用流程遵循 CANN 算子的两段式接口规范先调用aclnnQuantMatmulV5GetWorkspaceSize获取 workspace 大小与执行器再调用aclnnQuantMatmulV5执行计算。以 A2/A3 平台的 K-G 量化场景x1 为 INT8 (m,k)x2 为 INT32 (k,n)x1Scale 为 (1,1) FLOAT32x2Scale 为 (k/groupSize, n) UINT64yOffset 为 (n,) FLOAT32为例核心调用代码如下#include acl/acl.h #include aclnnop/aclnn_quant_matmul_v5.h // 1. 构造输入与输出 aclTensor以 x1 为例其余类似 std::vectorint64_t x1Shape {1, 8192}; // (m,k) std::vectorint64_t x2Shape {8192, 128}; // (k,n) std::vectorint64_t x1ScaleShape {1, 1}; std::vectorint64_t x2ScaleShape {32, 1024}; // x2ScaleShape [K / groupSize, N] std::vectorint64_t yoffsetShape {1024}; std::vectorint64_t outShape {1, 1024}; // 通过 aclCreateTensor 创建 x1/x2/x1Scale/x2Scale/yoffset/out 等 aclTensor // 每个 tensor 均通过 aclrtMalloc 申请 device 内存并用 aclrtMemcpy 完成 H2D 拷贝。 bool transposeX1 false; bool transposeX2 false; int64_t groupSize 256; // K-G 量化groupSizeK 256 // 2. 第一段接口获取 workspace 大小与执行器 uint64_t workspaceSize 0; aclOpExecutor* executor nullptr; auto ret aclnnQuantMatmulV5GetWorkspaceSize( x1, x2, x1Scale, x2Scale, nullptr /*yScale*/, nullptr /*x1Offset*/, nullptr /*x2Offset*/, yoffset, nullptr /*bias*/, transposeX1, transposeX2, groupSize, out, workspaceSize, executor); CHECK_RET(ret ACL_SUCCESS, LOG_PRINT(GetWorkspaceSize failed. ERROR: %d\n, ret); return ret); // 3. 按 workspaceSize 申请 device 侧 workspace 内存 void* workspaceAddr nullptr; if (workspaceSize 0) { ret aclrtMalloc(workspaceAddr, workspaceSize, ACL_MEM_MALLOC_HUGE_FIRST); CHECK_RET(ret ACL_SUCCESS, LOG_PRINT(allocate workspace failed. ERROR: %d\n, ret); return ret); } // 4. 第二段接口执行计算 ret aclnnQuantMatmulV5(workspaceAddr, workspaceSize, executor, stream); CHECK_RET(ret ACL_SUCCESS, LOG_PRINT(aclnnQuantMatmulV5 failed. ERROR: %d\n, ret); return ret); // 5. 同步等待并取回结果 ret aclrtSynchronizeStream(stream); // 使用 aclrtMemcpy 将 out 从 device 拷贝回 host 后打印几点实操提示均来自仓库示例源码的注释与写法FLOAT16/BFLOAT16 结果在 C 语言中无法直接打印示例采用std::vectoruint16_t读回二进制位后再自行转换如 arch35/test_aclnn_quant_matmul_v5_f8f4_nd.cpp 中的Bf16ToFloat函数FLOAT4_E2M1 数据用uint8_t表示 2 个 fp4 值示例中0b0010 (0b0010 4)即两个 1.0当 x2Scale 的原始输入类型不满足量化场景约束时需先调用aclnnTransQuantParamV2接口将 scale 转成 INT64/UINT64 类型示例中通过aclnnTransQuantParamV2GetWorkspaceSize/aclnnTransQuantParamV2两段接口完成 yScale → quantParam 的转换后再作为 yScale 传入资源释放使用 RAII 风格std::unique_ptraclTensor, aclnnStatus(*)(const aclTensor*)(x1, aclDestroyTensor)与std::unique_ptrvoid, aclError(*)(void*)(addr, aclrtFree)。五、约束说明数据类型组合与 shape 对齐要求QuantBatchMatmulV4 对输入输出数据类型的组合有严格约束不同产品系列支持的组合不同使用时必须整体匹配以下为 README 完整表格。5.1 Atlas A2 / Atlas A3 训练与推理系列x1x2x1_scalex2_scalex2_offsety_scalebiasy_offsetyINT8INT32FLOAT32UINT64nullptrnullptrnullptrFLOAT32FLOAT16/BFLOAT16INT8INT8nullptrUINT64/INT64nullptrnullptrnullptr/INT32nullptrFLOAT16INT8INT8nullptrUINT64/INT64nullptr/FLOAT32nullptrnullptr/INT32nullptrINT8INT8INT8nullptr/FLOAT32BFLOAT16nullptrnullptrnullptr/INT32/BFLOAT16/FLOAT32nullptrBFLOAT16INT8INT8FLOAT32FLOAT32nullptrnullptrnullptr/INT32/FLOAT16/FLOAT32nullptrFLOAT16INT4/INT32INT4/INT32nullptrUINT64/INT64nullptrnullptrnullptr/INT32nullptrINT32INT8INT8nullptrFLOAT32/BFLOAT16nullptrnullptrnullptr/INT32nullptrFLOAT16INT8INT8FLOAT32FLOAT32nullptrnullptrFLOAT32nullptrBFLOAT16INT4/INT32INT4/INT32FLOAT32FLOAT32/BFLOAT16nullptrnullptrnullptr/INT32/BFLOAT16/FLOAT32nullptrBFLOAT16INT4/INT32INT4/INT32FLOAT32FLOAT32nullptrnullptrnullptr/INT32/FLOAT16/FLOAT32nullptrFLOAT16INT4INT4FLOAT32FLOAT32FLOAT16nullptrnullptrnullptrBFLOAT165.2 Ascend 950PR / Ascend 950DTx1x2x1_scalex2_scalex2_offsety_scalebiasyINT8INT8nullptrUINT64/INT64nullptrnullptrnullptr/INT32FLOAT16/BFLOAT16INT8INT8nullptrUINT64/INT64nullptr/FLOAT32nullptrnullptr/INT32INT8INT8INT8nullptr/FLOAT32FLOAT32/BFLOAT16nullptrnullptrnullptr/INT32/FLOAT32/BFLOAT16BFLOAT16INT8INT8FLOAT32FLOAT32nullptrnullptrnullptr/INT32/FLOAT32/FLOAT16FLOAT16FLOAT8_E4M3FN/FLOAT8_E5M2FLOAT8_E4M3FN/FLOAT8_E5M2nullptrUINT64/INT64nullptrnullptrnullptr/FLOAT32FLOAT16/BFLOAT16/FLOAT32HIFLOAT8HIFLOAT8nullptrUINT64/INT64nullptrnullptrnullptr/FLOAT32FLOAT16/BFLOAT16/FLOAT32FLOAT8_E4M3FN/FLOAT8_E5M2FLOAT8_E4M3FN/FLOAT8_E5M2FLOAT32FLOAT32nullptrnullptrnullptr/FLOAT32FLOAT16/BFLOAT16/FLOAT32HIFLOAT8HIFLOAT8FLOAT32FLOAT32nullptrnullptrnullptr/FLOAT32FLOAT16/BFLOAT16/FLOAT32FLOAT4_E2M1FLOAT4_E2M1FLOAT8_E8M0FLOAT8_E8M0nullptrnullptrnullptr/FLOAT32FLOAT16/BFLOAT16/FLOAT32FLOAT8_E4M3FN/FLOAT8_E5M2FLOAT8_E4M3FN/FLOAT8_E5M2FLOAT8_E8M0FLOAT8_E8M0nullptrnullptrnullptr/FLOAT32FLOAT16/BFLOAT16/FLOAT32FLOAT8_E4M3FNFLOAT4_E2M1FLOAT8_E8M0FLOAT8_E8M0nullptrnullptrnullptr/BFLOAT16/FLOAT16BFLOAT16/FLOAT16FLOAT8_E4M3FNFLOAT4_E2M1nullptrBFLOAT16/FLOAT16nullptrINT64/UINT64nullptrBFLOAT16/FLOAT165.3 通用约束与量化场景专项约束除上述组合约束外还需注意不支持空 tensor支持连续 tensor[非连续 tensor] 仅支持转置场景README 原文非连续 tensor 只支持转置场景。INT4 的表示方式INT4 场景下 x1 仅支持非转置维度为 (m, k)要求 k 为偶数当以 INT32 承载 INT4 时每个 INT32 存放 8 个 INT4 数据维度为 (m, ceil(k/8))要求 k 为 8 的倍数。若 x2 的 INT4 数据布局不满足要求可先通过 aclnnConvertWeightToINT4Pack 接口 完成格式转换。静态量化与动态量化当 x1/x2 为 FLOAT8_E4M3FN/FLOAT8_E5M2/HIFLOAT8 时x2Scale 为 UINT64/INT64 属于静态量化x2Scale 为 FLOAT32 属于动态量化x1/x2 为 INT8/INT4/INT32 时仅支持静态 T-C/T-T 量化。scale 与 offset 的 shape 语义K-C 量化下 x1Scale 为 (m,)、x2Scale 为 (n,)K-T 量化下 x1Scale 为 (m,)、x2Scale 为 (1,)G-B 量化下 x1Scale 为 (m, ceil(k/128))、x2Scale 为 (ceil(n/128), ceil(k/128))MX 全量化下 x1Scale 为 (batch, m, ceil(k/64), 2)、x2Scale 为 (batch, ceil(k/64), n, 2)且 [gsM, gsN, gsK] [1, 1, 32]。g 的 0 值维会自动推导。shape 对齐要求如 A2/A3 G-B 量化要求 x1 的 k 与 128 对齐且为 4×128 的倍数、x2 的 n 与 256 对齐950 T-CG 量化要求 k 是 32 的倍数、x2Scale shape 为 (n, ceil(k/32))950 K-GINT4要求 x1、x2 的 k 与 1024 对齐、x2 的 n 与 256 对齐。yOffset 的取值语义A2/A3 K-G 场景下 yOffset 为计算过程中离线计算的辅助结果值要求为 8×x2×x2Scale 并在第 1 维累加。bias 的 shapeout 为 2 维时 bias 可为 (n,) 或 (1, n)out 为 4/5/6 维时 bias 仅支持 (n,)out 为 3 维时 bias 可为 (n,) 或 (batch, 1, n)。六、图融合优化量化矩阵乘的编译期降级与转置吸收在算子库的图编译阶段QuantBatchMatmulV4 还配备了两个图融合 Pass源码位于 op_graph/fusion_pass用于减少中间算子、提升执行效率。6.1 QuantBatchMatmulV4ToV3FusionPass该 Pass 将符合条件的 QuantBatchMatmulV4 节点替换为 QuantBatchMatmulV3 节点输入映射如下索引为算子 IR 定义中的索引详见 QuantBatchMatmulV4ToV3FusionPass.mdQuantBatchMatmulV4 输入V4 索引QuantBatchMatmulV3 输入V3 索引x10x10x21x21bias2bias4x1_scale3pertoken_scale5x2_scale4scale2x2_offset7offset3转换时各映射输入及输出 y 的形状、数据类型和格式保持不变不插入数据类型转换节点dtype、transpose_x1、transpose_x2 属性原样传递group_size 为 -1 时改为 V3 默认值 0V4 特有的 compute_type 属性不传递。以下两类场景保留 V4 不转换V4 原生支持场景x1 为 FLOAT8_E4M3FN、x2 为 FLOAT4_E2M1 或 FLOAT32、y 为 BF16 或 FLOAT16以及 A8W8 G-B 量化识别场景x1、x2 为 INT8x1_scale、x2_scale 为 FLOAT32y 为 BF16。对应单测见 tests/ut/op_graph/test_quant_batch_matmul_v4_to_v3_fusion_pass.cpp。6.2 QuantBatchMatmulV4TransposeFusionPass该 Pass 仅支持 Ascend 950PR/Ascend 950DT 且不可关闭用于删除 x2 与 x2_scale 输入前的 Transpose/TransposeD/Reshape 节点把转置信息打到算子的 transpose_x2 属性上详见 QuantBatchMatmulV4TransposeFusionPass.md。触发条件包括x2 输入必须连接 Transpose 或 TransposeD 节点、x1 与 x2 输入 shape 必须为 2D、x1 仅支持 FLOAT8_E4M3FN、x2 仅支持 FLOAT4_E2M1/FLOAT、输出仅支持 BF16/FLOAT16。七、仓库中的实现与测试资源导航如果想进一步深入算子内部实现可按以下路径继续阅读算子 IR 定义op_host/quant_batch_matmul_v4_def.cpp 完整声明了 x1、x2、bias、x1_scale、x2_scale、y_scale、x1_offset、x2_offset、y_offset、x2_table 共 10 个输入与输出 y以及 dtype、compute_type、transpose_x1、transpose_x2、group_size 五个属性并分别注册了 ascend950/ascend350 与 ascend910b/ascend910_93 两套 AICore 配置Shape 推导与参数校验op_host/quant_batch_matmul_v4_infershape.cpp、op_host/op_api/aclnn_quant_matmul_v5.cpp 与 op_host/op_api/quant_matmul_common_check.cppTiling 策略op_host/op_tiling 目录下按 perblock、pergroup、MSD、以及 arch35 的 pergroup/reg_base/weight_quant_mx_swat 等场景划分了多个 tiling 实现与 tiling 注册表Kernel 实现op_kernel 目录提供通用实现与 arch35 专属实现arch35 侧还细分了 perchannel、pertoken_pergroup、reg_base、weight_quant_mx 等 kernel 头文件测试与 golden 数据tests/assets/qbmmv4_aclnn_golden.py 与 qbmmv4_kernel_golden.py 生成对照数据tests/ut/op_host/test_aclnn_quant_matmul_v5_api.cpp 覆盖接口参数校验另有 op_host、op_kernel、op_graph 三层的 UT 用例可对照验证各类 tiling 与融合场景配套接口aclnnQuantMatmulV5 接口文档 完整列举了各量化场景下的 shape 与 groupSize 取值关系表是配置参数时最权威的速查手册。结语QuantBatchMatmulV4 是 CANN ops-nn 中覆盖量化模式最广、数据类型最丰富的量化矩阵乘算子之一在 Atlas A2/A3 系列上承接 INT8/INT4 全量化与 K-G/G-B 等常见组合在 Ascend 950 系列上进一步扩展到 FLOAT8/HIFLOAT8/FLOAT4/MX 等低比特浮点格式并支持 G-B、B-B、T-CG、MX 等新型量化模式。使用时的关键在于先根据产品系列与 x1/x2 数据类型确定量化模式再按量化模式表核对 x1Scale/x2Scale/x2Offset/bias/yScale 的 dtype 与 shape、按约束表核对对齐要求最后正确编码 groupSize 并通过两段式接口完成调用。仓库中 README、aclnnQuantMatmulV5 接口文档 与 examples 目录共同构成了一份可直接落地的完整参考。【免费下载链接】ops-nn本项目是CANN提供的神经网络类计算算子库实现网络在NPU上加速计算。项目地址: https://gitcode.com/cann/ops-nn创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关推荐

3个致命坑解决配置卡死:精品国产自在现线拍保姆级教程
3个致命坑解决配置卡死:精品国产自在现线拍保姆级教程

3个致命坑解决配置卡死:精品国产自在现线拍保姆级教程 配置环境就卡半天,是不是你的日常?别急着骂系统,十有八九是你在【精品国产自在现线拍】这类底层资源调度或数据流转模块里踩了经典的并发陷阱。很多新人以为这是网络问题,反复重启服务器,结果越搞… · 2026/9/23 12:21:27

基于Spark和Python的智能图书推荐系统实践
基于Spark和Python的智能图书推荐系统实践

1. 项目概述作为一名长期从事大数据系统开发的工程师,我最近完成了一个基于Python和Spark的智能图书推荐系统。这个项目融合了大数据处理、机器学习算法和Web开发三大技术领域,是一个典型的数据驱动型应用。系统采用Django作为后端框架,Vue.j… · 2026/9/23 12:21:27

零基础快速上手产品原型设计:摹客RP实操指南
零基础快速上手产品原型设计:摹客RP实操指南

当时我接到人生第一个原型设计任务的时候,脑子里只有一句话:"摹客RP?产品原型设计?我连这工具叫什么都是刚听说的。"没有任何经验,没有任何人带,项目排期已经写在白板上,三天后要给领… · 2026/9/23 12:21:19

勍怎么读:从生僻字到实战项目的破局指南
勍怎么读:从生僻字到实战项目的破局指南

勍怎么读:从生僻字到实战项目的破局指南 学会语法却不知怎么搭项目,这是无数开发者卡脖子最狠的地方。你背下了Python的 def ,记住了Java的 class… · 2026/9/23 13:03:01

3个坑解决微信密友版性能问题附完整示例
3个坑解决微信密友版性能问题附完整示例

3个坑解决微信密友版性能问题附完整示例 官方文档翻了三遍还是觉得云里雾里?别慌,微信密友版这种涉及隐私与实时性平衡的复杂机制,光看文字描述确实容易抓不住重点。很多开发者卡在“消息加密”和“好友列表隔离”这两个点上,导致面试时答非所问。今天这… · 2026/9/23 13:03:01

ceph-clsinfo 详解:Ceph RADOS 对象类(objclass)的名称、版本与架构信息查看工具
ceph-clsinfo 详解:Ceph RADOS 对象类(objclass)的名称、版本与架构信息查看工具

存储分布式文件系统对象存储后端高可用 【免费下载链接】ceph Ceph is a distributed object, block, and file storage platform 项目地址: https://gitcode.com/gh_mirrors/ce/ceph 点击查看 免费下载 导读 ceph-clsinfo 是 Ceph 发行版自带的命令行小工具&… · 2026/9/23 13:02:54

刘銮雄:一文搞懂注册土木工程师结构专业考试核心
刘銮雄:一文搞懂注册土木工程师结构专业考试核心

刘銮雄:一文搞懂注册土木工程师结构专业考试核心 配置环境就卡半天?别急,很多刚入行准备考注册土木工程师(结构专业)的朋友,一看到那些厚重的规范条文和复杂的力学模型,脑子瞬间就宕机了。网上资料满天飞,但真正能带你从底层逻辑看透“刘銮雄”这位行… · 2026/9/23 13:02:54

5个必坑点解析图片如何去水印避坑指南
5个必坑点解析图片如何去水印避坑指南

5个必坑点解析图片如何去水印避坑指南 报错一堆看不懂 StackTrace?别急着骂娘,先看看是不是踩了这三个雷区。 很多新手在实现 图片如何去水印 功能时,一运行就抛出 IndexOutOfBoundsException 或者… · 2026/9/23 13:02:48

从零开始,用 MCP 打造真正“会思考”的 RAG 智能体 —— 实战指南 + 源码解析(TaoToken 统一 Key 接入篇)
从零开始,用 MCP 打造真正“会思考”的 RAG 智能体 —— 实战指南 + 源码解析(TaoToken 统一 Key 接入篇)

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/23 13:02:48

3招搞定手机怎么下载微信面试难题实战项目解析
3招搞定手机怎么下载微信面试难题实战项目解析

3招搞定手机怎么下载微信面试难题实战项目解析 面试被问“手机怎么下载微信”背后的原理,90%的人答不上来。别笑,这看似弱智的问题,实则是考察你对移动应用分发机制、安全校验及网络协议理解的试金石。我带过不少校招新人,他们背了八股文,却连一个A… · 2026/9/23 0:00:03

你有新短消息请注意查收:3个新手避坑指南搞定消息系统选型
你有新短消息请注意查收:3个新手避坑指南搞定消息系统选型

你有新短消息请注意查收:3个新手避坑指南搞定消息系统选型 面试被问“高并发下如何保证消息不丢失”,你张口就是“用Redis”,结果面试官追问“如果Redis宕机了怎么办”,你瞬间卡壳。这种场景太常见了,很多新手在背八股文时,只记住了技术名词… · 2026/9/23 0:00:29

Win7无线热点配置工具源码解析:解决API失效的3个实战技巧
Win7无线热点配置工具源码解析:解决API失效的3个实战技巧

Win7无线热点配置工具源码解析:解决API失效的3个实战技巧 Win7无线热点配置工具在Win10/11上跑不动?不是你的问题,是版本升级后 API 全变了。很多老项目里的 netsh wlan… · 2026/9/23 0:00:36

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码