尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

CANN SHMEM Quick Start 实战指南:Ascend 平台多机多卡共享内存通信库的构建、安装与运行验证

CANN SHMEM Quick Start 实战指南:Ascend 平台多机多卡共享内存通信库的构建、安装与运行验证 CANN SHMEM Quick Start 实战指南Ascend 平台多机多卡共享内存通信库的构建、安装与运行验证【免费下载链接】shmemCANN SHMEM 是面向昇腾平台的多机多卡内存通信库基于OpenSHMEM 标准协议实现跨设备的高效内存访问与数据同步。项目地址: https://gitcode.com/cann/shmem本篇技术指南面向昇腾Ascend平台的模型与算子开发者系统讲解 CANN SHMEM 共享内存通信库的环境准备、源码构建、.run 软件包安装、allgather 示例验证、单元测试以及 Python wheel 与 Unique ID 初始化等完整上手路径。阅读并跟随操作后你将能够在 Atlas 系列硬件上独立完成 SHMEM 的编译安装、核心功能验证和多进程初始化为开发跨设备数据同步及通信-计算融合算子打下基础。本文以 docs/quickstart_en.md 为主体并结合仓库内 scripts/build.sh、scripts/run.sh 与 examples/allgather 等源码与脚本细节进行深化说明。项目定位与核心能力CANN SHMEM 面向昇腾平台的多机多卡内存通信场景为模型与算子开发者提供可移植、易用的多设备多卡内存访问模式帮助开发者快速搭建设备间数据同步能力加速通信算子或通信-计算融合算子的开发。从软件架构上看SHMEM 的 API 分为两大类别Host 侧 API提供初始化init、内存管理memory management、团队管理team management与同步synchronization功能对应仓库 include/host 目录下的头文件以及 src/host 下的实现代码Device 侧 API提供内存访问memory access、同步与团队管理功能对应 include/device 与 src/device。这种双端 API设计遵循昇腾算子开发范式支持 host-device 协作。关于 API 分类的更完整说明可参考 代码组织结构文档。仓库目录结构仓库顶层目录布局如下├── 3rdparty // 依赖的第三方库 ├── docs // 文档 ├── examples // 使用示例 ├── include // 头文件 ├── scripts // 相关脚本 ├── src // 源码 └── tests // 测试用例其中 include 按device/、host/、host_device/细分如 include/device/gm2gm、include/device/ub2gm、include/device/teamsrc 下同样划分为device/、device_simt/、host/、host_device/、python/其中 host 侧又细分为bootstrap/、data_plane/、mem/、sync/、team/、transport/、utils/等模块。更多结构细节见 代码组织结构文档。软硬件版本要求在开始构建之前请确认环境满足以下条件项目要求支持硬件型号Atlas 800I A2/A3 系列、Atlas 800T A2/A3 系列平台架构AArch64 / x86软件依赖驱动固件 Ascend HDK 25.0.RC1.1、CANN 8.3.RC1 及以上CANN 工具链及配套固件驱动的安装方法见 CANN 官方软件安装指南构建工具CMake 3.19 及以上系统库GLIBC 2.28 及以上需要说明的是当前仓库仅支持昇腾平台不支持其他硬件架构。此外README_en.md 中提示安装 Python wheel 后运行libshmem.so时建议 GLIBC 2.34 及以上否则可能因缺少符号导致加载失败可通过ldd --version检查本机 glibc 版本。快速开始环境准备与源码构建1. 设置 CANN 环境变量以 root 用户安装的默认路径为例source /usr/local/Ascend/ascend-toolkit/set_env.sh从 scripts/build.sh 的实现可以看到构建脚本会自动定位并 sourceset_env.sh优先使用${ascend_dir}/ascend-toolkit/set_env.sh其次是${ascend_dir}/set_env.sh如果两者同时存在会给出告警并优先使用新路径。2. 构建共享内存库在仓库根目录执行构建并加载构建产物的环境变量cd shmem bash scripts/build.sh source install/set_env.sh构建脚本默认构建 RELEASE 版本对应 A2/A3 平台的 910 系列 SOC若目标为 Ascend 950 平台需追加-soc_type Ascend950。常用构建选项可通过 scripts/build.sh 的print_usage查看核心参数如下构建选项作用-examples构建示例同时启用 catlass 依赖-uttests以 Debug 模式构建单元测试启用 googletest-python_extension构建 Python 扩展与 wheel 包多 SOC wheel910 950-python_example构建示例算子及其 PyTorch 扩展-enable_rdma启用 RDMA 支持Ascend 950 上需与-rdma_backend配合-rdma_backend XSCALE\|HNS_1825指定 RDMA 后端仅 Ascend 950-enable_simt启用 SIMT 支持-enable_relay启用 UDMA relay绕行支持依赖 Ascend 950 的 UDMA-debugDebug 构建-package打包生成.run安装文件-full全量构建wheel、示例、UT、打包-clean构建前清理 build 目录-soc_type type指定 SOC 类型如Ascend950注意脚本默认会复用仓库根目录build/下的 CMake 缓存与编译产物当切换工具链、清理过期配置或需要全量重编时使用bash scripts/build.sh -clean。构建过程中会自动下载 googletestv1.14.x与 nlohmann/jsonv3.11.3等第三方依赖到3rdparty/离线环境下需提前准备。3. 使用 .run 安装包软件包命名为SHMEM_{version}_linux-{arch}.run其中{version}为软件版本{arch}为 CPU 架构。安装依赖 CANN 环境步骤如下chmod x Software package name.run # 授予软件包执行权限 ./Software package name.run --check # 检查安装包的一致性与完整性 ./Software package name.run --install # 安装软件可用 --help 查询安装选项若输出xxx install success!字样说明安装成功。安装完成后同样可通过source /usr/local/Ascend/shmem/latest/set_env.sh加载环境二进制包默认安装路径。4. 关于 TLS 通信加密默认情况下SHMEM 的 TLS 通信加密处于开启状态。如需关闭可在初始化之前调用以下 C APIint32_t ret aclshmemx_set_conf_store_tls(false, NULL, 0);务必在aclshmemx_init_attr之前调用该接口初始化完成后 TLS 配置不可再修改。安全相关的详细说明见 安全说明文档关闭加密后请确保通信网络为可信内网防止数据泄露。运行示例验证核心功能以allgather示例为例验证集群通信、数据搬运与精度校验功能在shmem/根目录构建示例bash scripts/build.sh -examples进入shmem/examples/allgather目录运行 demobash run.sh -pes 2 -type int32_t该示例实现基于 SHMEM 的 allgather 集合通信每个 PE 将本地数据收集到所有 PE同时完成精度校验并将性能数据输出到result.csv。run.sh 参数说明examples/allgather/run.sh 支持以下参数完整说明见 examples/allgather/README_en.md参数默认值说明-pes2参与通信的 PE 数量可选 2、4、8-typeint32_t传输数据类型可选 int32_t、float16_t、bfloat16_t-ipporttcp://127.0.0.1:8766初始化监听的 IP 地址与端口需保证端口空闲且可绑定-gnpus8使用的 NPU 卡数若大于-pes脚本会自动调整为 PE 数-fnpu0首张 NPU 卡 ID多卡按卡 ID 升序分配-fpe0首个 PE ID-toolmsprof性能采集工具当前仅支持 msprof典型用法# 2 个设备、int32_t 数据类型 bash run.sh -pes 2 -type int32_t # 4 个设备、float16_t 数据类型从 NPU 卡 2 开始使用 4 张卡 bash run.sh -pes 4 -type float16_t -fnpu 2从 examples/allgather/run.sh 的脚本实现可以看到其工作流程先用scripts/data_gen.py生成 golden 数据随后设置SHMEM_UID_SESSION_ID127.0.0.1:8899按-gnpus指定的数量以 msprof 包装方式并行拉起多个allgather进程最后用scripts/data_statistic.py汇总性能数据。示例代码仅供参考请勿直接在生产环境使用。说明示例中展示的是本仓库的 C 示例。PyTorch 集成场景下allgather.py与 C 示例共享同一套 kernel 实现运行约束PE 数量仅支持 2、4、8数据类型为 int32/float16/bfloat16也保持一致详见 examples/python_extension/torch_test/README_en.md。功能自测单元测试在项目根目录依次执行bash scripts/build.sh -uttests bash scripts/run.shscripts/run.sh 提供了-ranks、-test_filter等参数用于指定执行测试的设备数量与 gtest 过滤规则参数默认值说明-ranks8参与测试的 rank设备数量必须是数字-test_filter*.*gtest 过滤规则也支持通过环境变量GTEST_FILTER传入-ipport随机端口初始化 bootstrap 监听地址格式如tcp://ip:port-gnpus8使用的 NPU 卡数-fnpu0首张 NPU 卡 ID-frank0首个 rank ID示例在 8 个设备上运行所有名称包含Init的测试用例bash scripts/run.sh -ranks 8 -test_filter Init从 scripts/run.sh 的实现可以看到脚本会生成随机 bootstrap 端口并导出SHMEM_UID_SESSION_ID、关闭 TLSSMEM_CONF_STORE_TLS_ENABLE0随后调用./bin/aclshmem_unittest执行 gtest 用例并输出 XML 报告UT 运行前后还会通过 tests/unittest/scripts/hbm_leak_check.sh 对 HBM 内存进行泄漏采样比对若环境未安装 lcov则跳过覆盖率统计。单元测试需要在具备 NPU、驱动与 CANN 运行时的硬件环境中执行。Python 测试用例与 wheel 安装cann-shmemPython wheel 仅支持 Python 3.10 至 3.12并依赖 TorchNPUpip 包名torch-npu。安装 wheel 前请先按当前 CANN、Python 版本与 CPU 架构准备匹配的torch-npu。完整的 Python API 列表见 Python API 文档。从昇腾私有索引安装时可将公共 PyPI 配置为补充索引以获取私有索引未镜像的依赖python3 -m pip install cann-shmem \ --index-url https://ascend.devcloud.huaweicloud.com/cann/pypi/simple/ \ --extra-index-url https://pypi.org/simple/注意pip 会合并两个索引的候选包不保证来源优先级。生产环境建议先显式安装匹配的torch-npu版本再仅使用昇腾私有索引安装cann-shmem。本地构建并安装 wheel在仓库根目录构建 Python 扩展与 wheel 包bash scripts/build.sh -python_extension从 scripts/build.sh 的fn_whl_build实现可以看到该过程会依次构建 910、950XSCALE、950HNS_1825等多个 SOC 后端将各后端libshmem.so拷贝到install/shmem/backends/soc/最终通过python3 setup.py bdist_wheel打出多 SOC wheel运行时__init__.py会根据当前 SOC 预加载对应后端的libshmem.so。加载环境变量source install/set_env.sh安装dist目录下生成的 wheel 包python3 -m pip install --force-reinstall dist/cann_shmem-*.whl按需启用或禁用 TLS 认证默认启用import shmem as shm shm.set_conf_store_tls(False, ) # 禁用 TLS 认证import shmem as shm tls_info xxx shm.set_conf_store_tls(True, tls_info) # 启用 TLS 认证使用 Torchrun 运行测试 demotorchrun --nproc-per-nodek test.py // k 为要运行的 rank 数量若日志输出test.py running success!说明 demo 运行成功。提示安装 wheel 后可使用shmem-config --version查询版本、shmem-config --diagnose检查原生库加载与包完整性详见 shmem-config 使用指南。Unique ID 初始化方式当使用 Unique ID 相关 API 进行初始化时可手动配置环境变量SHMEM_UID_SESSION_ID或SHMEM_UID_SOCK_IFNAME若两个变量同时配置仅读取SHMEM_UID_SESSION_ID若均未配置默认自动搜索可用网络端口搜索优先级为非虚拟网口排除 lo/docker/veth/br-/virbr/tun/tap优先于虚拟网口SHMEM_UID_SESSION_ID支持 IPv4 地址、IPv6 地址和主机名。SHMEM_UID_SESSION_ID配置示例SHMEM_UID_SESSION_ID127.0.0.1:1234 SHMEM_UID_SESSION_ID[6666:6666:6666:6666:6666:6666:6666:6666]:886 SHMEM_UID_SESSION_ID[6666:6666:6666:6666:6666:6666:6666:6666%eth]:886 SHMEM_UID_SESSION_IDlocalhost:8888SHMEM_UID_SOCK_IFNAME配置示例SHMEM_UID_SOCK_IFNAMEenpxxxx:inet4 # IPv4 SHMEM_UID_SOCK_IFNAMEenpxxxx:inet6 # IPv6 SHMEM_UID_SOCK_IFNAMEeth0 # 自动检测可用协议优先 IPv4Python 初始化示例将以下代码保存为init.py可参考 examples/python_extension/test/unique_id_test.py 的完整用例import shmem as ash # xxx uid ash.aclshmem_get_unique_id() ret ash.aclshmem_init_using_unique_id(rank, world_size, mem_size, uid) # xxx随后使用torchrun --nproc-per-node 8 init.py启动进程数可按需调整。从 examples/python_extension/test/unique_id_test.py 的实现可以看到完整的初始化流程rank 0 调用ash.aclshmem_get_unique_id()获取 uid通过dist.broadcast_object_list广播给所有进程各进程再以ash.aclshmem_init_using_unique_id(pe, world_size, g_ash_size, unique_id)完成初始化随后可进行aclshmem_malloc分配、my_pe()/pe_count()校验与aclshmem_finalize()释放。C 初始化示例aclshmemx_uniqueid_t uid; aclshmemx_init_attr_t attributes; int ret aclshmemx_get_uniqueid(uid); ret aclshmemx_set_attr_uniqueid_args(my_pe, n_pes, mem_size, uid, attributes); status aclshmemx_init_attr(ACLSHMEMX_INIT_WITH_UNIQUEID, attributes);常见问题速查构建时提示 CANN environment not found确认已安装 CANN 工具链并执行source /usr/local/Ascend/ascend-toolkit/set_env.sh且 CANN 版本满足上文软硬件版本要求。运行示例时提示 inter-device communication timeout检查 RDMA 网卡可用性、节点间网络连通性、防火墙是否放行初始化通信端口默认 8666、交换机无损网络配置是否正确以及各节点时钟是否同步。Python 导入 shmem 报 module not found确认 wheel 已安装、已 sourceinstall/set_env.sh且PYTHONPATH包含 shmem 路径。关闭 TLS 后仍报加密失败aclshmemx_set_conf_store_tls必须在aclshmemx_init_attr之前调用初始化后无法修改。离线环境构建报 git 拉取依赖失败googletestUT 构建用与 nlohmann/jsonAscend 950 构建用默认由构建脚本自动下载离线环境需提前放入3rdparty/googletest与3rdparty/json。更完整的排障指引见 故障排查 FAQ术语与缩写说明见 术语表。【免费下载链接】shmemCANN SHMEM 是面向昇腾平台的多机多卡内存通信库基于OpenSHMEM 标准协议实现跨设备的高效内存访问与数据同步。项目地址: https://gitcode.com/cann/shmem创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表