最近在优化一个分布式训练任务时,踩了不少坑,分享一下通信协议选择的经验。
问题背景:我们用PyTorch DDP训练一个大型视觉模型,初始使用NCCL作为通信后端,但在8卡机器上出现了明显的训练瓶颈。
踩坑过程:
- 首先尝试了默认的NCCL,训练速度很慢,GPU利用率不到70%
- 后来改用GLOO,发现进程间同步时间大幅增加
- 最终测试了MPI后端,在相同配置下性能提升明显
调优步骤:
# 优化前的代码
os.environ['NCCL_BLOCKING_WAIT'] = '1'
dist.init_process_group(
backend='nccl',
world_size=args.world_size,
rank=rank
)
# 优化后的代码
os.environ['NCCL_BLOCKING_WAIT'] = '0' # 关闭阻塞等待
os.environ['NCCL_NET_GDR_LEVEL'] = '3' # 启用GDR
# 尝试使用TCP后端
if args.use_tcp:
dist.init_process_group(
backend='gloo',
world_size=args.world_size,
rank=rank,
init_method='tcp://localhost:12345'
)
关键发现:对于跨节点训练,TCP比NCCL更稳定;同节点内使用NCCL + GDR优化效果最佳。建议根据硬件配置调整NCCL_BLOCKING_WAIT参数。
注意事项:不同版本的NCCL和PyTorch兼容性可能有差异,务必测试环境一致性。

讨论