已合并
add StatelessExponential for multinomial #4038
zhangxiyan7创建于 7月14日
add StatelessExponential for multinomial #4038
已合并
zhangxiyan7创建于 7月14日
zhangxiyan7
zhangxiyan7成员
7月14日

描述

当前multinomial接口中会通过exponential_小算子拼接,aclnnMultinomialTensor输入seed/offset是通过tensor输入,SimThreadExponential seed/offset作为属性输入,无法在aclnnMultinomialTensor中调用,因此新增StatelessExponential算子实现aclnnMultinomialTensor的seed/offset实现tensor输入。

关联的Issue

https://gitcode.com/cann/ops-math/issues/2418

测试

门槛用例通过,冒烟通过

文档更新

新增stateless_exponential目录下README.md

类型标签

  • Bug修复
  • 新特性
  • 性能优化
  • 文档更新
  • 其他,请描述:
likedislike
Pull Request已成功合入, 合并人@CANN-robot
(感谢 zhangxiyan7 的贡献)
zhangxiyan7zhangxiyan7成员
7月14日 创建了 pull request,commit 40c0ec37
atomgit-bot
atomgit-bot
7月14日 评论:

变更摘要

本 PR 引入了一个新的 StatelessExponential 算子,用于在原地(in-place)生成服从指数分布 Exp(λ) 的随机数。与旧的 SimThreadExponential 不同,该算子将 seedoffset 作为输入张量(而非属性)传递,使其能够被 aclnnMultinomialTensor 等基于张量的调用方直接使用。该算子的内核计算逻辑复用 SimThreadExponential::Process<T>,通过 TilingKey 按输出数据类型(FP16/BF16/FP32)分派。同时,PR 清理了 stateless_sample_multinomial 中旧的 David 路径代码(RunDavidMultinomialReplaceMentRunDavidMultinomialNoReplaceMent 等),并将 multinomial 的无放回采样路径统一改为 StatelessExponential + Run950AicoreMultinomialWithoutReplacement 的组合。

主要改动

  • 新增 StatelessExponential 算子:完整实现了 Op 定义 (stateless_exponential_def.cpp)、Op API (stateless_exponential.h/.cpp)、Tiling (stateless_exponential_tiling_arch35.h/.cpp) 和内核入口 (stateless_exponential.cpp),支持 FP16/BF16/FP32 输出,seed/offset 作为 INT64 标量张量通过 TilingInputsDataDependency 在 tiling 阶段消费,lambd 作为属性传入并校验 >0。
  • 重构 multinomial 无放回采样路径:在 aclnn_multinomial.cpp 中,aclnnMultinomialGetWorkspaceSizeaclnnMultinomialTensorGetWorkspaceSize 的 RegBase 分支不再调用已删除的 Run950AicoreExponentialWithoutReplacement,改为先通过 StatelessExponential 生成指数随机数,再传入 Run950AicoreMultinomialWithoutReplacement
  • 移除旧的 David 多分类实现代码:从 aclnn_multinomial.cpp 中删除了 RunDavidMultinomialReplaceMentRunDavidMultinomialNoReplaceMentGetDavidRandomUniformReplaceMentTensorGetDavidRandomUniformNoReplaceMentTensorBuildDavidCounter 等约 170 行代码;从 stateless_sample_multinomial.cpp/.h 中移除了 Run950AicoreExponentialWithoutReplacement 函数及 OP_TYPE_REGISTER(SimThreadExponential) 注册。
  • sim_thread_exponential 写入方式调整ExponentialTransform 中写回全局内存的方式从直接索引赋值 outputGm[li] = ... 改为 *const_cast<__gm__ T*>(&outputGm[li]) = ...,以适配更严格的编译器约束。
  • 新增完整的单元测试:tiling 层测试覆盖 FP32/FP16/BF16 三种数据类型、多维形状、lambd=0 校验失败、offset 非 4 的倍数校验失败;kernel 层测试覆盖冒烟测试(三种类型)和确定性验证(相同 seed/offset 两次运行结果一致)。
likedislike
atomgit-bot
atomgit-bot
7月14日 评论:

代码审查

Now let me write the closing summary.

审查总结

共审查了 18 个变更文件,报告了 3 个问题:

优先级 数量 说明
P0 0 无构建/严重安全问题
P1 0 无高概率运行时错误
P2 3 2 个空指针检查缺失(aclnn_multinomial.cpp 两个新增 RegBase 路径),1 个 const_cast 移除 volatile 的潜在内存序问题(sim_thread_exponential_simt.h
P3 0 无次要问题

逐文件审查结果

文件 结论
random/sim_thread_exponential/op_kernel/arch35/sim_thread_exponential_simt.h P2: const_cast 移除 volatile
random/stateless_exponential/CMakeLists.txt 无问题
random/stateless_exponential/README.md 无问题
random/stateless_exponential/op_api/stateless_exponential.cpp 无问题
random/stateless_exponential/op_api/stateless_exponential.h 无问题
random/stateless_exponential/op_host/arch35/stateless_exponential_tiling_arch35.cpp 无问题
random/stateless_exponential/op_host/arch35/stateless_exponential_tiling_arch35.h 无问题
random/stateless_exponential/op_host/config/ascend950/stateless_exponential_simplified_key.ini 无问题
random/stateless_exponential/op_host/stateless_exponential_def.cpp 无问题
random/stateless_exponential/op_kernel/stateless_exponential.cpp 无问题
random/stateless_exponential/tests/ut/op_host/arch35/test_stateless_exponential_tiling_arch35.cpp 无问题
random/stateless_exponential/tests/ut/op_kernel/CMakeLists.txt 无问题
random/stateless_exponential/tests/ut/op_kernel/stateless_exponential_tiling.h 无问题
random/stateless_exponential/tests/ut/op_kernel/test_stateless_exponential.cpp 无问题
random/stateless_sample_multinomial/CMakeLists.txt 无问题
random/stateless_sample_multinomial/op_api/aclnn_multinomial.cpp P2 × 2: 空指针检查缺失
random/stateless_sample_multinomial/op_api/stateless_sample_multinomial.cpp 无问题(清理旧代码)
random/stateless_sample_multinomial/op_api/stateless_sample_multinomial.h 无问题(清理旧声明)

整体风险评估:此 PR 引入了新的 StatelessExponential 算子以替代旧的 SimThreadExponential 路径,架构设计合理。主要风险集中在 aclnn_multinomial.cpp 两条新增 RegBase 路径中缺少中间分配结果(AllocIntArray/ConvertToTensor)的空指针检查,在 OOM 场景下会崩溃而非返回错误码。另外 sim_thread_exponential_simt.hconst_cast 剥离 volatile 的做法需确认是否是针对已知编译器问题的 intentional workaround。整体风险等级:中等

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

💬 仅评论

likedislike
CANN-robotCANN-robot成员
7月14日 添加了label:cann-cla/yes
CANN-robot
CANN-robot成员
7月14日 评论:

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
*/*/README.md 陈娇, xuejinghui (2/2) 陈娇 (1/1)
*/*/op_api/*.h 汤磊, xuejinghui (2/2) 汤磊 (1/1)
*/*/op_host/*_def.cpp 汤磊, xuejinghui (2/2) 汤磊 (1/1)
repo-cann/ops-math 宋恺, xuejinghui (2/2) 宋恺 (1/1)

💡 Tip:

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

CLA Signature Pass

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

likedislike
此处折叠了125条消息 查看更多
CANN-robotCANN-robot成员
15 天前 添加了label:api-check-failed
CANN-robotCANN-robot成员
15 天前 删除了label:ci-pipeline-running
CANN-robotCANN-robot成员
15 天前 添加了label:ci-pipeline-passed
CANN-robotCANN-robot成员
15 天前 关闭了关联的issue
CANN-robotCANN-robot成员
15 天前 合入了pull request