Merged
[Atanh] 修复原地 Golden 输入污染并兼容 TF 输入 #7021
[Atanh] 修复原地 Golden 输入污染并兼容 TF 输入 #7021
Merged
陈展熹Add on 12 days ago
陈展熹
12 days ago

描述

完善 Atanh 原地 ACLNN 通路的测试参考,修复 Golden 改写共享输入造成的精度失败。

TTK 在设备执行前生成 Golden。原来的 AclnnInplaceAtanhTestSpec.golden 通过 inputRef.copy_(result) 写回共享输入;FP64 不会创建升精度副本,后续 ACLNN 调用收到的已经是第一次 atanh 的结果。例如输入 1 会先被 Golden 写成 Inf,设备再计算 atanh(Inf) 得到 NaN。

本 PR 的最终行为:

  • Golden 保留 inputRef 参数,计算后按其 dtype 完整转换,返回独立的 [result],保持框架输入及底层存储不变。
  • 拒绝整型和 BOOL,避免浮点结果被隐式转换回非法的原地输入类型。
  • 补充接受 inputRef 的 Torch 三方适配器,使用 [inputRef.clone().atanh_()],使重复参考调用相互独立。
  • 实际 ACLNN 的原地写回由测试用例的输出槽 (0,) 回读设备输入缓冲区进行验证;Golden 的 Python 返回对象不承担设备别名验证。

本次仅修改 math/atanh/tests/assets/golden.py,包括对应说明。既有注册、数值计算 helper、FP16/BF16 提升规则、输出 dtype 映射和 Kernel/GEIR L0 标准保持一致。

关联的Issue

该精度 issue 的 CI 使用 operator-artifacts 中的独立 Golden;本 PR 更新 ops-math 的同类资产,归档仓 Golden 需单独同步后才能对该 CI 生效。

测试

  • 新增的定向回归在修改前复现 4 项失败:Golden 修改调用方输入、Golden/三方共用输入时相互影响、FP64 的 NumPy 底层存储被改写。修改后 79 项 CPU 合同检查全部通过。
  • CPU 检查覆盖 FP16/BF16/FP32/FP64/COMPLEX64/COMPLEX128,位置与关键字调用,标量、空张量、转置及偏移切片,重复调用独立性,非法类型拒绝,以及 NaN/Inf/正负零语义。核对原有三个注册和 L0 定义。
  • 使用正式 python3 -m ttk aclnn 通路,直接加载本 PR 修改后的 math Golden,回放 issue 中 002、003 的原始输入 dump;每条执行 3 次、确定性级别 1,精度和确定性均 PASS。
  • 两条回放的输入文件及 Golden 文件均与此前失败基线逐字节一致。002 有限值最大绝对误差为 8.881784197001252e-16;003 的 16,627,603 个输出全部为正 Inf,与 Golden 一致。
  • 真机验证环境:Ascend950PR_9579、CANN 9.1.0-beta.1、恢复树 TTK a89e7962。本轮验证本地 ACLNN/NPU 精度,未采集远端三方或性能数据,不代替 CI 精确构建的验收。
  • 按 math 仓原配置执行该文件完整 pre-commit,所有适用检查通过,OAT 实际扫描通过;git diff --check 及 AST 范围核验通过。

三方适配器内的 clone 会增加分配与拷贝开销,其整体耗时包含 clone。

文档更新

更新 Golden 文件中的输入保留和独立返回值说明。

类型标签

2026-11-11 补充:TF Golden 输入兼容

关联问题: https://gitcode.com/wangyueting/changwei_yezhao/issues/90

归档仓对应修复: https://gitcode.com/opencann/operator-artifacts/pull/417

问题为 TF EagerTensor 被直接送入要求 NumPy 数组的转换函数,导致 TypeError: expected np.ndarray (got tensorflow.python.framework.ops.EagerTensor),TTK 最终判为 GOLDEN_FAILURE。

math 原 Golden 未注册 tf.math.atanh。本次在同一文件 math/atanh/tests/assets/golden.py 补入独立的 TensorFlowAtanhTestSpec:TF 输入经 np.asarray(x.numpy()) 归一化,支持零维标量、空张量和 Variable;借助现有 dtype 转换工具及 _atanh_reference / _numpy_result 生成 NumPy 参考输出,保持输入 dtype/shape,并提供 TF 三方映射。

既有 Kernel/GEIR 和 ACLNN Spec、数值辅助函数、原地输入隔离逻辑保持原样,Kernel/GEIR 仍只支持 FP16/BF16/FP32 并使用 L0;本次未新增 FP64 容差标准。

验证:

  • 新增 TF 路由的定向检查先复现“未注册”,修复后通过;17 项 TF CPU 检查全部通过,显式确认使用本插件注册,排除默认 CPU 回退假通过。
  • 包含 issue 的两条完整规模用例:FP32 (7,406692,7)、FP16 (2451122,);按源仓范围和固定种子 9001/9002 生成输入,Golden 生成、shape/dtype 和输入保持检查通过。
  • 原有 79 项 math 接口契约检查全部通过,总计 96 项 CPU 检查通过。
  • 完整 pre-commit 通过,包含实际执行的 OAT 扫描;Ruff 未修改已验证文件。
  • AST 检查确认原有函数和 Spec 类实现均保持一致,仅新增 TF Spec、注册和说明。

环境:TensorFlow CPU 2.21.0、Torch 2.7.1+cpu、恢复树 ops-test-kit。本次未取得原 CI 输入 dump,未执行 NPU eager/graph_cst/graph_dyn 精度回归;CPU 检查不作为设备精度结论。关联 issue 不自动关闭。

likedislike
Pull Request has been successfully merged by CANN-robot.
(Thank you for 陈展熹's contribution.)
陈陈展熹
12 days ago Created pull request, commit 79fccba7
陈陈展熹
12 days ago Associated issue: [Bug-Report|缺陷反馈]: Atanh Host/API 参数校验、错误码与测试参考不完整,Atanh算子aclnn通路aclnnInplaceAtanh在golden中未注册
atomgit-bot
atomgit-bot
12 days ago Comments:

变更摘要

本 PR 针对 math/atanh/tests/assets/golden.py 中的原地 Atanh 测试规格 AclnnInplaceAtanhTestSpec,完善原地接口的返回别名关系与 Torch 第三方参考合同:写回后返回 inputRef 本身而非新计算结果,显式拒绝整型与 BOOL 输入,并补充基于 torch.atanh_() 的第三方适配器,同时在文件头说明中同步该原地通路的合同描述。

主要改动

  • 原地返回保持别名关系: AclnnInplaceAtanhTestSpec.golden 在 inputRef.copy_(result) 写回后改为返回 [inputRef],使返回对象与传入的 inputRef 指向同一张量,替代原先返回新计算的 result。
  • 拒绝非法输入类型: 在 golden 入口新增类型校验,当 inputRef 既非浮点也非复数时抛出 TypeError,避免整型/BOOL 输入经普通 atanh 计算后被隐式转换并写回。
  • 新增 Torch 原地第三方参考: 增加内部类 ThirdPartyImpl,其 __call__ 返回 [inputRef.atanh_()],并通过 third_party = {"torch": ThirdPartyImpl} 注册,支持位置参数与 inputRef 关键字调用。
  • 更新原地合同说明: 修改类文档字符串以说明按原始 inputRef dtype 原地写回并返回同一张量,模块头注释调整为 Kernel/GEIR 的 third_party 保持原样、ACLNN 原地通路提供 torch.atanh_ 参考。

🧩 本次 Review 已使用自定义 Skill:

likedislike
Incorrect?
atomgit-bot
atomgit-bot
12 days ago Comments:

代码审查

检视结论

变更文件覆盖情况

  • math/atanh/tests/assets/golden.py:已逐条检视(文档说明行 24、AclnnInplaceAtanhTestSpec.golden 的类型拒绝与返回别名 114-123、新增 ThirdPartyImpl 125-127),发现 1 个问题。

已核对且判定无问题的点

  • 新增的 is_floating_point()/is_complex() 拒绝与 op_api/aclnn_atanh.cpp:70-73 的原地支持列表(FLOAT/FLOAT16/DOUBLE/BF16/COMPLEX64/COMPLEX128)一致,整型/BOOL/uint8 确实应被拒绝,未与 AclnnAtanhTestSpec 的非原地通路(支持整型经 cast)产生矛盾。
  • 使用 TypeError 表达 aclnn 侧 dtype 拒绝,与仓内既有做法一致(bitwise_and/tests/assets/golden.py:130、left_shift/tests/assets/golden.py:195)。
  • ThirdPartyImpl 未定义 __init__(self, **kwargs):该通路无属性(CSV attributes 为空),且 inv、left_shift 的三方类同样未定义,属允许写法;按输入原型名 inputRef 接收参数,与 aclnnInplaceAtanhGetWorkspaceSize(inputRef) 契约一致。
  • 返回 [inputRef] 保持与输入同一对象、dtype/shape/stride 不变,符合 PR 声明的原地别名合同;FP16/BF16 升 FP32 计算再 cast 回写的既有数值链未被改动。

问题统计:P0 0 个 / P1 0 个 / P2 1 个 / P3 0 个。

整体风险判断:变更范围极小、方向正确(补齐原地别名返回、非法 dtype 拒绝、torch 参考),主要风险集中在新增第三方参考对框架输入做原地改写这一点——它与仓内“原地标杆先 clone”的既有约定相反,是否实际触发取决于 TTK 是否为各 provider 独立拷贝输入,属中等偏低风险,建议按 clone 方式收敛后再合入。

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

💬 仅评论


🧩 本次 Review 已使用自定义 Skill:

likedislike
Incorrect?
CANN-robotCANN-robotCollaborators
12 days ago Added label: cann-cla/yes
57 messages are collapsed here。 See more
CANN-robotCANN-robotCollaborators
4 days ago Removed label: ci-pipeline-running
CANN-robotCANN-robotCollaborators
4 days ago Added label: ci-pipeline-passed
xuejinghuiCollaborators
4 days ago Comments:

/lgtm

likedislike
CANN-robotCANN-robotCollaborators
4 days ago Added label: lgtm
CANN-robotCANN-robotCollaborators
4 days ago Merged pull request