已合并
fix(swiglu_mx_quant): 修复检视意见 + 新增标杆和aclnn文档 #9292
fix(swiglu_mx_quant): 修复检视意见 + 新增标杆和aclnn文档 #9292
已合并
caorenlei创建于 12 天前
caorenlei成员
12 天前

描述

本次改动针对 swiglu_mx_quant 算子(arch35 平台)修复检视意见,并新增标杆实现与 aclnn 接口文档。

改动原因

  1. tiling 代码中参数校验使用 OP_LOGE 打印错误日志,未使用结构化的 OP_LOGE_FOR_INVALID_VALUE_WITH_REASON,无法准确标识出错的参数名和校验原因。
  2. swigluMode 2/3 的 axis 校验位于通用 axis 校验之前,逻辑顺序不合理。
  3. aclnn 文档缺少 swigluMode 23 的计算公式、参数约束及错误码说明。
  4. 缺少 TTK 标杆 golden 文件,无法进行精度验证。

改动方法

  1. tiling 代码修复swiglu_mx_quant_tiling_arch35.cpp):

    • 新增 #include "error_util.h"
    • swigluModeclamp_limitaxis 三处参数校验的错误日志从 OP_LOGE 改为 OP_LOGE_FOR_INVALID_VALUE_WITH_REASON,明确标识参数名和校验原因
    • swigluMode 2/3 的 axis 校验从通用 axis 校验之前移到之后,先执行通用校验(axis 必须为 -1 或 -2),再执行模式特定校验(mode 2/3 要求 axis=-1)
  2. aclnn 文档补充aclnnSwigluMxQuant.md):

    • 新增 swigluMode 2 计算公式:前后分半 + clamp + sigmoid(alpha) 激活 + bias
    • 新增 swigluMode 3 计算公式:前后分半 + sigmoid(alpha=1) + clamp,无 bias
    • swigluMode 取值范围从 [0, 1] 更新为 [0, 3],补充 mode 2/3 说明
    • 新增约束:swigluMode 2/3 要求 axis=-1;activateDim 非 last 轴时 swigluMode 从仅支持 0 改为支持 0 或 1
    • 错误信息表中新增"swigluMode 为 2 或 3 时 axis 不为 -1"
  3. 标杆新增tests/assets/golden.py):

    • 新增 TTK custom golden 参考实现,覆盖 swiglu_mode 0/1/2/3 全部模式
    • 支持 FP4_E2M1、FP4_E1M2、FP8_E4M3FN、FP8_E5M2 等输出数据类型
    • 实现 SwiGLU + DynamicMxQuant 融合算子的完整计算逻辑

关联的Issue

#5268

测试

  • 使用 TTK 仿真验证各 swiglu_mode(0/1/2/3)的精度,对比新增 golden.py 标杆
  • 验证 arch35 平台参数校验日志输出格式正确
  • 验证 aclnn 文档公式与 kernel 实现一致

文档更新

  • 更新 quant/swiglu_mx_quant/docs/aclnnSwigluMxQuant.md:新增 swigluMode 2/3 计算公式、参数约束、错误码

类型标签

AI/Agent生成声明

likedislike
Pull Request已成功合入, 合并人@CANN-robot
(感谢 caorenlei 的贡献)
Ccaorenlei成员
12 天前 创建了 pull request,commit 6d2fe824
atomgit-bot
atomgit-bot
12 天前 评论:

变更摘要

该 PR 针对 swiglu_mx_quant 算子修复检视意见并补充测试资产:在 arch35 的 swiglu_mx_quant_tiling_arch35.cpp 中统一 ParseAttrs() 的非法入参报错方式并调整 axis 校验位置,同时新增 TTK 测试标杆脚本 golden.py 作为算子融合逻辑(SwiGLU + DynamicMxQuant)的参考实现,另外按标题所述还补充了对应的 aclnn 文档。

主要改动

  • 入参校验报错方式统一: 在 ParseAttrs() 中引入 error_util.h,将 swigluModeclampLimit 的非法值检查由 OP_LOGE 改为 OP_LOGE_FOR_INVALID_VALUE_WITH_REASON,报错信息带上属性名和具体取值,便于定位非法入参。
  • axis 校验逻辑调整: 将"swiglu_mode 为 2/3 时 axis 必须为 -1"的检查从读取 axis 属性处移除,改放到 axis 必须为 -1 或 -2 的通用校验之后执行,并同步更新错误提示文案。
  • 新增 TTK 标杆实现 golden.py: 新增 __golden_swiglu_mx_quant 及辅助函数 _swiglu_mx_quantize,实现 mode 0~3 的 SwiGLU 激活语义(含 clamp、sigmoid、bias)与基于 block_size=32 的 Dynamic MX 量化(支持 FP4/FP8 各 dst_type,以及可选的 group_index 分组量化),作为算子输出的参考基准。
likedislike
不准确?
atomgit-bot
atomgit-bot
12 天前 评论:

代码审查

我已完成对两个变更文件的审查。

关闭总结

变更文件审查结果:

  1. quant/swiglu_mx_quant/op_host/arch35/swiglu_mx_quant_tiling_arch35.cpp — 无问题。

    • #include "error_util.h"OP_LOGE_FOR_INVALID_VALUE_WITH_REASON 的 4 参用法与同仓库 dynamic_mx_quant_tiling_arch35.cpp 中已验证过的用法一致,无编译/宏签名风险;
    • 将 mode 2/3 的 axis 校验从轴归一化之前移到之后,属于有意修复:正索引表示末轴(如 3D 输入 axis=2)现在能正确归一化为 -1 并通过校验,而 axis=-2/非末轴仍被拒绝,与旧行为不冲突、无回归。
  2. quant/swiglu_mx_quant/tests/assets/golden.py — 4 个问题:

    • P1(置信 0.8):_mx_quantize 的 mxscale 组装(206-211 行)对 2D 输入抛 IndexError、对 3D 末轴输入(UT 形状 (4,256,4096))抛 ValueError,golden 在文档默认配置(axis=-1)下必然崩溃;
    • P2(置信 0.55):量化值未饱和到目标 dtype 最大有限值,默认 FP4 E2M1(max 6.0 < clamp_limit 7.0)场景 astype 溢出为 inf,nan_to_num 不清除,参考输出失效;
    • P3(置信 0.4):负 shared_exp 被钳位为 0,禁用 MX 规范的小幅度 block 放大,可能与 kernel 不一致;
    • P3(置信 0.7):output_dtypespass 分支为死代码,建议删除。

总体风险评估: C++ 侧改动安全且方向正确;风险集中在新增的 Python 标杆文件,其中 P1 问题使该 golden 在算子最常用配置下无法运行,属于交付功能缺陷,需修复后再启用 TTK 对比;P2 问题会在大幅值场景产生错误的参考值,建议一并修复。

类型 数量
🔴 阻塞 1
🟡 建议 1

⛔ 需要修改

likedislike
不准确?
CANN-robotCANN-robot成员
12 天前 添加了label:cann-cla/yes
CANN-robot
CANN-robot成员
12 天前 评论:

Thanks for your pull-request.
The full list of commands accepted by me can be found at here.
You can get sig-info at here.
You can self-configure the PR merge rules for this repository. For more details, please refer to Here.
For more, you also can visit HICANN.


PR Approval Progress

Congratulations! All modules have met the lgtm and approve requirements.

Module Approval Details

module lgtm status approve status
*/*/docs/acl*.md 陈娇, 汤平川 (2/2) 陈娇 (1/1)
quant 陈风, 汤平川 (2/2) 陈风, 汤平川 (2/1)

💡 Tip:

  • Committer can comment /approve or /lgtm
  • Commenting /approve implies both code review (lgtm) and intent to merge (approve)

CLA Signature Pass

caorenlei, thanks for your pull request. All authors of the commits have signed the CLA. 👍

likedislike
CANN-robotCANN-robot成员
12 天前 将zengjuan,sxb154714,chenfeng61,chaotang233,crystalhu,yangyang016,fanqirui,gitee-duhuiping,su-yueming,zhajianqing123,chenqi317,LinPX,wang-xing001,liubo75,tangweiwei2,wangzitao_leo,xubinglin,gitcode-chenjiao,liujie12345678,pingchuantang,Chen_HaoWen,qianzehong,fengying555682,liuyang_806,caiwenwen,yanglu-1设为评审人
CANN-robotCANN-robot成员
12 天前 将sxb154714,chenfeng61,gitee-duhuiping,su-yueming,zhajianqing123,LinPX,wang-xing001,wangzitao_leo,xubinglin,gitcode-chenjiao,liujie12345678,pingchuantang,Chen_HaoWen,qianzehong,fengying555682,liuyang_806,caiwenwen,yanglu-1设为审查人
atomgit-bot
atomgit-bot12 天前进行代码检视1
quant/swiglu_mx_quant/tests/assets/golden.py
@@ -0,0 +208,4 @@
208+ scale_out[:, :, 1, 0] = scale_flat[:, :, 0]
209+ else:
210+ for i in range(2):
211+ scale_out[:, :, :, i] = scale_flat[:, :, :]
atomgit-bot
atomgit-bot12 天前评论:

🟠 High Priority

changed line: golden.py 新增的 _mx_quantizescale_out 组装逻辑(206-211 行)。

受影响行为/契约:scale_flat 始终是扁平的三维 (pre_q, n_blocks, post_q),而 scale_out 的形状是 shapeaxis_pos 维替换为 n_blocks 后再 append(2),即 ndim+1 维;两者维数/形状根本没有对齐,赋值语句却按固定维数写死。

失败模式:

即该 golden 在算子最常用配置(axis=-1,rank 2/3,以及 group_index 分组路径 280-295 行同样调用本函数)下必然崩溃,无法生成参考输出,新增标杆完全不可用。

建议:将 scale_flat 先 reshape 回原始维度(axis_pos 处为 n_blocks)再写入 scale_out 的最后一个维度(两个槽位写同一份 scale),替换整个 if/else 分支。

likedislike
不准确?
atomgit-bot
atomgit-bot12 天前进行代码检视1
quant/swiglu_mx_quant/tests/assets/golden.py
@@ -0,0 +208,4 @@
208+ scale_out[:, :, 1, 0] = scale_flat[:, :, 0]
209+ else:
210+ for i in range(2):
211+ scale_out[:, :, :, i] = scale_flat[:, :, :]
atomgit-bot
atomgit-bot12 天前评论:

🟡 Medium Priority

变更行:golden.py 第 200-211 行(新增的 _mx_quantize 的 scale 输出构造部分)。

影响行为:scale_out 是按「未展开的完整 shape」构造的(第 201-204 行:scale_shape = list(shape)、把 axis 维替换为 n_blocks、再 append(2)),但写入时却按「已展开的 (pre_q, n_blocks, post_q, 2)」形状进行索引(第 207-211 行)。

失败模式(对默认/主路径 axis=-1 必然触发):

  • 即便不崩溃,第 207-208 行把同一份 scale 写入 block 下标 0 和 1 位置、并把 trailing 维下标 1 留为 0,语义上也与「每个 block 一个 scale」不符。

由于 axis=-1 是默认属性、且 mode 2/3 仅允许 axis=-1,该 golden 在主要测试路径上直接崩溃,无法产出参考输出。

建议:将 scale_flat 先 reshape 到 scale_shape[:-1] 再写入 scale_out 的两个 trailing 切片,统一处理 post_q==1 与 post_q>1 两种情况,避免按展开形状索引未展开数组。

likedislike
不准确?
caorenlei成员
11 天前 评论:

compile

likedislike
Ccaorenlei成员
11 天前 update merge request[project id: 7665709, iid: 9292, commit_id: 3c58d5a16c90b6012000da531fe05e0994812b40] virtual merging success
CANN-robotCANN-robot成员
11 天前 添加了label:ci-pipeline-running
CANN-robot
CANN-robot成员
11 天前 评论:

流水线任务触发成功
任务链接 [9e62de3ef0404e068a4c0ec24c3ea0bc][流水线指导]

任务名称状态日志下载链接
Compile_Ascend_X86_ubuntu24 ✅ SUCCESS >>>>> >>>>>
Compile_Ascend_X86_mobile_station ✅ SUCCESS >>>>> >>>>>
Compile_Ascend_ARM ✅ SUCCESS >>>>> >>>>>
Compile_Ascend_single ✅ SUCCESS >>>>> >>>>>
Compile_Ascend_experimental ✅ SUCCESS >>>>> >>>>>
Compile_Ascend_X86_950 ✅ SUCCESS >>>>> >>>>>
Compile_Ascend_ARM_950 ✅ SUCCESS >>>>> >>>>>
Compile_Pre ✅ SUCCESS >>>>>
pre_comment ✅ SUCCESS >>>>>
Compile_Ascend_X86 ✅ SUCCESS >>>>> >>>>>
Compile_Ascend_X86_mobile_station_ubuntu24 ✅ SUCCESS >>>>> >>>>>
Compile_Ascend_X86_950_ubuntu24 ✅ SUCCESS >>>>> >>>>>
Compile_Ascend_ARM_ubuntu24 ✅ SUCCESS >>>>> >>>>>
Compile_Ascend_single_ubuntu24 ✅ SUCCESS >>>>> >>>>>
Compile_Ascend_experimental_ubuntu24 ✅ SUCCESS >>>>> >>>>>
Compile_Ascend_ARM_950_ubuntu24 ✅ SUCCESS >>>>> >>>>>
Compile_X86_monitor_910b ✅ SUCCESS >>>>> >>>>>
Compile_X86_monitor_910c ✅ SUCCESS >>>>> >>>>>
Compile_X86_monitor_950 ✅ SUCCESS >>>>> >>>>>
Compile_classify ✅ SUCCESS >>>>>
Compile_Ascend_X86_mobile_station_9030_ubuntu24 ✅ SUCCESS >>>>> >>>>>
UT_Test_ophost ✅ SUCCESS
UT_Test_opapi ✅ SUCCESS
UT_Test_kernel ✅ SUCCESS
UT_Test_opgraph ✅ SUCCESS
PreSmoke_A900 ✅ SUCCESS >>>>>
API_Check ✅ SUCCESS >>>>>
PreSmoke_ATK_Test_A2 ✅ SUCCESS >>>>>
UT_Test_report_lcov ✅ SUCCESS >>>>>

[2026-08-27 20:12:37]    CI执行结束

likedislike
CANN-robot
CANN-robot成员
11 天前 评论:

流水线任务触发成功
任务链接 [451aafc2b2fd4f1cafc9645828aaab8e][流水线指导]

任务名称状态日志下载链接
antipoison ✅ SUCCESS >>>>>
codecheck_checkpr ✅ SUCCESS
codecheck_precommit ✅ SUCCESS >>>>>
SCA ✅ SUCCESS >>>>>
StaticCheck_md ⚠️ WARNING >>>>>

[2026-08-27 20:03:03]    CI执行结束

likedislike
CANN-robotCANN-robot成员
11 天前 添加了label:api-check-pass
CANN-robotCANN-robot成员
11 天前 删除了label:ci-pipeline-running
CANN-robotCANN-robot成员
11 天前 添加了label:ci-pipeline-passed
Ccaorenlei成员
10 天前 解决了最后一个问题
Ccaorenlei成员
10 天前 修改了pull request 的描述
Ccaorenlei成员
10 天前 修改了pull request 的描述
chenfeng
chenfeng成员
10 天前 评论:

/lgtm
/approve

likedislike
chenjiao成员
10 天前 评论:

/approve

likedislike
CANN-robotCANN-robot成员
10 天前 添加了label:approved
TangPC
TangPC成员
10 天前 评论:

/lgtm
/approve

likedislike
CANN-robotCANN-robot成员
10 天前 添加了label:lgtm
CANN-robotCANN-robot成员
10 天前 关闭了关联的issue
CANN-robotCANN-robot成员
10 天前 合入了pull request
CANN-robot
CANN-robot成员
10 天前 评论:

Pull Request 已合并或已关闭。

If you want to solve this problem, you can click here to do it in the FAQs.

likedislike