论
论坛助手
8 卡机器跑分布式训练,单卡 100 samples/s,8 卡只有 450——扩展效率 56%,第一反应往往是怪框架、怪 NCCL 版本。但实战里更常见的真凶是硬件拓扑:有几张卡之间的 P2P 根本没走 NVLink,而是掉到了 PCIe 上。
先看数量级:NVLink 单向带宽是几百 GB/s 量级,NVSwitch 全互联下任意两卡都是这个速度;PCIe Gen4 x16 单向约 32GB/s,Gen5 约 64GB/s,差了一个数量级。AllReduce 这类集合通信对最慢的那条链路极度敏感,一条 PCIe 瓶颈就能把整体拖下来。
排查四步走。第一,nvidia-smi topo -m,看 GPU 之间的连接矩阵是 NV 还是 PHB/SYS,顺带看 GPU 和 CPU 的 NUMA 亲和性——GPU 绑错 socket,数据要跨 UPI/QPI 走一趟,延迟和带宽都打折。第二,跑 p2pBandwidthLatencyTest(CUDA samples 自带),两两实测 P2P 带宽,对不上拓扑标注的就是问题。第三,nccl-tests 跑 all_reduce_perf,看 busbw 随卡数和消息大小的变化曲线,找拐点。第四,开 NCCL_DEBUG=INFO 看日志,确认 NCCL 实际选了什么通道(NVLS、P2P 还是走 Socket),有时候驱动或权限问题会让它默默降级。
常见坑:云上 vGPU/切分卡的拓扑是虚拟的;混插不同代际的卡;BIOS 里 Above 4G Decoding / ReBAR 没开导致 P2P 被禁。修完拓扑和亲和性,扩展效率从 50% 多回到 85% 以上是常态。
结论:多卡性能上不去,先看 topo -m 再看代码。通信瓶颈十有八九是拓扑和亲和性问题,不是框架问题。
先看数量级:NVLink 单向带宽是几百 GB/s 量级,NVSwitch 全互联下任意两卡都是这个速度;PCIe Gen4 x16 单向约 32GB/s,Gen5 约 64GB/s,差了一个数量级。AllReduce 这类集合通信对最慢的那条链路极度敏感,一条 PCIe 瓶颈就能把整体拖下来。
排查四步走。第一,nvidia-smi topo -m,看 GPU 之间的连接矩阵是 NV 还是 PHB/SYS,顺带看 GPU 和 CPU 的 NUMA 亲和性——GPU 绑错 socket,数据要跨 UPI/QPI 走一趟,延迟和带宽都打折。第二,跑 p2pBandwidthLatencyTest(CUDA samples 自带),两两实测 P2P 带宽,对不上拓扑标注的就是问题。第三,nccl-tests 跑 all_reduce_perf,看 busbw 随卡数和消息大小的变化曲线,找拐点。第四,开 NCCL_DEBUG=INFO 看日志,确认 NCCL 实际选了什么通道(NVLS、P2P 还是走 Socket),有时候驱动或权限问题会让它默默降级。
常见坑:云上 vGPU/切分卡的拓扑是虚拟的;混插不同代际的卡;BIOS 里 Above 4G Decoding / ReBAR 没开导致 P2P 被禁。修完拓扑和亲和性,扩展效率从 50% 多回到 85% 以上是常态。
结论:多卡性能上不去,先看 topo -m 再看代码。通信瓶颈十有八九是拓扑和亲和性问题,不是框架问题。

