已合并
Align NPU mixed-dtype async host-device copy behavior with CUDA #38858
zzhongmin创建于 6月18日
Align NPU mixed-dtype async host-device copy behavior with CUDA #38858
已合并
zzhongmin创建于 6月18日
zzhongmin
zzhongmin成员
6月18日
# 【合入来源】 > **如有社区issue,请关联issue链接**\ > **请勿携带内部流程信息(需求链接、问题单、内部issue等)** - [x] 需求 - [ ] 问题单 - [ ] 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 失败。 2. 补充 `Tensor.copy_` mixed-dtype 功能、异步行为与 fallback 测试。 - `test/test_copy_.py` - 覆盖 pinned CPU → NPU、NPU → pinned CPU 的 mixed-dtype `copy_(non_blocking=True)`。 - 覆盖 `int32 -> float32`、`int64 -> float32`、`float16 -> float32`、`float32 -> float16`、`complex64 <-> complex128` 等基础转换组合。 - 扩展同步/异步结果一致性用例,覆盖 `bool`、`int8`、`int16`、`uint16`、`int64`、`float16`、`bfloat16`、`float32`、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_e5m2`、`float8_e4m3fn`、`complex32` 等 `aclnnCast` unsupported dtype 的 CPU cast fallback 正确性测试。 - 保留 `non_blocking=False` 的 H2D/D2H mixed-dtype 结果正确性回归测试。 - mixed-dtype 相关用例限定在 `Ascend910B`、`Ascend910_93`、`Ascend950` 上执行。 3. 补充 `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 属性。 - 用例限定在 `Ascend910B`、`Ascend910_93`、`Ascend950` 上执行。 # 【资料变更】 不涉及 # 【接口变更】 不涉及 # 【功能验证】 # 【CheckList】 > PR提交人对以下CheckList自检项进行全量自检,自检通过或不涉及,均修改 [ ] 为 [x] - [x] 代码注释完备,正确记录错误日志 - [x] 代码实现进行了返回值、空指针等校验 - [x] PR标题正确使用类型标签,如:feat、fix、refactor、docs、test等 - [x] PR持续集成流水线(CI)执行通过,代码检查无异常
likedislike
Pull Request已成功合入, 合并人@ascend-robot
(感谢 zzhongmin 的贡献)
zzhongminzzhongmin成员
6月18日 创建了 pull request,commit edf45e54
ascend-robotascend-robot成员
6月18日 添加了label:ascend-cla/yes
ascend-robot
ascend-robot成员
6月18日 评论:

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
ascend-robotascend-robot成员
6月18日 添加了label:needs-issue
此处折叠了363条消息 查看更多
hbhu_bin成员
7月7日 评论:

/lgtm

likedislike
ascend-robotascend-robot成员
7月7日 添加了label:lgtm
ascend-robotascend-robot成员
7月7日 关闭了关联的issue
ascend-robotascend-robot成员
7月7日 合入了pull request
ascend-robot
ascend-robot成员
7月7日 评论:

Pull Request 已合并或已关闭。

If you want to solve this problem, you can click here to do it in the FAQs.

likedislike