TensorFlow GPU 支持: Ubuntu16.04 + Nvidia GTX + CUDA + CUDNN

Update:之前为了 TensorFlow 学习使用配置的 TensorFlow 深度学习环境(CPU Support)计算性能较差,已经不再适合现阶段学习开发使用了。故最近准备升级一下深度学习服务器,重新配置支持 GPU 显卡加速计算的 TensorFlow 深度学习开发环境。

配置过程中参考了网络上很多的相关博文,也遇到过很多坑,为了感谢配置过程中各位大佬的帮助以及方便本人下次配置或者升级,整理以作此文。

更多 TensorFlow 框架搭建相关内容,请关注博主相关博文系列 ↓↓↓↓↓

之一 >>>> 一文详解全平台 TensorFlow 深度学习框架在线搭建 (CPU&GPU 支持)

之二 >>>> TensorFlow GPU 支持: Ubuntu16.04 + Nvidia GTX + CUDA + CUDNN


Before Reading

TensorFlow GPU Support 配置须知:

服务器硬件要求

↓↓↓↓↓↓ 关于 内存(Memory)↓↓↓↓↓↓

16GB 以上。

推荐:条件允许,尽可能大一点。

↓↓↓↓↓↓ 关于 CPU ↓↓↓↓↓↓

不同于 TensorFlow For CPU Support 深度学习环境的搭建,GPU Support 环境主要使用 GPU 独立显卡进行计算加速,CPU 的核心数并不重要,只要拥有相对较高的主频就可以,因此对 CPU 的要求其实并不是很高。

推荐:具体根据实际情况进行选择,有条件的可以选择性能更好一点的,可以更好的兼容 TensorFlow For GPU Support 环境。

↓↓↓↓↓↓ 关于 GPU ↓↓↓↓↓↓

独立显卡是主角,TensorFlow For GPU Support 深度学习环境的核心计算都是依托于 GPU 进行运算的,故独立显卡的性能直接影响深度学习环境计算能力!!!

👇👇👇 并不是所有类型的独立显卡(GPU)都可以支持搭建 TensorFlow 深度学习环境 👇👇👇

我们需要能够 支持 CUDA 平台(一种由 NVIDIA 推出的通用并行计算架构)的 GPU 才行,故常见的深度学习独立显卡都选择【NVIDIA 显卡(也就是我们常说的 N 卡)】。

实际上,也并不是所有的 NVIDIA 显卡都支持此功能,NVIDIA 官方提供了 >>>> 【不同显卡系列的支持列表查询】 <<<< 同时你可以查看到相应 GPU 的计算能力。

如果你手头刚好有一块在支持列表内的独立显卡,那么恭喜你可以跳过本小节下面的内容开始后续的教程了~~~

| ============================================ 选购性价比 GPU? =============================================== |

如果你想要选购一块成本效益最佳的 GPU,推荐参考 Tim Dettmers 博客给出的 >>>> 【NVIDIA 卡分析与推荐–持续更新】 <<<< Tim Dettmers`s Experience and Advice for Using GPUs in Deep Learning。

这里给出博主测试出的主流显卡成本效益图,可供你参考选择:

本文我是基于手头现有的最好的设备进行搭建的,争取早日攒一台更好的服务器出来~~~


你应该了解你的 GPU

这里,你应该已经有了一块可以使用的 GPU 了。但在搭建基于 GPU 显卡加速运算的 TensorFlow【TensorFlow For GPU Support】深度学习环境之前,你首先应该做的就是:

先明确预使用的独立显卡(GPU )的详细信息(包括显卡型号、显存、计算性能等等)。

这是因为,TensorFlow 不仅对显卡类型(支持 CUDA)有要求,而且有些 TensorFlow 模型需要较大的 GPU 内存,或更多的 GPU 计算核心(即更强的计算能力,加速模型运算),了解预搭载独立显卡(GPU)的详细信息可以更好的帮助我们使用 GPU 进行 TensorFlow 计算加速。


CUDA && CUDNN && TF

TensorFlow 要想使用 GPU 进行计算加速(相较于 CPU),那么就必须部署 CUDA 和 CUDNN。

👇👇👇 先了解一下什么是 CUDA && CUDNN ? 👇👇👇

CUDA >>>> 显卡厂商 NVIDIA 推出的通用并行计算平台,它使得 GPU 能够解决并行的、复杂的计算问题。

CUDNN( cuDNN) >>>> CUDA DNN 的缩写,它是 CUDA 平台深度神经网络的计算库。想要在 CUDA 上运行深度神经网络,就要安装 cuDNN。

↓↓↓↓↓↓ 这里,需要注意一个问题(很重要)↓↓↓↓↓↓

我们知道 TensorFlow 提供有丰富的版本支持,但 某一版本的 TensorFlow 只兼容特定版本的 CUDA 和 CUDNN。也就是说,我们选择安装的显卡并行计算平台(CUDA)、深度神经网络 GPU 计算库(CUDNN)以及 TensorFlow 的版本要相互兼容。

↓↓↓↓↓↓ 关于 CUDA && CuDNN && TensorFlow 版本的选择问题 ↓↓↓↓↓↓

可以根据官方实测过的【Tensorflow && NVIDIA 版本信息对照表】进行选择,如下:

[1] >>>> For Linux/macOS >>>> 【TF CPU/GPU

[2] >>>> For Windows >>>> 【TF CPU/GPU


关于服务器操作系统选择

关于搭建 TensorFlow 深度学习开发环境的服务器(Server)的操作系统的选择,选择一个合适的 OS 可以帮我们减少很多的麻烦。

👇👇👇 Centos/Ubuntu Server Select 👇👇👇

| >>>> 1. Centos Server For Building TensorFlow ↓↓↓↓↓↓↓

如果选择 Centos Server,那么我们的 Centos 版本最好选择 Centos7Centos6 因为版本较低,其操作系统内置的库无法很好兼容 TensorFlow。虽可以解决,但会为安装带来更多的麻烦(可以通过升级一些运行时库得以解决)。

当然对于操作系统为 Centos6 的既有服务器,且不可以更换操作系统的安装需求,TF-CPU 中已经对解决方法做详细说明。

| >>>> 2. Ubuntu Server For Building TensorFlow ↓↓↓↓↓↓↓

如果选择 Ubuntu Server(墙裂推荐),那么我们的 Ubuntu 版本最好是 Ubuntu 14.04/16.04/18.04。这里只是因为使用 Ubuntu14.04/16.04/18.04 的人较多,可以更好的帮我们解决安装以及使用 TensorFlow 过程中遇到的问题。

对于初学 TensorFlow 深度学习框架,仅仅想做做简单学习测试,强烈建议选择 Ubuntu!!!

👇👇👇 Windows Platform 👇👇👇

一般情况下,Windows 平台下搭建 TensorFlow 深度学习框架仅作为简单学习使用,无法更高效利用软硬件资源。故,我们更应该关注基于 Liunx Server 搭建学习、开发环境。


Environment Lists

基于以上,这里给出我的预安装环境准备:

[1] >>>> 硬件环境说明

  • 搭载 Nvidia GeForce GTX 970 独立显卡联想 ThinkCentre 商业主机;
  • 搭载 3TB 硬盘用于存储数据以及 32GB(4 * 8GB)内存条;
  • 四核心 Inter CORE I7 CPU;
  • ThinkCentre 商用主机。

–> 联想 ThinkCentre 商用主机搭载 Nvidia GTX 970 独立显卡时问题:

  • 电源提供接口不够,购买电源转接线电源口 IDE 大 4D 芯一分二(4 pin公转母),显卡 6pin 转双大 4D。电源接线不够时,建议升级较大功率电源。
  • 机箱主板空间较小无法安装索泰(ZOTAC)Nvidia GTX 970 独立显卡,购买 PCI-E 16X 显卡延长线。
  • 购买 DVI 转 VGA24+5 Pin(显卡显示器高清视频转换接头)。

[2] >>>> 搭建环境说明

Ubuntu16.04 + Nvidia GeForce GTX 970 + CUDA8.0 + CUDNN5.1 + Tensorflow1.2.0


从这里开始,正式开始【TensorFlow GPU Support】深度学习环境的配置:

点亮 GPU && Ubuntu

首先,毋庸置疑的是可以成功点亮 >>>> 搭载了 GPU 独立显卡的 Ubuntu 服务器。

关于服务器操作系统,我们选择安装的是:Ubuntu16.04,具体的安装过程不赘述,网上有很多。

这里,有个需要注意的地方(很重要)>>>> 安装 Ubuntu16.04 系统时是否搭载(连接)GPU?!!

也就是说,这里我们有两种安装方式可供选择:

第一种:直接在主板上搭载 GPU,显示器接 GPU 输出接口,然后完成 Ubuntu16.04 系统的点亮;

第二种:不搭载 GPU(拔掉)安装好 Ubuntu16.04 系统(此时显示器接主机 VGA 接口),关机后安装好 GPU 并将显示器接 GPU 输出接口。

👇👇👇 重点来了 👇👇👇

通常使用的是第一种安装方式,但默认的前提是 Ubuntu16.04 安装引导系统能够正常识别 GPU(系统中默认显卡驱动支持该型号 GPU)。否则,你会发现:使用 U 盘启动盘安装系统时无法进入 Ubuntu 安装引导界面,怎么重启都没用。

而一旦拔掉 GPU,显示器转接主机 VGA 接口后,重启可成功进入安装引导界面(集显正常)。此时,你就需要考虑第二种方法了。

没看懂,不要着急~~~


故,搭建 TensorFlow [GPU Support] 环境第一步就是要解决系统显卡驱动问题:

显卡驱动

根据安装 Ubuntu16.04 系统时是否搭载(连接)GPU,分为两种显卡驱动安装方式:

[1] >>>> 搭载式安装 <<<< 对应上述第一种安装方式

[2] >>>> 非搭载式安装(推荐) <<<< 对应上述第二种安装方式

下面将针对上述两种安装方法,给出其显卡驱动安装的具体步骤。


查询系统显卡信息

首先,你需要查询当前系统显卡信息,以获取显卡详细信息,检查显卡驱动版本是否合适 CUDA 运算。具体检测过程如下:

1 >>>> 搭载式安装(第一种)

如果直接搭载 GPU 独显的服务器使用 U 盘启动安装 Ubuntu16.04,成功点亮了系统(显示器接 GPU 显示引导界面),那么恭喜你,当前系统默认显卡驱动支持你的 GPU。(如果无法成功,请移步至【2 >>>> 非搭载式安装(第二种) 】

成功点亮系统后,我们可以直接查询当前系统中 GPU 的详细信息:

[1] >>>> 查询本机的显卡型号

因显卡一般接 PCI 接口,可以通过 lspci 查询显卡相关信息。一般我们可以查看到两种类型显卡:一块时集显;一块是独显。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
$ sudo lspci -vnn |grep VGA -A 12
01:00.0 VGA compatible controller [0300]: NVIDIA Corporation GM206 [GeForce GTX 970] [10de:1401] (rev a1) (prog-if 00 [VGA controller])
Subsystem: ZOTAC International (MCO) Ltd. GM206 [GeForce GTX 970] [19da:1379]
Flags: bus master, fast devsel, latency 0, IRQ 124
Memory at f6000000 (32-bit, non-prefetchable) [size=16M]
Memory at e0000000 (64-bit, prefetchable) [size=256M]
Memory at f0000000 (64-bit, prefetchable) [size=32M]
I/O ports at e000 [size=128]
Expansion ROM at 000c0000 [disabled] [size=128K]
Capabilities: [60] Power Management version 3
Capabilities: [68] MSI: Enable+ Count=1/1 Maskable- 64bit+
Capabilities: [78] Express Legacy Endpoint, MSI 00
Capabilities: [100] Virtual Channel
Capabilities: [258] L1 PM Substates

| ================================= ↓↓↓↓↓ 显卡信息 ↓↓↓↓↓ ============================== |

独立显卡: 硬件厂商 NAVIDA(N卡);型号名称 GM206(GeForce GTX 970)

集成显卡:这里由于直接是搭载 GPU 的服务器安装系统,无法查看到集显信息

| ================================================================================ |

[2] >>>> 确认本机显卡驱动是否正常加载

1
2
3
4
5
6
7
8
9
10
11
12
13
$ sudo lshw -C display
*-display
description: VGA compatible controller
product: GM206 [GeForce GTX 970]
vendor: NVIDIA Corporation
physical id: 0
bus info: pci@0000:01:00.0
version: a1
width: 64 bits
clock: 33MHz
capabilities: pm msi pciexpress vga_controller bus_master cap_list rom
configuration: driver=nouveau latency=0
resources: irq:124 memory:f6000000-f6ffffff memory:e0000000-efffffff memory:f0000000-f1ffffff ioport:e000(size=128) memory:c0000-dffff

输出信息 configuration 字段中,如果 driver=“驱动名称” 不为空,说明系统支持该显卡的驱动。

我们可以看出,Ubuntu 系统支持 GTX 970 显卡且自动安装有一个默认的显卡驱动:nouveau(Linux 开源的显卡驱动)。

事实上,nouveau 驱动开发是很不完善的,我们需要重新安装适合显卡的(这里是 GTX960) Nvidia 显卡驱动才可以正常使用 TensorFlow 深度学习显卡加速。

到这里,你可以直接跳转到【Nvidia 显卡驱动安装】小节,接着完成后续的过程。


2 >>>> 非搭载式安装(第二种)

如果你采用第一种直接搭载 GPU 独显的服务器使用 U 盘启动安装 Ubuntu16.04,发现:无法进入 Ubuntu 安装引导界面,怎么重启都没用。而一旦拔掉 GPU,显示器转接主机 VGA 接口后,重启可成功进入安装引导界面。

此时,我们首先需要先拔掉 GPU,后将显示器转接主机 VGA 接口,安装 Ubuntu16.04。

成功点亮系统后,我们可以查询当前系统中 GPU(集显)的详细信息:

[1] >>>> 查询本机的显卡型号

因显卡一般是 PCI 接口,可以通过 lspci 查询显卡相关信息。一般我们可以查看到两种类型显卡:一块时集显;一块是独显。

1
2
3
4
5
6
7
8
9
10
11
12
deeplearning@ThinkCentre-M910s-N000:~$ lspci -vnn|grep VGA -A 12
00:02.0 VGA compatible controller [0300]: Intel Corporation HD Graphics 630 [8086:5912] (rev 04) (prog-if 00 [VGA controller])
DeviceName: Onboard IGD
Subsystem: Lenovo Device [17aa:3107]
Flags: bus master, fast devsel, latency 0, IRQ 124
Memory at f6000000 (64-bit, non-prefetchable) [size=16M]
Memory at e0000000 (64-bit, prefetchable) [size=256M]
I/O ports at f000 [size=64]
[virtual] Expansion ROM at 000c0000 [disabled] [size=128K]
Capabilities: <access denied>
Kernel driver in use: i915
Kernel modules: i915

这里只能查询到一块集显(未搭载独显):

| ================================= ↓↓↓↓↓ 显卡信息 ↓↓↓↓↓ ============================== |

集成显卡: 硬件厂商 Intel,型号名称 Corporation HD Graphics 630

| ================================================================================ |

[2] >>>> 确认本机显卡驱动是否正常加载

1
2
3
4
5
6
7
8
9
10
11
12
13
14
deeplearning@ThinkCentre-M910s-N000:~$ sudo lshw -C display
[sudo] password for deeplearning:
*-display
description: VGA compatible controller
product: HD Graphics 630
vendor: Intel Corporation
physical id: 2
bus info: pci@0000:00:02.0
version: 04
width: 64 bits
clock: 33MHz
capabilities: pciexpress msi pm vga_controller bus_master cap_list rom
configuration: driver=i915 latency=0
resources: irq:124 memory:f6000000-f6ffffff memory:e0000000-efffffff ioport:f000(size=64) memory:c0000-dffff

输出信息 configuration 字段中,如果 driver=“i915” 不为空,系统中集显驱动为:“i915”。

此时,先不要着急关机搭载 GPU!!!(如果你尝试关机后搭载 GPU,并将显示器接 GPU 输出接口同样会发现无法进入安装引导界面(系统中默认显卡驱动是不支持该型号 GPU的),故无法正常输出信号到显示器)。

↓↓↓↓↓↓ 解决办法 ↓↓↓↓↓↓

我们需要在安装好的系统中安装一个支持该型号 GPU 的先看驱动,接下文【Nvidia 显卡驱动安装】。


Nvidia 显卡驱动安装

下面我们来看,如何为特定型号的 GPU 安装合适版本的 Nvidia 显卡驱动:

1 >>>> 查询适合的 Nvidia 驱动

首先打开以及登陆 >>> Nvidia Driver 官网 <<< 根据独立显卡型号查询适合自己显卡的驱动(以 GTX 980 Ti 为例):

点击 SEARCH,查询显卡驱动信息:


2 >>>> 安装 Nvidia 驱动

查询到适用的 Nvidia 驱动版本后,开始安装 Nvidia 驱动 390.25

[1] >>>> 使用 PPA 安装

↓↓↓↓↓↓ 1. 首先需要添加 ppa 仓库 ↓↓↓↓↓↓

1
$ sudo add-apt-repository ppa:graphics-drivers/ppa

第一次运行会出现如下的警告:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Fresh drivers from upstream, currently shipping Nvidia.

## Current Status
We currently recommend: `nvidia-361`, Nvidia's current long lived branch.
For GeForce 8 and 9 series GPUs use `nvidia-340`
For GeForce 6 and 7 series GPUs use `nvidia-304`

## What we're working on right now:
- Normal driver updates
- Investigating how to bring this goodness to distro on a cadence.
-
## WARNINGS:
This PPA is currently in testing, you should be experienced with packaging before you dive in here. Give us a few days to sort out the kinks.
Volunteers welcome! See also: https://github.com/mamarley/nvidia-graphics-drivers/

http://www.ubuntu.com/download/desktop/contribute
更多信息: https://launchpad.net/~graphics-drivers/+archive/ubuntu/ppa
按回车继续或者 Ctrl+c 取消添加

–>【Enter】后继续:

1
2
3
4
5
6
7
8
9
10
# Enter 后显示如下信息表示添加成功:
gpg: keyring `/tmp/tmp7b1tsfut/secring.gpg' created
gpg: keyring `/tmp/tmp7b1tsfut/pubring.gpg' created
gpg: requesting key 1118213C from hkp server keyserver.ubuntu.com
gpg: /tmp/tmp7b1tsfut/trustdb.gpg: trustdb created
gpg: key 1118213C: public key "Launchpad PPA for Graphics Drivers Team" imported
gpg: no ultimately trusted keys found
gpg: Total number processed: 1
gpg: imported: 1 (RSA: 1)
OK

| ================================= ↓↓↓↓↓ 添加 PPA 仓库报错 ↓↓↓↓↓ ============================== |

如果添加 PPA 仓库报错的话,可以先 remove 掉,然后重新尝试:

1
2
$ sudo add-apt-repository --remove ppa:graphics-drivers/ppa
$ sudo add-apt-repository ppa:graphics-drivers/ppa

| ======================================================================================== |

↓↓↓↓↓↓ 2. 更新本地 apt-get 源 ↓↓↓↓↓↓

添加完 PPA 仓库,需要更新一下本地 apt-get 源,以检测添加的 PPA 仓库:

1
$ sudo apt-get update

↓↓↓↓↓↓ 3. 识别显卡模型和查看源中推荐的驱动程序 ↓↓↓↓↓↓

添加 PPA 仓库并且更新源后,先来识别显卡模型和查看源中推荐的驱动程序(如果采用非搭载式安装的话跳过):

1
2
3
4
5
6
7
8
9
10
11
12
13
$ ubuntu-drivers devices
== /sys/devices/pci0000:00/0000:00:01.0/0000:01:00.0 ==
modalias : pci:v000010DEd00001401sv000019DAsd00001379bc03sc00i00
model : GM206 [GeForce GTX 970]
vendor : NVIDIA Corporation
driver : nvidia-415 - third-party free
driver : nvidia-384 - distro non-free
driver : nvidia-396 - third-party free
driver : nvidia-418 - third-party free
driver : nvidia-410 - third-party free
driver : xserver-xorg-video-nouveau - distro free builtin
driver : nvidia-390 - third-party free
driver : nvidia-430 - third-party free recommended

为什么采用非搭载式安装的话跳过这里???非搭载式没有 GPU,查询无效,可直接选择【1 >>>> 查询适合的 Nvidia 驱动】中查询到的显卡驱动版本。

↓↓↓↓↓↓ 4. 安装源中推荐的驱动程序 ↓↓↓↓↓↓

首先你可以看到,PAA 仓库中提供有我们之前查询到的 390 版本的 Nvidia 驱动,你可以安装此版本。

当然,你也可以根据源中推荐的 Nvidia 版本进行安装(Recommended)。这里我的 GPU 为:GTX 970,故选择了 nvidia-384,它是支持 GTX 970 的一个稳定版本。

1
2
3
4
5
$ sudo apt-get install nvidia-384

# 安装一些可能的依赖插件:
$ sudo apt-get install mesa-common-dev
$ sudo apt-get install freeglut3-dev

推荐阅读: 安装 Nvidia 驱动还有其它方法,但推荐使用 PPA 仓库安装 Nvidia 驱动,这是最简单的驱动安装方式。关于使用官方的驱动进行手动安装这里就不介绍了。

[2] >>>> 使显卡驱动生效

针对搭载式安装,直接重启:

1
$ sudo reboot

如果采用非搭载式安装的话,上述驱动安装完成后,直接关机,然后搭载 GPU 并将显示器接 GPU 输出接口,便可发现已经可以进入系统了。

| =============================================== Split Line ================================================== |

安装好显卡驱动后就可以进行驱动测试了:

[3] >>>> 确认安装的显卡驱动是否正常加载

1
2
3
4
5
6
7
8
9
10
11
12
13
$ sudo lshw -C display
*-display
description: VGA compatible controller
product: GM206 [GeForce GTX 970]
vendor: NVIDIA Corporation
physical id: 0
bus info: pci@0000:01:00.0
version: a1
width: 64 bits
clock: 33MHz
capabilities: pm msi pciexpress vga_controller bus_master cap_list rom
configuration: driver=nvidia latency=0
resources: irq:127 memory:f6000000-f6ffffff memory:e0000000-efffffff memory:f0000000-f1ffffff ioport:e000(size=128) memory:c0000-dffff

可以发现,driver=nvidia 表明安装成功。

[4] >>>> 查看显卡运行状态

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
$ watch -n -1 nvidia-smi

# 显示如下信息表示显卡驱动安装成功(Ctrl + c 可退出查看状态):

Sat Jun 2 17:03:40 2018
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 384.130 Driver Version: 384.130 |
|-------------------------------+----------------------+----------------------+
| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |
|===============================+======================+======================|
| 0 GeForce GTX 970 Off | 00000000:01:00.0 On | N/A |
| 36% 45C P8 11W / 120W | 3863MiB / 4036MiB | 3% Default |
+-------------------------------+----------------------+----------------------+

+-----------------------------------------------------------------------------+
| Processes: GPU Memory |
| GPU PID Type Process name Usage |
|=============================================================================|
| 0 1143 G /usr/lib/xorg/Xorg 94MiB |
| 0 2070 G compiz 42MiB |
| 0 18635 G /usr/lib/firefox/firefox 1MiB |
| 0 29337 C ...naconda3/envs/tensorflow-3.5/bin/python 3710MiB |
+-----------------------------------------------------------------------------+

Nvidia 驱动升级

对于已经安装了 Nvidia 显卡驱动的服务器,但其驱动版本过低。或者前面安装了不合适的 Nvidia 显卡驱动,无法正常使用新版本的 CUDA。

故,我们一般会将 Nvidia 显卡驱动更新到一个较新的版本。

前面我们已经知道如何安装全新的 Nvidia 显卡驱动,这里来看如何快速卸载服务器原有的显卡驱动程序:

1
$ sudo apt-get --purge remove nvidia*

上述我们已经卸载了系统中的 Nvidia 显卡驱动,注意 >>>> 此时千万不能重启,重新电脑可能会导致无法进入系统,安装好新驱动后再重启!

接下来我们需要根据章节【Nvidia 驱动驱动安装】完成新的 Nvidia 显卡驱动的安装。


Summary

好奇么?驱动安装不是都已经结束了,怎么还有一小节???黑脸?!!、

–> 总结一下:

前面我们知道了如何基于搭载 GPU 独显的服务器安装 Ubuntu16.04 ,然后安装适合版本的显卡驱动(搭载式)。

另外,我们还同时说明了非搭载式安装方法:先把 GPU 拿掉,然后在只有集显的服务器上先安装 Ubuntu16.04 ,接着按照章节【Nvidia 驱动驱动安装】安装 Nvidia 显卡驱动,然后 shutdown 关机安装上 GPU 后重启即可。

事实上,非搭载式安装方法可以帮助我们避免驱动安装中的很多麻烦。


👇👇👇 部署 CUDA && cuDNN 👇👇👇

在开始 CUDA 和 cuDNN 的部署之前,你需要通过查看 Tensorflow && NVIDIA 版本信息对照表 >>> 见【CUDA && CUDNN && TF】中说明,选择和预安装和 TensorFlow [GPU Support] 版本兼容的 CUDA && cuDNN 版本。

版本清单 >>>> TensorFlow v1.2.0 && CUDA Toolkit v8.0 && CuDNN v5.1

部署 CUDA 8.0

我选择使用的 TensorFlow 版本是:TensorFlow-gpu-1.2.0,所以需要安装 CUDA 8.0

在安装 CUDA 之前,Google 了一下,发现在 Ubuntu 下安装 CUDA 8.0 非常常见,支持 GTX 970。

下面我们将以 CUDA 8.0 的安装为样例(其它版本 CUDA 安装类似):

环境检测

安装 CUDA 8.0 之前,请先确认系统中是否已安装有默认的 CUDA 版本?!!执行如下命令查看系统 CUDA 版本:

1
2
3
4
5
6
7
8
9
10
11
$ nvcc -V

# 输出如下信息表示当前系统已安装有 CUDA,安装目录见:/usr/local/
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2016 NVIDIA Corporation
Built on Tue_Jan_10_13:22:03_CST_2017
Cuda compilation tools, release 8.0, V8.0.61

# 没有的话输出如下:
The program 'nvcc' is currently not installed. You can install it by typing:
sudo apt install nvidia-cuda-toolkit

如果有,可以跳转至【CUDA 卸载】章节,先卸载掉系统中已安装的 CUDA 版本,再开始下面的步骤。


Download CUDA

下载 CUDA 需要注册和登陆 NVIDIA 开发者账号,CUDA8 下载页面提供了很详细的系统选择和安装说明。

这里,我们首先提供 >>> 【CUDA 8.0 下载地址】,并且选择做如下平台设置(其它版本戳 这里):

这里选择了 Ubuntu16.04 系统 Runfile 安装方案,千万不要选择 deb 方案,否则前方无数坑。

配置好平台设置后,进入下载界面。如下:

这里,只需下载 cuda_8.0.27_linux.run(1.4GB) 即可。


下载好的 cuda_8.0.27_linux.run1.4G。下面按照 Nvidia 官方给出的方法安装 CUDA8:

Setup CUDA

1
$ sudo sh cuda_8.0.27_linux.run --tmpdir=/opt/temp/

这里加了 --tmpdir 主要是因为直接运行 sudo sh cuda_8.0.27_linux.run 可能会提示空间不足的错误(如下)。实际上是全新的电脑主机,硬盘足够大的(当报错后,你知道如何解决即可)。

1
2
3
4
Not enough space on parition mounted at /.
Need 5091561472 bytes.

Disk space check has failed. Installation cannot continue.

–> 执行 sh cuda_8.0.27_linux.run 后会有一系列提示让你确认,非常非常非常关键的地方是是否安装 361 这个低版本的驱动:

1
Install NVIDIA Accelerated Graphics Driver for Linux-x86_64 361.62 ?

答案必须是 n,否则之前为 GTX960 安装的 nvidia-384 驱动就白费了,而且后续问题多多。

👇👇👇 详细安装步骤如下 👇👇👇

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
Logging to /opt/temp//cuda_install_6583.log
Using more to view the EULA.
End User License Agreement
--------------------------
Preface
-------
The following contains specific license terms and conditions
for four separate NVIDIA products. By accepting this
agreement, you agree to comply with all the terms and
conditions applicable to the specific product(s) included
herein.

Do you accept the previously read EULA?
accept/decline/quit: accept

Install NVIDIA Accelerated Graphics Driver for Linux-x86_64 361.62?
(y)es/(n)o/(q)uit: n

Install the CUDA 8.0 Toolkit?
(y)es/(n)o/(q)uit: y

Enter Toolkit Location
[ default is /usr/local/cuda-8.0 ]:

Do you want to install a symbolic link at /usr/local/cuda?
(y)es/(n)o/(q)uit: y

Install the CUDA 8.0 Samples?
(y)es/(n)o/(q)uit: y

Enter CUDA Samples Location
[ default is /home/textminer ]:

Driver: Not Selected

Installing the CUDA Toolkit in /usr/local/cuda-8.0 ...
Installing the CUDA Samples in /home/textminer ...
Copying samples to /home/textminer/NVIDIA_CUDA-8.0_Samples now...
Finished copying samples.

===========
= Summary =
===========

Driver: Not Selected
Toolkit: Installed in /usr/local/cuda-8.0
Samples: Installed in /home/textminer

Please make sure that
- PATH includes /usr/local/cuda-8.0/bin
- LD_LIBRARY_PATH includes /usr/local/cuda-8.0/lib64, or, add /usr/local/cuda-8.0/lib64 to /etc/ld.so.conf and run ldconfig as root

To uninstall the CUDA Toolkit, run the uninstall script in /usr/local/cuda-8.0/bin

Please see CUDA_Installation_Guide_Linux.pdf in /usr/local/cuda-8.0/doc/pdf for detailed information on setting up CUDA.

***WARNING: Incomplete installation! This installation did not install the CUDA Driver. A driver of version at least 361.00 is required for CUDA 8.0 functionality to work.
To install the driver using this installer, run the following command, replacing with the name of this run file:
sudo .run -silent -driver

Logfile is /opt/temp//cuda_install_6583.log

安装完成之后,不要清空终端!不要清空终端!不要清空终端!后面有用处。

👇👇👇 配置环境变量 👇👇👇

安装完毕后,需要再声明一下环境变量,并将其写入到 ~/.bashrc 的尾部:

1
2
export PATH=/usr/local/cuda-8.0/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/cuda-8.0/lib64:$LD_LIBRARY_PATH

更新 ~/.bashrc 配置文件:

1
$ source ~/.bashrc

注意:如果是已经安装了 NVIDIA 和 CUDA 的云服务器环境,还需要添加环境变量才可以使用。

| =============================================== Split Line ================================================== |

如果环境变量设置错误,导致 系统PATH 值被覆盖了,这会导致 ls、make 等基本命令都用不了,提示 xxx: command not found。后来查阅资料,通过输入以下语句,可还原 PATH 变量值进行恢复(恢复至默认 PATH 值):

1
export PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin

至此,CUDA8.0 的部署其实已经完成了!!!但是请注意安装过程中这里可能有报错(missing recommended):

👇👇👇 Problem:Missing Recommended 👇👇👇

1
2
3
Driver: Not Selected
Toolkit: Installed in /usr/local/cuda-8.0
Samples: Installed in /home/textminer, but missing recommended

知道上面为什么不清空终端了吧~~~

不会报错,不注意的话,会导致后续 CUDA 测试( nbody 样例),如下:

1
2
3
$ cd  ~/NVIDIA_CUDA-8.0_Samples/5_Simulations/nbody  
$ make
$ ./nbody

即在 CUDA 上运行 nbody 样例,make 部分发生报错:

1
2
3
4
5
6
7
8
9
10
11
>>> WARNING - libGLU.so not found, refer to CUDA Getting Started Guide for how to find and install them. <<<
>>> WARNING - libX11.so not found, refer to CUDA Getting Started Guide for how to find and install them. <<<
>>> WARNING - gl.h not found, refer to CUDA Getting Started Guide for how to find and install them. <<<
>>> WARNING - glu.h not found, refer to CUDA Getting Started Guide for how to find and install them. <<<
>>> WARNING - Xlib.h not found, refer to CUDA Getting Started Guide for how to find and install them. <<<
[@] /usr/local/cuda-8.0/bin/nvcc -ccbin g++ -I../../common/inc -m64 -ftz=true -gencode arch=compute_20,code=sm_20 -gencode arch=compute_30,code=sm_30 -gencode arch=compute_35,code=sm_35 -gencode arch=compute_37,code=sm_37 -gencode arch=compute_50,code=sm_50 -gencode arch=compute_52,code=sm_52 -gencode arch=compute_60,code=sm_60 -gencode arch=compute_60,code=compute_60 -o bodysystemcuda.o -c bodysystemcuda.cu
[@] /usr/local/cuda-8.0/bin/nvcc -ccbin g++ -I../../common/inc -m64 -ftz=true -gencode arch=compute_20,code=sm_20 -gencode arch=compute_30,code=sm_30 -gencode arch=compute_35,code=sm_35 -gencode arch=compute_37,code=sm_37 -gencode arch=compute_50,code=sm_50 -gencode arch=compute_52,code=sm_52 -gencode arch=compute_60,code=sm_60 -gencode arch=compute_60,code=compute_60 -o nbody.o -c nbody.cpp
[@] /usr/local/cuda-8.0/bin/nvcc -ccbin g++ -I../../common/inc -m64 -ftz=true -gencode arch=compute_20,code=sm_20 -gencode arch=compute_30,code=sm_30 -gencode arch=compute_35,code=sm_35 -gencode arch=compute_37,code=sm_37 -gencode arch=compute_50,code=sm_50 -gencode arch=compute_52,code=sm_52 -gencode arch=compute_60,code=sm_60 -gencode arch=compute_60,code=compute_60 -o render_particles.o -c render_particles.cpp
[@] /usr/local/cuda-8.0/bin/nvcc -ccbin g++ -m64 -gencode arch=compute_20,code=sm_20 -gencode arch=compute_30,code=sm_30 -gencode arch=compute_35,code=sm_35 -gencode arch=compute_37,code=sm_37 -gencode arch=compute_50,code=sm_50 -gencode arch=compute_52,code=sm_52 -gencode arch=compute_60,code=sm_60 -gencode arch=compute_60,code=compute_60 -o nbody bodysystemcuda.o nbody.o render_particles.o -L/usr/lib/nvidia-367 -lGL -lGLU -lX11 -lglut
[@] mkdir -p ../../bin/x86_64/linux/release
[@] cp nbody ../../bin/x86_64/linux/release

↓↓↓↓↓↓ 解决方案 ↓↓↓↓↓↓

make 报错信息中得知,缺少了一些编译库,下面我们来安装这些库文件:

1
2
3
$ sudo apt-get install freeglut3-dev build-essential libx11-dev libxmu-dev libxi-dev libgl1-mesa-glx libglu1-mesa libglu1-mesa-dev libglfw3-dev libgles2-mesa-dev

$ GLPATH=/usr/lib make

–> 成功之后会显示:

1
2
3
4
5
6
7
8
9
10
> Windowed mode
> Simulation data stored in video memory
> Single precision floating point simulation
> 1 Devices used for simulation
gpuDeviceInit() CUDA Device [0]: "GeForce GTX 970
> Compute 6.1 CUDA device: [GeForce GTX 1080]
number of bodies = 256000
256000 bodies, total time for 10 iterations: 2291.469 ms
= 286.000 billion interactions per second
= 5719.998 single-precision GFLOP/s at 20 flops per interaction

Test CUDA

[1] >>>> 输出 CUDA 版本信息

1
$ nvcc –V

信息显示如下:

[2] >>>> 查询 GPU 信息

–> 进入 cd NVIDIA_CUDA-8.0_Sample/1_Utilities/deviceQuery 目录:

–> 执行:make

–> 执行:./deviceQuery

结果如下:

[3] >>>> nbody 测试

nbody 测试见【Problem:Missing Recommended】中相关说明。

恭喜你~~~~ 至此,CUDA 部署已经完成!!!


Remove CUDA

通过前面的介绍,我们了解了如何在服务器上安装 CUDA 应用。事实上,很多时候我们的服务器本身已经默认安装了某个版本的 CUDA,而搭建 TensorFlow For GPU Support 环境要求安装特定版本的 CUDA。

如果你无法确认系统中是否存在使用当前版本 CUDA 的应用时,不推荐卸载,为了尽量降低对原始系统的影响,你可以跳转至【CUDA 多版本管理】来解决问题。

↓↓↓↓↓↓ 对于有卸载需求的,我们来看如何卸载服务器中已安装的 CUDA ↓↓↓↓↓↓

分别针对 .deb.run 两种不同的安装方式(卸载方法不同),这里提供两种方式来卸载系统原有的 CUDA:

[1] >>>> .run 方法卸载

执行如下命令进行自动卸载(以 cuda-8.0 卸载为例):

1
$ sudo /usr/local/cuda-8.0/bin/uninstall_cuda-8.0.pl

有上述卸载文件 uninstall_cuda-8.0.pl 就说明是之前是用 .run 文件安装的,没有则是用 .deb 文件安装的,可以使用第二种方法进行卸载:

[2] >>>> .deb 方法卸载

1
2
3
4
5
$ sudo apt-get remove cuda

$ sudo apt-get autoclean

$ sudo apt-get remove cuda*

↓↓↓↓↓↓ 清空残留文件 ↓↓↓↓↓↓

最后,将当前目录切换至 /usr/local/ 下,查看是否还残留有未删除干净的 CUDA 相关文件:

1
2
3
4
5
$ cd /usr/local/
$ ls

% 存在残留文件则删除:
sudo rm -rf cuda-8.0

接着来看 CUDNN 的下载与安装:

部署 CUDNN 5.1

CUDNN 全称 CUDA Deep Neural Network library,是 NVIDIA 专门针对深度神经网络设计的一套 GPU 计算加速库,被广泛用于各种深度学习框架,例如 Caffe, TensorFlow, Theano, Pytorch, CNTK 等。

Download CuDNN

Nvidia 官方 CuDNN 地址 下载链接选择一个期望版本,不过下载 cuDNN 前同样需要注册登录甚至填写一个简单的调查问卷,链接界面如下:

从中你可以选择适合操作系统的 CUDNN 计算加速库。


Setup CuDNN

安装 CuDNN 比较简单,解压后把相应的文件拷贝到对应的 CUDA 目录下即可:

1
2
3
4
5
6
7
8
9
10
11
12
$ tar -zxvf cudnn-8.0-linux-x64-v5.1.tgz

cuda/include/cudnn.h
cuda/lib64/libcudnn.so
cuda/lib64/libcudnn.so.5
cuda/lib64/libcudnn.so.5.0.5
cuda/lib64/libcudnn_static.a

$ sudo cp cuda/include/cudnn.h /usr/local/cuda/include/
$ sudo cp cuda/lib64/libcudnn* /usr/local/cuda/lib64/
$ sudo chmod a+r /usr/local/cuda/include/cudnn.h
$ sudo chmod a+r /usr/local/cuda/lib64/libcudnn*

可以发现,cuDNN 中的 5 个文件(全部),在 /usr/local/cuda/include/ && /usr/local/cuda/lib64/ 中找不到相同文件:

1
2
$ ls /usr/local/cuda/lib64/ |grep libcudnn
$ ls /usr/local/cuda/include/ |grep cudnn

也就意味着:CuDNN 其实就是 CUDA 的扩展计算库,把 cuDNN 相关库文件添加 CUDA 里,不会对 CUDA 造成其他影响,即所谓的 插入式设计。这保证了当前系统环境中可以存在多个版本的 cuDNN。


CuDNN 的插入式设计 >>>> 帮助我们简单、快捷的实现 CuDNN 的升级或多版本管理:

Update CuDNN

这里,假设一下:上面我们已经完成了 cuDNN v5.1 for CUDA8.0 的安装。事实上,我们需要的是 cuDNN v6.0 for CUDA8.0 计算加速包,那么我们如何将 cuDNN 版本升级到 cuDNN v6.0 呢???

其实很简单。下载 cuDNN v6.0 安装包 cudnn-8.0-linux-x64-v6.0.tgz、解压以及使用 cuDNN v6.0 库文件覆盖 CUDA 中的 cuDNN v5.1 库文件即可。详细步骤如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$ tar -zxvf cudnn-8.0-linux-x64-v6.0.tgz

cuda/include/cudnn.h
cuda/lib64/libcudnn.so
cuda/lib64/libcudnn.so.6
cuda/lib64/libcudnn.so.6.0.6
cuda/lib64/libcudnn_static.a

$ rm /usr/local/cuda/include/cudnn.h
$ rm /usr/local/cuda/lib64/libcudnn*

$ sudo cp cuda/include/cudnn.h /usr/local/cuda/include/
$ sudo cp cuda/lib64/libcudnn* /usr/local/cuda/lib64/
$ sudo chmod a+r /usr/local/cuda/include/cudnn.h
$ sudo chmod a+r /usr/local/cuda/lib64/libcudnn*

至此,CUDA 8.0 以及 CUDNN 5.1 安装完成!!!接下来就可以开始 Tensorflow GPU Enabled 的安装了。

部署 TensorFlow-GPU

这里,我们使用 Anaconda 的方式来部署 TensorFlow-GPU 深度学习环境。

1 >>>> Conda Envs install TensorFlow

通过 Anaconda 安装 Tensorflow 详细过程参见博文 >>> 一文详解全平台 TensorFlow 深度学习框架在线搭建 (CPU&GPU 支持) <<< 【使用 Anaconda 安装】小节,篇幅原因不赘述。

对于其它方式的 TensorFlow 部署,可以参见博文中的其它章节。

2 >>>> TensorFlow 导入测试

正常情况,如果安装的 Python、TensorFlow、CUDA 、CUDNN 版本正确,import tensorflow as tf 时,无报错。

| ========================= ↓↓↓↓↓ CUDA & CUDNN 与不相容版本的 TensorFlow 问题 ↓↓↓↓↓ ========================= |

以安装 tensorflow-gpu1.3 为例:

1
libcudnn.so.6:cannot open sharedobjectfile:No such file or directory

根据错误代码,应该是找不到 libcudnn.so.6

到指定文件夹下发现只有 5.08.0 的版本,没有 6.0,查找原因是因为当前已经是 1.3 版本,而 tensorflow-gpu1.3 已经开始去找 cudnn6 了(也就是说是用 cudnn6 编译的)…

故,需要换到 tensorflow-gpu1.2 版本,就解决问题了:

1
2
3
4
5
6
7
8
9
10
11
# 先卸载掉之前安装的错误版本的 TensorFlow 环境,然后重新安装 :
$ pip uninstall tensorflow-gpu==1.3
$ pip install tensorflow-gpu==1.2

#或者

# 直接移除整个 conda 虚拟环境,然后重新安装:
$ conda remove –n tensorflow-3.5 –all
$ conda create –n tensorflow-3.5 python=3.5
$ source activate tensorflow-3.5
$ pip install tensorflow-gpu==1.2

| ================================================================================================== |


3 >>>> GPU 运算测试

这里以一个简单的向量加法为例来测试 TensorFlow [GPU Support] 环境,测试代码如下(gpu_test.py):

1
2
3
4
5
6
7
8
9
10
import tensorflow as tf

a = tf.constant([1.0,2.0,3.0], shape=[3], name=”a”)
b = tf.constant([1.0,2.0,3.0], shape=[3], name=”b”)
result = a + b

# 通过 log_device_placement 参数来输出运行每一个运算的设备:
sess = tf.Session(config=tf.ConfigProto(log_device_placement=True))

print (sess.run(result))

结果输出信息如下:

[3.1] >>>> 在没有 GPU 的机器上运行上述代码,可以得到如下输出:

1
2
3
4
Device mapping: no known devices
add :/job:localhost/replica:0/task:0/cpu:0
a : /job:localhost/replica:0/task:0/cpu:0
b : /job:localhost/replica:0/task:0/cpu:0

[3.2] 配置好 GPU 环境的 TensorFlow 中,没有明确制定运行设备的话,TensorFlow 会优先选择 GPU 设备运行,会得到如下结果:

1
2
3
4
5
6
7
8
9
10
11
12
Device mapping:
/job:localhost/replica:0/task:0/gpu:0 -> device: 0, name: GeForce GTX 960, pci bus id: 0000:01:00.0
2018-02-04 13:01:33.343286: I tensorflow/core/common_runtime/direct_session.cc:265] Device mapping:
/job:localhost/replica:0/task:0/gpu:0 -> device: 0, name: GeForce GTX 960, pci bus id: 0000:01:00.0

add: (Add): /job:localhost/replica:0/task:0/gpu:0
2018-02-04 13:01:33.343948: I tensorflow/core/common_runtime/simple_placer.cc:847] add: (Add)/job:localhost/replica:0/task:0/gpu:0
b: (Const): /job:localhost/replica:0/task:0/gpu:0
2018-02-04 13:01:33.343980: I tensorflow/core/common_runtime/simple_placer.cc:847] b: (Const)/job:localhost/replica:0/task:0/gpu:0
a: (Const): /job:localhost/replica:0/task:0/gpu:0
2018-02-04 13:01:33.343997: I tensorflow/core/common_runtime/simple_placer.cc:847] a: (Const)/job:localhost/replica:0/task:0/gpu:0
[2. 4. 6.]

自此,我们就完成了 Ubuntu16.04 + Nvidia GTX 970 + CUDA8.0 + CUDNN + Anaconda3 + Tensorflow1.2 深度学习环境搭建。


You Need Know More

扩展阅读部分:

NVIDIA 显卡相关

[1] >>>> nvidia-smi

英伟达系统管理接口(NVIDIA System Management Interface, 简称 nvidia-smi),属于命令行管理组件,旨在帮助管理和监控 NVIDIA GPU 设备。

执行 nvidia-smi 命令可以查看当前系统安装的 NVIDIA 驱动信息以及 GPU 使用情况,显示如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
$ root@Ubuntu:~# nvidia-smi

Thu Feb 28 15:50:39 2019
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 390.46 Driver Version: 390.46 |
|-------------------------------+----------------------+----------------------+
| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |
|===============================+======================+======================|
| 0 Tesla P4 On | 00000000:00:07.0 Off | 0 |
| N/A 30C P8 7W / 75W | 0MiB / 7611MiB | 0% Default |
+-------------------------------+----------------------+----------------------+

+-----------------------------------------------------------------------------+
| Processes: GPU Memory |
| GPU PID Type Process name Usage |
|=============================================================================|
| No running processes found |
+-----------------------------------------------------------------------------+

可以看出:驱动版本(NVIDIA-SMI 390.46)、显卡型号(Tesla P4)、内存(7611MiB:8G)以及 GPU 使用率(GPU-Util Compute M.: 0% Default)等。

nvidia-smi 配合 watch -n 一起使用,可用于查看 GPU 的实时动态使用情况:

1
$ watch -n -1 nvidia-smi 

[2] >>>> lspci

查看服务器集成显卡信息:

1
2
$ lspci | grep VGA
00:02.0 VGA compatible controller: Cirrus Logic GD 5446

查看服务器 NVIDIA 显卡信息:

1
2
$ lspci | grep NVIDIA
00:07.0 3D controller: NVIDIA Corporation Device 1bb3 (rev a1)

[3] >>>> 集显与独显的切换

NVIDIA 还提供了用于切换显卡的命令。例如,查看当前使用的显卡:

1
$ sudo prime-select query

如何切换 nvidia 显卡:

1
$ sudo prime-select nvidia

如何切换 intel 显卡:

1
$ sudo prime-select intel

CUDA 多版本管理

事实上,很多情况下我们需要多个 CUDA 版本兼容存在于服务器系统中,并且可以很容易地在不同版本之间进行迅速切换。

请参见如下场景:

场景一 >>> 多人共享使用当前服务器,由于使用的 TensorFlow 框架版本不同,所需要的 CUDA 版本也不同。此时,系统需要存在多个版本的 CUDA。

场景二 >>> 之前搭建 TensorFlow 环境使用的是 CUDA8.0cuDNN5.1,当我们需要在 TensorFlow 环境中兼容其它深度学习环境时(比如搭建 TensorFlow + Pytorch 环境),Pytroch GPU Support 可能需要更高版本的 CUDA 以及 cuDNN。此时,升级 CUDA 以及 cuDNN 版本以适应 TensorFlow + Pytorch 环境是必要的。

怎么办???卸载重装???


这一章节,我们会以同时部署 cuda-8.0cuda-9.0 版本为例进行说明:

CUDA 多版本共存

对于 cuda-8.0cuda-9.0,无论先安装哪个版本,都一样。

上面已经安装过 cuda-8.0 了,这里,我们将扩展安装 cuda-9.0 版本:

1 >>>> Download && Setup CUDA9.0

下载 CUDA 需要注册和登陆 NVIDIA 开发者账号。这里,我们首先给出 >>> CUDA 版本库地址 <<< 供选择下载期望版本的 CUDA 安装包,版本库页面如下:

通过 CUDA 版本库地址进入 CUDA9.0 下载页面:

可以看到这里提供了很详细的系统选择和安装说明,这里选择了 Ubuntu16.04 系统 Runfile 安装方案(千万不要选择 deb 方案,否则前方无数坑)。

下载完成之后,进入到 CUDA9.0 安装包(cuda_9.0.176_384.81_linux.run)所在目录运行如下命令即可开始进行安装,详细安装过程讲解如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
$ sudo sh cuda_9.0.176_384.81_linux.run

Using more to view the EULA.
End User License Agreement
--------------------------
Preface
-------
The following contains specific license terms and conditions
for four separate NVIDIA products. By accepting this
agreement, you agree to comply with all the terms and
conditions applicable to the specific product(s) included
herein.

# 接受安装协议:
Do you accept the previously read EULA?
accept/decline/quit: accept

# 询问是否重新安装显卡驱动,这里一定要选择 `n`,否则最初安装的显卡驱动会被覆盖产生出错:
Install NVIDIA Accelerated Graphics Driver for Linux-x86_64 384.81?
(y)es/(n)o/(q)uit: n

Install the CUDA 9.0 Toolkit?
(y)es/(n)o/(q)uit: y

# 定义安装目录(一般默认回车即可,即安装在 `/usr/local/cuda-9.0` 目录下),
Enter Toolkit Location
[ default is /usr/local/cuda-9.0 ]:

# 询问是否将 `cuda-9.0` 安装目录通过软连接的方式 link 到 `/usr/local/cuda`?【 yes or no 】 均可。
# 系统当前启用的 `cuda` 为哪个版本?取决于哪个版本的 CUDA 安装目录被链接到 `/usr/local/cuda` 上。
# 对于首次安装 CUDA,肯定是需要建立软连接的(yes);对于安装额外版本的 CUDA,【 yes or no 】 需要根据是否启动新版本 CUDA 决定。
Do you want to install a symbolic link at /usr/local/cuda?
(y)es/(n)o/(q)uit: n

# 询问是否安装样例,可用于后续检测是否安装成功:
Install the CUDA 9.0 Samples?
(y)es/(n)o/(q)uit: n

# 定义样例安装目录:
Enter CUDA Samples Location
[ default is /root ]: /home/textminer

# *** 安装信息显示 **** #
Driver: Not Selected

Installing the CUDA Toolkit in /usr/local/cuda-9.0 ...
Installing the CUDA Samples in /home/textminer ...
Copying samples to /home/textminer/NVIDIA_CUDA-9.0_Samples now...
Finished copying samples.

===========
= Summary =
===========

Driver: Not Selected
Toolkit: Installed in /usr/local/cuda-9.0
Samples: Installed in /home/textminer

Please make sure that
- PATH includes /usr/local/cuda-9.0/bin
- LD_LIBRARY_PATH includes /usr/local/cuda-9.0/lib64, or, add /usr/local/cuda-9.0/lib64 to /etc/ld.so.conf and run ldconfig as root

To uninstall the CUDA Toolkit, run the uninstall script in /usr/local/cuda-9.0/bin

Please see CUDA_Installation_Guide_Linux.pdf in /usr/local/cuda-9.0/doc/pdf for detailed information on setting up CUDA.

***WARNING: Incomplete installation! This installation did not install the CUDA Driver. A driver of version at least 361.00 is required for CUDA 9.0 functionality to work.
To install the driver using this installer, run the following command, replacing with the name of this run file:
sudo .run -silent -driver

Logfile is /opt/temp//cuda_install_6583.log

安装过程中是否创建 symbolic link 是关键。首次安装,选【yes】;安装额外的版本,选【no】。


2 >>>> 配置 CUDA 环境变量

在当前用户配置文件 ~/.bashrc 末尾添加如下内容:

1
2
3
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/cuda/lib64
export PATH=$PATH:/usr/local/cuda/bin
export CUDA_HOME=$CUDA_HOME:/usr/local/cuda

需要注意的是,这里配置的 CUDA 目录并不是特指 CUDA9.0 的安装目录,而是一个特殊的 CUDA 目录(不管 CUDA8.0/9.0/…)。这样做的好处你可以参见下一小节【CUDA 版本实时切换】。

自此,我们已经成功完成了 cuda-8.0cuda-9.0 的安装。


下面我们来看如何迅速完成 CUDA 版本的切换:

CUDA 版本实时切换

通过上文可知,当我们安装了多个版本的 CUDA 之后,CUDA 一般会被安装到 /usr/local/ 目录(或你自己的自定义目录)下。查看一下当前目录下的文件:

1
2
3
$ cd /usr/local
$ ls
bin cuda cuda-8.0 cuda-9.0 etc games ......

上述 cuda-8.0cuda-9.0 是系统中已安装的 CUDA 版本,而 cuda 就是我们上面创建的 symbolic link

cuda 指向系统当前正在启用的 CUDA 版本 >>> 方便了我们切换 CUDA 版本,可以让我们不用每次都去 ~/.bashrc 修改环境变量的值(cuda-8.0/-9.0/...)。

我们先来查看当前 cuda 软链接指向的哪个 cuda 版本:

1
2
3
4
5
6
7
8
9
$ stat cuda
File: 'cuda' -> '/usr/local/cuda-8.0'
Size: 19 Blocks: 0 IO Block: 4096 symbolic link
Device: 807h/2055d Inode: 133904 Links: 1
Access: (0777/lrwxrwxrwx) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2019-02-28 10:44:36.494902702 +0800
Modify: 2018-02-03 10:52:47.543432671 +0800
Change: 2018-02-03 10:52:47.543432671 +0800
Birth: -

可以看到,cuda' -> '/usr/local/cuda-8.0,此时系统当前正在启用的 CUDA 版本为 cuda-8.0

那么,我们如何快速完成 cuda-9.0 的版本呢?其实很简单:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 1. 查看系统当前启用的 CUDA 版本:
$ nvcc -V
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2016 NVIDIA Corporation
Built on Tue_Jan_10_13:22:03_CST_2017
Cuda compilation tools, release 8.0, V8.0.61

# 2. 从 `cuda8.0` 切换到 `cuda9.0`:
$ rm -rf /usr/local/cuda
$ sudo ln -s /usr/local/cuda-9.0/ /usr/local/cuda/

# 查看切换后的CUDA 版本:
$ nvcc --version
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2016 NVIDIA Corporation
Built on Tue_Jan_10_13:22:03_CST_2018
Cuda compilation tools, release 9.0, V9.0.176

CUDNN 多版本管理

事实上,关于 CUDNN 多版本共存和实时切换的问题,在【部署 CUDNN 5.1】章节中 >>>> 【Update CuDNN】小节以及解决,请参考上文。


Author

Waldeinsamkeit

Posted on

2018-04-02

Updated on

2023-04-03

Licensed under

You need to set install_url to use ShareThis. Please set it in _config.yml.

Comments

You forgot to set the shortname for Disqus. Please set it in _config.yml.