zxyza

  最近在玩谷歌新开源的自然语言模型bert,最开始是在google的免费GPU上面来弄的(这个部分其实也是可以写一个教程的,中间坑也挺多)。但谷歌比较坑人,小数据集还行,大点的数据集训练耗费时间长,再加上网络不稳定总掉线,训练一个上万的数据集断断续续的用了一天时间。改用在本地的linux服务器上来训练bert,但是没有NVIDIA显卡,只好用cpu来跑了,速度超慢,跑一个7万的模型需要50个小时。跑出来的结果很奇葩loss很大,估计参数设置有问题,想换个参数重新跑,太耗费时间了,看来只好搞个GPU来加速计算了。于是这两天开始研究怎么在华为云上面部署GPU,接下来就是入坑了。

  首先说一下华为云,我想要在上面租个服务器,就是带Tesla P100显卡,这样计算就快不少。(注意,GPU版的服务器即便关机也照样收费,一晚上收了100多。。。)但是公司已经有挺多的云服务器,只不过是没有NVIDIA显卡而已,老板让我先在没有显卡的服务器上先搭环境,然后做个私有镜像,然后再申请p100云服务器,加载镜像的时候就加载我制作的这个私有镜像就行了。接下来我就按照这个思路来弄。首先找一些centos下安装TensorFlow-gpu的教程(这个教程我后面详细贴出来),然后就安装anaconda3、cuda、TensorFlow等这些依赖工具,然后在本地跑一个bert的小demo。倒是跑出来了,但是程序中有报错:

tensorflow failed call to cuInit: CUDA_ERROR_UNKNOWN

开始我也没管,反正跑出结果了,说明TensorFlow-gpu能运行,报这个错可能是没有NVIDIA显卡的原因,等我申请带有GPU的服务器,在那上面跑估计就行了。然后将当前部署好的可以运行bert的linux环境生成了一个镜像,华为云官网上说生成镜像需要挺多配置啥的,我都没有配,直接生成了。接着我租了一个华为云p100服务器,加载镜像的时候加载的是我生成的私有镜像。进去之后我直接在上面开始跑bert了,但是还是有:

tensorflow failed call to cuInit: CUDA_ERROR_UNKNOWN这个错误

上网查了一会,发现是NVIDIA显卡没有驱动的问题,原来那个镜像里面根本没NVIDIA显卡我驱动个毛线啊,华为云官网说安装了cuda后会自动安装NVIDIA驱动,好吧,我在p100服务器上开始安装驱动,各种安装,各种不好使,使用nvidia-smi这个命令就可以看到本机的gpu情况,但是一直显示的都是这个命令是无效的,说明nvidia显卡驱动我始终没有安装好。最后没有办法我把这个p100服务器删除了,然后重新申请了一个,加载镜像我直接加载的一个干净的centos7的公共镜像,我打算从头在p100上安装所有的依赖包。啰嗦了半天终于要进入正题了:

  华为云p100服务器是专门给GPU加速计算用的,所以肯定是预先安装了NVIDIA和GCC的,如果你不打算在华为云,而打算在自己本地机子上来部署一个TensorFlow-gpu。首先应该确认一些基本的安装条件是否具备,这里我们依据centos7.3来实验;

1、使用GPU得有nvidia显卡,所以得先看一下本机的显卡,分别输入a命令和b命令:

a、lspci | grep -i nvidia

b、lspci | grep -i vga

  如果结果显示有nvidia字样还带有型号啥的,说明你机器上有nvidia显卡,可能能够使用GPU(这里用可能二字是因为计算是nvidia显卡也不一定是能用GPU加速计算,对于TensorFlow而言,应该是算力达到一定程度才可以),若果要是输入刚才命令啥也没有显示,而显示:

00:02.0 VGA compatible controller: Cirrus Logic GD 5446

说明机器上没有nvidia显卡,只有一个普通显卡,即便你安装cuda也没用,不能加速计算。

2、确认Linux版本是否支持cuda:

[littlebei@localhost ~]$ uname -m && cat /etc/*release

若有信息输出,说明是支持的。

3、检查gcc是否安装

[littlebei@localhost ~]$ gcc --version

若没有安装,可以使用一下命令安装

[littlebei@localhost ~]$ sudo yum install gcc gcc-c++

这里需要注意,TensorFlow-gpu需要gcc版本是5以下的,下面是一个详细的版本对应情况:

Version: CPU/GPU: Python Version: Compiler: Build Tools: cuDNN: CUDA:

tensorflow-1.8.0 CPU 2.7, 3.3-3.6 GCC 4.8 Bazel 0.10.0 N/A N/A

tensorflow_gpu-1.8.0 GPU 2.7, 3.3-3.6 GCC 4.8 Bazel 0.9.0 7 9

tensorflow-1.7.0 CPU 2.7, 3.3-3.6 GCC 4.8 Bazel 0.10.0 N/A N/A

tensorflow_gpu-1.7.0 GPU 2.7, 3.3-3.6 GCC 4.8 Bazel 0.9.0 7 9

tensorflow-1.6.0 CPU 2.7, 3.3-3.6 GCC 4.8 Bazel 0.9.0 N/A N/A

tensorflow_gpu-1.6.0 GPU 2.7, 3.3-3.6 GCC 4.8 Bazel 0.9.0 7 9

tensorflow-1.5.0 CPU 2.7, 3.3-3.6 GCC 4.8 Bazel 0.8.0 N/A N/A

tensorflow_gpu-1.5.0 GPU 2.7, 3.3-3.6 GCC 4.8 Bazel 0.8.0 7 9

tensorflow-1.4.0 CPU 2.7, 3.3-3.6 GCC 4.8 Bazel 0.5.4 N/A N/A

tensorflow_gpu-1.4.0 GPU 2.7, 3.3-3.6 GCC 4.8 Bazel 0.5.4 6 8

tensorflow-1.3.0 CPU 2.7, 3.3-3.6 GCC 4.8 Bazel 0.4.5 N/A N/A

tensorflow_gpu-1.3.0 GPU 2.7, 3.3-3.6 GCC 4.8 Bazel 0.4.5 6 8

tensorflow-1.2.0 CPU 2.7, 3.3-3.6 GCC 4.8 Bazel 0.4.5 N/A N/A

tensorflow_gpu-1.2.0 GPU 2.7, 3.3-3.6 GCC 4.8 Bazel 0.4.5 5.1 8

tensorflow-1.1.0 CPU 2.7, 3.3-3.6 GCC 4.8 Bazel 0.4.2 N/A N/A

tensorflow_gpu-1.1.0 GPU 2.7, 3.3-3.6 GCC 4.8 Bazel 0.4.2 5.1 8

tensorflow-1.0.0 CPU 2.7, 3.3-3.6 GCC 4.8 Bazel 0.4.2 N/A N/A

tensorflow_gpu-1.0.0 GPU 2.7, 3.3-3.6 GCC 4.8 Bazel 0.4.2 5.1 8

4、上面检查都没有问题下面开始安装一些TensorFlow的依赖工具

  首先安装python,目前linux默认自带的python都是2.7版本的,很多时候都用着不方便,甚至报错,所以我们先装一个python3.6版本的,这里使用anaconda3来安装,因为装完之后一些常用的机器学习工具都一起给你装了,省的后续自己还得装,装anaconda时候需要注意的是最新版本里面带的python是3.7,很多软件可能还没有支持,为了稳定,我们装带有python3.6的anaconda3。 在linux执行 wget http://repo.continuum.io/archive/Anaconda3-5.1.0-Linux-x86_64.sh,会直接下载安装包,下载完成后执行 bash Anaconda3-5.1.0-Linux-x86_64.sh 会安装anaconda,对应的python是3.6.4的版本,需要注意的是在安装过程中需要两次输入yes,尤其是第二次相当于将anaconda加入到系统环境变量中,然后安装完成后直接ctrl+D退出后重新登录linux。输入命令 python 就可以看到是最新版本的python了,原来的系统自带的python被切换成了python3.6.4。(这里多说一句,有些同学可能在安装过程中没有输入yes,不小心直接回车默认安装了,结果重启后输入python还是显示2.7版本 ,说明anaconda没有加入到系统环境变量中,解决办法参见https://zhuanlan.zhihu.com/p/24664358)。

5、接下来是cuda的安装,这块就比较磨叽了,首先华为云上说当用户安装cuda后,如果当前的系统有nvidia显卡,会自动安装显卡驱动的,而不必手动进行安装的。所以我直接安装cuda就好了,首先我们需要确定安装哪些版本,见下表:

表1 CUDA工具包下载地址

实例

类型

操作系统

CUDA版本

下载路径

索引项

Operating

System

Architecture

Distribution

Version

Installer

Type

P2v

(V100)

CentOS 7.4 64bit

9.2

https://developer.nvidia.com/cuda-92-download-archive

Linux

x86_64

CentOS

7

rpm(local)

Ubuntu 16.04 64bit

Linux

x86_64

Ubuntu

16.04

deb(local)

Windows Server 2016 Standard 64bit

Windows

x86_64

-

Server 2016

exe(local)

Windows Server 2012 R2 Standard 64bit

Windows

x86_64

-

Server 2012 R2

exe(local)

P1

(P100)

CentOS 7.3 64bit

9

https://developer.nvidia.com/cuda-90-download-archive

Linux

x86_64

CentOS

7

rpm(local)

Ubuntu 16.04 64bit

Linux

x86_64

Ubuntu

16.04

deb(local)

Windows Server 2012 R2 Standard 64bit

Windows

x86_64

-

Server 2012 R2

exe(local)

Pi1

(P4)

CentOS 7.3 64bit

9

https://developer.nvidia.com/cuda-90-download-archive

Linux

x86_64

CentOS

7

rpm(local)

Ubuntu 16.04 64bit

Linux

x86_64

Ubuntu

16.04

deb(local)

这里我是p1型号的服务器,所以点击进入第二个网址:

进入nvidia官网后如下选择:

那个深绿色的就是我选择的cuda工具包的型号,然后点击download,不过由于我担心国外资源下载速度慢,所以我使用的是华为云服务器下载的,注意服务器需要配有公网弹性ip,这样就可以直接从华为云镜像下载了,基本一分钟就下载完了,具体步骤就是首先鼠标放到download上,右键复制下载地址,然后在华为云服务器上用wget [复制的链接地址]下载即可:

下载完成后需要按照官网下面的提示步骤进行安装,即按照顺序执行下面三个命令:

1、sudo rpm -i cuda-repo-rhel7-9-0-local-9.0.176-1.x86_64-rpm(这里需要注意的是,官网下面的命令是最后是.rpm,如果按照那个执行会找不到文件,按照我的命令执行即可)

2、sudo yum clean all

3、sudo yum install cuda

执行完之后就安装完成了cuda 执行nvcc –V 检查CUDA,可以看到安装cuda的版本;

多说一句,我执行这三条命令都是遇到询问安装都yes了,网上有的人说不能那样,会安装不好驱动,反正说啥都有,我就按照这个步骤装的,也没出问题。

6、安装cuda后还需要安装cudnn这个软件,官网下载和CUDA对应的版本(https://developer.nvidia.com/rdp/cudnn-download ),需要注册。然后解压文件,一次执行以下命令(我下载的版本是cudnn-9.0-linux-x64-v7.5.0.56.tgz)

tar -xvzf cudnn-9.0-linux-x64-v7.5.0.56.tgz

cd cuda

sudo cp include/cudnn.h /usr/local/cuda/include

sudo cp lib64/libcudnn.* /usr/local/cuda/lib64

CUDNN安装完成。

查看cudnn版本的方法:

cat /usr/local/cuda/include/cudnn.h | grep CUDNN_MAJOR -A 2

 

PS:这里下载cundnn一定要对应好版本,下面这个是版本对应关系:

Download cuDNN v7.1.2 (Mar 21, 2018), for CUDA 9.1

Download cuDNN v7.1.2 (Mar 21, 2018), for CUDA 9.0

Download cuDNN v7.1.2 (Mar 21, 2018), for CUDA 8.0

Download cuDNN v7.1.1 (Feb 28, 2018), for CUDA 9.1

Download cuDNN v7.1.1 (Feb 28, 2018), for CUDA 9.0

Download cuDNN v7.1.1 (Feb 28, 2018), for CUDA 8.0

Download cuDNN v7.0.5 (Dec 11, 2017), for CUDA 9.1

Download cuDNN v7.0.5 (Dec 5, 2017), for CUDA 9.0

Download cuDNN v7.0.5 (Dec 5, 2017), for CUDA 8.0

Download cuDNN v7.0.4 (Nov 13, 2017), for CUDA 9.0

Download cuDNN v7.0.4 (Nov 13, 2017), for CUDA 8.0

Download cuDNN v6.0 (April 27, 2017), for CUDA 8.0

Download cuDNN v6.0 (April 27, 2017), for CUDA 7.5

Download cuDNN v5.1 (Jan 20, 2017), for CUDA 8.0

Download cuDNN v5.1 (Jan 20, 2017), for CUDA 7.5

Download cuDNN v5 (May 27, 2016), for CUDA 8.0

Download cuDNN v5 (May 12, 2016), for CUDA 7.5

Download cuDNN v4 (Feb 10, 2016), for CUDA 7.0 and later.

Download cuDNN v3 (September 8, 2015), for CUDA 7.0 and later.

Download cuDNN v2 (March 17,2015), for CUDA 6.5 and later.

Download cuDNN v1 (cuDNN 6.5 R1)

7、基本环境终于安装完了,剩下最后一步了,安装TensorFlow-gpu

正常是可以直接pip install tensorflow-gpu,安装完全没有毛病,但是测试的时候会出现问题:

ImportError: libcublas.so.10.0: cannot open shared object file

这是因为这种安装方式默认安装都是TensorFlow最新版本,即安装的是TensorFlow1.13,这个版本是无法和cuda9.0兼容的,然后我在国外一网站看到如下解释:

地址:https://github.com/tensorflow/tensorflow/issues/26182

Latest TensorFlow supports cuda 8-10. cudnn 6-7.

Each TensorFlow binary has to work with the version of cuda and cudnn it was built with. If they don\'t match, you have to change either the TensorFlow binary or the Nvidia softwares.

Official tensorflow-gpu binaries (the one downloaded by pip or conda) are built with cuda 9.0, cudnn 7 since TF 1.5, and cuda 10.0, cudnn 7 since TF 1.13. These are written in the release notes. You have to use the matching version of cuda if using the official binaries.

If you don\'t like to change your Nvidia software, you can:

(1) Use a different version of TensorFlow

(2) Use non-official binaries built by others. e.g.: https://github.com/mind/wheels/releases, https://github.com/hadim/docker-tensorflow-builder#builds,

https://github.com/inoryy/tensorflow-optimized-wheels

(3) Build the binaries by yourself from source with your version of Nvidia software.

说明最新版本的TensorFlow需要时cuda10和cudnn7,而上文我安装的是cuda9.0,所以TensorFlow-gpu应该是TF1.13以下的版本,如果你不小心pip安装了,可以最新安装的这个TensorFlow卸载:

pip uninstall tensorflow-gpu

基本几十秒就卸载完成了

然后再重新安装一个低版本的TensorFlow,这里我安装的是TensorFlow1.9.0

所以直接再执行:pip install tensorflow-gpu==1.9.0

安装完成后再测试就无报错了,至此整个的安装过程就结束了

8、最后我们检测GPU是否使用

在python中输入

from tensorflow.python.client import device_lib

print(device_lib.list_local_devices())

输出为

即可。

最后测试TensorFlow-gpu

import tensorflow as tf

hello = tf.constant(\'Hello, TensorFlow!\')

sess = tf.Session()

print(sess.run(hello))

输出:类似红色框中信息,即可

最后当我们开始真正跑模型时候可以输入nvidia -smi,可以查看GPU的运行状态,包括温度,GPU使用率等等信息;

具体可以参考https://blog.csdn.net/Bruce_0712/article/details/63683787 CUDA之nvidia-smi命令详解

最后附上本文写作过程中参考的博客:

1、https://blog.csdn.net/u010420283/article/details/82874588 服务器从零搭建GPU版本的TensorFlow环境

2、https://blog.csdn.net/Oh_My_Fish/article/details/78861867 TensorFlow-gpu 在 CentOS 7 下的完全安装手册

3、https://www.huaweicloud.com/product/gpu.html 华为云购买P1服务器

4、https://support.huaweicloud.com/usermanual-ecs/zh-cn_topic_0141194659.html 购买p1注意事项

5、https://blog.csdn.net/gaoxurong123456/article/details/79041168 安装与卸载tensorflow-gpu

6、https://blog.csdn.net/gsch_12/article/details/79368990 载入tensorflow出现错误,ImportError: libcublas.so.9.0

7、https://blog.csdn.net/qysh123/article/details/79977891 安装tensorflow报ImportError: libcublas.so.9.0: cannot open shared object file的解决方法

8、https://github.com/tensorflow/tensorflow/issues/26182 ImportError: libcublas.so.10.0: cannot open shared object file: No such file or directory

9、https://blog.csdn.net/Lucifer_zzq/article/details/76675239 最正确的姿势安装cudnn,网上大多数教程都太坑了

分类:

技术点:

相关文章: