TensorFlow在InfiniBand网络使用RDMA失败,执行分布式训练命令报错
问题场景
在InfiniBand网络环境中运行TensorFlow分布式训练时,我指定--server_protocol=grpc+verbs尝试启用RDMA加速,但执行训练命令后出现报错。
执行的训练命令:
python tf_cnn_benchmarks.py \ --local_parameter_device=gpu \ --num_gpus=1 \ --batch_size=2 \ --model=alexnet \ --variable_update=distributed_replicated \ --job_name=ps \ --ps_hosts=192.168.230.107:50000 \ --worker_hosts=192.168.230.107:60000,192.168.230.108:60000 \ --task_index=0 \ --server_protocol=grpc+verbs
报错片段:
Traceback (most recent call last):
File "tf_cnn_benchmarks.py", line 1258, in
tf.app.run()
File "/usr/lib/python2.7/site-packages/tens...
排查与解决思路
我之前踩过类似的坑,大概率是RDMA相关依赖没配置到位,或者TensorFlow版本的兼容性问题,你可以按下面的步骤逐一排查:
1. 确认TensorFlow是否编译了RDMA支持
默认通过pip安装的预编译TensorFlow包没有开启RDMA支持,这是最常见的原因。你需要从源码编译TensorFlow,编译时加上--config=verbs参数(针对你用的Python2.7,对应TensorFlow 1.x系列):
bazel build --config=verbs --config=cuda //tensorflow/tools/pip_package:build_pip_package
编译完成后生成pip包,再安装到你的环境中。
2. 先验证底层RDMA连通性
先抛开TensorFlow,直接测试两台机器的InfiniBand RDMA是否能正常工作,用ib_send_bw工具跑带宽测试:
# 在192.168.230.107上运行服务端 ib_send_bw -d mlx5_0 -i 1 # 在192.168.230.108上运行客户端 ib_send_bw -d mlx5_0 -i 1 192.168.230.107
如果测试失败,说明底层InfiniBand环境有问题:
- 用
ibstat命令检查IB端口状态,确保State是Active、Physical State是LinkUp - 确认MLNX_OFED驱动是否安装正确,两台机器的驱动版本要一致
3. 安装RDMA依赖库
TensorFlow的grpc+verbs依赖libibverbs和librdmacm,两台机器都要安装:
# CentOS/RHEL系统 yum install -y libibverbs-devel librdmacm-devel # Ubuntu/Debian系统 apt-get install -y libibverbs-dev librdmacm-dev
安装后再重新编译TensorFlow,确保编译过程能找到这些库的头文件和动态库。
4. 尝试使用IB地址而非以太网地址
InfiniBand有专属的IB地址(可通过ibaddr命令查看),虽然grpc+verbs支持以太网地址映射,但直接用IB地址稳定性更好。你可以把ps_hosts和worker_hosts换成IB地址再试。
5. 锁定兼容的TensorFlow版本
因为你用的是Python2.7,建议使用TensorFlow 1.15.x(最后支持Python2.7的稳定版本),这个版本对RDMA的支持更成熟,老版本可能存在grpc+verbs的已知bug。
内容的提问来源于stack exchange,提问作者William Zhou

