八块显卡跑在两块主机上,所有单节点监控指标绿油油。但吞吐量掉了四倍。问题藏在跨节点查询里,不在任何一台机器的日志中。

一个典型场景:全员健康,全员卡死

打开网易新闻 查看精彩图片

这是GPU集群调试的噩梦模式。八个rank分布在两台主机,执行ncclAllReduce(英伟达集合通信库的全归约操作)。token吞吐暴跌75%,但每台机器上的nvidia-smi显示GPU利用率95-99%,DCGM的SM_ACTIVE指标正常跳动,eBPF追踪看到cudaLaunchKernel → ncclAllReduce → cudaStreamSynchronize完整走完。

真相:rank 5在B节点上某步骤花了380毫秒,其他七个rank 90毫秒就跑完。剩下七人不是闲着——他们在ncclAllReduce里等了290毫秒。ncclAllReduce本身是CUDA核函数,nvidia-smi看来就是"正在运行"。

单节点视角完全失效。你需要问的是:这次端到端掉速,哪个rank的ncclAllReduce比同伴启动更晚?它之前500毫秒在干什么?

这是跨主机关联查询,不是时间序列能回答的。

为什么现有工具集体失明

三个事实,单节点监控永远看不见:

一、rank 5进入屏障比其他rank晚290毫秒——这是集群级事实,不是主机级事实。

二、其他rank在ncclAllReduce里阻塞的290毫秒,本地追踪显示为"正常完成的核函数调用"。

三、根因是rank 5前一步的某个操作,但那个操作的痕迹只存在于rank 5的本地日志。

传统方案把每台机器的采样打到中央仪表盘,画成时间序列曲线。曲线能告诉你"8点15分集群慢了",但回答不了"谁导致的"。

需要的是关系型查询:把八个rank的事件流按时间戳和资源属性(cluster ID, node ID, rank, nranks)做跨节点join。

Ingero Echo的设计:让AI代理能直接问

Ingero的v0.12.4版本已经解决了数据采集。每台主机的agent通过uprobe挂钩libcudart.so和libnccl.so,用eBPF捕获内核调度事件,输出OTLP(OpenTelemetry协议)格式。

v0.12.5补上了集群级归集层:Ingero Echo。

架构很直接。所有Fleet collector的OTLP/gRPC流自动汇入嵌入式DuckDB,单写多读,SQL只读。然后暴露为MCP-over-DuckDB——AI代理可以直接查询。

关键设计选择:DuckDB是嵌入式的,没有外部服务依赖;MCP(模型上下文协议)让LLM能把自然语言问题转成精确SQL,而不是让工程师手写。

验证demo跑了90秒:Echo在:4317端口启动,两个echo-stress实例分别推流(node-a100 + node-h100),合计2000条事件,DuckDB验证全部落盘,因果链标记(causal-chain markers)跨网络存活。

从2000条事件里捞出straggler

demo的核心是证明查询可行。两条事件流来自不同架构的GPU(A100和H100),fan-in进同一张表后,SQL可以按rank分组、按步骤聚合,算出每个rank每步骤的耗时离散度。

380毫秒 vs 90毫秒的异常,在group by step_id, rank having max(duration) > 2*avg(duration)这类查询里直接浮出来。

不需要人工比对八份日志。不需要假设"可能是网络问题"然后逐台ping。问题定义和答案都在同一张表的关系型结构里。

这对AI基础设施意味着什么

大模型训练的成本结构正在变化。算力集群从"能跑起来"进入"能debug"阶段,而debug的瓶颈从"数据不够"变成"查询太难"。

Ingero Echo的赌注是:把集群级事件流变成AI代理能直接操作的SQL接口,让诊断问题的时间从小时降到分钟。2000条事件的demo是个起点——真实训练任务的event量级在百万到十亿,但查询模式相同。

当每台机器都显示健康,但业务指标暴跌时,工具必须能回答"谁拖了后腿"。这是从监控(monitoring)到可观测性(observability)的真正跨越:不是收集更多指标,而是让任意维度的问题都能被查询。