压测工具选型:nccl-tests、DeepSpeed、Megatron-LM 对比

说到压测工具选型,我见过不少团队一上来就纠结。其实没那么复杂。你想想看,这三个工具解决的问题层次完全不同。我习惯把它们分成三类:底层通信测试、框架级压测、模型级压测。

嗯,咱们一个一个聊。

1. nccl-tests:最底层的通信基准

nccl-tests 是 NVIDIA 官方出的。说白了,它只测一件事:GPU 之间的带宽和延迟。

它不关心你跑什么模型,也不管你用哪个框架。它只管发数据、收数据、算时间。

核心价值:验证集群的物理通信能力是否达标。

我在项目中遇到过一件事。有一次新集群上线,跑 DeepSpeed 死活上不去吞吐。折腾了两天,最后用 nccl-tests 一测,发现跨节点带宽只有理论值的 30%。原来是 IB 网卡配置错了。你看,要是早点跑这个,能省多少时间。

用法很简单:

# 单节点 8 卡 allreduce 测试
./build/all_reduce_perf -b 8 -e 128M -f 2 -g 8

# 跨节点测试(需要 mpirun)
mpirun -np 16 -hostfile hosts ./build/all_reduce_perf -b 8 -e 128M -f 2 -g 8

输出结果里,我主要看两个指标:algbw(算法带宽)和 busbw(总线带宽)。如果 busbw 低于理论值的 80%,那肯定有问题。

我的习惯:每次集群变更后,先跑一轮 nccl-tests 全家桶。包括 allreduce、allgather、reducescatter。全部通过再上框架。

2. DeepSpeed:微软出品的框架级压测

DeepSpeed 的压测思路不一样。它不测裸带宽,而是测「在 ZeRO 优化下,模型能跑多快」。

我个人觉得,DeepSpeed 的压测工具更适合做「容量规划」。比如你想知道:用 ZeRO-3 跑 175B 的模型,需要多少节点?每节点能塞多少参数?

它内置了一个 benchmark 脚本:

# 在 DeepSpeed 目录下
python benchmark.py --model bert-large --dtype fp16 --num_gpus 8

输出会告诉你:

  • 每 GPU 的吞吐(tokens/sec)
  • 显存占用
  • 通信开销占比

我曾经用这个工具帮一个客户做选型。他们纠结用 8 卡 A100 还是 16 卡 A10G。跑完 benchmark 发现,A10G 虽然卡多,但通信效率低,最终吞吐反而不如 8 卡 A100。嗯,数据说话。

注意:DeepSpeed 的 benchmark 默认用 HuggingFace 模型。如果你用自定义模型,需要自己写一个简单的 forward/backward 脚本。别偷懒,我见过有人直接拿默认结果去汇报,结果跟实际差 30%。

3. Megatron-LM:模型级压测的标杆

Megatron-LM 是 NVIDIA 的。它做压测的方式最「重」——直接跑一个完整的 GPT 或 BERT 训练流程。

为什么说它是标杆?因为它同时压了三个维度:

  • 计算:矩阵乘法、注意力机制
  • 通信:张量并行、流水线并行
  • 显存:激活值、优化器状态

它的压测脚本长这样:

# 跑一个 1.3B 参数的 GPT 模型
bash examples/gpt3/train_gpt3_1.3b_distributed.sh \
  --tensor-model-parallel-size 2 \
  --pipeline-model-parallel-size 2 \
  --num-layers 24 \
  --hidden-size 2048 \
  --num-attention-heads 32

输出结果里,我最关注 tokens per second per GPU。这个指标能直接反映集群的「有效算力利用率」。

我记得有一次,用 Megatron 压测发现吞吐波动很大。排查了半天,发现是 NVLink 带宽被其他进程抢占了。嗯,这种问题 nccl-tests 测不出来,DeepSpeed 也测不出来。只有跑完整模型才能暴露。

4. 三者的对比总结

维度 nccl-tests DeepSpeed Megatron-LM
测试层级 通信层 框架层 模型层
测试内容 带宽、延迟 ZeRO 优化下的吞吐 完整训练流程
耗时 几分钟 十几分钟 几小时
适用场景 集群验收、故障排查 容量规划、框架选型 性能调优、上线前验证
依赖 仅 NCCL DeepSpeed + PyTorch Megatron + PyTorch + Apex

5. 我的选型建议

别想着只用一种工具。我习惯分三步走:

  1. 第一步:nccl-tests 快速验证。确保物理链路没问题。这一步不过,后面都是白搭。
  2. 第二步:DeepSpeed benchmark 做容量估算。确定能跑多大的模型、用多少资源。
  3. 第三步:Megatron-LM 跑完整压测。模拟真实训练场景,暴露隐藏问题。

避坑指南:我曾经跳过第一步,直接上 Megatron。结果跑了一天发现吞吐不对,回头一查是网卡固件版本不匹配。白白浪费一天算力。所以,别嫌麻烦,按顺序来。

6. 核心逻辑图

下面这张图展示了三个工具的定位和关系。我建议你保存下来,以后做方案时对照着看。

压测工具选型:三层测试体系 nccl-tests(通信层) 测试内容:GPU间带宽、延迟 | 耗时:几分钟 适用场景:集群验收、故障排查 通过后 DeepSpeed(框架层) 测试内容:ZeRO优化下的吞吐 | 耗时:十几分钟 适用场景:容量规划、框架选型 通过后 Megatron-LM(模型层) 测试内容:完整训练流程 | 耗时:几小时 适用场景:性能调优、上线前验证

你看,这三层是递进关系。底层不过,上层跑得再花哨也没用。我见过太多人一上来就调 Megatron 的参数,结果发现是网线没插好。嗯,别做那种事。

好了,工具选型就聊到这儿。记住一个原则:先通后快,先简后繁。下次你拿到一个新集群,按这个顺序来,不会错。