
人工智能大模型模型推理服务AscendCANN【免费下载链接】vllm-ascendCommunity maintained hardware plugin for vLLM on Huawei Ascend项目地址https://gitcode.com/gh_mirrors/vl/vllm-ascend点击查看免费下载GroupedMatmulSituQuant 是 vLLM-Ascend 为Ascend 950A5arch35平台引入的融合自定义算子它将npu_grouped_matmul situ_mx_quant这一串行算子链合并为一次 kernel 启动single launch在 MoEMixture of Experts推理场景中把「分组矩阵乘法MXFP8 激活 × MXFP4 专家权重、SiTU 激活、动态 MX 量化」三段计算一体完成。本文以 csrc/moe/grouped_matmul_situ_quant/README.md 为主线结合算子定义、Host Tiling、设备 Kernel、Torch 适配层与端到端测试源码完整讲解该算子的接口契约、四形态权重分发、图捕获执行机制与数值精度实现。读完本文你将掌握该算子在 A5 上的调用方式、参数语义、shape 约束以及其背后的融合设计思路。一、为什么需要单次启动的融合算子在常规的 MoE 前向链路中Kimi 等 W4A84-bit 权重、8-bit 激活模型的一层 FFN 通常被拆成多段执行npu_grouped_matmul把当前 batch 的 token 按路由结果分组分别与各专家的低比特权重做矩阵乘得到 BF16 中间结果situ_mx_quant对中间结果施加 SiTU 激活beta * tanh(gate/beta) * sigmoid(gate) * up再做动态 MX 量化输出 FP8-E4M3 数据与 E8M0 的 MX scale。两次 kernel 启动意味着两次设备访存、两段调度开销以及中间 BF16 结果的额外写读。GroupedMatmulSituQuant 的目标就是把这条拆分链split chain熔成一个 launch设备侧直接消费 MXFP8 激活与 MXFP4 专家权重完成分组矩阵乘后在 epilogue 阶段立即计算 SiTU 激活并动态量化最终只产出outputFP8与outputScaleE8M0两个输出张量。从源码看该算子是从 PR #15871 引入且仅面向 Ascend 950arch35设计是 A5 专属的 MX 数据通路实现。二、算子接口输入、输出与核心约束2.1 输入输出一览官方接口文档 docs/aclnnGroupedMatmulSituQuant.md 定义了如下张量契约名称方向数据类型说明x输入float8_e4m3fn量化后的激活形状[M, K]xScale输入float8_e8m0fnux的 MX scaleweight输入float4_e2m1fn_x2专家权重可为 ND、FRACTAL_NZ 或 TensorList 形式weightScale输入float8_e8m0fnu专家权重的 MX scalegroupList输入int64每个专家的 token 分组信息output输出float8_e4m3fn量化后的 SiTU 输出outputScale输出float8_e8m0fnuoutput的动态 MX scale2.2 官方约束条件groupListType仅支持0cumulative累加式与1count计数式linearBeta必须为正数才能走融合路径只实现 MX A8W4 组合bias与smoothScale有意不支持K以及输出宽度的一半N/2必须是 64 的倍数唯一支持平台Ascend 950。2.3 算子定义层的形状与数据类型契约在算子定义 op_host/grouped_matmul_situ_quant_def.cpp 中可以确认上述约束的落地细节x、x_scale、group_list为必填REQUIREDND 格式输入weight与weight_scale为动态DYNAMIC输入其中权重格式被固定为FORMAT_FRACTAL_NZ_C0_16对应 K3 A5 MXFP4 的 C016 布局并通过IgnoreContiguous()接受非连续张量——这是因为权重以 NZ 存储的转置视图到达loader 先做npu_format_cast(...).transpose(1, 2)NZ 张量无法强制 contiguous而 kernel 本身通过格式元数据读取它们两个属性group_list_type默认 0与beta、linear_beta默认 1.0均为可选AICore 配置注册在ascend950平台开启动态编译静态化DynamicCompileStaticFlag与动态形状支持DynamicShapeSupportFlag。InferShape 实现 op_host/grouped_matmul_situ_quant_infershape.cpp 给出了输出形状的精确规则设n packedWeightElements / ((isTensorList ? 1 : E) * (K/2))n2 n/2则输出为y (M, n2)、yScale (M, ceil(n2/64), 2)。这里yScale的第三维固定为 2正是 gate/up 两半输出的 scale 拼接结构。三、Host Tiling形状校验、块切分与参数解码Host 侧 Tiling 实现在 op_host/grouped_matmul_situ_quant_tiling.cpp它负责把运行时形状与属性编码进 64 字节的 tiling 头结构体定义见 op_kernel/grouped_matmul_situ_quant_tiling.h。3.1 形状校验链Tiling 入口按以下顺序做硬性校验任何一项失败都返回GRAPH_FAILEDx必须为二维[M, K]groupList必须为一维权重维数至少为 1K 0且K % 64 0MX scale 配对要求从权重打包元素数反推NN packedWeightElements / (E * (K/2))TensorList 形式时按groupList长度取 EN 0、N % 2 0且n2 N/2必须是MAIN_BLOCK_N2 64的倍数属性校验groupListType ∈ {0, 1}beta ! 0linearBeta ! 0。3.2 Tiling 头关键字段struct SituTilingHeader { uint32_t coreNum; // 使用 AIC 核心总数GetCoreNumAic uint32_t activeCount; // 专家数 E设备入口语义 uint32_t kSize; // K uint32_t nSize; // N uint32_t baseM; // 固定 128命中 kbL1Size512 快路径 uint32_t mainBlockSize; // 主块 N2 宽度64 或 128见下文 uint32_t firstTailBlockSize; // 预留当前为 0 uint32_t reserved; // 低 1 bit groupListTypebit1 TensorList 标志 uint64_t mainBlockCount; uint64_t firstTailBlockCount; float beta, invBeta, linearBeta, invLinearBeta; };其中beta与linearBeta在 Tiling 阶段即预计算好各自的倒数设备端 epilogue 直接用乘法代替除法。3.3 N/K 联合 tilenk_tile策略Tiling 代码中值得注意的优化当n2 % 128 0时mainBlockSize取 128宽块设备侧nL1Size mainBlockSize * 2 256配合kbL1Size自动落到 256B 单槽nL1Align × kbL1 256×256的 FP8 数据恰为 64KB与基线128×512的容量相同。若n2不被 128 整除则回退到基线块宽 64保证合法 shape 全覆盖详见 tiling 源码中关于 nk_tile 的注释。四、Torch 适配层V2 对齐的双入口与四种权重形态该算子的对外调用不是直接暴露 aclnn 接口而是通过 grouped_matmul_situ_quant_torch_adpt.h 注册到torch.ops._C_ascend注册入口位于 csrc/torch_binding.cpp图/编译期的 Meta 实现在 csrc/torch_binding_meta.cpp。4.1 镜像官方 V2 API 的四个入口该适配层刻意对齐官方aclnnGroupedMatmulSwigluQuantWeightNzV2的调用习惯提供**两个名字 × 两种重载stacked /.list**共四个入口共享同一份 Host Tiling 与同一个设备 kerneltorch.ops._C_ascend.grouped_matmul_situ_quant(x, weight(ND), weightScale, weightAssistMatrix?, bias?, xScale, smoothScale?, groupList, dequantMode, dequantDtype, quantMode, groupListType, tuningConfigOptional?, beta, linearBeta) - (output, outputScale) torch.ops._C_ascend.grouped_matmul_situ_quant_weight_nz(...) # NZ 权重 # 两者各自的 .list 重载接受 per-expert TensorList4.2 权重分发四形态源码 §3.2ND stacked(E, N, K/2)FP4x2 打包连续张量。入口层通过生产级 aclnn 格式转换npu_format_cast目标 id 29见CastNdToNz转成 NZ 字节流后喂给 kernelNZ stackedformat-29 存储FRACTAL_NZ_C0_16或FRACTAL_NZ标签可以是(E,N,K/2)、转置视图(E,K/2,N)或规范 5D[E,K/32,N/16,16,32]。kernel 按字节直读、零转换这是融合 kernel 的原生形态ND list每次调用将 per-expert 张量拼接CatTensorList单次at::cat设备算子再统一转 NZNZ list作为 ACL 动态输入传入kernel 通过地址表直接解引用各专家张量无 cast、无 cat。4.3 参数行为矩阵源码 §3.3bias/smoothScale传None或空张量即跳过传入真实值会触发TORCH_CHECK显式报错——宁可报错也绝不静默给出错误结果weightAssistMatrix接收但忽略仅打印一次提示因为 vendoredvf_nz寻址路径不消费 NZ assist matrixtuningConfigOptional接收但忽略算子使用自己的 Tiling 策略baseM128模式枚举只接受一组组合dequantMode1MX 联合 datascale 反量化、dequantDtype0BF16 中间 GEMM 结果、quantMode1动态 MX 量化FP8-E4M3 输出 E8M0 scale其他取值一律报错groupList设备侧 int64(E,)张量type0 为累加和、type1 为计数由 kernel 内部 preamble 解码图安全。4.4 输出形状与空 token 保护输出张量由入口层直接分配y (M_cap, N/2)FP8-E4M3yScale (M_cap, ceil(N/2/64), 2)E8M0与 golden 拆分链形状完全一致。另外代码显式处理了EP 秩可以合法地收到零路由 token的情况当M_cap 0时直接返回空输出不启动 kernel但元数据校验仍然执行RunV2Core中的空分支。五、设备 Kernel图捕获友好的静态网格与内核内剪枝设备侧入口 op_kernel/grouped_matmul_situ_quant.cpp 非常简洁它只负责注册 tiling 结构REGISTER_TILING_DEFAULT真正的逻辑全部在GmmSituControllerop_kernel/gmsq_vcv_controller.h中。5.1 设备 group_list 与内核内 preamble与 eager 入口Host 在 tiling blob 中预剪枝零 token 组的 X14 活跃表不同图捕获入口要求group_list 保持为设备张量由 kernel 内部的 preamble 段per-core 对 E≤32 个条目做 running cumsum构建等价的分组表——刻意不做独立的 cumsum 设备 kernel从而守住「融合 launch」的契约红线。每条专家按形状推导静态 stridedevPerGroupW_、devKScaleRow_等不依赖 group_list 内容。5.2 静态网格与重放语义网格 全量 AIC 核心数启动配置对捕获图的每次重放完全一致不依赖 Host 端活跃专家表无基本块的 core 在 preamble 之后直接退出约 1%~3% 的低活跃度成本桶重放语义kernel 每次 launch 都重新读取 group_list 设备缓冲因此路由器输出被就地更新后图的每次重放都能感知新路由不存在冻结的 Host 副本。这正好解释了端到端测试的用例设计测试用NPUGraph捕获一次融合调用后反复修改groups张量的内容并graph.replay()验证跨小 M 边界与双角色边界的路由变化详见第六节。5.3 SplitNByMultiCore 与块切分ProcessGroup对每个专家组按baseM128切分 M 方向再经SplitNByMultiCore把 gate/up 两半输出按核心轮转分配其中nL1Size basicBlockSize * 2覆盖两半nOffset语义为前 N/2gate输出列偏移。宽块nL1Size 128且mL1Size 64时按每子块 64 个 gate 列拆分为连续 128 宽子块kbL1Size依据生产动态规则小 M 窄 N 走 512 深度否则 256逐子块重算。5.4 双角色dual-role模式的条件化启用控制器按「每 L1 块 M 行数」maxL1M条件化启用供数专核 epilogue 专核的双角色拆分阈值 34 依据 M 分布间隙maxL1M ∈ [33,35]观测中点选定且额外要求maxL1M × maxNL1Size ≤ 1638464KB relay 窗 / 4B否则整体回退到交错路径。该判断由 tiling 头与组表内容在三个核AIC/AIV sub0/AIV sub1上独立推导结果一致、全程恒定无需额外同步。六、SiTU 激活与 MX 量化 Epilogue 的数值实现epilogue 实现在 op_kernel/situ_epilogue.h其文件头明确标注这是对生产级situ_mx_quantarch35 regbase 实现的逐字verbatim改编源自 csrc/moe/situ_mx_quant要求与生产 kernel位级一致bit-exact因此禁止改动指令顺序。6.1 SiTU 激活的数学形态核心公式ComputeVfSitusitu(gate, up) beta * tanh(gate / beta) * sigmoid(gate) * up 可选up 再施加 linear_beta * tanh(up / linear_beta)实现细节值得注意tanh采用双路径|x| 0.6走 9 次多项式 FMA Horner系数c1..c4与参考 tanh.h 完全一致|x| 0.6走 sigmoid 分解2/(1exp(-2x)) - 1符号天然保持所有运算在 FP32 域完成最终CastBF16输出保证与生产 kernel 的舍入行为一致有符号性边界处理MAX_EXP_FOR_BF16、FP8_E4M3FN_MAX/MIN_VALUE ±448.0等常量被用于量化前 clamp有序比较不改变上游 NaN。6.2 动态 MX 量化三步走量化辅助函数改编自swiglu_mx_quant_common.h的 BF16-only 路径ComputeVfMaxExpVfLast按 32 元素块提取 BF16 指数并求块内最大值ComputeScaleLast按 OCP 算法由最大指数计算 E8M0 scale 及其倒数含 NaN/零/特殊指数掩码处理ComputeDataF8Last数据乘以倒数 scaleclamp 到 E4M3FN 有限域后CastFP8通过寄存器布局交错CAST_32_TO_80/81/82/83与字节加法完成打包输出。七、构建、调用与 MoE 量化方法的自动融合7.1 构建与打包kernel 随vllm_ascend_C一起构建vLLM-Ascend 在SOC_VERSIONascend950*环境下正常安装即可打包进算子库无需额外编译步骤。平台注册见 op_host/grouped_matmul_situ_quant_def.cpp 中AICore().AddConfig(ascend950, ...)。7.2 调用入口A5 上现有的DeviceOperator.npu_grouped_matmul_situ_quant入口调用torch.ops._C_ascend.grouped_matmul_situ_quant_weight_nzTensorList 分发使用.list后缀ND 条目保留参考名。一个最小 NZ-list 调用示意与测试用例同形torch.ops._C_ascend.grouped_matmul_situ_quant_weight_nz.list( x, # (M_cap, K) fp8_e4m3fn weights, # per-expert FRACTAL_NZ FP4 权重列表 scales, # per-expert E8M0 weightScale 列表 None, # weightAssistMatrix忽略 None, # bias不支持 x_scale, # (M_cap, K/32) fp8_e8m0fnu None, # smoothScale不支持 groups, # (E,) int64 设备张量 dequant_mode1, # MX 反量化 dequant_dtype0, # BF16 中间结果 quant_mode1, # 动态 MX 量化 group_list_type0, # 0cumsum / 1counts tuning_configNone, beta4.0, linear_beta25.0, )7.3 W4A8 MoE 方法的自动选择W4A8 MXFP MoE 量化方法在满足以下条件时会自动选择融合路径SiTU 激活、group size 32、group-list 类型 0cumulative或 1counts、linear_beta为正。此时 W13 以原生 FP4 元数据加载scale 使用 E8M0 元数据与 N-major 视图不复制存储W2 与既有 GMM2 路径保持不变。八、端到端验证小专家数 图捕获下的动态路由Ascend 950 的端到端用例位于 tests/e2e/nightly/single_node/ops/singlecard_ops/test_gmm_situ_small_experts.py它同时验证了两件关键能力与 golden 拆分链的位级一致性测试构造参考实现npu_grouped_matmul(...)situ_mx_quant(...)用torch.testing.assert_close(..., rtol0, atol0)断言融合结果与其逐字节相等图捕获下的动态路由正确性在torch.npu.NPUGraph()中捕获一次融合调用后用 6 组路由模式均衡、仅 8 个专家活跃、单专家独享、全量路由到单专家等反复set_groups(...)并graph.replay()每次重放后仍与 reference 严格一致——这直接验证了「设备 group_list 内核内 preamble 静态网格」机制对路由变化的响应能力。测试还参数化覆盖了experts ∈ {14, 15}与group_list_type ∈ {0, 1}并在非 Ascend950 设备上自动 skip进一步印证了该算子「仅 A5 支持」的约束。九、设计要点速查融合边界一次 launch 完成「MXFP8×MXFP4 分组矩阵乘 → SiTU → 动态 MX 量化」消除中间 BF16 结果的写读图捕获友好group_list 设备常驻、静态满核网格、内核内 preamble 建表重放时自动感知路由变化数值位级一致epilogue 逐字复用生产situ_mx_quant实现禁止优化指令顺序显式拒绝而非静默错误不支持的bias/smoothScale/模式枚举直接TORCH_CHECK报错shape 契约K % 64 0、N % 2 0、N/2 % 64 0输出y(M, N/2)、yScale(M, ceil(N/2/64), 2)。十、继续深入阅读算子总览csrc/moe/grouped_matmul_situ_quant/README.mdaclnn 接口规格csrc/moe/grouped_matmul_situ_quant/docs/aclnnGroupedMatmulSituQuant.md算子定义与 InferShapeop_host/grouped_matmul_situ_quant_def.cpp、op_host/grouped_matmul_situ_quant_infershape.cppHost Tilingop_host/grouped_matmul_situ_quant_tiling.cpp设备 Kernelop_kernel/grouped_matmul_situ_quant.cpp、op_kernel/gmsq_vcv_controller.hSiTU/MXQuant epilogueop_kernel/situ_epilogue.hTorch 适配与注册grouped_matmul_situ_quant_torch_adpt.h、csrc/torch_binding.cpp、csrc/torch_binding_meta.cpp端到端测试tests/e2e/nightly/single_node/ops/singlecard_ops/test_gmm_situ_small_experts.py赞分享人工智能大模型模型推理服务AscendCANN【免费下载链接】vllm-ascendCommunity maintained hardware plugin for vLLM on Huawei Ascend项目地址https://gitcode.com/gh_mirrors/vl/vllm-ascend点击查看免费下载相关推荐终极免费电子签名解决方案如何在3分钟内搭建专业数字签名平台终极免费电子签名解决方案如何在3分钟内搭建专业数字签名平台 DocuSeal是一款功能强大的开源电子签名平台为企业和个人提供安全高效的文档签署体验。作为Do算子库人工智能大模型深度学习CANNAscendCANN ops-nn QuantMatmulActivationQuant 算子深度解析融合量化矩阵乘、GELU 激活与 MX 动态量化CANN ops nn QuantMatmulActivationQuant 算子深度解析融合量化矩阵乘、GELU 激活与 MX 动态量化 本指南围绕 CAN人工智能算子库深度学习CANNAscendCANN ops-nn 算子详解aclnnQuantMatmulActivationQuantWeightNz 融合量化矩阵乘GELU 激活 动态 MX 量化NZ 权重CANN ops nn 算子详解aclnnQuantMatmulActivationQuantWeightNz 融合量化矩阵乘GELU 激活 动态 MX人工智能算子库深度学习CANNAscend上一篇ReplaceItems.jsxIllustrator图形批量替换终极指南下一篇3分钟免费汉化Axure告别英文界面拥抱高效中文设计体验创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考