Horovod安装

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. Centos 7 安装Cuda10 过程记录
  2. 总结在CentOS7上搭建CUDA10+cudnn7的Tensorflow-gpu环境的经验

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.复制代码

解决方法

参考(需要注意里面关于显卡驱动安装的版本是否和系统一致):

  1. Could not load dynamic library 'libnvinfer_plugin.so.6' #35968

  2. 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;复制代码

解决方案

参考:

  1. tensorflow查看使用的是cpu还是gpu

  2. 解决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卡驱动即可。

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值