ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

智算集群监控与故障诊断:Benchmark、监控、根因分析实战指南

智算集群监控与故障诊断:Benchmark、监控、根因分析实战指南

1. 智算集群为什么需要一套“听诊器”

搞过大规模训练的人都有一个共同体会:集群规模一旦上去,故障就不再是“某台机器坏了”这么简单。一张卡降频、一根网线误码、一个交换机端口抖动,都可能让一个千卡任务从“正常跑”变成“集体等一根烟”。这时候如果没有一套完整的Benchmark、监控和故障诊断体系,你面对的就是一个黑盒——知道它慢,但不知道慢在哪;知道它挂了,但不知道谁先挂的。

所谓“智算集群的听诊器”,本质上就是三件套:Benchmark(性能基线)、监控(实时状态采集与可视化)、故障诊断(异常定位与根因分析)。这三者不是孤立的,而是像医院里的体检、心电监护和专家会诊——体检告诉你正常值应该是多少,监护告诉你现在偏离了多少,会诊告诉你为什么偏离以及怎么治。

这套东西适合谁?如果你是集群运维、AI平台工程师、算法团队里负责“让训练跑起来”的那个人,或者你正在从零搭建一个小规模智算集群,那这套方法论你迟早要用上。哪怕你只有8卡、16卡,只要开始跑多机多卡任务,NCCL报错、GPU掉卡、网络抖动这些问题就会找上门。提前把听诊器装好,比事后救火划算得多。

我见过太多团队在集群刚上线时只关注“能不能跑通”,等到业务压力上来,故障频发才开始补监控,结果发现历史数据没有、基线没有、日志没开全,排查全靠猜。所以这篇内容我会从整体设计思路讲起,把Benchmark怎么做、监控怎么搭、故障怎么诊断这三块拆开揉碎,再给出一套可以直接抄作业的实操方案。

2. 整体设计思路:先建基线,再谈异常

2.1 为什么Benchmark必须放在最前面

很多人一上来就装Prometheus、Grafana,觉得监控面板一拉,问题就能看见。但实际经验告诉我:没有基线的监控,等于没有刻度尺。你知道GPU利用率是70%,但70%是正常还是异常?你知道NCCL AllReduce耗时200ms,但200ms是快还是慢?没有基线,这些数字就没有意义。

Benchmark的核心作用就是建立“健康状态下的性能指纹”。这个指纹包括:

  • 单卡算力基线:FP16/BF16/FP8的TFLOPS实测值,跟理论值差多少
  • 单机内多卡通信基线:NVLink或PCIe的带宽和延迟
  • 多机通信基线:NCCL AllReduce、AllGather、ReduceScatter在不同规模下的耗时
  • 存储IO基线:顺序读写、随机读写、元数据操作延迟
  • 整机稳定性基线:连续跑一段时间后的频率、温度、功耗曲线

这些基线数据不是跑一次就完事,而是要在集群交付时、每次重大变更后、以及定期(比如每月)重新采集。因为硬件会老化、固件会升级、网络配置会变,基线漂移了,监控阈值就得跟着调。

2.2 监控体系的分层设计

智算集群的监控不能只盯GPU。我习惯把它分成四层:

层级监控对象关键指标常用工具
硬件层GPU、CPU、内存、硬盘、网卡温度、功耗、频率、ECC错误、链路状态DCGM、IPMI、smartctl
系统层操作系统、驱动、容器运行时进程状态、内核日志、OOM、句柄数node_exporter、journald
通信层NCCL、RDMA、交换机带宽、延迟、重传、PFC风暴NCCL Tests、perfquery、交换机Telemetry
应用层训练框架、任务调度Loss曲线、吞吐、迭代时间、Checkpoint耗时框架自带日志、自定义埋点

这四层要能关联起来看。比如应用层发现迭代变慢,往下查通信层发现某条链路重传率高,再往下查硬件层发现对应网卡光模块温度异常——这就是一个完整的诊断链路。

2.3 故障诊断的核心逻辑:从“现象”到“根因”的漏斗

故障诊断最怕的就是“眉毛胡子一把抓”。我的经验是建立一个漏斗模型:

  1. 现象层:任务报错、性能下降、节点失联
  2. 指标层:哪些指标偏离基线?偏离多少?什么时候开始偏离?
  3. 组件层:定位到具体组件(某张卡、某个网口、某个交换机端口)
  4. 根因层:确认是硬件故障、配置错误、还是软件Bug

这个漏斗要跑得快,关键靠两样东西:完整的日志和可回溯的时间线。所以监控系统里,指标、日志、事件必须统一时间戳,最好能在一个面板里联动查看。

3. 核心细节解析:Benchmark、监控、诊断各自的关键点

3.1 Benchmark工具选型与实操要点

GPU算力基准测试,我常用这几个:

  • gpu-burn:快速验证GPU能否满负载稳定运行,主要看是否报错、是否降频
  • dcgmproftester:NVIDIA官方工具,可以针对特定指标(如SM利用率、显存带宽)做压力测试
  • HPL/HPCG:虽然偏HPC,但用来验证整机浮点性能和通信性能依然有效
  • NCCL Tests:多机多卡通信的黄金标准,必须跑all_reduce、all_gather、reduce_scatter、broadcast等模式

NCCL Tests的实操细节很关键。很多人跑一遍all_reduce就完事,其实不同消息大小、不同进程数、不同拓扑下的表现差异很大。我一般会跑一个矩阵:

# 单机8卡 all_reduce ./build/all_reduce_perf -b 8 -e 8G -f 2 -g 8 # 两机16卡 all_reduce mpirun -np 16 -hostfile hostfile \ ./build/all_reduce_perf -b 8 -e 8G -f 2 -g 1

参数说明:-b是起始消息大小,-e是结束大小,-f是倍增因子,-g是每进程GPU数。跑完之后重点看bus bandwidth这一列,它反映的是实际通信带宽。如果多机带宽只有单机的60%以下,基本可以判断网络有问题。

注意:跑NCCL Tests之前一定要确认GPU拓扑。用nvidia-smi topo -m看清楚卡间是NVLink还是PCIe,跨机走的是IB还是RoCE。拓扑不对,跑出来的数据没有参考价值。

3.2 监控指标采集:哪些指标真正有用

监控指标不是越多越好。我见过有人把DCGM的几百个指标全采了,结果Grafana面板卡到打不开,真正有用的信息反而被淹没。我的建议是分层采集,核心指标高频采,辅助指标低频采。

GPU层核心指标(采集间隔1-5秒):

  • DCGM_FI_DEV_GPU_UTIL:GPU利用率
  • DCGM_FI_DEV_MEM_COPY_UTIL:显存带宽利用率
  • DCGM_FI_DEV_POWER_USAGE:功耗
  • DCGM_FI_DEV_GPU_TEMP:温度
  • DCGM_FI_DEV_SM_CLOCK:SM频率
  • DCGM_FI_DEV_XID_ERRORS:XID错误(这个极其重要,后面会细说)

通信层核心指标(采集间隔5-10秒):

  • IB/RoCE端口带宽:rate_bytes_rcv、rate_bytes_xmit
  • 链路误码:symbol_error、link_downed
  • 重传计数:retrans_bytes、out_of_sequence
  • PFC暂停帧:pfc_pause_duration

系统层核心指标(采集间隔10-15秒):

  • CPU负载、内存使用、Swap使用
  • 磁盘IO延迟、IO队列深度
  • 网络丢包、TCP重传

这些指标采集上来之后,Grafana面板要按“集群总览→节点详情→GPU详情”三级组织。总览看全局异常,节点详情看具体哪台机器有问题,GPU详情看具体哪张卡有问题。

3.3 故障诊断:XID错误与NCCL日志的联合分析

GPU故障诊断里,XID错误是最重要的线索之一。XID是NVIDIA驱动报告的错误代码,不同的XID代表不同的问题:

XID含义常见原因处理建议
13Graphics Engine Exception驱动Bug或硬件故障记录频率,频繁出现需换卡
31GPU memory page fault显存访问越界检查应用代码,可能是非法访问
43GPU stopped processing驱动崩溃重启驱动,频繁出现需换卡
48Double Bit ECC Error显存硬错误立即隔离该卡
63ECC page retirement显存页退役记录,达到阈值需换卡
74NVLink errorNVLink链路错误检查NVLink连接,可能需要重新插拔
79GPU has fallen off the busGPU掉卡检查供电和散热,严重时需换卡

XID错误要跟NCCL日志联合看。NCCL在报错时会输出详细的通信拓扑和失败原因,比如:

NCCL INFO Call to connect returned Connection refused, retrying NCCL WARN Bootstrap : no socket interface found NCCL INFO NET/IB : Using [0]mlx5_0:1/IB [1]mlx5_1:1/IB

如果NCCL报连接失败,同时对应节点有XID 74,那基本可以定位到NVLink或IB链路问题。如果NCCL报超时,但XID正常,那可能是网络拥塞或交换机配置问题。

实操心得:我习惯在训练脚本里加一个wrapper,把NCCL_DEBUG设为INFO,同时把输出重定向到带时间戳的日志文件。这样出问题时,NCCL日志、DCGM指标、系统日志三条时间线可以对齐看,定位速度快很多。

4. 实操过程:从零搭建一套可用的听诊器

4.1 环境准备与工具部署

假设你有一个小规模集群,比如4台机器、每台8卡A100或H800,操作系统是Ubuntu 22.04,已经装好NVIDIA驱动和CUDA。下面是部署步骤。

第一步:部署DCGM Exporter

DCGM Exporter负责把GPU指标暴露成Prometheus格式。用Docker部署最省事:

docker run -d --gpus all --rm \ -p 9400:9400 \ --name dcgm-exporter \ nvcr.io/nvidia/k8s/dcgm-exporter:3.3.0-3.2.0-ubuntu22.04

跑起来之后,curl localhost:9400/metrics应该能看到一堆DCGM_FI_*指标。

第二步:部署node_exporter

每台机器都要装,负责采集CPU、内存、磁盘、网络指标:

wget https://github.com/prometheus/node_exporter/releases/download/v1.7.0/node_exporter-1.7.0.linux-amd64.tar.gz tar xzf node_exporter-1.7.0.linux-amd64.tar.gz cd node_exporter-1.7.0.linux-amd64 ./node_exporter &

第三步:部署Prometheus

Prometheus负责拉取和存储指标。配置文件prometheus.yml:

global: scrape_interval: 15s evaluation_interval: 15s scrape_configs: - job_name: 'dcgm' static_configs: - targets: ['node1:9400', 'node2:9400', 'node3:9400', 'node4:9400'] - job_name: 'node' static_configs: - targets: ['node1:9100', 'node2:9100', 'node3:9100', 'node4:9100']

第四步:部署Grafana

Grafana负责可视化。用Docker跑:

docker run -d -p 3000:3000 --name=grafana grafana/grafana-oss:10.2.0

然后导入NVIDIA官方提供的DCGM Dashboard(ID: 12239),再自己配一个节点总览面板。

4.2 NCCL Tests的完整跑法与结果解读

NCCL Tests建议从源码编译,确保跟当前CUDA和驱动版本匹配:

git clone https://github.com/NVIDIA/nccl-tests.git cd nccl-tests make MPI=1 MPI_HOME=/usr/lib/x86_64-linux-gnu/openmpi CUDA_HOME=/usr/local/cuda

编译完成后,创建一个hostfile:

node1 slots=8 node2 slots=8 node3 slots=8 node4 slots=8

然后跑all_reduce:

mpirun -np 32 -hostfile hostfile \ -x NCCL_DEBUG=INFO \ -x NCCL_IB_DISABLE=0 \ -x NCCL_SOCKET_IFNAME=eth0 \ ./build/all_reduce_perf -b 8 -e 8G -f 2 -g 1

输出结果里重点看这几列:

  • size:消息大小
  • time:耗时
  • algbw:算法带宽
  • busbw:总线带宽(这是实际有效带宽)

对于A100/H800集群,8G消息大小的busbw,单机内应该接近NVLink理论带宽的80%以上,跨机应该接近IB理论带宽的70%以上。如果明显偏低,就要查网络。

4.3 监控面板配置:三个必须有的视图

视图一:集群健康总览

  • 所有GPU的XID错误计数(按节点分组)
  • 所有GPU的温度和功耗(热力图)
  • 所有IB端口的带宽和误码(折线图)
  • 异常节点列表(用表格展示偏离基线的节点)

视图二:单节点详情

  • 8张卡的利用率、显存、温度、功耗(8条曲线)
  • NVLink带宽(如果支持)
  • 该节点IB端口状态
  • 该节点最近1小时的XID事件

视图三:NCCL通信质量

  • 定期跑的NCCL Tests结果趋势图
  • 当前训练任务的NCCL日志关键字统计(超时、重传、连接失败)

这三个视图配好,日常巡检基本够用。

4.4 故障诊断实战:一次典型的NCCL超时排查

说一个我实际遇到的案例。某次千卡训练任务,跑到第3天突然大量节点报NCCL timeout。按漏斗模型排查:

现象层:任务卡住,日志显示NCCL WARN Timeout。

指标层:查Grafana发现,node37的IB端口rate_bytes_xmit在故障前10分钟开始下降,同时symbol_error飙升。

组件层:登录node37,ibstat显示mlx5_0端口状态为Active但LinkDown计数在涨。perfquery显示该端口误码率异常。

根因层:更换该端口的光模块和光纤后恢复。事后分析是光模块老化导致误码,进而引发NCCL重传和超时。

这个案例里,如果没有IB端口级别的监控,只看到NCCL超时,很可能就去查GPU和驱动了,方向完全错。

避坑技巧:IB/RoCE网络一定要开PFC和ECN,但PFC配置不当会导致风暴。建议在交换机侧配置PFC watchdog,一旦检测到某端口PFC持续暂停超过阈值,自动恢复或告警。另外,RoCEv2场景下,ECN阈值要跟网卡速率匹配,太低会导致过度降速,太高则失去作用。

5. 常见问题与排查技巧实录

5.1 GPU相关常见问题速查

问题现象可能原因排查命令处理建议
GPU利用率低但任务慢数据加载瓶颈nvidia-smi dmon、iostat检查DataLoader worker数、存储IO
GPU掉卡供电不足/散热问题`dmesggrep -i xid`
显存ECC错误显存硬件故障`nvidia-smi -qgrep ECC`
NVLink降速链路误码nvidia-smi nvlink -e重新插拔GPU或换基板
频率被锁功耗墙/温度墙nvidia-smi -q -d PERFORMANCE检查散热和电源策略

5.2 NCCL常见报错与处理

报错一:NCCL WARN Bootstrap : no socket interface found

原因:NCCL找不到可用的网络接口。处理:设置NCCL_SOCKET_IFNAME为正确的网卡名,比如eth0或bond0。

报错二:NCCL INFO Call to connect returned Connection refused

原因:对端节点NCCL进程没起来,或者防火墙挡了端口。处理:检查对端进程状态,确认端口范围开放。

报错三:NCCL WARN Timeout

原因:通信超时,可能是网络拥塞、链路故障、或者某张卡挂了。处理:按漏斗模型排查,先看IB端口指标,再看XID。

报错四:NCCL INFO NET/IB : Using [0]mlx5_0:1/IB但带宽很低

原因:可能走了错误的IB端口,或者GID索引不对。处理:设置NCCL_IB_HCA指定正确的HCA,设置NCCL_IB_GID_INDEX匹配RoCE版本。

5.3 监控系统自身的坑

监控系统本身也会出问题,我踩过的坑包括:

  • Prometheus存储爆盘:默认保留15天,千卡集群指标量大,很容易把磁盘写满。建议设置storage.tsdb.retention.time=7d,并配置远程存储。
  • DCGM Exporter内存泄漏:某些版本长时间运行会吃满内存。建议设置容器内存限制,并定期重启。
  • Grafana面板查询超时:查询范围太大或指标太多会导致超时。建议用Recording Rules预聚合,面板查询走预聚合数据。
  • 时间不同步:节点间时间不同步会导致日志和指标对不上。必须部署NTP或Chrony,确保所有节点时间偏差在毫秒级。

独家技巧:我习惯在每台机器上跑一个轻量级的日志采集器(比如Promtail),把dmesg、journalctl -u nvidia-*、NCCL日志统一收集到Loki。这样排查时,在Grafana里可以同时看指标和日志,不用来回切换终端。

6. 从单点工具到体系化能力

把Benchmark、监控、诊断这三块串起来,才算真正有了“听诊器”。但体系化不是一蹴而就的,我的建议是分三步走:

第一步:先跑通Benchmark,建立基线。哪怕只有单机8卡,也要把NCCL Tests、gpu-burn、HPL跑一遍,把数据存下来。这是后续所有异常判断的参照物。

第二步:搭最小可用监控。Prometheus + Grafana + DCGM Exporter + node_exporter,四个组件就能覆盖80%的日常需求。先把XID、温度、功耗、IB端口状态这几个关键指标盯住。

第三步:建立故障诊断SOP。把常见故障的现象、排查步骤、处理方案写成文档,最好做成Checklist。每次故障处理后更新SOP,慢慢就形成团队的知识库。

我在实际运维中发现,最耗时的往往不是解决故障本身,而是定位故障。一套好的听诊器能把定位时间从几小时压缩到几分钟,这对大规模训练任务来说,节省的就是真金白银。

最后分享一个小技巧:定期做“故障演练”。比如故意拔掉一根IB线,看监控多久能告警、诊断流程多久能定位。演练多了,真出故障时就不会慌。这个习惯我坚持了三年,团队的平均故障恢复时间从最初的4小时降到了现在的25分钟。

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进