Background
网上关于安装 tensorlfow-gpu 环境的博客可谓是多如牛毛,但是参考了很多篇,都没能成功的在 CentOS 7.6 上把整套环境布置上。折腾了差不多一个礼拜,时间跨度长达几个月,总算是把这一堆装上了,分享一下过程。本文主要目的在于给出一个非常详细的安装过程(从一个全新环境开始后的每一个操作)以及环境配置说明,这样后面的人参考的时候就能根据不同之处快速定位问题。
测试环境
本文中使用的服务器是 Google Cloud 的VPS,下图是详细配置。
- 系统版本为
CentOS 7.6.1810
(不太确定是不是 minimal,不过没有wget,应该是吧) - 挂载了一块 Nvidia K80 显卡
版本选择
因为目的是运行tensorflow程序,所以各个版本都要跟着tf来。目前为止(确切来说是昨天),默认安装的tensorflow-gpu版本是1.12,这个版本也发布了挺久的了,尽量选择新的稳定的。
参照以下链接中的tf版本支持情况,可以看到 1.12 (仅)支持 CUDA 9 和 cuDNN 7,需要注意的是,这里虽然没有写小版本号,但是实际上它支持且仅支持9.0,其他版本会出现找不到so库的错误。
所以 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
,然后搜索进入下载页面,点击下载,同意并继续,然后在浏览器下载队列里复制文件下载链接。
我的是http://us.download.nvidia.com/tesla/384.183/nvidia-diag-driver-local-repo-rhel7-384.183-1.0-1.x86_64.rpm
。
连上服务器,切换到root用户,首先下载文件。
1 | sudo su |
(现在似乎下载的都是run文件,直接运行就可以)
然后安装驱动,会自动装上一些依赖,如dkms什么的。
1 | rpm -i nvidia-diag-driver-local-repo-rhel7-384.183-1.0-1.x86_64.rpm |
如果提示需要dkms,安装一下
1 | yum install -y epel-release |
安装完毕之后输入 nvidia-smi
命令,不出意外就能看见输出了。
驱动安装完毕,还是挺简单的,没有网上那么复杂的安装和修改模块啥的。
如果只想在docker里使用GPU,后面的CUDA和cuDNN就都不用安装。
安装 cuda9.0
首先到以下页面选择期望的cuda版本,如9.0,然后选择你的环境参数等信息。
网站提供了三种安装方式:runfile(local)、rpm(local)、rpm (network)
如果要部署的服务器很多,推荐使用local安装的形式,毕竟文件还是挺大的。runfile和rpm都行,我这里选择了runfile模式。
点击下载,然后获取下载链接。(9.0版本现在有很多的patch补丁,需要从第一个本体程序开始都装一遍,步骤类似)
1 | 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 |
由于文件较大,等待一会后进入README,不停按空格,一直到最后让你确认这块,当然是选择 accept
啦(我有的选么。。。),然后问是否安装驱动,因为上一步已经装过了,所以这步选n跳过。整个过程中只需要在cuda toolkit这一步选y,其他都n,然后等待安装完成。(中间有一步问是否创建软链接,我感觉没必要,毕竟tensorflow那么坑爹,没法做到透明升级)
不出意外的话,cuda就安装完毕了(等待时间还挺久的),最后会提示让把cuda的路径添加到环境变量里。
1 | echo 'export PATH=/usr/local/cuda-9.0/bin:$PATH' >> /etc/profile.d/cuda-9.0.sh |
最后一步也可以不输入,重启服务器等自动生效也行,不过服务器重启一次实在是太慢了。
至此,cuda安装完毕,可以通过执行 /usr/local/cuda-9.0/extras/demo_suite/deviceQuery
程序来判断是否安装成功。
安装 cuDNN 7.0
首先不得不吐槽一下,Nvidia 你一个卖硬件的,下个驱动还得注册账号。。。
打开以下链接,选择合适的版本,注意cuda的版本号。选好之后就告知要注册账号,按照要求注册完账号之后,回来再重新走一遍流程,就能下载了。
同样是获取下载链接,然后在服务器上
1 | # 请把下面这个链接换成你自己的,不然会访问禁止 |
压缩包里就几个文件,复制到cuda目录下即可。
1 | tar zxvf cudnn-9.0-linux-x64-v7.tgz |
至此,cuDNN就安装完毕了。
安装 tensorflow-gpu
安装 tf 本身没难度,但是有一个地方需要注意一下,就是必须指定版本,不然你不知道哪天tf就升级了,装了个不兼容的版本。(比如我昨天装还是默认1.12,今天就变成了1.13,说出来都是泪啊)
1 | # 新环境可能没有pip,需要先装上。 |
包挺大的,在外网服务器上还装了几分钟,网络不好的还是建议下安装包吧。
装好之后写个文件测试一下:
1 | import tensorflow as tf |
安装 nvidia-docker(可选)
这个不是必须项,仅供有需要的参考。
似乎tensorflow经过了这么久的开发,版本兼容问题还是渣,不同的tf版本依赖不同的cuda版本,个人独占的服务器还好,要是实验室共享的GPU服务器,那这个版本势必乱到无法直视。
建议使用docker,既能隔离乱七八糟的环境,同时也不会造成太大的性能损失。
卸载旧版本nvidia与cuda驱动
如果当前系统已经存在 nvidia 驱动,需要先卸载。
根据旧驱动安装形式不同,卸载方式也不同
run 文件安装
使用nvidia-smi
查看nvidia驱动版本,然后下载相应版本的驱动文件(测试过,不用完全一致)
1 | # 卸载cuda-toolkit |
rpm形式安装
1 | sudo yum list | grep nvidia |
卸载完毕后需要重启服务器(谨慎重启),然后再安装新的驱动。
Trouble Shootings
- X-server 问题
1 | ERROR: You appear to be running an X server; please exit X before |
解决:
1 | # To stop: |
Reference
Ubuntu 16.04上安装Nvidia GPU驱动 + CUDA + cuDNN
Adding or Removing GPUs | Google Cloud
NVIDIA-SMI can’t communicate with NVIDIA driver | Server Fault