Ascend for PyTorch 训练营学习笔记第五期

举报
黄生 发表于 2026/08/04 11:25:19 2026/08/04
【摘要】 设备管理机制 Ascend for PyTorch 训练营(https://www.chaspark.com/#/s/AscendforPyTorch2026?multi=zh) 第五期跨设备数据搬运(tensor.to('npu'))Python 层:x.to("npu") 触发Dispatch 路由:PyTorch dispatcher 识别目标设备,路由到 copy kernelNPU...

设备管理机制 Ascend for PyTorch 训练营(https://www.chaspark.com/#/s/AscendforPyTorch2026?multi=zh) 第五期

跨设备数据搬运(tensor.to('npu')

  1. Python 层:x.to("npu") 触发
  2. Dispatch 路由:PyTorch dispatcher 识别目标设备,路由到 copy kernel
  3. NPUGuard:c10_npu::NPUGuard 自动切换当前线程到目标 NPU 设备(构造时切、析构时还原)
  4. 底层拷贝:调用 aclrtMemcpy(H2D)在 currentStream 上执行实际字节搬运
void copy_h2d_baseformat_opapi(...) {
    c10_npu::NPUGuard guard(dst.device());  // RAII 自动切设备
    copy_h2d_baseformat_dtype_contiguous_opapi(dst, src, non_blocking);
}

多流(Stream)并行

  • 流 = 设备侧有序命令队列,host 提交后立即返回,device 按 FIFO 串行执行
  • NPU 对应 aclrtStream(类比 CUDA 的 cudaStream_t
场景 行为
同一流内 严格串行,天然有序,前完成后开始
不同流间 可并发执行,无先后保证,默认互不等待
with torch.npu.stream(s1):
    kernel1(tensors)          # 提交到流 s1
with torch.npu.stream(s2):
    kernel2(other_tensors)    # 提交到流 s2,与 s1 并发

目的:计算与通信/数据拷贝重叠,隐藏传输延迟,提升吞吐量。

PyTorch 2.x 引入 torch.accelerator,把"当前用哪个加速后端"抽象成统一入口,让同一份脚本跨 CUDA/NPU 通用,无需写死 torch.cudatorch.npu

import torch
# 不写死 torch.cuda / torch.npu
if torch.accelerator.is_available():
    dev = torch.accelerator.current_device()   # cuda:0 或 npu:0
    torch.accelerator.set_device(0)
    x = torch.randn(4, device=dev)
    torch.accelerator.synchronize()              # 统一同步入口

底层链路:

  • torch.accelerator.*at::getAccelerator() 选 DeviceType(PrivateUse1 > CUDA)
  • VirtualGuardImpl(type) 查 GuardImpl 注册表
  • → 后端实现 CUDAGuardImpl / NPUGuardImpl

设备切换的两种触发方式

方式 触发场景 调用链路
显式 set_device Python 侧主动调用 torch.npu.set_device(1) torch_npu.npu.set_device_get_device_indextorch_npu._C._npu_setDeviceTHNPModule_setDevice_wrapnpu_lazy_init()(ACL 初始化)→ NpuSysCtrl::ExchangeDevicec10_npu::SetDeviceaclrtSetDevice
隐式 device guard 框架自动,如 x.npu()x.to("npu:1") C++ copy kernel 里自动切到目标设备,作用域结束自动还原(RAII)

torch.accelerator 提供统一跨后端编程接口;设备切换既支持 Python 显式设置,也支持 C++ 层通过 guard 自动管理,最终都落到 ACL Runtime 的 aclrtSetDevice

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。