Open
gather_for_rank1迁移 #220
suhaolongAdd on 7 days ago
gather_for_rank1迁移 #220
Open
suhaolongAdd on 7 days ago
suhaolong
suhaolongCollaborators
7 days ago

合入来源

问题/功能描述

修改方案描述

是否涉及UT/ST

开发自检

likedislike
Merge blocked
atomgit-bot
atomgit-bot
7 days ago Comments:

变更摘要

本 PR 把 gather_for_rank1(1D 嵌入权重表按 index 查表,即 y = x[index])迁移为 ops_rec 命名空间下的自定义算子,并同时补齐前向算子注册、NPU 与 Meta 双后端实现以及 autograd 反向绑定。PR 共涉及 6 个文件,其中新增的 gather_for_rank1_plugin.cpp 负责通过 TORCH_LIBRARY_FRAGMENT 与 TORCH_LIBRARY_IMPL 注册 aclnnGatherForRank1 调用;新增的 gather_for_rank1_autograd.py 负责把反向计算交给主仓独立算子 ops_rec::index_select_for_rank1_backward。其余 4 个文件没有内嵌补丁,因此不展开说明。

主要改动

  • 新增前向算子 schema 与 NPU 实现:在 gather_for_rank1_plugin.cpp 中以 m.def("gather_for_rank1(Tensor x, Tensor index) -> Tensor") 定义接口,并在 PrivateUse1 后端把该接口绑定到 gather_for_rank1_impl,该实现内部通过 EXEC_NPU_CMD(aclnnGatherForRank1, ...) 完成查表计算并返回输出。
  • 输入校验与执行约束:实现先用 check_tensor_non_empty、check_tensor_npu_device 校验输入非空且位于同一 NPU 设备,再约束 x、index 均为 1D 且 index 必须是 int64,随后对输入调用 contiguous(),并以 at::zeros_like(index, x_conti.options()) 构造输出张量。
  • 新增 Meta 实现:通过匿名命名空间中的 gather_for_rank1_meta 在 Meta 后端注册只推导 shape 与 dtype 的实现,供 torch.compile 图模式进行 shape 推断。
  • 声明 vendor 依赖:在 #include "pytorch_npu_helper.hpp" 之前定义 OPS_REC_CUST_VENDORS "gather_for_rank1_forward",用于指明 aclnn 接口所在的 op_api 库。
  • autograd 公式注册:新增 gather_for_rank1_autograd.py,其中 _setup_context 保存 x 与 index,_backward 调用 torch.ops.ops_rec.index_select_for_rank1_backward 得到 grad_x,并返回 (grad_x, None)(index 不可导);register_autograd() 加入重复注册的幂等保护,并说明该逻辑会经 ops_rec 插件加载机制自动执行。
likedislike
Incorrect?
atomgit-bot
atomgit-bot
7 days ago Comments:

代码审查

✅ 未发现问题

likedislike
Incorrect?
AtlasAccount
AtlasAccountCollaborators
7 days ago Comments:
流水线 PR-pipeline_ops-rec 待运行
此流水线已支持下列评论快捷指令,仅PR创建者和白名单成员评论有效
  • compile : 运行流水线
  • retry : 重试流水线所有失败子任务
  • retry <任务名> : 仅重试指定失败子任务
  • stop : 停止流水线
likedislike
ascend-robotascend-robotCollaborators
7 days ago Added label: ascend-cla/yes
ascend-robot
ascend-robotCollaborators
7 days ago Comments:

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.


PR Approval Progress

⚠️ This PR does not yet meet the following requirements:lgtm (requires ≥ 2 person(s) per module)、approve (requires ≥ 1 person(s) per module)

Module Approval Details

module lgtm status approve status
repo-Ascend/ops-rec ❌ (0/2)(You can also ask: Fionazm, beau1, QianZH97, 文一晴, 汪泽南) ❌ (0/1)(You can also ask: 蒋皓洋, 黄诗磊, imhandsome1, hjj12345678_, 项攀霄)

💡 Tip:

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

CLA Signature Pass

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

likedislike
AtlasAccountAtlasAccountCollaborators
7 days ago Added label: ci-pipeline-running
ascend-robot
ascend-robotCollaborators
7 days ago Comments:

ascend docs pipeline is running...

likedislike
ascend-robotascend-robotCollaborators
7 days ago Added label: docs-ci-pipeline-running
ascend-robot
ascend-robotCollaborators
7 days ago Comments:

❌ 文档门禁未通过!

检查项 检查结果 详情
markdownlint ✅ 已通过 查看详情
link-validity-check ❌ 未通过 查看详情
resource-existence-check ✅ 已通过 查看详情
tag-closed-check ✅ 已通过 查看详情

💡 本次检查出 4 项错误,详情内容如下:

序号 错误详情
1 [文件路径]:ascendc/embedding/gather_for_rank1/gather_for_rank1_forward/README.md
[检查类型]:link-validity-check
[错误位置]:第 63 行
[错误信息]:本地路径链接无法访问
[错误内容]:./examples/aclnn/test_aclnn_gather_for_rank1.cpp
2 [文件路径]:ascendc/embedding/gather_for_rank1/gather_for_rank1_forward/README.md
[检查类型]:link-validity-check
[错误位置]:第 64 行
[错误信息]:本地路径链接无法访问
[错误内容]:./examples/torch/test_torch_gather_for_rank1.py
3 [文件路径]:ascendc/embedding/gather_for_rank1/gather_for_rank1_forward/docs/aclnn_gather_for_rank1.md
[检查类型]:link-validity-check
[错误位置]:第 83 行
[错误信息]:本地路径链接无法访问
[错误内容]:../examples/aclnn/test_aclnn_gather_for_rank1.cpp
4 [文件路径]:ascendc/embedding/gather_for_rank1/gather_for_rank1_forward/docs/torch_gather_for_rank1.md
[检查类型]:link-validity-check
[错误位置]:第 69 行
[错误信息]:本地路径链接无法访问
[错误内容]:../examples/torch/test_torch_gather_for_rank1.py
likedislike
ascend-robotascend-robotCollaborators
7 days ago Removed label: docs-ci-pipeline-running
ascend-robotascend-robotCollaborators
7 days ago Added label: docs-ci-pipeline-failed
AtlasAccountAtlasAccountCollaborators
7 days ago Removed label: ci-pipeline-running
AtlasAccountAtlasAccountCollaborators
7 days ago Added label: ci-pipeline-failed
李振华
李振华7 days agoStart code review1
ascendc/embedding/gather_for_rank1/torch_extension/gather_for_rank1_plugin.cpp
李振华
李振华7 days agoComments:

代码问题(按严重程度):

1)index 取值未做任何范围校验(P0)
plugin 是唯一能拿到实际张量值的位置,但这里只校验了 dtype/shape,没有校验 index 的取值范围。kernel 里会把 int64 索引 Cast 成 int32 再乘 sizeof 当 uint32 偏移做 Gather:负值会回绕成巨大偏移,>= x.size(0) 会读到未拷贝区域,>= 2^31 还会被截断。建议在 EXEC_NPU_CMD 前加 TORCH_CHECK(index.min().item<int64_t>() >= 0 && index.max().item<int64_t>() < x.size(0))(或至少校验上界,与 op_host 的 MAX_DIM 约束对齐)。

2)输出用 zeros_like 预清零(P2)
kernel 对 Out 的 [0, indexLen) 区间是全量写,zeros_like 多了一次整块 GM 写;如果保留 zeros_like 是为了兼容 kernel 未覆盖的尾块,建议在 kernel 侧补齐写入,否则用 at::empty_like(index, x_conti.options())。

likedislike