Horovod需要mpi进行通信,NCLL和CUDA进行编译,所以安装Horovod前需要先安装相应的依赖。
环境说明
- centos7 x64
- openmpi 4.0.2
- nccl nccl-repo-rhel7-2.6.4-ga-cuda10.0-1-1
- cuda cuda_10.0.130_410.48_linux
- cudnn 7.6.5
- tensorflow-gpu 1.14.0
- torch 1.1.0
- Keras 2.2.4
- horovod 0.19.1
open mpi安装
参考链接: How do I build Open MPI?
下载地址:download
1. 下载openmpi
可以前往下载地址下载对应的安装包后上传到服务器,也可以在服务器用wget
进行下载,这里使用wget
下载版本为4.0.2的openmpi
wget https://download.open-mpi.org/release/open-mpi/v4.0/openmpi-4.0.2.tar.gz复制代码
2. 解压、编译、安装
tar -zxvf openmpi-4.0.2.tar.gz
cd openmpi-4.0.2
mkdir /usr/local/openmpi-4.0.2
./configure --prefix=/usr/local/openmpi-4.0.2
make all install复制代码
3. 配置环境变量
/etc/profile
文件中添加以下内容:
# openmpi
export OPENMPI_HOME=/usr/local/openmpi-4.0.2
export PATH=$PATH:$OPENMPI_HOME/bin复制代码
然后source /etc/profile
一下使其生效
4. 测试
进入openmpi安装包目录/examples(注意是安装包目录/opt/openmpi-4.0.2
不是安装目录/usr/local/openmpi-4.0.2
)
make
./hello_c复制代码
如果出现以下内容表示ok:
Hello, world, I am 0 of 1, (Open MPI v4.0.2, package: Open MPI root@dp-master Distribution, ident: 4.0.2, repo rev: v4.0.2, Oct 07, 2019, 109)复制代码
NCCL安装
参考地址:nccl-install-guide
下载地址:NVIDIA Collective Communications Library (NCCL) Download Page
1. 安装NCLL
下载好对应版本的NCLL后将NCLL上传到服务器,不同的系统的安装文件和执行命令不一致需要注意(90和25x系统不一样):
centos:
sudo rpm -ivh nccl-repo-rhel7-2.6.4-ga-cuda10.0-1-1.x86_64.rpm --force --nodeps
sudo yum update
sudo yum install -y libnccl libnccl-devel libnccl-static复制代码
ubuntu:
sudo dpkg -i nccl-repo-ubuntu1804-2.6.4-ga-cuda10.0_1-1_amd64.deb
sudo apt update
sudo apt install libnccl2 libnccl-dev复制代码
CUDA安装
参考文档:
1. 检测显卡驱动
lspci | grep -i vga
01:00.0 VGA compatible controller: NVIDIA Corporation GP104 [GeForce GTX 1080] (rev a1)复制代码
如果出现上述的结果表明已经有显卡驱动,如果没有的话,可参照centos 安装 nvidia的两种方式 进行安装
2. 禁用Nouveau驱动
centos默认是有Nouveau
驱动的,以下命令有任何输出表示还没有禁用(否则跳过):
lsmod | grep nouveau复制代码
通过在/etc/modprobe.d/blacklist.conf
添加以下内容后重启机器实现Nouveau
的禁用:
blacklist nouveau
options nouveau modeset=0复制代码
reboot
重启
3. cuda安装
前往CUDA Toolkit Archive寻找适合的版本下载安装包,这里使用的是10.0
版本的(tensorflow1.14未对10.1进行测试):
wget https://developer.nvidia.com/compute/cuda/10.0/Prod/local_installers/cuda_10.0.130_410.48_linux复制代码
然后执行以下命令进行安装:
init 3
# 如果默认可以加上 --silent
sudo sh cuda_10.0.130_410.48_linux.run复制代码
在安装前需要执行init 3
这个命令,不然会报以下错误:
The file '/tmp/.X0-lock' exists and appears to contain the process ID '3031' of a runnning X server.复制代码
解决参考文档为:How to install NVIDIA.run?
安装完成后在/etc/profile
中添加以下配置:
export PATH=$PATH:/usr/local/cuda-10.0/bin
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/cuda-10.0/lib64复制代码
执行source /etc/profile
使其修改生效
执行nivdia-smi
测试
cudnn安装
安装好显卡驱动和CUDA
后还需要安装cudnn
算法才能使用GPU,使用以下命令进行CUDA的安装:
conda install -y cudatoolkit=10.0
conda install -y cudnn复制代码
如果找不到版本可以指定库下载:
conda install -y cudatoolkit=10.0 -c https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/复制代码
gcc、g++升级
安装编译horovod时需要gcc >= 4.8.5 g++ >= 4.9,centos中自带的版本是4.8.5的,需要升级为高版本的。参考文档:centos7使用yum升级gcc
sudo yum install centos-release-scl
sudo yum install devtoolset-7-gcc*
scl enable devtoolset-7 bash
which gcc
gcc --version
g++ --version复制代码
horovod安装
参考地址1:Install
参考地址2:Horovod Installation Guide
1. 安装horovod
horovod编译的时候需要cpu版本和GPU版本的tensorflow,要确保环境中两者都安装了,不然会触发下载最新版本的tensorflow的操作(这个不确定什么原因,但是我自己安装的时候如果没有CPU版本就自动触发下载tensorflow-2.0版本,所以我都安装了再编译horovod,如果没有这种情况则直接编译即可)
horovod是通过pip安装的,服务器中的python是由conda管理,所以先进入conda对应的环境,然后执行安装命令:
conda activate ai
# 编译horovod需要CPU版本的不知道为什么,不存在就会去下载最新的tensorflow和pytorch
pip install tensorflow==1.14 tensorflow-gpu==1.14
# 编译
HOROVOD_GPU_ALLREDUCE=NCCL HOROVOD_GPU_BROADCAST=NCCL HOROVOD_WITH_TENSORFLOW=1 HOROVOD_WITH_PYTORCH=1 pip install --no-cache-dir horovod[tensorflow,keras,pytorch]
# 编译完要卸载所有tensorflow,然后重装tensorflow-gpu,不然只能用CPU很奇怪
pip uninstall -y tensorflow tensorflow-gpu tensorflow-estimator tensorboard
pip install tensorflow-gpu==1.14
# 测试horovod支持的框架是否包含tensorflow和pytorch
horovodrun -cb
# --测试GPU是否可用--
# 检测可用device
from tensorflow.python.client import device_lib
print(device_lib.list_local_devices())
# 测试GPU是否可用
import tensorflow as tf
tf.test.is_gpu_available()复制代码
2. 测试
测试参考我的另一篇文章:horovod测试
3. 问题解决:
问题1:
Could not load dynamic library 'libnvinfer_plugin.so.6'; dlerror: libnvinfer_plugin.so.6: cannot open shared object file: No such file or directory
W tensorflow/compiler/tf2tensorrt/utils/py_utils.cc:30] Cannot dlopen some TensorRT libraries. If you would like to use Nvidia GPU with TensorRT, please make sure the missing libraries mentioned above are installed properly.复制代码
解决方法
参考(需要注意里面关于显卡驱动安装的版本是否和系统一致):
-
Could not load dynamic library 'libnvinfer_plugin.so.6' #35968)
-
Could not load dynamic library 'libnvinfer.so.6'
# 确保/usr/local/cuda-10.1/lib64配置在系统变量LD_LIBRARY_PATH中了 echo $LD_LIBRARY_PATH # 如果没有将一下内容补充到/etc/profile中 export PATH=$PATH:/usr/local/cuda-10.1/bin export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/cuda-10.1/lib64 # source使其生效 source /etc/profile复制代码
问题2:
Could not dlopen library 'libcusparse.so.10.0'; dlerror: libcusparse.so.10.0: cannot open shared object file: No such file or directory;复制代码
解决方案
参考:
-
解决Could not load dynamic library 'libcudart.so.10.0'的问题)
# 这其实是由于tensorflow不支持cuda10.1导致的,卸载cuda10.1重新安装cuda10.0即可 cd /usr/local/cuda-10.1/bin/ # 勾选所有卸载原有的cuda sudo ./cuda-uninstaller # 将下载好的cuda10.0上传到服务器后进入到对应目录 sudo init 3 # 别用--silent,重装的时候不用再安装显卡驱动了,不然又得重启 sudo sh ./cuda_10.0.130_410.48_linux.run # 安装好后更新/etc/profiled的配置为一下内容 export PATH=$PATH:/usr/local/cuda-10.0/bin export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/cuda-10.0/lib64 # 使修改生效 source /etc/profile # 重装cuda-toolkit conda uninstall -y cudatoolkit conda install -y cudatoolkit=10.0 conda install -y cudnn #重装tensorflow pip uninstall -y tensorflow tensorflow-gpu tensorflow-estimator tensorboard pip install tensorflow-gpu==1.14复制代码
执行以下代码进行测试,不报错则完成:
# 检测可用device from tensorflow.python.client import device_lib print(device_lib.list_local_devices()) # 测试GPU是否可用 import tensorflow as tf tf.test.is_gpu_available()复制代码
问题3:
horovod.run.common.util.network.NoValidAddressesFound: Unable to connect to the horovodrun task service #1 on any of the addresses复制代码
这个问题是在多机多卡训练的时候发生的,horovod的多节点分布式训练要求每个节点都有能连通的端口,可能会由不一样的情况导致。我这里主要是有个warning表示253期望用enp4s0
网卡连接但是用了enp3s0
(忘了没保留错误信息),这是因为一次系统异常后网卡驱动名称改了。参照CentOS7网络配置和修改网卡名称及常用服务管理命令将网卡名称改为enp4s0
即可。
sudo nmtui
sudo reboot复制代码
问题4:
NVIDIA-SMI has failed because it couldn't communicate with the NVIDIA driver. Make sure that the latest NVIDIA driver is installed and running.复制代码
应该是显卡驱动出问题了,重装N卡驱动即可。