已开启
【代码侦探Challenge08】青海大学 - challenge08_tanhcustom #3876
【代码侦探Challenge08】青海大学 - challenge08_tanhcustom #3876
已开启
eieiei创建于 17 天前
eieiei
eieiei
17 天前

青海大学

团队信息

成员

算子: challenge08_tanhcustom

使用 AscendC 实现 Tanh 激活算子:host 侧 Tiling 按 8 核并行切分(向上取整、尾核截断防御、越界核空转),UB 单块搬运含容量校验;kernel 侧按 schMode 分派 fp32/fp16 双实例,采用数值稳定的 1 - 2/(e^{2x}+1) 公式(仅 1 次 Exp 运算),统一 DataCopyPad 搬运;含完整 UT 与精度比对(MERE/MARE)体系。

likedislike
合并受阻
eieieieieiei
17 天前 创建了 pull request,commit e6d37306
eieiei
eieiei
17 天前 评论:

/compile

likedislike
atomgit-bot
atomgit-bot
17 天前 评论:

变更摘要

本 PR 为 CANN 代码侦探挑战赛(青海大学)提交的 challenge08_tanhcustom 算子工程,使用 AscendC 实现 Tanh 激活算子。host 侧在 tanh_tiling.cpp 中完成按核并行切分的 Tiling(向上取整、尾核截断防御、UB 容量校验并预留 guard 字节),kernel 侧在 tanh.cpp/tanh.h 中按 schMode 分派 fp32/fp16 双实例,通过 Exp/Muls/Add/Sub/Div 计算链实现 y=(e^x-e^-x)/(e^x+e^-x),搬运统一使用 DataCopyPad;同时配套 aclnn 调用示例、op_host/op_kernel 双层 UT 与基于 MERE/MARE 的精度比对脚本。

主要改动

  • host 侧算子定义与 Tiling:tanh_def.cpp 声明 Tanh 算子(DT_FLOAT/DT_FLOAT16、FORMAT_ND),tanh_infershape.cpp 将输入 shape 原样赋给输出,tanh_tiling.cpp 依据 dtype 选择 tileAlignHint、按元素数选取 coreGrain 计算 plannedCores/coreSpan/launchCores,并在 UB 容量扣减 kUbGuardBytes 后计算 ubFactor,最后按输入 dtype 设置 tilingKey(fp16→TANH_TPL_SCH_MODE_0,fp32→TANH_TPL_SCH_MODE_1)。
  • kernel 计算与分派:tanh.h 中模板类 NsTanh::Tanh<T> 的 ComputeTanh 以 Exp→Muls→Exp→Add→Sub→Div 顺序实现 tanh,Init 按 blockFactor 计算各核 coreOffset/activeElems_(越界核置 0 空转)并决定 compact/queue 缓冲模式;tanh.cpp 通过 if constexpr 按 schMode 实例化 Tanh<half> 与 Tanh<float>,CopyIn/CopyOut 统一使用 DataCopyPad。
  • Tiling 数据结构与模板参数:新增 tanh_tiling_data.h 定义 TanhTilingData(totalNum/blockFactor/ubFactor 三个字段),tanh_tiling_key.h 通过 ASCENDC_TPL_ARGS_DECL 声明 schMode 模板参数及 TANH_TPL_SCH_MODE_0/1 两个取值。
  • 示例与构建脚本:examples/test_aclnn_tanh.cpp 演示 aclnnTanhGetWorkspaceSize/aclnnTanh 两段式调用(含 fp16/bf16 数据转换、workspace 申请与资源释放);顶层 build.sh 提供 -j、-u、-e、--make_clean 选项,串起 cmake 构建、UT 与示例执行。
  • UT 与精度比对体系:tests/ut 下提供 gtest 构建(BuildGoogleTest.cmake,强制 old ABI 以匹配 CANN 库)、TilingContextFaker/InferShapeContextFaker 与对应 case executor;test_tanh_tiling.cpp 校验 tiling 输出,test_tanh.cpp 直接构造 TanhTilingData 经 ICPU_RUN_KF((tanh<1>)) 运行 kernel,gen_data.py/compare_data.py 生成 golden 并以 MERE/MARE 阈值(fp16/fp32 等按 dtype 设定)完成精度比对,run.sh 汇总各阶段结果。
likedislike
不准确?
atomgit-bot
atomgit-bot
17 天前 评论:

代码审查

审查结论

各文件审查状态

  • CMakeLists.txt — 已审查。无独立问题(第 29 行 --soc 用法提示与 build.sh 不一致,已并入 build.sh 的问题 3)。
  • build.sh — 已审查。2 个问题(P3:--soc 参数未实现但被提示使用;P3:-e 分支在未安装算子包时必然失败)。
  • examples/CMakeLists.txt — 已审查。无独立问题(依赖已安装算子包,相关风险并入 build.sh 问题 4)。
  • examples/run.sh — 已审查。无独立问题。
  • examples/test_aclnn_tanh.cpp — 已审查。1 个问题(P3:示例不回读/校验输出,精度回归无法被发现)。
  • op_host/CMakeLists.txt — 已审查。无问题。
  • op_host/tanh_def.cpp — 已审查。无问题(AddConfig 仅 ascend910b,与 build.sh 默认 SOC 一致)。
  • op_host/tanh_infershape.cpp — 已审查。无问题。
  • op_host/tanh_tiling.cpp — 已审查。无问题(tiling key 分派与 kernel 的 fp16/fp32 双实例一致;tile 上限在 192KB UB 下 5 个缓冲区可容纳)。
  • op_kernel/CMakeLists.txt — 已审查。无问题。
  • op_kernel/tanh.cpp — 已审查。无问题。
  • op_kernel/tanh.h — 已审查。2 个问题(P2:大绝对值输入 exp 溢出输出 NaN;P2:尾块 DataCopyPad 非 32B 对齐时越界读写 GM)。

问题统计

  • P0:0
  • P1:0
  • P2:2
  • P3:3

总体风险判断

整体构建与基本运行链路完整,host 侧 tiling/def/infershape 及 kernel 分派逻辑一致,未见编译级或接口级阻断问题。主要风险集中在 kernel 数值正确性与边界安全:ComputeTanh 在 |x| 较大(fp32 ≥ ~88.7、fp16 ≥ ~11.1)时因 exp 溢出产生 NaN,属于真实边界正确性缺陷(P2);输出尾块使用 DataCopyPad 在张量尺寸非 32B 对齐时存在 GM 越界读写(P2)。脚本与示例侧为便利性问题(P3)。建议合入前优先修复 tanh.h 的数值溢出与尾块越界问题,并补充大绝对值输入的校验用例。


审查结论

发现统计

  • P0:0 个
  • P1:0 个
  • P2:2 个
  • P3:3 个

总体风险判断

本次 PR 全部为 UT 基础设施与 tiling 数据/模板参数头文件(TanhTilingData、TanhTilingKey),生产算子本体(host tiling / kernel)不在 diff 内。整体风险中低:无 P0/P1 级问题,最值得关注的两点是——gtest 从外部镜像下载编译却关闭 TLS 校验且无校验和(供应链风险),以及 infershape 用例执行器缺少空指针校验(算子未注册时测试进程直接崩溃而非可诊断失败)。其余为条件触发的健壮性问题。

各文件审查确认

  1. op_kernel/tanh_tiling_data.h — no issues(结构体三字段 int64 + 默认初始化,无对齐/溢出问题)
  2. op_kernel/tanh_tiling_key.h — no issues(标准 ASCENDC_TPL 宏用法,参数列表与模板声明一致)
  3. tests/ut/CMakeLists.txt — no issues(UT 接线常规写法;子目录 CMakeLists 不在审查范围内无法交叉验证)
  4. tests/ut/cmake/BuildGoogleTest.cmake — P2:TLS_VERIFY OFF 且无 URL_HASH,第三方 gtest 下载无完整性校验(供应链风险)
  5. tests/ut/common/any_value.h — no issues(shared_ptr<void> 正确管理 new 对象,各 CreateFrom 特化与枚举类型一一对应)
  6. tests/ut/common/infershape_case_executor.cpp — P2:spaceRegistry/GetOpImpl()/infer_shape 无判空即解引用,与 tiling 侧判空不一致,注册缺失时崩溃
  7. tests/ut/common/infershape_case_executor.h — no issues
  8. tests/ut/common/infershape_context_faker.cpp — no issues(均为 builder 直通调用)
  9. tests/ut/common/infershape_context_faker.h — no issues(Attr 重载忽略 attrName 属设计限制,本算子无属性,未达上报标准)
  10. tests/ut/common/tiling_case_executor.cpp — P3:STR(BUILD_SOC_VERSION) 字符串化语义使"宏未定义"防御失效,且 socToArch 缺键导致 socVersion/NpuArch 静默为空
  11. tests/ut/common/tiling_case_executor.h — P3:5 参重载默认 expectTilingData="" 与跳过哨兵 EMPTY_EXPECT_TILING_DATA 不一致,默认调用产生假失败
  12. tests/ut/common/tiling_context_faker.cpp — P3:DeterministicInfo 未判空即解引用指针参数,空指针调用会崩溃

审查结论

变更文件逐一核对结果

文件 结论
tests/ut/common/tiling_context_faker.h 1 个问题(P3:Attr() 重载忽略 attrName)
tests/ut/op_host/CMakeLists.txt no issues(链接/命名与 main 及 run.sh 一致;ASCEND_HOME_PATH 依赖问题并入 run.sh 发现)
tests/ut/op_host/test_op_host_main.cpp no issues(.so 命名与 CMake 产物一致,gtest_main 不会产生 main 符号冲突)
tests/ut/op_host/test_tanh_tiling.cpp no issues(StorageShape/initializer_list 生命周期、compileInfo 空结构均符合模板惯例)
tests/ut/op_kernel/CMakeLists.txt no issues(tikicpulib REQUIRED、CANN_HOME 降级查找、编译定义齐全)
tests/ut/op_kernel/tanh_data/compare_data.py 1 个问题(P3:元素数不一致时未捕获 ValueError 崩溃)
tests/ut/op_kernel/tanh_data/gen_data.py no issues(形状 8×2048 与 kernel UT 一致,golden 计算正确)
tests/ut/op_kernel/tanh_tiling.h no issues(官方模板结构,路径正确)
tests/ut/op_kernel/test_tanh.cpp 3 个问题(P3:GmAlloc 未校验、内核结果未校验即回读、未使用的转换函数)
tests/ut/run.sh 1 个问题(P3:ASCEND_HOME_PATH 硬编码默认路径且无存在性检查)

汇总

  • 发现数:P0 = 0,P1 = 0,P2 = 0,P3 = 6。
  • 总体风险评估:本 PR 为 tanh 算子的 UT 测试体系(host tiling UT + kernel UT + 精度比对 + 构建/执行脚本),不涉及生产算子逻辑本身。未发现会导致构建失败、数据损坏或安全风险的缺陷;所报 6 个问题均为测试/脚本健壮性问题(错误路径未校验、异常未捕获、死代码、环境依赖硬编码),触发时多以"崩溃/测试失败"等显式方式暴露,不会静默产生错误结论,整体风险低。其中 tiling_context_faker.h 的 Attr() 丢名字问题属于新测试设施 API 的潜在正确性陷阱,当前用例未触发,建议尽快修正以免后续用例踩坑。
类型 数量
🔴 阻塞 0
🟡 建议 2

💬 仅评论

likedislike
不准确?
CANN-robotCANN-robot成员
17 天前 添加了label:cann-cla/yes
此处折叠了62条消息 查看更多
eieieieieiei
11 天前 强制推送  1158 个提交:1255ff7d-1157 commits from branch master,ca81f7dd-feat: 提交代码侦探第八期 TanhCustom 算子实现(青海大学)
eieieieieiei
11 天前 预合并成功(commit_id: 8bc33923d0ec6905439565c5a3e659adb00a905b)
CANN-robotCANN-robot成员
11 天前 删除了label:cann-cla/yes
CANN-robotCANN-robot成员
11 天前 添加了label:cann-cla/yes
eieiei
eieiei
11 天前 评论:

更正:最终 head 是 ca81f7dd(上一条引用的 5ce5a535 已被替换)

上一条补记里的代码改动内容不变(infershape_case_executor.cpp 的判空、BuildGoogleTest.cmake 的 URL_HASH),但提交本身重做了,原因值得说明,避免助教看 diff 时被误导:

  • 5ce5a535 那次是在浅克隆里 commit --amend 得到的,产出了一个没有父提交的孤儿提交,平台因此退化成整树比对,文件改动里凭空多出 800 多个与本提交无关的“删除”;
  • 现已改为以当前 master 为父的单提交:ca81f7dd,文件改动回到 36 个且全部为新增,全部位于本人提交目录内;
  • 过程中还因 committer 邮箱不对触发过一次 CLA 重判,现已是 cann-cla/yes。

resolve_discussion_passed 仍为 false(那几条讨论需要评审人点,提交者无权限)。麻烦 @shaoyf @fullt 帮忙把已处理的讨论标记为已解决,抱歉前后两次改动 head 造成的阅读干扰。

likedislike