从万兆到10万兆:我的GPU集群网络升级翻车+救火实录

7 阅读4分钟

文章正文

上次写了一篇PCIe降级排查实录,说三台GPU服务器全部跑在PCIe 1.0上小半年,改完BIOS以后GPU终于恢复到PCIe 4.0满速了。本以为性能问题告一段落,结果一看多机推理的benchmark,网络才是下一个瓶颈——两台服务器之间走的万兆网,跑235B的大模型TP=4跨节点通信,万兆的带宽明显不够用。

于是趁热打铁,又把网络从万兆升级到了100GbE(十万兆)。跑的是235B的MoE大模型(AWQ量化后~116GB),跨两台服务器4张4090魔改48G做张量并行(TP=4,就是把模型切成4份分别放到4张卡上同时算)。

本来以为换个网卡、线速到了就完事。结果又折腾了两天,中间还翻了个大车——升级完反而更慢了。

先说下后面会用到的几个指标:

  • 吞吐量(tok/s):每秒生成多少个token,越高越好。64并发吞吐量就是64个请求同时跑,每秒总共出多少token
  • TPOT(Time Per Output Token):每生成一个token要多久,越低说明每个请求响应越快。比如TPOT=42ms,就是每个token平均42毫秒出来
  • TTFT(Time To First Token):用户发出请求到收到第一个token的时间,主要受prefill阶段影响

第一天:100G网卡装上了,速度反而崩了

装好Mellanox 100G双口网卡,跑ib_write_bw(测试RDMA裸带宽的工具),带宽到91.75 Gb/s,接近线速,心里挺美。

然后跑benchmark——单请求吞吐直接从22 tok/s掉到7.1 tok/s,TPOT从45ms飙到141ms。

100G的卡跑出比万兆还差的效果。

排查了一圈,踩了好几个坑:

网卡接口要绑对:服务器上有管理口、万兆口、100G口三个网卡,通信框架默认不一定选对,必须手动指定走100G口。

RoCEv2有个参数容易设错:RoCEv2是让以太网跑RDMA的协议,设错了会fallback到更慢的模式,你看着带宽够了但延迟还是高。具体哪个参数就不说了,ibv_devinfo能查。

Linux内核网络缓冲区太小:默认就几百KB,100G网络高并发时根本不够用,改成128MB后改善明显。


第二天:找到真正的性能杀手

上面那些调完,高并发好多了,但单请求TPOT还是131ms,没回到万兆的水平。

最后发现是一个调试参数背锅——之前为了方便调试加了个参数,会禁用CUDA Graphs(CUDA Graphs是NVIDIA的优化技术,把多个GPU操作打包成一个图一次性提交,避免CPU逐个发起kernel launch的开销)。单机无所谓,但多机TP的时候,每个token生成都要跨节点做AllReduce(把4张卡的中间结果汇总),没有CUDA Graph的话每次都是CPU单独发起操作,延迟堆起来了。

去掉这个参数,启动时自动捕获了67个shape的CUDA Graph,耗时约32秒。之后所有推理都走graph。

单这一个改动,TPOT从131ms降到42ms,3倍提升。


最终性能对比

235B MoE模型,TP=4,max_tokens=256:

阶段网络CUDA Graphs单请求吞吐单请求TPOT64并发吞吐
万兆基线10GbE22.0 tok/s45.0ms
100G TCP100GbE7.1 tok/s141.2ms245 tok/s
100G RDMA100GbE7.6 tok/s131.1ms430 tok/s
最终优化100GbE RDMA23.5 tok/s42.1ms497.5 tok/s

从万兆基线到最终优化,单请求TPOT从45ms降到42ms,64并发从135 tok/s(万兆的16并发峰值)直接干到497 tok/s,高并发吞吐提升接近4倍

中间那个"升级反而更慢"的阶段,纯粹是那个调试参数挖的坑。


给要做类似升级的人几点建议

  1. 先跑ib_write_bw确认物理层没问题,带宽不到线速说明驱动或线缆有问题
  2. 100G网卡TCP本身就有开销,最终还是要上RDMA才能在高并发场景跑满
  3. 多机部署注意CUDA Graphs是否真的开了,没开的话延迟会非常离谱
  4. 内核网络缓冲区要改,具体改多大看并发需求,128MB是个保险值
  5. 做完所有优化后再看效果,单独改某一个可能不明显,组合起来效果很大

有问题欢迎私信交流,踩过的坑可以帮你避一避。

顺便说一句,这次升级之前还踩过一个大坑——三台GPU服务器全部PCIe降级到1.0跑了小半年,性能一直在打折。感兴趣的可以看我这篇:三台4090服务器GPU全部PCIe降级到1.0——排查实录


我方向是电力行业AI落地,自建GPU集群,大模型私有化部署。踩坑经验持续分享。