虽然说TensorFlow到现在已经发布好几年了,但是在ubuntu上用带GPU的TensorFlow,我认为一直是个灾难,而且这个灾难仍将持续。。。
这个话题,相当简单了,只是配置一下环境而己,但是N多人在上面痛不欲生,我还是写出来吧。有问题尽管给我留言。
我也用过一段时间的tensorflow了,但是今天返过来,还要写安装教程的原因是,今天早上手贱,一个命令:
$ sudo apt-get autoremove
然后把原来装好的cuda9.0完全remove了,这时候再装上去,很麻烦了。还好一番折腾,搞定。
进入正题。
自己买的笔记本是thinkpad P50的工作站,内置M2000M的显卡,操作系统为ubuntu,可以用做GPU加速来训练模型。
麻烦是,Tensorflow的最近几个版本,对应于cuda 9.0版本。但是现在nvidia的官网上,已经出cuda 10.0的版本了。但是Tensorflow的安装,总是指定只能是cuda9.0的版本。而且ubuntu有个大的问题,和人往高处走一样,一般是就高不就低。这是麻烦造成的根源。
首先还是想办法,怎么在ubuntu上以完美的姿势装上cuda 9.0吧。
如果您的电脑上,已经有cuda的高版本,而且显卡驱动也有了。那么,直接来这一句。
sudo apt-get --purge -y remove 'cuda*'
sudo apt-get --purge -y remove 'nvidia*'
要完全清理掉啊。如果有一些残余,后面更难受。。。不要害怕,运行之后,重启,ubuntu还是能够正常的。不过没有用到显卡的一些特性而已。
如果要离线安装。我建议在 medium网站上看这篇文章。 由于国内看不了medium,尽可能想办法看吧。但是这篇文章写的也早。千万只装一个cuda,不要装tools,,千万不要用文章中的upgrade啊不然的话,版本会升级到9.1那样就麻烦了。
如果完全在线安装,我这边写了一个脚本去解决这个问题
#!/bin/bash -e
#wget http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1604/x86_64/cuda-repo-ubuntu1604_9.0.176-1_amd64.deb
#wget http://developer.download.nvidia.com/compute/machine-learning/repos/ubuntu1604/x86_64/libcudnn7_7.0.5.15-1+cuda9.0_amd64.deb
#wget http://developer.download.nvidia.com/compute/machine-learning/repos/ubuntu1604/x86_64/libcudnn7-dev_7.0.5.15-1+cuda9.0_amd64.deb
#wget http://developer.download.nvidia.com/compute/machine-learning/repos/ubuntu1604/x86_64/libnccl2_2.1.4-1+cuda9.0_amd64.deb
#wget http://developer.download.nvidia.com/compute/machine-learning/repos/ubuntu1604/x86_64/libnccl-dev_2.1.4-1+cuda9.0_amd64.deb
sudo dpkg -i cuda-repo-ubuntu1604_9.0.176-1_amd64.deb
sudo apt-key adv --fetch-keys http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1604/x86_64/7fa2af80.pub
sudo dpkg -i libcudnn7_7.0.5.15-1+cuda9.0_amd64.deb
sudo dpkg -i libcudnn7-dev_7.0.5.15-1+cuda9.0_amd64.deb
sudo dpkg -i libnccl2_2.1.4-1+cuda9.0_amd64.deb
sudo dpkg -i libnccl-dev_2.1.4-1+cuda9.0_amd64.deb
sudo apt-get update
sudo apt-get install cuda=9.0.176-1
sudo apt-get install libcudnn7-dev
sudo apt-get install libnccl-dev
这儿只是我测试过的,用nvidia的driver 390版本可以用。但是,千万不要任意指定一个版本装driver。。。那样可能引起图形界面崩溃的。
现在完全依靠这脚本,可以把cuda配好。但是里面还有一个版本冲突。
冲突来源于mesg在不同的包中问存在。用–force-overwrite的方法直接盖过去,我用了之后,还没有发现问题。
sudo dpkg -i --force-overwrite /var/cache/apt/archives/libnvidia-compute-390_390.48-0ubuntu3_amd64.deb
这样的话。cuda就完全装好了。
用命令去检测
$ nvidia-smi
Sun Sep 30 11:23:07 2018
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 396.44 Driver Version: 396.44 |
|-------------------------------+----------------------+----------------------+
| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |
|===============================+======================+======================|
| 0 Quadro M2000M Off | 00000000:01:00.0 On | N/A |
| N/A 40C P8 N/A / N/A | 134MiB / 4043MiB | 0% Default |
+-------------------------------+----------------------+----------------------+
+-----------------------------------------------------------------------------+
| Processes: GPU Memory |
| GPU PID Type Process name Usage |
|=============================================================================|
| 0 1173 G /usr/lib/xorg/Xorg 133MiB |
+-----------------------------------------------------------------------------+
这个结果表明nvidia的cuda的那些东西,完全装好了。
等等。还得处理装完之后的残余问题,也就是nvidia的版本,在不断的更新。那么,他提示更新我为9.2,或者10.0版本怎么办?进入安装管理工具。然后去掉。ubuntu的nvidia库的官方在线更新。
这样的话。就万事大吉了。
后面就可以装带gpu的tensorflow了
$ pip3 install -U tensorflow-gpu
检测脚本如下:
$ cat test.py
import tensorflow as tf
hello = tf.constant('Hello, TensorFlow!')
sess = tf.Session()
print(sess.run(hello))
运行结果如下:
$ python3 test.py
2018-09-30 11:41:20.590788: I tensorflow/core/platform/cpu_feature_guard.cc:141] Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX2 FMA
2018-09-30 11:41:20.674838: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:964] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2018-09-30 11:41:20.675610: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1411] Found device 0 with properties:
name: Quadro M2000M major: 5 minor: 0 memoryClockRate(GHz): 1.137
pciBusID: 0000:01:00.0
totalMemory: 3.95GiB freeMemory: 3.76GiB
2018-09-30 11:41:20.675655: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1490] Adding visible gpu devices: 0
2018-09-30 11:41:21.270939: I tensorflow/core/common_runtime/gpu/gpu_device.cc:971] Device interconnect StreamExecutor with strength 1 edge matrix:
2018-09-30 11:41:21.270966: I tensorflow/core/common_runtime/gpu/gpu_device.cc:977] 0
2018-09-30 11:41:21.270973: I tensorflow/core/common_runtime/gpu/gpu_device.cc:990] 0: N
2018-09-30 11:41:21.271200: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1103] Created TensorFlow device (/job:localhost/replica:0/task:0/device:GPU:0 with 3490 MB memory) -> physical GPU (device: 0, name: Quadro M2000M, pci bus id: 0000:01:00.0, compute capability: 5.0)
b'Hello, TensorFlow!'