ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

如何在PyTorch中使用CANN SHMEM Python扩展:替代MPI的分布式训练通信实战指南

如何在PyTorch中使用CANN SHMEM Python扩展:替代MPI的分布式训练通信实战指南 如何在PyTorch中使用CANN SHMEM Python扩展替代MPI的分布式训练通信实战指南【免费下载链接】shmemCANN SHMEM 是面向昇腾平台的多机多卡内存通信库基于OpenSHMEM 标准协议实现跨设备的高效内存访问与数据同步。项目地址: https://gitcode.com/cann/shmemCANN SHMEM 是面向昇腾平台的多机多卡内存通信库基于 OpenSHMEM 标准协议实现跨 NPU 设备的高效内存访问与数据同步。本文带你掌握CANN SHMEM Python 扩展在 PyTorch 中的用法从shmem.core初始化、对称内存分配、put/get 远程内存访问到通过 Torch Binding 把 SHMEM 算子挂进torch.classes逐步替代传统 MPI 集合通信让你的分布式训练代码更简洁、延迟更低。一、为什么在 PyTorch 里用 SHMEM 替代 MPI传统方案里多卡数据交换通常依赖torch.distributed的 NCCL 后端或 MPI 进程间通信数据要经过打包 → 传输 → 解包CPU 参与度高、小消息延迟大。而 SHMEM 提供的是对称内存Symmetric Memory模型统一地址空间每张卡PE上分配的同位置内存互为镜像通过buffer/get_peer_buffer就能换算出对端地址单边操作RMAput/get直接读写远端对称内存对端无需参与CPU 零拷贝介入信号同步signal_opsignal_wait用信号字替代复杂的分布式屏障粒度更细、开销更小。对 PyTorch 用户来说SHMEM 有两套接入路径接入方式入口适用场景纯 Python APIimport shmem/shmem.core在torch.distributed流程中自定义通信逻辑Torch Binding 算子torch.classes.ShmemOps把 allgather、KV shuffle 等算子封装成 PyTorch 自定义类两者源码分别在 src/python/shmem/ 和 examples/torch_binding/完整接口文档见 docs/api/pythonAPI.md。二、一键编译安装准备 SHMEM Python 扩展️编译步骤在 shmem 仓库根目录执行# 编译 example 算子用例及其 torch 扩展 bash scripts/build.sh -python_example source install/set_env.sh编译完成后Torch 绑定库aclshmem_torch.so会产出在构建目录中它由 examples/torch_binding/CMakeLists.txt 驱动自动定位当前环境的torch与torch_npu路径并链接shmem库。运行前请确保已加载 CANN 与 SHMEM 的环境变量set_env.sh每个进程独占一张 NPU。 多 PE 用例统一用torchrun拉起所有 PE 必须按相同顺序执行集合操作——这与 MPI 的调用约束一致但对用户是透明的。三、初始化实战用 UniqueID 替代 MPI_CommSHMEM 的初始化不依赖 MPI。它采用UIDUniqueID引导模式由 rank 0 生成一个唯一 ID 字节串广播给所有进程后各自调用init完成运行时启动。在 PyTorch 里这个广播可以直接复用torch.distributedimport shmem.core as core import torch.distributed as dist pe dist.get_rank() nranks dist.get_world_size() # 1. rank0 生成唯一ID经 NCCL 广播分发 unique_id core.get_unique_id() if pe 0 else None uid_list [unique_id] dist.broadcast_object_list(uid_list, src0) # 2. 各 PE 用 UID 初始化 SHMEM 运行时集合操作 core.init(rankpe, nranksnranks, mem_size1024**3, uiduid_list[0], initializer_methoduid)初始化时各进程之间会通过内置的ConfigStore完成握手rank 0 启动配置服务器其余进程经 TCP 交换拓扑信息之后所有通信走数据面HCCS / SDMA / RDMA控制面开销只发生一次。这个引导过程对应源码 src/host/bootstrap/shmemi_bootstrap_uid.cpp。四、对称内存与 put/getPyTorch 张量也能直接寄快递分配对称缓冲区集合操作所有 PE 同序调用buf core.buffer(8 * 1024**2, mem_typecore.MemType.DEVICE_SIDE) peer_buf core.get_peer_buffer(buf, remote_pe) # 换算对端地址 core.put(dstpeer_buf, srcbuf, remote_pe1) # 单边写远端put/get都是按流排序的Host 调用只把操作排入 ACL Stream同步该流后即可观测到完成天然适配 PyTorch 的异步执行模型。RMA 底层由 DMA 引擎搬运数据对端无需任何 CPU 参与等待远端数据就绪用信号字代替 barriercore.signal_op(signal_var, 1, core.SignalOp.SIGNAL_SET, remote_pe1, streams) core.signal_wait(signal_var, 1, core.ComparisonType.CMP_GE, streams)这套模式与 MPI 的MPI_Send/MPI_Wait相比省去了消息打包与进程参与特别适合梯度推送、参数拉取等我知道你准备好了只等数据落地的场景。五、Torch Binding 实战一行 compute() 完成 AllGather 想让 SHMEM 算子像 PyTorch 算子一样被调用官方提供了 Torch Binding 演示编译后会向torch.classes.ShmemOps注册三个类Torch 算子类功能对应 C 样例ShmemOps.Managerinit / finalize / malloc_tensor / free_tensorexamples/torch_binding/ShmemOps.AllGather多卡 AllGather 集合通信examples/allgather/ShmemOps.KVShuffleLLM 推理 KV Cache 均衡交换examples/kv_shuffle/注册逻辑见 examples/torch_binding/src/torch_bindings.cpp其中malloc_tensor直接把aclshmem_malloc分配的对称内存包装成at::TensorPyTorch 张量从此可以参与 SHMEM 通信。运行演示脚本默认 8 卡--pes可指定 2/4/8cd examples/python_extension/torch_test python allgather.py # 八卡用例 python allgather.py --pes 2 # 两卡用例examples/python_extension/torch_test/allgather.py 的核心流程只有四步load_torch_library(aclshmem_torch.so) # 1. 加载 torch 扩展 manager torch.classes.ShmemOps.Manager() manager.attr_init(pe, PES, 1024**3, tcp://127.0.0.1:8662) # 2. SHMEM 初始化 allgather torch.classes.ShmemOps.AllGather() # 3. 创建算子实例 allgather.compute(aclshmem_output, local_input_npu) # 4. 一次调用完成 AllGather脚本内部用multiprocessing拉起多个进程、各自绑定一张 NPU执行compute后用 golden 数据校验结果--tool 1还能顺带挂上torch_npu.profiler采集性能数据。KV Cache 均衡场景请看 examples/python_extension/torch_test/kv_shuffle.py。六、进阶多机训练与常见问题排查多机启动跨机场景用标准torchrun参数拉起即可SHMEM 通过 ConfigStore 完成跨机握手SHMEM_TEST_ENGINEROCE torchrun \ --nnodes2 --nproc-per-node1 \ --node-rank${NODE_RANK} \ --master-addr${MASTER_ADDR} --master-port${MASTER_PORT} \ examples/python_extension/test/core/test_memory.py常见问题清单进程卡住 / 超时多数是各 PE 集合操作调用顺序不一致或有进程提前退出——所有 PE 必须同序调用init、buffer、free等集合接口初始化失败检查 rank 0 的ip:port是否可达、端口是否被占用可参考 docs/debug/images/trouble-shooting/ 的排查截图内存错误排查编译时加-mssanitizer运行改用mssanitizer -- python xxx.py方式拉起mssanitizer 与 msprof 不能同时使用完整用例参考examples/python_extension/README.md 覆盖了 memory、sync、多实例、handle_wait 等全套用例。七、写在最后CANN SHMEM Python 扩展给 PyTorch 用户提供了一条不依赖 MPI 的低延迟多卡通信路径shmem.core负责运行时管理UID 初始化、对称内存、put/get、信号同步全部 Python 调用Torch Binding 负责算子封装AllGather、KVShuffle 等以torch.classes形式即插即用集合操作同序调用 按流排序的 RMA让通信自然融入 PyTorch 异步流水线。建议从 examples/python_extension/ 的最小用例跑起再逐步替换自己训练框架中的通信层——从MPI 思维切换到对称内存思维分布式代码会变得更短、更快。✨【免费下载链接】shmemCANN SHMEM 是面向昇腾平台的多机多卡内存通信库基于OpenSHMEM 标准协议实现跨设备的高效内存访问与数据同步。项目地址: https://gitcode.com/cann/shmem创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表