最近在玩谷歌新开源的自然语言模型bert,最开始是在google的免费GPU上面来弄的(这个部分其实也是可以写一个教程的,中间坑也挺多),但谷歌比较坑人,小数据集还行,大点的数据集训练耗费时间长,再加上网络不稳定,总掉线,训练一个上万的数据集断断续续的用了一天时间,后来改用在本地的linux服务器上来训练bert,但是没有NVIDIA显卡,只好用cpu来跑了,速度超慢,跑一个7万的模型需要50个小时,尼玛,结果出来跟屎一样难看,估计参数设置有问题,这不行啊,浪费这么多时间就等来一坨屎,还是整个GPU来玩吧。于是这两天开始研究怎么在华为云上面部署GPU,接下来就是入坑了,各种连环坑。首先说一下华为云,我想要在上面租个服务器,就是带Tesla P100显卡,这样计算就快不少。但是公司已经有挺多的云服务器,只不过是没有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的依赖工具