CANN/hcomm Checker 静态验证工具指南

发布时间:2026/7/11 13:49:50
CANN/hcomm Checker 静态验证工具指南 Checker 上手指导【免费下载链接】hcommHCOMMHuawei Communication是HCCL的通信基础库提供通信域以及通信资源的管理能力。项目地址: https://gitcode.com/cann/hcomm本文介绍 Checker 的基本概念和处理流程。错误码 FAQ 按错误码展开具体场景。[toc]1 Checker 是什么Checker 是一个静态验证工具它不介入算子运行而是通过读取算子执行后留下的记录重建执行图并进行静态分析判断本次算子执行在逻辑上是否正确。Checker 输入算子信息 各 Rank 的任务数据 CCU指令序列Checker 输出校验结论(成功/失败) 错误日志2 Checker 整体流程2.1 关键术语介绍名词说明通信域一组通信成员的组合描述通信范围通信成员通常称为rank是参与通信的最小逻辑实体每个rank都会分配一个唯一标识即rankId通信算子一次集合通信操作例如AllReduce、AllGather针对不同网络拓扑、数据量、硬件资源等场景通信算子通常会采用不同的通信算法实现任务Checker 的核心数据结构描述某个rank一次原子操作的记录例如内存搬运、Reduce、内存拷贝等任务图Checker 的核心数据结构用来表达一个算子执行所生成的任务节点及其依赖关系节点任务图上的每个节点即为一个任务Streamrank内按顺序执行任务的队列每个任务内都使用streamId记录自己属于哪个队列任务类型不同类型的任务的作用不同例如执行内存搬运、Reduce、或是同步2.2 Checker 处理流程阶段作用成图基于Checker输入生成任务图若为CCU模式会将CCU指令转换为任务图单任务校验检查单条任务的内存区间是否合法并校验从流的头尾结构内存冲突检测检查并发任务之间是否存在未保护的内存重叠语义校验模拟算子执行过程验证最终输出是否符合算子预期3 任务图任务图是 Checker 的核心数据结构它用来表达一个算子执行所生成的任务节点及其依赖关系任务图是在成图阶段基于 Checker 输入生成的3.1 节点与边任务图上的每个节点即为一个任务都有明确的任务类型表示该节点执行的具体操作。常见类型如下任务类型说明核心字段TRANS_MEM内存数据搬运srcRankId,srcOffsetdstRankId,dstOffsetlen,typeBATCH_TRANS_MEM批量内存数据搬运一个节点内包含多组(src - dst)搬运关系srcs[]dsts[]REDUCE数据规约srcRankId,srcOffsetdstRankId,dstOffsettype,dataCount,dataType,reduceOpBATCH_REDUCE批量数据规约一个节点内包含多组(src - dst)规约关系srcs[][]dsts[]dataType,reduceOpRECORD/WAIT同步任务分别表示发出同步信号和等待同步信号srcRankId发出方dstRankId等待方notifyId除上述真实执行任务外任务图中还会补充START/END两类虚拟边界节点。它们不对应实际的数据搬运或计算动作主要用于表达主图、子图和 Loop 结构的边界。虚拟节点类型支持的boundaryType说明STARTMAIN_GRAPH、CCU_SUB_GRAPH、AIV_SUB_GRAPH、LOOP起始边界节点。用于标记整个任务图入口或某个 CCU/AIV 子图、Loop 片段的开始位置ENDCCU_SUB_GRAPH、AIV_SUB_GRAPH、LOOP结束边界节点。用于标记某个 CCU/AIV 子图、Loop 片段的结束位置并统一汇聚该边界内的尾节点边表示节点之间的执行先后关系即一个有向边的尾节点一定在首节点之后执行边可分为以下两类边类型说明顺序边同一 stream 内按执行顺序连接的依赖边如下图示例rank0/stream0上有两个先后执行的任务rank1/stream0上有三个先后执行的任务同步边同步任务节点间的依赖边如下图示例WAIT节点需要等待RECORD节点的信号然后才能继续执行所以用一条从RECORD指向WAIT的边表示此类依赖关系3.2 任务图示例3.2.1 AICPU模式AICPU 模式下任务图通常由RECORD、WAIT和TRANS_MEM这几类节点组合而成。下面给出一个典型的 2-rank、每个 rank 含两条 stream 的AllGather示例按实际执行序列展示 stream 内顺序边并用虚线表示RECORD到WAIT的同步依赖。3.2.2 CCU模式在 CCU 模式下Checker 会把 CCU 指令展开成 CCU 子图。下面沿用 2-rankAllReduce的数据流省略了 CCU 子图外部的同步操作只保留 CCU 子图内部的任务序列。CCU 使用同步字段从notifyId变为cke/mask中间缓冲区使用的是 CCU 的MS类型。3.2.3 Graphviz 简易可视化Checker 提供了任务图导出能力用于把任务图输出成 Graphviz 的.dot文件。它导出的内容不只是“有哪些节点”还会尽量把调试时常用的信息直接放进图里按rank / stream排布节点便于观察同一执行队列上的顺序关系用实线表示普通依赖边用虚线表示RECORD - WAIT这类同步依赖边节点标签中会带上任务类型、nodeId、位置信息以及内存片段、notifyId或cke/mask等关键字段使用方式如下Checker 在成图完成后会自动尝试导出该.dot文件不需要额外开关导出成功后可在日志中搜索[GraphvizDot]日志里会打印最终落盘路径通常为hccl_vm_install/data/输出文件名格式为TaskGraph_YYYYMMDDHHMMSS.dot拿到.dot文件后可使用Microsoft VS Code相关的插件如Graphviz Interactive Preview来实现即时浏览。4. 单任务校验此阶段主要检查单条任务的内存区间是否合法并校验从流的头尾结构4.1 内存区间 (MemSlice)内存搬运与规约类的任务中最重要的信息就是内存区间 (MemSlice)一个内存区间由以下信息组成MemSlice { rankId, type, offset, len }rankId表示内存属于哪个 ranktype表示内存类型 | 内存类型 | 用途 | |----------|------| | INPUT | 算子输入BUFFER | | OUTPUT | 算子输出BUFFER | | CCL | CCL_BUFFER | | MS_CCU | CCU MS |offset和len共同确定内存访问区间offset表示本次访问在该内存片段上的起始地址len表示本次内存访问的长度访问区间采用半开表示即[offset, offset length)为本次访问的内存段单条任务内存区间的校验点如下offset length不能溢出uint64上界否则会报错同一任务内部的多个 MemSlice 在相同(rankId, memType)下不能有区间重叠否则会报错不同type是相互独立的地址空间同一offset在不同type下不视为重叠offset length不能越过当前type地址空间的边界4.2 从流slave stream结构校验从流用于执行算子的辅助任务例如数据预搬运。在HCCL编程模型中主流通过同步任务RECORD - WAIT触发从流从流完成后再通过另一组同步任务通知主流所以从流必须满足固定的首尾结构首任务为WAIT 末任务为RECORD下图为一个错误示例标红的节点都是违规节点5. 内存冲突校验本阶段是校验任务图中是否存在内存冲突的可能内存冲突是指同一时刻有多个内存操作访问同一段内存且至少有一个操作为写操作。发生内存冲突时冲突的内存段的值是无法确定的会导致集合通信算子的精度问题。5.1 内存冲突的判定标准两个内存访问类任务节点同时满足以下三个条件时会判定为内存冲突两个节点可能并发执行 (任务图上两个节点之间不存在路径)访问的内存地址区间重叠至少一方是写操作Checker会高效地校验每一对内存访问类任务节点保证不发生漏报5.2 内存冲突示例下图为一个存在内存冲突的任务图示例R0A和R0B在同一个 stream 上先后执行不满足并行执行的条件所以不会发生内存冲突R0A和R1B之间通过同步节点限制了执行顺序即R0A - R0RECORD - R1WAIT - R1B所以不会发生内存冲突R0B和R1B之间可以并发且它们的写内存dst完全重叠因此存在内存冲突5.3 冲突日志解读内存冲突校验的错误日志格式如下[ErrorCode: 302] Two tasks may access the same memory range in parallel, and at least one access is a write. Conflict memory : rank 0 OUTPUT Overlap range : [0x0,0xc80) Conflict task 1: node 17, actionwrite access range : [0x0,0xc80) task : [TaskTransMem] node17, rank1, stream0, queue0, protocolSDMA, srcrank 1 CCL [0x0,0xc80), dstrank 0 OUTPUT [0x0,0xc80) Conflict task 2: node 23, actionwrite access range : [0x0,0xc80) task : [TaskTransMem] node23, rank2, stream0, queue0, protocolSDMA, srcrank 2 CCL [0x0,0xc80), dstrank 0 OUTPUT [0x0,0xc80)日志说明| 字段 | 含义 | |----|------| |[ErrorCode: 302]| 内存冲突错误码对应MEMCONFLICT_DETECTED| |Conflict memory : rank X TYPE| 发生冲突的内存所在位置 | |Overlap range : [start,end)| 两条访问真正重叠的地址区间 | |Conflict task 1 / Conflict task 2| 最终被判定为“可并发执行且地址重叠”的两个访问 | |node X, actionread/write| 任务图中的节点 ID 与本次访问的读写类型。只要两条访问中至少一条是write就可能报冲突 | |access range : [start,end)| 这条访问自身覆盖的完整地址区间不一定与Overlap range完全相同 | |task :| 具体任务详情任务类型、节点 ID、位置、src/dst 内存区间等 |6. 语义校验语义校验阶段按拓扑序遍历任务图模拟算子执行过程验证最终输出是否符合算子预期6.1 BufferSemantic语义校验过程中Checker 会为每段内存维护数据来源记录BufferSemantic { startAddr: 内存区间起始地址offset size: 内存区间长度len srcBufs: 内存来源集合每项为 {rankId, bufferType, srcAddr} isReduce: 是否为Reduce操作 reduceType: Reduce操作类型 SUM/MAX/MIN/... }其中srcBufs记录内存数据来源bufferType表示来源所属缓冲区类型例如INPUT、OUTPUT或CCL。每个节点执行时将每一组(src - dst)关系翻译为如下两种操作之一再写回目标地址空间。(src - dst)表示一组从源地址到目标地址的搬运或规约关系TaskType操作行为TRANS_MEM/BATCH_TRANS_MEMoverwrite先清除目标区间的已有语义再将源语义复制过去REDUCE/BATCH_REDUCEreduce要求目标区间已预填满语义否则会报错随后将新来源追加进srcBufs并标记isReducetrue6.2 各算子 OUTPUT 期望语义校验的目标是判断每个 rank 的OUTPUT是否符合当前算子的预期。不同算子的期望如下算子OUTPUT 语义期望AllReduce每个 rank 的 OUTPUT 都是全部 rank INPUT 的 reduce 结果AllGather每个 rank 的 OUTPUT 都是所有 rank INPUT 的按序拼接结果ReduceScatter每个 rank 的 OUTPUT 都是全局 reduce 后分配给本 rank 的分片AllGatherV与 AllGather 相同但各 rank 的贡献大小不同ReduceScatterV与 ReduceScatter 相同但各 rank 的分片大小不同Send/Recv目标 rank 的 OUTPUT 等于源 rank 的 INPUT单源且无 reduceBatchSendRecv多对 Send/Recv 同时进行Broadcast所有 rank 的 OUTPUT 都等于 root rank 的 INPUTReduce只有 root rank 的 OUTPUT 是全部 rank INPUT 的 reduce 结果All2All每个 rank 的OUTPUT[i]等于rank i的INPUT[本 rank 偏移]下图以 2 rank 集合通信算子为例展示了各算子OUTPUT预期AllReduceAllGather / AllGatherVAllGatherV的语义与上图相同只是各 rank 的贡献长度可以不同。ReduceScatter / ReduceScatterVReduceScatterV的语义与上图相同只是各 rank 输出分片的长度可以不同。Send/RecvBatchSendRecvBroadcastReduceAll2All6.3 最终校验流程以 4-rankAllReduce为例rank0.OUTPUT[0,L) 期望 sources { rank0.INPUT, rank1.INPUT, rank2.INPUT, rank3.INPUT } reduceType SUM 假设 sources 缺失 rank3.INPUT actualSourceRankCount3expectedRankSize4 - 校验失败6.4 语义传播示例以 2-rankAllGather每 rank INPUT 大小 100 字节为例说明语义传播过程。初始状态每个 rank 的 INPUT 已有自己的初始语义来源指向自身rank0.INPUT[0, 100): srcBufs { (rank0, INPUT, 0) } rank1.INPUT[0, 100): srcBufs { (rank1, INPUT, 0) } rank0.OUTPUT: 空 rank1.OUTPUT: 空传播过程下图展示 rank0.OUTPUT 的语义填充过程。每条箭头表示一次 overwrite 操作读取源 buffer 的语义写入目标 buffer 的对应区间。rank1.OUTPUT 的传播过程同理。最终两个 rank 的 OUTPUT 均填满来源正确校验通过。区间拆分若写入区间与已有语义边界不对齐Checker 会先拆分再覆盖。例如 rank0.OUTPUT[0,100) 已有整段语义此时写入 [35,65)写入前在 offset 35 和 65 处拆分原有语义块将 [35,65) 替换为新来源其余部分保持不变。6.5 语义错误的两类根因语义校验失败本质上只有两类问题数据缺失表示 OUTPUT 区间没有被写到或写入不完整缺头、断裂或缺尾。数据来源错误表示 OUTPUT 已被写满但来源 rank、偏移或 reduce 类型不符合预期。排查时先判断问题类型如果是数据缺失重点检查 task 编排是否缺少传输如果是数据来源错误重点检查 src/dst 地址和 reduceOp 是否正确。6.6 错误日志解读[ErrorCode: 407] AllGather output range [0x1000,0x1400) for rank 3 should come from rank 4, but it actually comes from rank 5. Current result range detail: range[0x1000,0x1400), size0x400, sourceCount1 sources: - sourceRank5, sourceBufferTypeINPUT, sourceAddr0x0日志说明行含义第 1 行错误码和主错误信息。407表示最终输出来源属性错误output range [0x1000,0x1400) for rank 3指出错的输出 rank 与区间should come from rank 4, but it actually comes from rank 5表示预期来源 rank 与实际来源 rank 不一致Current result range detail当前这段输出区间的完整语义展开帮助继续定位range / size / sourceCount当前输出语义块的地址范围、长度以及该区间包含多少个来源sources当前区间的来源列表每项包含来源 rank、来源 buffer 类型和来源地址7. 术语速查表术语说明通信域一组通信成员的组合描述通信范围通信成员通常称为rank是参与通信的最小逻辑实体每个rank都会分配一个唯一标识即rankId通信算子一次集合通信操作例如AllReduce、AllGather针对不同网络拓扑、数据量、硬件资源等场景通信算子通常会采用不同的通信算法实现任务Checker 的核心数据结构描述某个rank一次原子操作的记录例如内存搬运、Reduce、内存拷贝等任务图Checker 的核心数据结构用来表达一个算子执行所生成的任务节点及其依赖关系节点任务图上的每个节点即为一个任务Streamrank内按顺序执行任务的队列每个任务内都使用streamId记录自己属于哪个队列任务类型不同类型的任务的作用不同例如执行内存搬运、Reduce、或是同步QueueCCU 内部串行指令队列MemSlice内存访问区间{rankId, type, offset, len}从流执行副任务的辅助 stream要求首WAIT、尾RECORDRECORD/WAIT一组配套的同步任务分别表示发出同步信号和等待同步信号同步边由RECORD - WAIT建立的跨 stream 或跨 rank 执行依赖内存冲突同一时刻有多个内存操作访问同一段内存且至少有一个操作为写操作BufferSemantic语义校验阶段的重要数据结构记录一段内存数据来自哪里reduceType语义中的规约类型例如SUM、MAX、MIN用于描述多来源数据如何合并OUTPUT 期望某个通信算子最终输出结果应满足的正确语义定义用于和实际结果做最终比对【免费下载链接】hcommHCOMMHuawei Communication是HCCL的通信基础库提供通信域以及通信资源的管理能力。项目地址: https://gitcode.com/cann/hcomm创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考