昇腾开源仓Issue分析解答-CANN精选(二)
昇腾开源仓Issue分析解答-CANN精选(二)
一句话让Agent变成昇腾专家,昇腾任务轻松搞定。评测入口:请按这个开源仓接入昇腾图谱 https://gitcode.com/agent0/kg-tools
总览
| 仓库 | 定位 | 收录条数 |
|---|---|---|
| hccl | AllReduce/AllGather/AllToAll 等集合通信与 MC2 通算融合,分布式训练通信的底座 | 9 |
| hcomm | 点对点/单边通信、memcache 池化与 CCU 通信引擎,PD 分离与 KV 传输的关键路径 | 14 |
| shmem | OpenSHMEM 范式的 PGAS 通信,RDMA/SDMA/UDMA 多传输通道自适应 | 6 |
| hixl | RDMA 传输引擎与 mooncake KV 池化支撑,跨机数据面带宽的守门人 | 6 |
| runtime | 设备/流/事件/内存管理与模型加载执行,ACL 推理程序的运行时底座 | 10 |
| driver | 内核态驱动与设备管理,/dev 节点、ioctl 分发与 npu-smi 的最底层 | 5 |
hccl(HCCL 集合通信库)
AllReduce/AllGather/AllToAll 等集合通信与 MC2 通算融合,分布式训练通信的底座
| 编号 | Issue 问题内容 | 解答总结 |
|---|---|---|
| #113 | 社区检视 all_to_all_v 模块报 17 项风险:整型溢出、空指针、越界、并发安全等 | 官方逐条核实:多数已由入口校验/前序流程防护(HcomCheckUserRank 保证 rankSize 非 0、CalcInputOutputSize 防偏移溢出、threadNum>=1 保证 threads.size>=2、算法编排避免共享资源冲突访问);确认有风险项经 PR#972 修复上库(2026-05-25 合入)。检视类问题须对照算子入口校验链逐条判定真伪,不能盲目加防御代码。 |
| #114 | 社区检视 all_reduce 模块报除零、乘法溢出、空容器访问等风险 | 官方逐条分析:DEFAULT_RANK_SIZE/userRankSize 除零在 userRankSize=0 场景走另一分支不触发;确认有效的问题主线修复,PR#1156 于 2026-06-02 合入闭环。此类检视发现多为"理论可达、实际路径不可达",须结合算法分支判定后再改。 |
| #115 | 社区检视 all_gather/all_gather_v 报除零、溢出、异常路径内存泄露等风险 | 关键实锤一项:all_gather_v_op.cc:222 异常路径未释放 paramMem 致内存泄露,PR#774 修复上库(2026-06-04 合入);其余多不成立——jettyNum_ 固定初始化为 1、recvCounts/recvDispls 由上层框架保证、thread 实为流且同步已过 checker、单次传输有上限不溢出;CCU 整改将删除部分问题代码。 |
| #152 | 910C上 all_to_all_single 部分卡数耗时百 ms、其余 10ms,差近 10 倍 | 官方要求提供 profiling(用户已交),issue 关闭时未给根因结论,用户质疑"没解决就强行关闭"。[未闭环] 劣化卡数:48/96/112/144/240。卡数相关性能悬崖首先怀疑算法选择随卡数变化(不同算法适用不同拓扑),用 hccl_test 扫卡数复现并留 profiling 证据。 |
| #158 | dist.all_gather 比融合算子慢 3.6 倍(96KB:0.256/0.070ms) | 官方看 profiling 定位(A2 环境):0 卡存在大量 notify 等待,根因是快慢卡不同步的性能差异,与接口无关,用 HCCL 集合通信需保障卡间同步。另 AllGatherMatmulV2 属 MC2 通算融合算子(AllGather 与 MatMul 一体、通信计算重叠),天然优于先通信后计算的 eager 路径,同场景优先选融合接口。 |
| #165 | eager all_to_all_single 后 MC2 报 aicore error,反序正常 | 关键证据:plog 出现 “Already have context, skip create”(op_common.cc:889 按 algTag 复用 eager 通信的 CCU 资源缓存),融合算子复用后触发 CCU remote HBM UCE(retCode=550)。官方未公开结论。[未闭环] 规避:eager 与 MC2 融合算子混用注意同 algTag 复用,必要时隔离通信域。 |
| #304 | CCU 通信引擎下 fp16 all_reduce 累加误差极小,是否内部做了升精度累加? | 官方确认:CCU 通信引擎上的规约操作会升到 32 位再累加,因此 fp16 数据 all_reduce 精度接近 fp32 累加,误差很小。对精度敏感的 fp16 训练/推理场景可直接使用 CCU 路径,无需业务侧手动升精度。 |
| #663 | 950 机型部分 UBX 算子爬坡场景性能低于单跑 1G 场景,爬坡必现 | PR#2727 修复:SelectMeshAlgoAicpuUBX 小数据判定从 !IsSmallData(dataSize) 改为 dataSize > SMALL_COUNT_512KB,统一小数据判定口径(影响 AicpuAllReducePipeLineUBX 等算法选择),ReduceScatter 同步改。根因:爬坡场景数据量渐增被误判为小数据、选错算法。 |
| #685 | HCOMM_TA_CTP_UB_TIMEOUT 值 0-31 除以 8 反推档位,整除规则文档未说清 | 官方澄清按整除计算分档:0-7 为 0 档、8-15 为 1 档、16-23 为 2 档、24-31 为 4 档,各档对应不同超时时间;配置时按目标超时选档位区间内取值即可。文档补充整除细节经 PR#2938 上库(2026-09-08 合入)。 |
hcomm(HCCL 单边通信与 CCU)
点对点/单边通信、memcache 池化与 CCU 通信引擎,PD 分离与 KV 传输的关键路径
| 编号 | Issue 问题内容 | 解答总结 |
|---|---|---|
| #14 | UT 编译运行段错误:gcc≥10 下反复建拆通信域必 core | build.sh --ut 编译通过但用例段错误,堆栈 core 在 gtest 无 HCCL 帧,与 #10 同根因:GCC 10+ 下多次初始化/析构通信域触发段错误(GCC 9.5 正常)。开发者提交最小复现 PR#443;官方上库高版本 gcc 兼容代码后不复现。规避:换用较低版本 gcc 或更新 master 分支。 |
| #186 | 改码重编安装后 device 侧仍跑旧逻辑,日志行号不变 | 自编译 .run 安装成功但 aicpu_scheduler 日志仍打印旧行号,说明新 AICPU 算子包未生效。根因:HDK 25.2.3 过旧,未把 aicpu_hcomm.tar.gz 搬运到 Device 侧加载;升级 HDK 至 25.5.2 后修改生效。排查技巧:比对日志中源码行号即可判断新二进制是否被加载。 |
| #285 | Translate 读 kernelMap_ 的锁与 Register/UnRegister 不一致 | Translate 持 translateMutex_ 读 kernelMap_,而 Register/UnRegister 写时持 kernelMapMutex_——两把锁护同一份数据,形同虚设。同设备多线程操作不同 CcuInsHandle 时 unordered_map 边写边读属未定义行为;单线程先全部 Register 再 Translate 不触发。修复:统一锁,PR#3119 合入。 |
| #286 | CcuKernelMgr::GetKernel 无锁读 kernelMap_,竞态且可能 UAF | GetKernel 无锁 find kernelMap_,UnRegister 持 kernelMapMutex_ 删节点;异常回调 InitChannelMap 持的却是另一把全局 g_channelMapMutex,防不住并发。并发时可读到中间态 unordered_map(未定义行为),且返回裸指针在节点销毁后使用即 use-after-free。修复:统一加互斥锁,PR#3119 已合入。 |
| #670 | 多线程并发 HcommChannelCreate 同 endpoint 竞态 coredump | PD 分离 GLM5.1 模型场景,hixl 多线程在同一 endpoint 下并发建链:原设计未保护 endpoint 资源,竞态使 memhandle 指向空,HostCpuUrmaChannel::ParseInputParam 解析空指针 core。官方确认代码已修改支持并发建链;修复前规避:业务侧加锁串行建链。 |
| #765 | 销毁 team/window 后通信内存未反注册,重建报 already registered | DeepEP Ascend 在同一 communicator 反复建拆 ElasticBuffer,二次 HcclTeamWindowRegister 报错:销毁流程未解除 CommMems 注册,tag 残留被判已注册。官方在关联 PR 修复并重构 AIN 控制面接口,最新文档给出新调用示例。规避:升级修复版,或避免同 communicator 反复建拆 window。 |
| #770 | A3 双机 allreduce 卡死:禁 HCCS 后仍选中 HCCS 专用算法 | HCCL_INTER_HCCS_DISABLE=TRUE 时超节点内双机改走 RoCE,但 AllReduceMeshAivFor91093Executor 仅支持 HCCS 链路,任务超时卡死。修复:SelectAlgfor91093 增加 !GetExternalInputInterHccsDisable() 判断,禁用 HCCS 时不再选该 executor,PR#4672 已合入。 |
| #802 | 确定性计算 STRICT 开关按硬件白名单拦截 A3 | comm config 确定性开关设为 STRICT(保序)时被硬件白名单拦截:原仅放行 A2 系列,而 A3(910_93) 已支持规约保序(可环境变量开启)。修复 PR#4485 放行 910_93。背景:HcclConfig 的 HCCL_DETERMINISTIC 取 0 关/1 确定性/2 strict 保序,文档原注明仅 A2 系列支持。 |
| #809 | CCU quick start 文档缺约束与 rank 说明,无法上手 | 官方逐点解答:CCU 仅 Ascend 950PR/950DT 支持(见 comm_engine.md 对比表),quick start 未写明;root 即 rank0,示例中 aclrtSetDevice(rootRank)+HcclGetRootInfo 生成 rootInfo 再广播给其余 rank;rank1/2/3 到 rank0 的拷贝由 CCU 算子完成。文档将补充产品约束与注释。 |
| #822 | A3 单边通信 CQ overflow,报流同步超时 | CANN 9.1.0 + DeepSeek V4 flash + vLLM-Ascend 0.26.0 PD 分离 + hixl 场景,单边通信完成队列(CQ)被打爆,随后 StreamSynchronize 报超时(0x7030010)。官方修复 PR#4953 已合入;规避:升级含修复的 hcomm 版本。 |
| #829 | memcache 故障重建链失败:销毁链未释放 socket,白名单配额耗尽 | 池化故障场景 server 端 HcommChannelDestroy 后进程保留、client 退出再重建链,异步收包报对端 socket 关闭。根因:销毁 channel 时未释放 socket 资源,server 白名单配额耗尽拒绝新链。修复:Destroy 中补 socket 资源销毁,PR#5004 已合入。 |
| #834 | A2/A3 双机 alltoall 大 CCLBUFFER 跨机 RDMA 执行超时 | CCLBUFFER>80M 双机 alltoall 走 RDMA,alltoallv_continuous_pipeline 算法 WaitValueOfRank 等待对端 flag 超时报错。根因是超时时间配置不当,大 buffer 慢路径下默认门限不足;PR#4754 调整 A2A CP flag 超时已合入。此类等待超时需结合通信量与链路带宽评估合理门限。 |
| #843 | AllToAllV 仅 self copy 时 AICPU cache 路径执行失败 | 2 rank sendCounts=[1,0]/[0,1] 的合法场景(各 rank 只 self copy、remote 量为 0),CANN 9.1.0 默认 AICPU cache 路径失败;同参数 HOST/AIV 展开与 AICPU_CacheDisable、8.5.2 均正常,锁定 cache 边界缺陷。修复 PR#5088/5222 已合入;规避:禁用 cache 或 AIV 展开。 |
| #860 | A3(910_9382) createEndpoint 报芯片类型不支持 | master 分支单边通信 CreateEndpoint 创建 RoCE 链路时,rtGetSocVersion 返回 illegal chipver(0x500000f),cpu_roce_endpoint 初始化抛异常。根因:SOC 版本映射表缺 910_9382(A3)条目;PR#5117 修正映射表已合入。同类报错可先查 soc version 映射是否覆盖当前芯片。 |
shmem(SHMEM 通信库)
OpenSHMEM 范式的 PGAS 通信,RDMA/SDMA/UDMA 多传输通道自适应
| 编号 | Issue 问题内容 | 解答总结 |
|---|---|---|
| #402 | v1.5.0 社区包 kv_shuffle 用例 coredump | 报错看似 shmem 用例崩溃,日志实际定位在 aclrtCreateStream 创建流失败,属 CANN 运行时环境问题而非库缺陷。官方联系提出者排查环境后关闭(后续 14 天无反馈自动关)。同类 basic_filebuf::xsgetn Bad address 中止,先校验驱动/固件与 CANN 版本匹配,再怀疑用例本身。 |
| #429 | SHMEM_UID_SOCK_IFNAME 仅配网口名(如 eth)被校验报错 | 校验逻辑只认『网口名:inet4|inet6』完整写法,仅网口名的历史用法被拒。PR#583 修复 bootstrap 兼容:不指定协议族时自动探测该网口可用地址族,双栈可用优先 IPv4,均不可用才报错;官方文档明确两种格式均合法。配置时需保证网口存在对应协议地址。 |
| #469 | 咨询 Dispatch/Combine 自适应传输策略的 segment size 切换阈值 | 官方答复:并非单一阈值,远端 segment 须同时满足多项条件(含按 pe_size 动态计算、随卡数与路由分布自适应)才走 SDMA,否则走 direct MTE;2MiB 由编译期常量 MIN_SDMA_BYTES 决定,暂无运行时配置接口。推荐沿用默认 2MiB,2/4/8 卡无需分别调整;全局数据量小时注意 SDMA 固定开销。 |
| #472 | Ascend950 CMO quiet 异常、RMA 误选 SDMA、STARS 固定 48 AIV | ①CMO 后 quiet 完成标志搬运方式与平台能力不匹配,可能无法完成;②高阶 RMA 仅按 topology transport bit 选 SDMA,未按架构屏蔽 950 不支持的 put/get 路径;③Host 固定按 48 个 AIV 核建 STARS stream,未按实际核数。PR#642/643/644 同日修复并覆盖 master/v1.5.0/v1.6.0 三分支。 |
| #536 | UBX 上混合 rdma/sdma/udma 场景样例执行失败 | 根因:UDMA 默认读 /etc/hccl_rootinfo.json,缺失时自动生成未适配 UBX 机型,CLOS 下 netlayer 误设 TOPO_FILE_DESC 致初始化失败。修复:不再按 plane_id 推断 Mesh/Clos,改以 driver topo 文件 topo_type 为准;已回合 v1.6.0(PR#782),master PR#740 进行中。 |
| #565 | mssanitizer 检出 barrier 核多 AIV 并发写 sync_counter WAW | 团队 barrier 设备核内多 AIV 对同一 GM 地址 sync_counter 并发非原子写,触发 mssanitizer WAW 告警。官方已确认并提 PR#785:通过判断是否第一个 AIV 限制写入,仅首个 AIV 执行以屏蔽写写冲突;因改动触及高频使用的 barrier 函数,合入前需完成性能影响验证。检测样例时可将该告警视为库内部已知问题。 |
hixl(高速互联库)
RDMA 传输引擎与 mooncake KV 池化支撑,跨机数据面带宽的守门人
| 编号 | Issue 问题内容 | 解答总结 |
|---|---|---|
| #8 | mooncake store 开 buffer pool 后传输报错,大负载必现 | 根因:2025-10-10 前后 CANN 8.3.RC1.alpha003 框架 bug。解法:用 hixl 最新代码编译 run 包替换,–install-path 指向真实 toolkit 路径(默认不生效),长稳通过。store 复用 transfer engine,KV buffer 已在 TE 注册勿重复 register_buffer;PR#17 同期修 need_buffer。 |
| #26 | RDMA 建链报 ra reg global mr fail(128102),注册 143MB 失败 | 官方归纳内存不合法四类根因:1 传入内存类型与真实类型不匹配;2 地址未对齐(见 hixl#14);3 传入 size 与真实 size 不匹配(本例排查即为 size 不匹配);4 RDMA 注册 MR 消耗系统内存,系统内存不足时报注册失败,常伴随 aicpu OOM。排查顺序:先核对 size/对齐/类型,再看系统内存水位。 |
| #424 | A3 容器内 hixl_cs HCCS 建链报 Recv fail/TgidMesg 交换失败 | 官方 RCA:hcomm 在 IPC 内存授权阶段取 PID 用错类型——旧代码 SalGetPid() 返回容器 namespace PID,而 Driver 白名单校验用 Host 侧 bare TGID,容器内两值不同致 EnableMemAccess 授权失败、建链中断。修复方向:IPC 授权统一用 bare TGID。容器化部署建链失败优先查 PID namespace 隔离。 |
| #561 | vllm 0.18.0 开 mooncake 池化后 TTFT 劣化,vllm0.21 正常 | 排查思路:同 CANN 下 vllm0.21 正常而 0.18 劣化,怀疑框架侧对 store 传输接口调用方式的影响。官方给定位方法:在 vllm-ascend 调用 store 接口处包 torch_npu.profiler.profile(按 RANK 分目录防多 worker 覆盖)抓传输耗时对比。规避:升级 vllm0.21+cann9.0.0 组合(实测正常)。[分析未完全闭环] |
| #570 | A3 Prefill 间走 mem pool 中转传输,初始快,10-20 分钟后越来越慢至超时 | 官方明确:中转传输已不推荐且将日落,A3 上 D2H/H2D copy 与模型计算并发时冲突严重,导致传输持续劣化;建议改用 RoCE 或 FabricMem 模式。RoCE 下注册 host 内存有上限:HDK>=25.5 驱动最大支持注册 1TB host 内存;FabricMem 跨机建链问题需另行排查。选型结论:A3 跨机 KV 传输避开中转模式。 |
| #598 | A5 单机 D2D 与 rH2D 并发,总带宽能否超 D2D 单路上限? | 官方确认:即便 D2rH,物理上也要过 D2D 那段通道;D2D 带宽已基本打满则叠加池化后总带宽受限,未打满(如仅用一半)则池化叠加后总带宽可提升。同超节点内刀片内 H2D 与跨刀片 rH2D(物理走 H2D+D2D)效率理论上差异不大。结论:池化收益取决于 D2D 链路占用率;ub_ctp 协议下 Host 内存经 UBMEM 映射复用同一 Device→Device Channel。 |
runtime(ACL 运行时)
设备/流/事件/内存管理与模型加载执行,ACL 推理程序的运行时底座
| 编号 | Issue 问题内容 | 解答总结 |
|---|---|---|
| #328 | 容器挂载davinci6,7后ASCEND_RT_VISIBLE_DEVICES=6,7不生效 | 非bug:ASCEND_RT_VISIBLE_DEVICES在runtime层校验的是容器内逻辑设备号,–device挂载两卡后容器可见设备数为2,填6,7超出[0,1]范围校验失败,静默回退默认0,1。容器内应设0,1,或按aclrtGetLogicDevIdByUserDevId文档做物理号到逻辑号映射;官方表示将审视该联动机制合理性。 |
| #487 | ACL Graph捕获阶段设aclrtSetDeviceResLimit是否对Graph生效 | 仅在捕获阶段生效:设置后aclnn算子按可用核数决定下发block数并固化进Graph任务信息,replay阶段不再生效、以捕获时配置为准。多batch多次捕获(vLLM典型)不是只第一次生效,每个batch捕获前都必须重新调用,各Graph携带各自核数配置互不影响;捕获后再设置无效。 |
| #535 | 910A显示HUGE/NORMAL两个HBM池,任何策略最多只用到约15GiB | 实测确认两池硬件物理隔离,CANN不提供合并机制,单进程最大可分配内存=所选池实际容量而非两池总和。910A 32G设备大页池约16G、普通池约15G,故单进程上限约16G;910B实测HUGE_ONLY可分60G接近总容量。多进程建议不同进程显式用不同策略(HUGE_ONLY/NORMAL_ONLY)分池使用。 |
| #588 | 程序退出时error_manager/libexe_graph析构发生崩溃 | CANN 9.0.0-beta.2下程序退出阶段libexe_graph.so内std::map<string,string>析构崩溃(cannlab CPU环境跑ops-nn仓nn_op_host_ut可复现)。官方确认最新包已不再复现该问题,升级新版CANN包即可规避;issue先行关闭,未关联具体修复PR。 |
| #609 | 升级CANN 8.0 RC2后ACL推理aclrtMalloc失败返回507011 | 507011实为ACL_ERROR_RT_MODEL_EXECUTE模型执行错误,并非内存分配错误码(207001/207018才是),报错信息有误导性。排查四步:核对驱动与CANN版本匹配;plog中grep ERROR看首条所属模块(RUNTIME/GE/DRV)定根因;aclrtGetMemInfo查HUGE/NORMAL两池余量;按官方FAQ解读异步错误码。 |
| #666 | 重复Load/Unload模型(aclmdlLoadFromMemWithMem)两天OS内存缓涨 | CANN 9.0.0 nnrt下连续运行两天内存缓涨疑似泄漏。排查要点:该接口workPtr/weightPtr为用户自管理内存,需确认每次Unload后自行释放(用户已排除)。真因是Runtime内部引用计数异常,aclmdlUnload时缓存数据无法释放;官方修复后于2026-07-02确认解决。 |
| #769 | ASCEND_WORK_PATH路径过长(约240字节)trace落盘失败、日志丢失 | PR#3746支持相对路径后引入回归:ASCEND_WORK_PATH=./temp且执行路径达240字节时,trace拼接root路径校验能通过,但落盘阶段报failed at second directory,trace日志丢失且无默认路径保底。PR#3903修复(2026-08-06合入)。规避:升级含修复版本,或缩短ASCEND_WORK_PATH路径长度。 |
| #808 | 并发向同一DVPP流提交任务时多次分配RR写值内存,设备内存泄露 | Stream::GetDvppRRTaskAddr双重检查锁缺陷:锁外空检查通过后多线程依次进临界区,各自DevMemAlloc且后者覆盖前者地址,Stream销毁只释放最后保存的地址,造成设备内存泄漏并存在数据竞争(910真机复现)。官方确认缺陷成立按缺陷处理;修法为锁内补二次空检查,PR#4161已提交待合入。 |
| #827 | 随机数样例randomCounterAddr未初始化,同seed结果受Device内存历史影响 | aclrtMalloc不保证清零,样例把未初始化内存直接作128位随机数counter传入,首个随机任务读到Device历史数据,后续复用同counter的任务全被带偏,不同环境同seed结果不一致。修复:首个随机数任务前用aclrtMemset将16字节counter清零,PR#4295已合入并经实机验证同seed五组输出逐项一致。 |
| #901 | 跨片record event无归属校验,同步链断裂致流同步永久挂死 | aclrtRecordEvent缺Event/Stream设备归属校验:dev1的Event record到dev0流返回0放行,污染起点使同步链静默断裂,dev1流SynchronizeStream永久挂死,并扩散至aclFinalize段错误。修复:PR#4682对eventRecord/eventReset增加event与stream同device校验,PR#4895同款后合入。 |
driver(NPU 驱动)
内核态驱动与设备管理,/dev 节点、ioctl 分发与 npu-smi 的最底层
| 编号 | Issue 问题内容 | 解答总结 |
|---|---|---|
| #113 | 950DT 上 halhostregister 做 host 到 device 内存注册报错 | 官方结合内核日志定位:直接原因是设备侧调用 ub 相关接口转地址失败,udma 组件报『query device ubmem info send ctrlq msg failed, ret -2』,非 halhostregister 用法问题,建议转 ub 开源社区继续分析设备侧。同类注册报错先查内核 slogd 中 ub/UDMA 错误日志再定位责任组件,避免误判为接口使用错误。 |
| #124 | VULN:davinci_intf 统一 ioctl 分发器缺每模块访问控制,疑跨模块提权 | 上报路径:open /dev/davinci_manager 后经统一 ioctl 分发器可直达 DEVMNG/svm/HISI_HDC 等模块,缺二次鉴权。官方结论:权限统一在字符设备 open 处控制(crw-rw---- HwHiAiUser),已限定可打开节点的用户/组范围,各分发器无需重复鉴权,按现有节点权限收敛即可,不改码。 |
| #134 | VULN:大 iovec 致 QUEUE_MAX_IOVEC_NUM 上界无效,内核内存耗尽 | 上报:QUEUE_ENQUEUE_CMD ioctl 传入超大 iovec 计数可放大内核内存申请,疑整数溢出耗尽内存。官方结论:用户参数驱动的内存申请统一走 cgroup 管控,queue_kvalloc 携带内核计费标志(GFP_ACCOUNT)计入 cgroup 配额,memcg 兜底上限,无需代码修复;生产环境建议为 NPU 相关进程配置 cgroup 内存限额。 |
| #135 | build.sh prepare_src 用 mv 造 .org 备份不可重入,残留致无法再构建 | prepare_src 把 dms_product.c 等文件 mv 成 .org,构建完由 clean_src 恢复;但该阶段不在错误保护范围内,set -e 中途失败即残留 .org 且原文件缺失,下次执行 mv 因源文件不存在报错,仓库陷入只能 git 手工恢复的死局。PR#133 修复该场景并已合入;规避:构建失败后先手动恢复 .org 备份再重跑。 |
| #146 | 多用户共享 NPU 开发机,如何限制各用户可用的芯片;udev 不稳定 | 官方方案:cgroup devices 控制器。每用户一个 cgroup,先 devices.allow ‘a’,再按主次设备号 deny 不用的 NPU(如 echo ‘c 238:14 rwm’ > devices.deny),比 udev 稳定;npu-smi 依赖 manager 节点需保留读权限。遗留:限制后可用 NPU≤2 时 npu-smi 报 -8005,官方复测正常正跟进日志。 |
组合解读:这 50 条里的共性规律
1. 并发与锁是本批最大的缺陷家族。
hcomm 两把锁护一份数据(#285、#286)、并发建链竞态 coredump(#670)、runtime 双重检查锁缺陷致内存泄露(#808)、跨片 event 无归属校验致永久挂死(#901)、barrier 核多 AIV 写写冲突(#565)——共同姿势只有三句话:一份数据一把锁、锁内做二次检查、操作前校验归属。多线程场景下「不报在出错位置」是常态,按数据流梳理比看栈有效。
2. 通信性能问题,先怀疑算法选择。
爬坡场景被误判小数据选错算法(#663)、卡数相关的性能悬崖(#152)、快慢卡 notify 等待(#158)、禁 HCCS 后仍选 HCCS 专用算法卡死(#770)、大 buffer 超时门限不足(#834)。集合通信的性能/卡死问题,第一动作是用 hccl_test 扫卡数与数据量复现,再上 profiler 留证据;同场景优先选 MC2 通算融合接口(#158)。
3. 版本组合二分法。
HDK 过旧不搬运 AICPU 算子包(#186)、CANN 8.3.RC1.alpha003 框架 bug(#8)、vllm 0.18 与 0.21 行为分叉(#561)、9.0.0-beta.2 退出崩溃(#588)。驱动×CANN×框架三者的版本组合先二分,再查代码;#186 的技巧值得抄:比对日志里的源码行号,立刻知道新二进制有没有被加载。
4. 容器化部署三连坑。
容器内建链失败先查 PID namespace 与 bare TGID 的差(#424);ASCEND_RT_VISIBLE_DEVICES 填的是容器内逻辑设备号不是物理号(#328);多用户限芯片用 cgroup devices 而非 udev(#146)。容器里一切「看不见/连不上/没权限」,先把这三件事过一遍。
5. 资源生命周期要配对。
销毁链不释放 socket 致白名单配额耗尽(#829)、销毁 team/window 不反注册致二次注册报错(#765)、引用计数异常致两天缓涨(#666)、未初始化内存当随机数 counter 致同 seed 漂移(#827)。建/拆、注册/反注册、分配/释放必须成对;malloc 不清零,状态内存用前先初始化。
6. 静态检视报告要逐条判定,不能盲目加防御。
hccl 三个检视 issue(#113、#114、#115)里几十项「风险」多数是「理论可达、实际路径不可达」——入口校验链(如 HcomCheckUserRank 保证 rankSize 非 0)已挡住;实锤修复的是 all_gather_v 异常路径 paramMem 泄露。姿势:对照算子入口校验链逐条判真伪,而不是见告警就加 if。
7. 官方语义澄清同样值钱。
aclrtSetDeviceResLimit 仅捕获阶段生效、replay 以捕获时配置为准(#487)、910A 双 HBM 池物理隔离不可合并(#535)、CCU 规约升 32 位累加(#304)、SDMA 切换阈值 2MiB 由编译期常量决定(#469)、D2rH 物理仍过 D2D 通道(#598)、中转传输将日落选 RoCE/FabricMem(#570)。这些是文档没写清的行为契约,选型前先核对。
排错指引(从这批 issue 提炼)
| 症状 | 第一优先动作 | 本篇相关案例 |
|---|---|---|
| 通信卡死 / 流同步超时 | 查环境变量是否被算法 honor;CQ overflow;跨片 event/stream 归属校验 | #770、#822、#901 |
| 通信性能悬崖 / 劣化 | hccl_test 扫卡数与数据量;profiling 看快慢卡等待;优先融合接口 | #152、#158、#663、#561 |
| coredump / 竞态崩溃 | 锁一致性(一份数据一把锁);并发建链业务侧加锁或升修复版 | #670、#285、#286、#808 |
| 内存缓涨 / 泄露 | 异常路径资源释放;注册/反注册配对;引用计数 | #666、#765、#829、#808 |
| 容器内建链失败 / 设备不可见 | PID namespace 与 bare TGID;逻辑设备号映射;cgroup devices | #424、#328、#146 |
| 升级后行为异常 | 驱动×CANN×框架版本组合二分;日志行号验证新包生效 | #186、#8、#561、#588 |
| 同 seed 结果漂移 | 状态内存未初始化,首个任务前清零 | #827 |
| 建链 / MR 注册失败 | size、对齐、类型、系统内存四查;容器查 bare TGID | #26、#424 |
涉及具体 API 语义与硬件约束的核对,用了昇腾知识图谱(ascend.wiki)的官方文档节点;各条解答中 KG 核实过的部分不再单独标注,评论与 PR 均无依据的信息一律未收录。本批 hcomm#809、shmem#536、shmem#565、runtime#808、driver#146 五条为 open 状态但官方评论已给出结论或修复已回合分支,按「实质已解决」口径收录。接入昇腾知识图谱 https://gitcode.com/agent0/kg-tools
系列下一篇:Ascend 训练线(pytorch / torchair / MindSpeed-LLM / MindSpeed-MM),覆盖大模型训练迁移、精度对齐与集群组网的真实案例。
鲲鹏昇腾开发者社区是面向全社会开放的“联接全球计算开发者,聚合华为+生态”的社区,内容涵盖鲲鹏、昇腾资源,帮助开发者快速获取所需的知识、经验、软件、工具、算力,支撑开发者易学、好用、成功,成为核心开发者。
更多推荐

所有评论(0)