已合并
test: 更新deep_norm_grad等4个算子golden测试数据 #8582
test: 更新deep_norm_grad等4个算子golden测试数据 #8582
已合并
tianqiguang创建于 8月12日
tianqiguang成员
8月12日

描述

更新 4 个算子的 golden 测试数据。

算子 变化
deep_norm_grad +61 -4
apply_adam_w_quant +113 -28
dynamic_quant_update_scatter +3 -3
dynamic_quant_update_scatter_v2 +6 -2

类型标签

关联的Issue

  • #4730
likedislike
Pull Request已成功合入, 合并人@CANN-robot
(感谢 tianqiguang 的贡献)
Ttianqiguang成员
8月12日 创建了 pull request,commit 288123a4
atomgit-bot
atomgit-bot
8月12日 评论:

变更摘要

此 PR 主要更新了三个算子(deep_norm_grad、apply_adam_w_quant、dynamic_quant_update_scatter / dynamic_quant_update_scatter_v2)测试资产中的 golden 参考实现,使其适配新的测试框架接口(如额外的位置参数 *unused_outputs / *attr_values),同时调整了部分容差标准,并增强了 golden 函数对 PyTorch tensor 与 NumPy 混合输入场景的兼容性。

主要改动

  • deep_norm_grad golden 新增纯 Torch 参考实现:新增 _deep_norm_grad_torch_reference 函数,提供基于原生 PyTorch 运算的完整参考实现;_DeepNormGradCompose.__call__ 改为调用该实现以替代原先的 deep_norm_grad_aclnn_golden;同时 deep_norm_grad_input 和 deep_norm_grad_aclnn_golden 签名新增 *unused_outputs 以兼容新测试框架传入的额外输出参数。

  • apply_adam_w_quant golden 增强 tensor/numpy 互操作与属性传参:新增 _to_f32、_shape_of、_dtype_of、_cast_like 等辅助函数,统一处理 tensor 与 numpy 的转换;apply_adam_w_quant_golden 签名新增 *attr_values 以按位置接收超参(lr、beta1、beta2、weightDecay、eps、gnormScale、blockSize),并支持驼峰与下划线两种 key 名;customize_inputs 拆分为 tensor(in-place)和 numpy 两条路径;uint8 数据类型容差标准从 "binary_equal" 改为 "quant"。

  • dynamic_quant_update_scatter golden 容差与参数处理调整:int8 的 kernel 容差标准从 "quant" 改为 "binary_equal";_DynamicQuantUpdateScatterCompose.__call__ 中对 reduce 和 axis 的获取由 kwargs.get 改为 kwargs.pop,避免多余参数向下传递。

  • dynamic_quant_update_scatter_v2 golden 修复 int4 检测与输出类型:_to_supported_torch_tensor 中 int4 dtype 判断从精确匹配 "int4" 扩展为 "int4" in str(arr.dtype) or arr.dtype.kind == "V",兼容更多 dtype 表示形式;_DynamicQuantUpdateScatterV2Compose.__call__ 返回值中第一个输出保持为 NumPy 数组(np.asarray),其余输出仍通过 _to_supported_torch_tensor 转为 tensor。

likedislike
不准确?
atomgit-bot
atomgit-bot
8月12日 评论:

代码审查

现在我已经完整阅读了所有 4 个变更文件及其上下文。让我逐一总结每个文件的审查结果。


文件 1: norm/deep_norm_grad/tests/assets/golden.py

变更内容:

  • deep_norm_grad_input 和 deep_norm_grad_aclnn_golden 增加了 *unused_outputs 参数以吸收框架可能传入的额外输出张量
  • 新增 _deep_norm_grad_torch_reference 函数——纯 Torch 实现的金色参考
  • _DeepNormGradCompose.__call__ 从调用 deep_norm_grad_aclnn_golden(NumPy 路径)切换为调用 _deep_norm_grad_torch_reference(Torch 路径)

审查结论: 无问题。新函数 _deep_norm_grad_torch_reference 正确复刻了 deep_norm_grad_golden 的数学逻辑,使用了 Torch 原生算子(torch.sum、torch.where、torch.all),适合在 GPU 上运行。*unused_outputs 的加入是正确的兼容性改动,且 alpha/epsilon 在该签名中本来就有关键字参数的默认值,实际调用不受影响。kwargs.pop("alpha", self.alpha) 允许调用方覆盖 alpha 值,行为合理。


文件 2: optim/apply_adam_w_quant/tests/assets/golden.py

变更内容:

  • 新增 import ml_dtypes 以支持 bfloat16 的 NumPy 注册
  • uint8 的 tolerance standard 从 "binary_equal" 改为 "quant"(量化感知比较,更合理)
  • _to_f32 和 _to_numpy_for_golden 增加了对 Torch 张量和 bfloat16 的支持
  • 新增辅助函数 _shape_of、_dtype_of、_cast_like
  • apply_adam_w_quant_golden 签名增加 *attr_values,支持灵活的属性名称映射(驼峰/下划线兼容)
  • customize_inputs 重写为同时支持 Torch 和 NumPy 的就地修改路径

审查结论: 无问题。属性名映射通过 kwargs.setdefault 实现(关键词参数优先级高于位置参数),驼峰/下划线双兼容的 fallback 设计合理。customize_inputs 的就地修改方式与旧代码的重新赋值方式在 TTK 框架中行为等价。_cast_like 正确区分了 Torch/NumPy 两种输出类型。


文件 3: quant/dynamic_quant_update_scatter/tests/assets/golden.py

变更内容:

  • _KERNEL_TOLERANCE 中 int8 的 standard 从 "quant" 改为 "binary_equal"(精确逐位比对)
  • _DynamicQuantUpdateScatterCompose.__call__ 中 kwargs.get 改为 kwargs.pop,防止 reduce/axis 重复传入 golden 函数

审查结论: 无问题。kwargs.get → kwargs.pop 是正确的 bug 修复——旧代码在 **kwargs 中包含 reduce/axis 时会导致 TypeError: got multiple values for argument,因为 dynamic_quant_update_scatter_golden 已将这些作为显式参数。int8 tolerance 改为 binary_equal 是合理的(int8 量化输出应为逐位精确)。


文件 4: quant/dynamic_quant_update_scatter_v2/tests/assets/golden.py

变更内容:

  • _to_supported_torch_tensor 的 dtype 检测从 arr.dtype.name == "int4" 改为 "int4" in str(arr.dtype) or arr.dtype.kind == "V"(更健壮的 int4 检测)
  • _DynamicQuantUpdateScatterV2Compose.__call__ 的返回值从统一 _to_supported_torch_tensor 列表推导改为:第一个输出保持 np.asarray(int4),后两个用 _to_supported_torch_tensor 转为 Torch 张量

审查结论: 无问题。第一个输出(int4 打包的 var)保持为 NumPy 数组是合理的——int4 类型在 PyTorch 中没有良好支持,转为 int8 会丢失精度语义。"int4" in str(arr.dtype) 比 arr.dtype.name == "int4" 更健壮(兼容不同的 dtype 字符串表示),arr.dtype.kind == "V" 作为额外的防御性检查覆盖了自定义 void dtype 的情况。


关闭总结

优先级 数量
P0 0
P1 0
P2 0
P3 0

总体风险判断:低。 四个文件的变更均为金色引用文件的维护性更新,包含:

  1. 签名兼容性改动(*unused_outputs / *attr_values)以适配 TTK 框架的新参数传递方式;
  2. 更健壮的 dtype 处理和 Torch/NumPy 双路径支持;
  3. 一个 bug 修复(kwargs.get → kwargs.pop 防止重复参数错误);
  4. tolerance 策略调整。

所有变更逻辑一致,未发现正确性、安全性、可靠性或兼容性方面的问题。

类型 数量
🔴 阻塞 0
🟡 建议 2

💬 仅评论

likedislike
不准确?
CANN-robotCANN-robot成员
8月12日 添加了label:cann-cla/yes
CANN-robot
CANN-robot成员
8月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


PR Approval Progress

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

Module Approval Details

module lgtm status approve status
norm ✅ 汤平川, 王星 (2/2) ✅ 汤平川, 王星 (2/1)
optim ✅ 王星, 汤平川 (2/2) ✅ 汤平川, 王星 (2/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

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

likedislike
CANN-robotCANN-robot成员
8月12日 将zengjuan,sxb154714,chenfeng61,chaotang233,kevin_huang1234,crystalhu,yu-xinjie62,yangyang016,fanqirui,renruhai,su-yueming,zhajianqing123,chenqi317,LinPX,wang-xing001,liubo75,tangweiwei2,wangzitao_leo,xubinglin,liujie12345678,pingchuantang,Chen_HaoWen,liuyang_806设为评审人
CANN-robotCANN-robot成员
8月12日 将sxb154714,chenfeng61,kevin_huang1234,yu-xinjie62,renruhai,su-yueming,zhajianqing123,LinPX,wang-xing001,wangzitao_leo,xubinglin,liujie12345678,pingchuantang,Chen_HaoWen,liuyang_806设为审查人
tianqiguang成员
8月12日 评论:

compile

likedislike
Ttianqiguang成员
8月12日 预合并成功(commit_id: ab135a96ed2c1f41cf0a0e0f6115c54a2ed1ad51)
CANN-robotCANN-robot成员
8月12日 添加了label:ci-pipeline-running
CANN-robot
CANN-robot成员
8月12日 评论:

流水线任务触发成功
任务链接 [6396558c363b422daef52c1bf18daec6][流水线指导]

任务名称状态日志下载链接
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_harmony-infer-chs-nn ✅ SUCCESS
UT_Test_harmony-infer-chs-nn-1 ✅ SUCCESS
UT_Test_harmony-infer-cpro-nn ✅ SUCCESS
UT_Test_report_lcov ⚠️ WARNING >>>>>

[2026-08-12 09:34:47]    CI执行结束

likedislike
CANN-robot
CANN-robot成员
8月12日 评论:

流水线任务触发成功
任务链接 [2a019ba676b440df88b9679db936be2c][流水线指导]

任务名称状态日志下载链接
antipoison ✅ SUCCESS >>>>>
codecheck_checkpr ✅ SUCCESS
StaticCheck_codespell ✅ SUCCESS
StaticCheck_link_validity ✅ SUCCESS
StaticCheck_resource_existence ✅ SUCCESS
StaticCheck_tag_closed ✅ SUCCESS
StaticCheck_markdownlint ✅ SUCCESS
codecheck_precommit ✅ SUCCESS >>>>>
SCA ✅ SUCCESS >>>>>

[2026-08-12 09:20:34]    CI执行结束

likedislike
atomgit-bot
atomgit-bot8月12日进行代码检视1
quant/dynamic_quant_update_scatter_v2/tests/assets/golden.py
@@ -163,0 +160,4 @@
160+ np.asarray(outputs[0]),
161+ _to_supported_torch_tensor(outputs[1], device),
162+ _to_supported_torch_tensor(outputs[2], device),
163+ ]
atomgit-bot
atomgit-bot8月12日评论:

🟡 Medium Priority

changed line 159–163: _DynamicQuantUpdateScatterV2Compose.__call__ 的返回值从统一使用 _to_supported_torch_tensor(out, device) 改为对 outputs[0] 仅调用 np.asarray(outputs[0]),而 outputs[1] 和 outputs[2] 仍通过 _to_supported_torch_tensor 转为 torch tensor 并放到正确 device。

受影响行为/契约:third-party compose 负责将 CPU golden 结果转为与输入一致的 torch tensor(参考同仓库 _ApplyAdamWQuantCompose 和 _DynamicQuantUpdateScatterCompose 的实现模式)。旧代码对所有输出统一转换;新代码让 outputs[0](int4 var 数组)保留为 CPU numpy 数组,与 outputs[1]/outputs[2](torch tensor,可能在 GPU 上)类型不一致。

失败模式:如果测试对比框架遍历所有输出并统一做 .cpu().numpy() 或 .to(device) 操作,outputs[0](已是 numpy)会因缺少这些方法而报错;或者对比时因 device 不一致导致隐式传输失败。

同时,_to_supported_torch_tensor 在本 diff 中已修复为可正确识别 int4 类型("int4" in str(arr.dtype) or arr.dtype.kind == "V"),但 compose 中却绕过它处理 outputs[0],这看起来是遗漏。

建议:将 outputs[0] 也通过 _to_supported_torch_tensor 转换,保持三个输出类型和 device 一致。

改动建议
163
+ return [
164
+ _to_supported_torch_tensor(outputs[0], device),
165
+ _to_supported_torch_tensor(outputs[1], device),
166
+ _to_supported_torch_tensor(outputs[2], device),
163
167
  ]
应用建议
likedislike
不准确?
atomgit-bot
atomgit-bot8月12日进行代码检视1
optim/apply_adam_w_quant/tests/assets/golden.py
@@ -79,30 +121,30 @@
121+ )
122+ for name, value in zip(attr_names, attr_values):
123+ kwargs.setdefault(name, value)
124+ 
79125 lr = torch.tensor(float(kwargs.get("lr", 0.001)), dtype=torch.float32)
80126 beta1 = torch.tensor(float(kwargs.get("beta1", 0.9)), dtype=torch.float32)
81127 beta2 = torch.tensor(float(kwargs.get("beta2", 0.999)), dtype=torch.float32)
82128 weight_decay = torch.tensor(
83- float(kwargs.get("weight_decay", 1.0)), dtype=torch.float32
129+ float(kwargs.get("weight_decay", kwargs.get("weightDecay", 1.0))),
130+ dtype=torch.float32,
84131 )
85132 eps = torch.tensor(float(kwargs.get("eps", 1e-8)), dtype=torch.float32)
86133 gnorm_scale = torch.tensor(
87- float(kwargs.get("gnorm_scale", 1.0)), dtype=torch.float32
134+ float(kwargs.get("gnorm_scale", kwargs.get("gnormScale", 1.0))),
135+ dtype=torch.float32,
88136 )
89- block_size = int(kwargs.get("block_size", BLOCK))
137+ block_size = int(kwargs.get("block_size", kwargs.get("blockSize", BLOCK)))
90138 
91- out_dtype = np.asarray(var).dtype
139+ out_dtype = _dtype_of(var)
92140 one = torch.tensor(1.0, dtype=torch.float32)
93141 step_v = _to_f32(step).reshape(-1)[0] + one
94142 bias_c1 = one - torch.pow(beta1, step_v)
@@ -101,7 +149,7 @@
101149 var_f = _to_f32(var).reshape(-1).clone()
102150 grad_f = _to_f32(grad).reshape(-1)
103151 m_codes = torch.as_tensor(np.asarray(m).reshape(-1).copy(), dtype=torch.int64)
104152 v_codes = torch.as_tensor(np.asarray(v).reshape(-1).copy(), dtype=torch.int64)
atomgit-bot
atomgit-bot8月12日评论:

🟡 Medium Priority

customize_inputs 在 tensor 分支中直接返回原地修改后的 tensor(可能位于 GPU),随后 apply_adam_w_quant_golden 接收这些 tensor 作为输入。第 151–152 行使用 np.asarray(m) / np.asarray(v) 直接转换,当 m / v 为 GPU tensor 时会抛出 TypeError: can't convert cuda:0 device type tensor to numpy。

同一函数中,其他输入(var, grad, qmap_m, qmap_v, absmax_m, absmax_v)在第 149–156 行均通过 _to_f32() 转换,该函数内部已通过 .cpu() 处理了 GPU tensor 场景。唯独 m 和 v 缺失 .cpu() 保护,构成不一致的遗漏。

触发条件: 测试框架提供 GPU tensor 输入 → customize_inputs tensor 分支返回 GPU tensor → apply_adam_w_quant_golden 执行到第 151 行即崩溃。

建议:为 m / v 增加 GPU-safe 路径:先用 .detach().cpu().numpy() 处理 tensor 输入,再构造 m_codes / v_codes。与同一函数中 _to_f32 的模式保持一致。

改动建议
152
+ m_arr = m.detach().cpu().numpy() if torch.is_tensor(m) else np.asarray(m)
153
+ m_codes = torch.as_tensor(m_arr.reshape(-1).copy(), dtype=torch.int64)
154
+ v_arr = v.detach().cpu().numpy() if torch.is_tensor(v) else np.asarray(v)
152
- v_codes = torch.as_tensor(np.asarray(v).reshape(-1).copy(), dtype=torch.int64)
155
+ v_codes = torch.as_tensor(v_arr.reshape(-1).copy(), dtype=torch.int64)
应用建议
likedislike
不准确?
CANN-robotCANN-robot成员
8月12日 添加了label:api-check-pass
CANN-robotCANN-robot成员
8月12日 删除了label:ci-pipeline-running
CANN-robotCANN-robot成员
8月12日 添加了label:ci-pipeline-passed
Ttianqiguang成员
8月12日 修改标题为 “test: 更新deep_norm_grad等4个算子golden测试数据”,原标题为“fix: update golden references for changwei ops”
Ttianqiguang成员
8月12日 修改了pull request 的描述
Ttianqiguang成员
8月12日 解决了最后一个问题
TangPC
TangPC成员
8月12日 评论:

/lgtm
/approve

likedislike
CANN-robotCANN-robot成员
8月12日 添加了label:approved
wang-xing001成员
8月12日 评论:

/lgtm
/approve

likedislike
CANN-robotCANN-robot成员
8月12日 添加了label:lgtm
CANN-robotCANN-robot成员
8月12日 关闭了关联的issue
CANN-robotCANN-robot成员
8月12日 合入了pull request
CANN-robot
CANN-robot成员
8月12日 评论:

Pull Request 已合并或已关闭。

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

likedislike