已合并
Align NPU mixed-dtype async host-device copy behavior with CUDA #39574
zzhongmin创建于 6月30日
Align NPU mixed-dtype async host-device copy behavior with CUDA #39574
已合并
zzhongmin创建于 6月30日
zzhongmin
zzhongmin成员
6月30日

【合入来源】

如有社区issue,请关联issue链接
请勿携带内部流程信息(需求链接、问题单、内部issue等)

【修改方案】

  1. 对齐 CUDA Copy.cu 的 mixed-dtype 异步 Host/Device 拷贝策略,调整 NPU OpApi 路径。

non_blocking=True 且 Host/Device dtype 不一致时,将可由 aclnnCast 支持的 dtype 转换前移到 NPU Device 侧完成,避免因 CPU 侧 dtype cast 产生非 pinned 临时 Tensor,导致 H2D/D2H 退化为同步拷贝。non_blocking=False 与同 dtype fast path 保持原有逻辑。

  • torch_npu/csrc/aten/ops/op_api/CopyKernelOpApi.cpp
    • H2D:先申请源 dtype 的 NPU temporary,将 pinned/已注册 CPU 数据按源 dtype 执行同 dtype H2D 拷贝,再通过 aclnnCast 转为目标 dtype 并写回目标 Tensor。
    • D2H:先在 NPU 侧通过 custom_ops::_npu_dtype_cast 转为目标 dtype,再执行同 dtype D2H 拷贝到 CPU 目标。
    • D2H cast 前补充 NpuUtils::check_match(&src) 判断;当 NPU 源 Tensor 是非连续 view 或 metadata 不满足 OpApi 要求时,先通过 NpuUtils::format_contiguous(src) 规范化输入,避免 aclnnCast 直接处理不匹配的 view。
    • 新增 cast_dtype_out_baseformat_opapi,封装 aclnnCast out 路径,用于 H2D mixed-dtype async 路径中将 NPU temporary 转换并写入目标 Tensor。
    • 新增 should_fallback_to_cpu_cast:在 A2 及之后产品上,对 aclnnCast 不支持的 dtype 组合保留原 CPU cast 路径,避免 unsupported dtype 走设备侧 cast 失败。
  1. 补充 Tensor.copy_ mixed-dtype 功能、异步行为与 fallback 测试。
  • test/test_copy_.py
    • 覆盖 pinned CPU → NPU、NPU → pinned CPU 的 mixed-dtype copy_(non_blocking=True)
    • 覆盖 int32 -> float32int64 -> float32float16 -> float32float32 -> float16complex64 <-> complex128 等基础转换组合。
    • 扩展同步/异步结果一致性用例,覆盖 boolint8int16uint16int64float16bfloat16float32、complex dtype,并包含负数、边界值、小数和复数数据。
    • 通过 gate_stream 上的矩阵乘任务阻塞 copy_stream,再使用 done_event.query() 验证 copy_ 返回时没有同步等待异步拷贝完成。
    • 补充非连续 NPU 目标、非连续 CPU pinned 目标、非连续 NPU 源、broadcast 源、带 storage offset 的 pinned CPU slice,以及连续 mixed-dtype 异步拷贝下 temporary 生命周期测试。
    • 非连续 NPU 源用例覆盖 D2H mixed-dtype 场景,验证 _npu_dtype_cast 前的 format_contiguous 保护逻辑。
    • 补充 float8_e5m2float8_e4m3fncomplex32aclnnCast unsupported dtype 的 CPU cast fallback 正确性测试。
    • 保留 non_blocking=False 的 H2D/D2H mixed-dtype 结果正确性回归测试。
    • mixed-dtype 相关用例限定在 Ascend910BAscend910_93Ascend950 上执行。
  1. 补充 Tensor.to mixed-dtype 跨设备测试。
  • test/npu/test_npu.py
    • 新增 test_to_non_blocking_different_dtype,覆盖 CPU ↔ NPU、non_blocking=True/False 的跨设备 dtype 转换。
    • 验证 int32 -> float32 转换结果正确性。
    • 验证 D2H 且 non_blocking=True 时输出 Tensor 保持 pinned-memory 属性。
    • 用例限定在 Ascend910BAscend910_93Ascend950 上执行。

【资料变更】

不涉及

【接口变更】

不涉及

【功能验证】

【CheckList】

PR提交人对以下CheckList自检项进行全量自检,自检通过或不涉及,均修改 [ ] 为 [x]

likedislike
Pull Request已成功合入, 合并人@ascend-robot
(感谢 zzhongmin 的贡献)
zzhongminzzhongmin成员
6月30日 创建了 pull request,commit 056658d9
ascend-robotascend-robot成员
6月30日 添加了label:ascend-cla/yes
zzhongmin
zzhongmin成员
6月30日 评论:

compile

likedislike
ascend-robot
ascend-robot成员
6月30日 评论:

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
repo-Ascend/pytorch li_jing_hw, hbhu_bin (2/2) li_jing_hw (1/1)
test li_jing_hw, hbhu_bin (2/2) li_jing_hw (1/1)

💡 Tip:

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

CLA Signature Pass

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

likedislike
此处折叠了83条消息 查看更多
ascend-robotascend-robot成员
7月7日 添加了label:approved
hbhu_bin成员
7月7日 评论:

/lgtm

likedislike
ascend-robotascend-robot成员
7月7日 添加了label:lgtm
ascend-robotascend-robot成员
7月7日 合入了pull request
ascend-robot
ascend-robot成员
7月7日 评论:
流水线 pytorch_gitcode_PR_multiVersion#12062 [ commitID:91491a3f ] 已完成
likedislike