基础环境 | GPU | 检查多机中每个节点的GPU是否归属同一型号, horovod后台线程周期性处理提交的梯度, 如果由于GPU计算能力不同或网络延迟导致某次allreduce中某个提交者落后超过一个周期, 会发生使用错误的Tensor进行allreduce的情况, 通常, 这都会导致Tensor Shape Mismatch的错误, 笔者就层遇到过不小心同时使用M40和P40的情况, 在tensorflow1.8还能的运行, 但1.14就无法多机reduce, 定位了好久才发现是硬件不同 |
cuda | 是否与驱动match:cuda兼容性检查及下载, 随同一起安装的还有cupti等组件 | |
cudnn | 版本是否与cuda版本match: cudnn兼容性检查及下载 | |
nccl | 版本是否与cuda版本match: nccl兼容性检查及下载 | |
mpi | 其中libmpi.so要对外可见, 多机训练需要tensorflow编译的时候就要将MPI链接到lib中, 同时, MPI对于horovod也是必要依赖 | |
Tensorflow | tensorflow | 选择的tensorflow 版本是否兼容系统cuda, 官方兼容列表 |
tensorboard | tensorboard是否兼容tensorflow, tensorboard的版本号要与tensoflow保持一致 | |
tensorflow-estimator | tensorflow-estimator是否兼容了tensorflow, tensorflow 1.10.6 之后的特性, 是对底层API的封装, 需要与tensorflow版本号一致 | |
bazel | tensorflow对使用的bazel版本比较敏感, 如果没有修改bazelrc却出现bazelrc文件解析错误, 就要考虑下是不是bazel版本的问题, 参考tensorflow测试通过的bazel版本和bazel下载 | |
编译选项 | tensorflow编译选项, 是否包含了cuda和nccl, 这两个缺省都是不安装的, 此处使用GPU, cuda为必须, 加之多机多卡, NCCL可以减少通信开销, 应该编译进tensorflow. 在1.13之前, nccl是随同config的过程一同配置, 1.14开始使用环境变量 + .bazelrc控制NCCL的安装, 具体的, 环境变量中需要export以下环境变量
export TF_NCCL_VERSION=2.4.2 export NCCL_HDR_PATH=/usr/local/nccl_2.4.2-1+cuda9.2_x86_64/include/同时, 修改tensorflow/.bazelrc文件 build:nccl --define=with_nccl_support=true #build:nccl --define=no_nccl_support=true |
|
Horovod | 环境变量 | 环境变量是否指定了libtensorflow_framework.so的路径以及NCCL路径信息
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/lib/python2.7/site-packages/tensorflow/ export HOROVOD_WITH_TENSORFLOW=1 export HOROVOD_WITHOUT_PYTORCH=1 export HOROVOD_GPU_ALLREDUCE=NCCL export HOROVOD_NCCL_HOME=/usr/local/nccl_2.1.15-1+cuda9.0_x86_64 export HOROVOD_NCCL_INCLUDE=/usr/local/nccl_2.1.15-1+cuda9.0_x86_64/include/ export HOROVOD_NCCL_LIB=/usr/local/nccl_2.1.15-1+cuda9.0_x86_64/lib/ |