栈 不一致 就是 局部 挂 起: 百度 用 火焰 图 看 训练 Hang
百度智能云百舸文档更新于 2026-07-23。Hang 检测先看日志迭代间隔,再到阈值后再看调用栈和进程 IO。只支持 PyTorch 和整机 GPU。案例里 8 机 64 卡的 rank 40 到 47 栈不一样,进程处于 disk-sleep。

栈不一致就是局部挂起:百度用火焰图看训练 Hang
百度智能云百舸的《训练任务 Hang 检测》更新时间是 2026-07-23。Hang 在这里指分布式训练任务卡住。这一页是任务健康诊断,不是模型打分。它在任务跑着的时候巡检挂起,再用函数调用栈找瓶颈。面向算法工程师和任务运维。当前只支持 PyTorch,并且只支持申请了整机 GPU 的训练任务。
怎么判断挂住了
检测有两层。一层看日志里的迭代间隔,间隔可以自己设阈值。间隔到了阈值之后,高级诊断再看训练进程调用栈和进程 IO,几路一起判断,避免只靠日志误报。采集不改业务代码,自动采训练进程和 Dataloader 子进程的栈,可以手动触发,也可以自动触发。
任务要这样开:创建分布式训练,框架选 PyTorch,容错与诊断里打开自动容错,高级设置里打开 Hang 检测。跑起来之后实时看。详情页有「Hang 解析」。如果创建时就开了检测,系统发现挂起会自动采指标,并生成聚合函数栈火焰图。没提前开也可以事后手动采。图可以下载。
火焰图怎么读
图把所有 rank 的数据合在一起。栈帧格式是:线程名、函数名、代码路径、哪些 rank 走到了这里、哪些 rank 没走到。采不到的名字写成 unknown。连续的 rank 压成起止号,例如 0-5 表示 rank 0 到 4。不连续的用斜杠隔开,例如 60-62/65。
文档给的读法是三步。先看所有 rank 的栈是否一样。一样,当成全局 Hang,怀疑代码或通信。不一样,当成局部节点先挂。再看栈顶:停在业务、数据加载、IO 或计算函数,归到应用层;停在 all_reduce 这类通信函数,归到通信等待或全局阻塞。最后看和别人不一样的 rank,或者其他人都在等它通信的那个 rank。
两个案例
局部挂起:某个 rank 或某个 pod 里的一组 rank 先因为非通信问题挂住,再扩散成全局挂起。文档写的规模是 8 机 64 卡。火焰图上机器 A 的 rank 40 到 47,栈顶和别的 rank 不一样。进实例看训练进程,Process 23x 处于 disk-sleep,判断是磁盘 IO 把训练堵住。页面建议再看节点磁盘监控。它没有给出卡住了多少分钟。
全局挂起:用户代码导致所有 rank 停在同一个函数。文档写的规模是 10 机。栈顶都是 dataloader 相关函数,所以怀疑 dataloader 写法。页面没有贴出函数名,也没有说改完之后间隔恢复到多少。
限制
这一页没有误报率,没有和只看日志的对照,也没有默认的日志间隔秒数。8 机 64 卡和 10 机是案例规模,不是平台上限。rank 40-47 和 Process 23x 是这一次案例里的编号。整机 GPU 和 PyTorch 以外的任务能不能开,页面写成不支持。火焰图合并了全部 rank,单 rank 的原始栈要不要另存,没有写。
百度智能云,训练任务 Hang 检测,2026-07-23,https://cloud.baidu.com/doc/AIHC/s/fmol3wrhy
觉得有用,转给同事
微信扫码
用微信扫一扫,在手机上打开后即可转发。