鱼喃

听!布鲁布鲁,大鱼又在那叨叨了

在 CentOS 7.6 上部署 CUDA、cuDNN、tensorflow-gpu 运行环境

Background

网上关于安装 tensorlfow-gpu 环境的博客可谓是多如牛毛,但是参考了很多篇,都没能成功的在 CentOS 7.6 上把整套环境布置上。折腾了差不多一个礼拜,时间跨度长达几个月,总算是把这一堆装上了,分享一下过程。本文主要目的在于给出一个非常详细的安装过程(从一个全新环境开始后的每一个操作)以及环境配置说明,这样后面的人参考的时候就能根据不同之处快速定位问题。

测试环境

本文中使用的服务器是 Google Cloud 的VPS,下图是详细配置。

792b00403e3b4f87f881ddb087ddf8c9.png

  • 系统版本为 CentOS 7.6.1810 (不太确定是不是 minimal,不过没有wget,应该是吧)
  • 挂载了一块 Nvidia K80 显卡

版本选择

因为目的是运行tensorflow程序,所以各个版本都要跟着tf来。目前为止(确切来说是昨天),默认安装的tensorflow-gpu版本是1.12,这个版本也发布了挺久的了,尽量选择新的稳定的。

参照以下链接中的tf版本支持情况,可以看到 1.12 (仅)支持 CUDA 9 和 cuDNN 7,需要注意的是,这里虽然没有写小版本号,但是实际上它支持且仅支持9.0,其他版本会出现找不到so库的错误。

Tested build configurations

所以 CUDA 版本选择 9.0,cuDNN 选择 7.0 版本。

即便您的版本跟环境都相同,也不建议直接复制粘贴命令,因为随着时间流逝,很多文件名都已变化

本文最后更新于 20190305,如果按照文中步骤出现错误,可以通过邮件联系我。

安装 Nvidia GPU 驱动

各个教程都建议通过cuda安装包来安装驱动,但是测试了很多次都没有成功,反复出现

NVIDIA-SMI has failed because it couldn’t communicate with the NVIDIA driver. Make sure that the latest NVIDIA driver is installed and running.

这个错误,试了网上很多诸如禁用nouveau模块、安装kernel包,都没有解决这个问题,安装cuda9.2倒是能成功运行,可坑爹的tensorflow只认9.0版本啊!

后来尝试单独安装Nvidia driver,发现是完全OK的,只要跟cuda版本兼容就行。所以本教程中Nvidia驱动是单独安装的,此外单独安装还有另外一个原因:后期准备在docker里运行程序,宿主机上只安装必需的程序。

首先,点击链接,选择相关的参数,没有给出CentOS的选项,所以选了Linux 64-bit RHEL7,然后搜索进入下载页面,点击下载,同意并继续,然后在浏览器下载队列里复制文件下载链接。

Download Drivers

623f46be5ced6dfc33910af961d8ce63.png

我的是http://us.download.nvidia.com/tesla/384.183/nvidia-diag-driver-local-repo-rhel7-384.183-1.0-1.x86_64.rpm

连上服务器,切换到root用户,首先下载文件。

1
2
3
4
5
6
sudo su

# 如果没有wget,先安装
yum install -y wget

wget http://us.download.nvidia.com/tesla/384.183/nvidia-diag-driver-local-repo-rhel7-384.183-1.0-1.x86_64.rpm

(现在似乎下载的都是run文件,直接运行就可以)

然后安装驱动,会自动装上一些依赖,如dkms什么的。

1
2
3
4
5
rpm -i nvidia-diag-driver-local-repo-rhel7-384.183-1.0-1.x86_64.rpm

yum clean all

yum install -y cuda-drivers

如果提示需要dkms,安装一下

1
2
yum install -y epel-release
yum install -y --enablerepo=epel dkms

安装完毕之后输入 nvidia-smi 命令,不出意外就能看见输出了。

01049238878340472ff3c65a3244737b.png

驱动安装完毕,还是挺简单的,没有网上那么复杂的安装和修改模块啥的。

如果只想在docker里使用GPU,后面的CUDA和cuDNN就都不用安装。

安装 cuda9.0

首先到以下页面选择期望的cuda版本,如9.0,然后选择你的环境参数等信息。

CUDA Toolkit Archive

网站提供了三种安装方式:runfile(local)、rpm(local)、rpm (network)

258489ca1dfafb23ab996f8cbeb0f92a.png

如果要部署的服务器很多,推荐使用local安装的形式,毕竟文件还是挺大的。runfile和rpm都行,我这里选择了runfile模式。

点击下载,然后获取下载链接。(9.0版本现在有很多的patch补丁,需要从第一个本体程序开始都装一遍,步骤类似)

1
2
3
wget -O cuda_9.0.176_384.81_linux.run https://developer.nvidia.com/compute/cuda/9.0/Prod/local_installers/cuda_9.0.176_384.81_linux-run

sh cuda_9.0.176_384.81_linux.run

由于文件较大,等待一会后进入README,不停按空格,一直到最后让你确认这块,当然是选择 accept 啦(我有的选么。。。),然后问是否安装驱动,因为上一步已经装过了,所以这步选n跳过。整个过程中只需要在cuda toolkit这一步选y,其他都n,然后等待安装完成。(中间有一步问是否创建软链接,我感觉没必要,毕竟tensorflow那么坑爹,没法做到透明升级)

48df54970aa5e9196f111e719d7dbf8b.png

不出意外的话,cuda就安装完毕了(等待时间还挺久的),最后会提示让把cuda的路径添加到环境变量里。
acc032050c83fd55426361f5610ad67f.png

1
2
3
4
echo 'export PATH=/usr/local/cuda-9.0/bin:$PATH' >> /etc/profile.d/cuda-9.0.sh
echo 'export LD_LIBRARY_PATH=/usr/local/cuda-9.0/lib64:$LD_LIBRARY_PATH' >> /etc/profile.d/cuda-9.0.sh

source /etc/profile.d/cuda-9.0.sh

最后一步也可以不输入,重启服务器等自动生效也行,不过服务器重启一次实在是太慢了。

至此,cuda安装完毕,可以通过执行 /usr/local/cuda-9.0/extras/demo_suite/deviceQuery 程序来判断是否安装成功。

98d303cca7e84f3302391ea853502b3d.png

安装 cuDNN 7.0

首先不得不吐槽一下,Nvidia 你一个卖硬件的,下个驱动还得注册账号。。。

打开以下链接,选择合适的版本,注意cuda的版本号。选好之后就告知要注册账号,按照要求注册完账号之后,回来再重新走一遍流程,就能下载了。

cuDNN Archive

43f1b14656c7ad5ba47978e3a846a2e4.png

同样是获取下载链接,然后在服务器上

1
2
# 请把下面这个链接换成你自己的,不然会访问禁止
wget -O cudnn-9.0-linux-x64-v7.tgz https://developer.download.nvidia.com/compute/machine-learning/cudnn/secure/v7.0.5/prod/9.0_20171129/cudnn-9.0-linux-x64-v7.tgz

压缩包里就几个文件,复制到cuda目录下即可。

1
2
3
4
5
6
7
tar zxvf cudnn-9.0-linux-x64-v7.tgz

cp cuda/include/* /usr/local/cuda-9.0/include
cp cuda/lib64/* /usr/local/cuda-9.0/lib64

rm -rf cuda
rm -f cudnn-9.0-linux-x64-v7.tgz

至此,cuDNN就安装完毕了。

安装 tensorflow-gpu

安装 tf 本身没难度,但是有一个地方需要注意一下,就是必须指定版本,不然你不知道哪天tf就升级了,装了个不兼容的版本。(比如我昨天装还是默认1.12,今天就变成了1.13,说出来都是泪啊)

1
2
3
4
# 新环境可能没有pip,需要先装上。
yum install -y python-pip

pip install tensorflow-gpu==1.12

包挺大的,在外网服务器上还装了几分钟,网络不好的还是建议下安装包吧。

装好之后写个文件测试一下:

1
2
3
4
5
6
7
import tensorflow as tf

hello = tf.constant('Hello, Tensorflow')

sess = tf.Session()

print(sess.run(hello))

947b2c91e8a1e4336614f42de4f1905d.png

安装 nvidia-docker(可选)

这个不是必须项,仅供有需要的参考。

似乎tensorflow经过了这么久的开发,版本兼容问题还是渣,不同的tf版本依赖不同的cuda版本,个人独占的服务器还好,要是实验室共享的GPU服务器,那这个版本势必乱到无法直视。

建议使用docker,既能隔离乱七八糟的环境,同时也不会造成太大的性能损失。

Nvidi-docker2

卸载旧版本nvidia与cuda驱动

如果当前系统已经存在 nvidia 驱动,需要先卸载。

根据旧驱动安装形式不同,卸载方式也不同

run 文件安装

使用nvidia-smi查看nvidia驱动版本,然后下载相应版本的驱动文件(测试过,不用完全一致)

1
2
3
4
5
6
7
8
9
# 卸载cuda-toolkit

sudo bash /usr/local/cuda/bin/uninstall_***

# 卸载nvidia驱动

例如文件是 NVIDIA-Linux-x86-384.183.run

则运行如下命令:sudo bash NVIDIA-Linux-x86-384.183.run --uninstall

rpm形式安装

1
2
3
sudo yum list | grep nvidia

sudo yum remove ${通过旧驱动安装的包}

卸载完毕后需要重启服务器(谨慎重启),然后再安装新的驱动。

Trouble Shootings

  1. X-server 问题
1
2
3
4
ERROR: You appear to be running an X server; please exit X before            
installing. For further details, please see the section INSTALLING
THE NVIDIA DRIVER in the README available on the Linux driver
download page at www.nvidia.com.

解决:

1
2
3
4
5
6
7
# To stop:
sudo init 3

# 安装驱动

# To resume:
sudo init 5

Reference

centos7安装tensorflow-gpu版本

Ubuntu 16.04上安装Nvidia GPU驱动 + CUDA + cuDNN

Adding or Removing GPUs | Google Cloud

NVIDIA-SMI can’t communicate with NVIDIA driver | Server Fault

CentOS 7 安装 Cuda 的经历

Centos7离线安装nvidia驱动

Centos7 安装NVDIA GPU+TensorFlow-gpu1.5.0

使用nvidia-docker2