
CANN SHMEM 算子运行时环境搭建指南run.sh 环境注入与 setup_shmem_runtime_env 全解析【免费下载链接】shmemCANN SHMEM 是面向昇腾平台的多机多卡内存通信库基于OpenSHMEM 标准协议实现跨设备的高效内存访问与数据同步。项目地址: https://gitcode.com/cann/shmem本文面向在昇腾平台上基于 CANN SHMEM 编写和运行 custom-ops 算子的开发者系统讲解算子scripts/run.sh应如何注入 CANN 与 SHMEM 运行时环境重点剖析setup_shmem_runtime_env、setup_shmem_dynamic_endpoints、warn_shmem_stale_processes三个核心函数的职责与实现并给出完整可复制的脚本骨架与常见故障排查路径。阅读完本文你将能够编写一份不依赖任何 skill 附属文件、可重复执行的 SHMEM 算子运行脚本并理解IPPORT、SHMEM_UID_SESSION_ID、LD_LIBRARY_PATH等环境变量在运行时链路中的真实作用。背景为什么 run.sh 需要一套环境注入协议CANN SHMEM本仓库 README.md 定位为面向昇腾平台的多机多卡内存通信库基于 OpenSHMEM 标准协议的算子程序从编译到运行依赖三层环境的叠加CANN 工具链环境由set_env.sh常见路径/usr/local/Ascend/ascend-toolkit/set_env.sh注入提供ASCEND_HOME_PATH等基础变量SHMEM 安装环境由仓库内的 scripts/set_env.sh构建后复制到install/set_env.sh注入设置SHMEM_HOME_PATH并把install/shmem/lib、driver 库和 bin 目录加入环境算子自身产物${OP_DIR}/build/lib中的算子动态库。如果 run.sh 只手动export LD_LIBRARY_PATHbuild/lib而跳过install/set_env.sh会缺失 bootstrap 插件与 driver 库典型症状为aclError:100000或 golden 结果全 FAIL见 build-test.md §1 的反模式说明。因此环境注入顺序有强约束先 CANN、再 SHMEM install、最后追加算子与ASCEND_HOME_PATH/lib64到LD_LIBRARY_PATH且禁止只设build/lib。run.sh 推荐结构从仓库根目录定位到环境注入一个规范的算子 run.sh首先需要稳健地推导出仓库根目录再调用统一的环境注入函数SCRIPT_DIR$(cd $(dirname ${BASH_SOURCE[0]}) pwd) OP_DIR$(dirname $SCRIPT_DIR) SHMEM_REPO$(cd ${OP_DIR}/../.. pwd) # 内联下列函数或 source 已生成的 custom-ops/scripts/shmem_runtime_env.sh source ${SHMEM_REPO}/custom-ops/scripts/shmem_runtime_env.sh setup_shmem_runtime_env ${SHMEM_REPO} ${OP_DIR} || exit 1这段代码的三行路径推导是关键SCRIPT_DIR取当前脚本所在目录无论从何处被调用BASH_SOURCE[0]都指向脚本真实路径OP_DIR算子工程目录run.sh位于OP_DIR/scripts/下SHMEM_REPO仓库根目录OP_DIR/../..上溯两级。之后source生成的custom-ops/scripts/shmem_runtime_env.sh并立即调用setup_shmem_runtime_env任何一步失败即exit 1。这种推导路径 单一函数注入的写法保证脚本可以在任意工作目录下被调用而不出错。需要指出的是custom-ops/是 skill 工作流生成的交付树并非本 SHMEM 仓库自带目录其中custom-ops/scripts/shmem_runtime_env.sh由工作流生成其内容与本文内联函数必须保持一致见 custom-ops-entrypoints.md。HCCL baseline 场景的追加配置当算子脚本需要作为 HCCL昇腾集合通信库baseline 对比基线运行时应在setup_shmem_runtime_env之后追加export CANN_SET_ENV${CANN_SET_ENV:-/usr/local/Ascend/ascend-toolkit/set_env.sh} source ${CANN_SET_ENV} export HCCL_WHITELIST_DISABLE1HCCL_WHITELIST_DISABLE1用于关闭 HCCL 的白名单校验baseline 采集时需要该变量是 HCCL 生态既有约定。注意CANN_SET_ENV使用${VAR:-默认值}形式——用户已显式指定时保留用户值否则回退到默认系统安装路径。函数一setup_shmem_dynamic_endpoints——动态端点分配IPPORTtcp store 地址与SHMEM_UID_SESSION_IDunique id 初始化模式下 PE 0 的监听 socket如果被写死多轮测试会因端口或会话冲突而失败。正确做法是用户已导出时保留原值否则随机化setup_shmem_dynamic_endpoints() { if [[ -z ${IPPORT:-} ]]; then local _run_port$((27010 RANDOM % 900)) export IPPORTtcp://127.0.0.1:${_run_port} fi if [[ -z ${SHMEM_UID_SESSION_ID:-} ]]; then export SHMEM_UID_SESSION_ID127.0.0.1:$((8899 RANDOM % 900)) fi }IPPORT未设置时在27010..27909范围内随机取端口格式为tcp://127.0.0.1:portSHMEM_UID_SESSION_ID未设置时在8899..9798范围内随机取端口。关于SHMEM_UID_SESSION_ID仓库文档 env_vars_intro.md 给出了完整格式约束使用 unique id 接口初始化时需要手动配置SHMEM_UID_SESSION_ID或SHMEM_UID_SOCK_IFNAME同时配置时只读SHMEM_UID_SESSION_ID指定SHMEM_UID_SESSION_ID时需保证 IP 可连通、端口空闲。其支持三种格式IPv4 字面量ip:port如192.168.1.100:1234IPv6 字面量[ip]:port如[6666:6666:6666:6666:6666:6666:6666:6666]:886主机名hostname:port如localhost:8888通过 DNS、/etc/hosts 等解析。可以看到本函数生成的127.0.0.1:8899..9798正是 IPv4 字面量格式且默认落在 SHMEM 约定的 8899 起始端口区间。仓库内的示例脚本也体现了这一约定例如 examples/aclgraph_demo/run.sh 中IPPORTtcp://127.0.0.1:8766、export SHMEM_UID_SESSION_ID127.0.0.1:8899——区别在于示例脚本面向单次确定性演示可以写死而自动化多轮测试必须动态分配。函数二warn_shmem_stale_processes——残留进程预警多轮测试中上一轮未退出的torch_test_*.py进程可能继续占用 tcp store 端口或 SHMEM 会话导致新一轮初始化失败。该函数在启动前做一次轻量探测warn_shmem_stale_processes() { if pgrep -f torch_test_.*\.py /dev/null 21; then echo [WARN] 检测到仍在运行的 torch_test 进程可能占用 tcp store 端口或 SHMEM 会话。 2 echo [WARN] 请先结束这些进程或为本轮测试设置独立的 IPPORT / SHMEM_UID_SESSION_ID。 2 fi }它只负责预警而非强杀进程pgrep -f按完整命令行匹配torch_test_*.py模式命中时向 stderr 输出提示建议手动结束进程或改用独立的IPPORT/SHMEM_UID_SESSION_ID。与setup_shmem_dynamic_endpoints配合即可在动态端口 残留检测双保险下展开新一轮测试。函数三setup_shmem_runtime_env——完整运行时链路核心这是环境注入的总入口其执行顺序被标注为 MUST强制任何一步缺失都可能导致运行时失败若ASCEND_HOME_PATH未设置则source ${CANN_SET_ENV}source ${SHMEM_REPO}/install/set_env.shSHMEM 原生安装环境依次将${SHMEM_REPO}/build/lib、可选${OP_DIR}/build/lib、${ASCEND_HOME_PATH}/lib64前置到LD_LIBRARY_PATH调用setup_shmem_dynamic_endpoints与warn_shmem_stale_processes。完整实现setup_shmem_runtime_env() { local project_root$1 local op_dir${2:-} if [[ -z ${ASCEND_HOME_PATH:-} ]]; then if [[ -n ${CANN_SET_ENV:-} -f ${CANN_SET_ENV} ]]; then source ${CANN_SET_ENV} else echo [ERROR] ASCEND_HOME_PATH not set. 2 return 1 fi fi local set_env${project_root}/install/set_env.sh if [[ ! -f ${set_env} ]]; then echo [ERROR] ${set_env} not found; run: bash scripts/build.sh -examples 2 return 1 fi source ${set_env} export LD_LIBRARY_PATH${project_root}/build/lib:${LD_LIBRARY_PATH} if [[ -n ${op_dir} ]]; then export LD_LIBRARY_PATH${op_dir}/build/lib:${LD_LIBRARY_PATH} fi export LD_LIBRARY_PATH${ASCEND_HOME_PATH}/lib64:${LD_LIBRARY_PATH} setup_shmem_dynamic_endpoints warn_shmem_stale_processes }步骤 1CANN 环境解析ASCEND_HOME_PATH函数首先检查ASCEND_HOME_PATH注意官方变量名是ASCEND_HOME_PATH不是ASCEND_HOME。若未设置则尝试source ${CANN_SET_ENV}而CANN_SET_ENV的解析遵循 cann-env-resolution.md 中的约定默认路径候选按顺序探测/usr/local/Ascend/ascend-toolkit/set_env.sh→/usr/local/Ascend/cann/set_env.sh→$HOME/Ascend/cann/set_env.sh用户自定义路径如/opt/Ascend/ascend-toolkit/set_env.sh必须显式确认禁止在未确认时静默 source 默认路径。${ASCEND_HOME_PATH}在 CANN 中的实际作用可以从 scripts/build.sh 中印证构建脚本会检查ASCEND_HOME_PATH指向的opp/version.info或version.info以获取 CANN 版本号并将其作为SOC_TYPE构建依据说明ASCEND_HOME_PATH是 CANN 安装目录这一层级的权威变量。步骤 2source install/set_env.shSHMEM 原生环境install/set_env.sh由构建流程生成并复制自仓库 scripts/set_env.sh其核心行为设置SHMEM_HOME_PATH指向安装目录将$SHMEM_HOME_PATH/shmem/lib加入LD_LIBRARY_PATH将/usr/local/Ascend/driver/lib64/driver/加入LD_LIBRARY_PATHdriver 库将$SHMEM_HOME_PATH/bin加入PATH若存在 Python 扩展shmem/torch_binding目录追加其 kernels 目录到LD_LIBRARY_PATH。正因为该脚本同时注入 bootstrap 插件、driver 库和 Python 扩展路径跳过它而只手动设build/lib必然导致运行时缺库。若install/set_env.sh不存在函数会提示先执行bash scripts/build.sh -examples——这是 scripts/build.sh 提供的构建入口-examples选项会开启USE_EXAMPLESON并构建示例程序构建产物输出到build/安装产物输出到install/。步骤 3LD_LIBRARY_PATH 的追加顺序LD_LIBRARY_PATH采用前置追加新路径:旧路径顺序为SHMEM 构建产物build/lib→ 算子产物op_dir/build/lib→ CANN 运行库ASCEND_HOME_PATH/lib64。这个顺序保证动态链接时优先命中 SHMEM 源码树构建出的最新libshmem.so而非系统安装的旧版本算子自身的.so位于 SHMEM 之后可覆盖同名库的解析CANNlib64殿后补齐 ACL、driver 等基础运行库。步骤 4端点分配与残留检查最后调用前两个辅助函数完成端口动态化与残留进程预警使整个链路具备多轮可重复运行的能力。禁止事项环境注入的负面清单以下行为在 skill 规范中被明确列为禁止见 env-setup.snippet.md 与 custom-ops-entrypoints.md禁止原因与替代方案在.agents/skills/下放置 skill 附属.sh/.py脚本skill 形态要求为 Markdown 代码段函数应内联进 run.sh或由工作流生成custom-ops/scripts/*.sh从 skill 目录source任何文件应内联函数不得假设 skill md 可被 sourcerun.sh 只手动export LD_LIBRARY_PATHbuild/lib而跳过install/set_env.sh缺 bootstrap 插件和 driver 库典型症状aclError:100000或 golden 全 FAIL必须先 source install/set_env.sh写死IPPORT/SHMEM_UID_SESSION_ID多轮测试会因端口/会话冲突失败应调用setup_shmem_dynamic_endpoints动态分配对应的反模式在 SKILL.md 中亦有强调run.sh写死IPPORT/SHMEM_UID_SESSION_ID且不调用setup_shmem_dynamic_endpoints会引发端口占用 → shmem init 失败 → 输出全 0 的连锁问题。故障排查端口与进程相关症状当运行时环境注入不完整时可结合 Troubleshooting_FAQs.md 与 log_debug.md 定位问题aclError:100000通常是缺少 bootstrap 插件或 driver 库检查是否跳过了install/set_env.sh端口被占用 / shmem init 失败检查IPPORT与SHMEM_UID_SESSION_ID是否与残留进程冲突用warn_shmem_stale_processes的提示结束残留torch_test_*.py进程或更换动态端口输出 bin 全 0 但进程打印 SUCCESS先查 SHMEM 日志端口占用、Memory Heap Not Initialized不要直接改 kernel 代码。小结围绕run.sh的环境注入本质上是把CANN 工具链 → SHMEM 安装环境 → 算子产物三层依赖以固定顺序和固定方式串联起来setup_shmem_runtime_env是总入口强制执行先 CANN、再 install/set_env.sh、最后追加 LD_LIBRARY_PATH的 MUST 顺序setup_shmem_dynamic_endpoints负责端点随机化保障多轮测试不冲突warn_shmem_stale_processes负责残留进程预警与动态端口形成双保险IPPORT与SHMEM_UID_SESSION_ID的格式细节由 env_vars_intro.md 规定脚本生成时应遵守其 IPv4/IPv6/主机名格式约束。将上述函数内联进任意算子的scripts/run.sh即可获得一份可复制、可重复执行的 SHMEM 运行时环境注入骨架。若需进一步了解算子的编译方式、CANN 路径确认流程与完整调试链路可继续阅读 build-test.md、cann-env-resolution.md 与 custom-ops-entrypoints.md。【免费下载链接】shmemCANN SHMEM 是面向昇腾平台的多机多卡内存通信库基于OpenSHMEM 标准协议实现跨设备的高效内存访问与数据同步。项目地址: https://gitcode.com/cann/shmem创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考