安装 NVIDIA driver

以 Ubuntu 18.04 和 RTX 3080 显卡为例。

1. 检查BIOS启动项

Boot BIOS 选项中检查 Secure Boot、关闭(改为disabled)

2. 禁用nouveau

(1) 打开这个文件

sudo vim /etc/modprobe.d/blacklist.conf

并在最后加上

blacklist rivafb
blacklist vga16fb
blacklist nouveau
blacklist nvidiafb
blacklist rivatv
blacklist lbm-nouveau
options nouveau modeset=0
alias nouveau off
alias lbm-nouveau off

(2) 在终端执行:

sudo update-initramfs -u

(3) 重启(可以用 reboot 命令);

(4) 重启后,打开终端并输入如下命令:

lsmod | grep nouveau

如果没有输出,则表明禁用nouveau成功。

3. 删除原有NVIDIA驱动

sudo apt-get remove --purge nvidia*

4. 安装相关依赖

sudo apt-get install libprotobuf-dev libleveldb-dev libsnappy-dev libopencv-dev libhdf5-serial-dev protobuf-compiler
sudo apt-get install --no-install-recommends libboost-all-dev
sudo apt-get install libopenblas-dev liblapack-dev libatlas-base-dev
sudo apt-get install libgflags-dev libgoogle-glog-dev liblmdb-dev

还有,如果有图形化界面则需要禁用 X-Window 服务:

sudo service lightdm stop

或者

sudo /etc/init.d/lightdm stop

这两个都试一下。

5. 查询显卡是否挂载成功(无需安装任何驱动即可显示)

lspci | grep -i nvidia

我的电脑显卡为 RTX 3080,显示如下:

01:00.0 VGA compatible controller: NVIDIA Corporation Device 2206 (rev a1)
01:00.1 Audio device: NVIDIA Corporation Device 1aef (rev a1)

如什么都不显示,则 GPU 硬件挂载失败,可以检查一下电路接触是否良好。

6. 安装对应的显卡驱动

在英伟达官网 Official Drivers | NVIDIA 查询自己显卡对应的驱动版本,按照网站提示下载对应版本的 .run 文件。

以 NVIDIA-Linux-x86_64-455.23.04 为例,下载好之后执行:

sudo ./NVIDIA-Linux-x86_64-455.23.04.run -no-opengl-files

不过,据笔者实验,后面的 -no-opengl-files 可以不用,感觉没啥影响。


安装过程中可能会显示的问题

(1) The distribution-provided pre-install script failed! Are you sure you want to continue?

选择 yes 继续。

(2) Would you like to register the kernel module souces with DKMS? This will allow DKMS to automatically build a new module, if you install a different kernel later?

选择 No 继续。

(3) 问题大概是:Nvidia’s 32-bit compatibility libraries?

选择 No 继续。

(4) Would you like to run the nvidia-xconfigutility to automatically update your x configuration so that the NVIDIA x driver will be used when you restart x? Any pre-existing x confile will be backed up.

选择 Yes 继续


安装结束后,终端中使用 nvidia-smi 命令,如果安装成功,可以显示类似如下界面:

Tue Mar  2 11:46:41 2021       
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 455.23.04    Driver Version: 455.23.04    CUDA Version: 11.1     |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|                               |                      |               MIG M. |
|===============================+======================+======================|
|   0  GeForce RTX 3080    Off  | 00000000:01:00.0  On |                  N/A |
| 30%   34C    P8    16W / 320W |    606MiB / 10015MiB |      3%      Default |
|                               |                      |                  N/A |
+-------------------------------+----------------------+----------------------+

再次重启,可以看到你的屏幕分辨率会自动调整了。说明显卡驱动安装成功。

一些说明

  • nvidia-smi 命令后显示界面上的 “CUDA Version: 11.1” 版本似乎并非你安装的 CUDA 版本,而是显卡驱动支持的版本。你自行安装的 CUDA 版本和这个可以不同。例如,后面的教程就是安装 10.1 版本。
  • Ubuntu 中经常会遇到显卡驱动再次失败的情况。此时,笔者测试,可以只用上面第 6 步,重新安装一下那个 .run 驱动文件即可,无需从头再走一边。因此,建议第一次安装完驱动后,保留 .run 驱动文件,以免将来再次安装。

安装 CUDA

在官网 https://developer.nvidia.com/cuda-downloads 中选择自己显卡对应的 CUDA 版本,然后下载 .run 文件。以 CUDA 10.0 版本的 cuda_10.0.130_410.48_linux.run 为例。

NOTE: CUDA 10.0 版本是对应 tensorflow 和 tensorflow-gpu 1.14 或 1.15 版的。如果要安装更新的 CUDA,如 10.1 以及以后版本,那么 tensorflow 则必须安装更新的 tensorflow 2 以及以后版本才能对应。后面讲述了这几个工具之间的对应关系。

运行:

chmod +x cuda_10.0.130_410.48_linux
sudo ./cuda_10.0.130_410.48_linux

在弹出的界面中出现待安装的工具列表(不过早期的 CUDA 可能没有这个界面)。不要选择那个 driver,因为已经安装过了。其余全选,包括 CUDA ToolKit, CUDA Samples, Demo, Documentation 等。

安装过程中还会遇到一些提示问题。只有这一个问题 “Install NVIDIA Accelerated Graphics Driver for Linux-x86_64 3XX.XX ?” 这里选 NO,其余问题全部选 YES 或默认(其余问题有选择安装路径之类的,建议用默认路径)

安装完成后,在 ~/.bashrc 中添加环境变量:

export PATH=/usr/local/cuda/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/cuda/lib64:$LD_LIBRARY_PATH

记得再 source ~/.bashrc。不妨先检查一下这个路径 /usr/local/cuda/bin 有没有 CUDA 文件。

之后使用命令 nvcc -V,若输出类似如下信息,则证明 CUDA 安装成功。

nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2018 NVIDIA Corporation
Built on Sat_Aug_25_21:08:01_CDT_2018
Cuda compilation tools, release 10.0, V10.0.130

安装 cuDNN

cuDNN 的安装其实就是拷贝相关的头文件和库文件到 CUDA 安装路径下。

从官网 cuDNN Archive | NVIDIA Developer 下载对应版本下的 cuDNN Library for Linux,还需要注册账号。这里以 cuDNN 7.4 版本的 cudnn-10.0-linux-x64-v7.4.2.24.tgz 文件为例。

NOTE: cuDNN 7.4 是对应 tensorflow 1.14 或 1.15 版。如果要安装更新的 tensorflow,记得安装对应的 cuDNN 版本。

tar -xvzf 解压该文件,会出现一个名为 cuda 的文件夹。然后运行:

# 复制cudnn头文件
sudo cp cuda/include/* /usr/local/cuda-10.0/include/
# 复制cudnn的库
sudo cp cuda/lib64/* /usr/local/cuda-10.0/lib64/
# 添加可执行权限
sudo chmod +x /usr/local/cuda-10.0/include/cudnn.h
sudo chmod +x /usr/local/cuda-10.0/lib64/libcudnn*

可以看出,cuDNN 就俩文件夹,拷贝进去就行。

然后检查一下 /usr/local/cuda-10.1/include/ 中有没有 cudnn.h 文件就行了。也可以验证一下版本:

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

输出类似这样:

#define CUDNN_MAJOR 7
#define CUDNN_MINOR 4
#define CUDNN_PATCHLEVEL 2
--
#define CUDNN_VERSION (CUDNN_MAJOR * 1000 + CUDNN_MINOR * 100 + CUDNN_PATCHLEVEL)

#include "driver_types.h"

安装 tensorflow-gpu

这里 python 版本建议用 3.7。安装时,建议首先建立虚拟环境(例如 anaconda)。然后,建议指定 tensorflow GPU 版本:

pip install tensorflow-gpu==1.15.2

如果安装 CPU 版本则使用:

pip install tensorflow==1.15.2

NOTE: 从 tensorflow 2.0 版本开始,cpu 和 gpu 版本都只在一个文件中了,例如,只需安装一个文件 tensorflow==2.1.0。

安装成功后,从终端进入 python 然后测试一下:

>>> import tensorflow as tf
>>> tf.test.is_gpu_available()

会返回很多内容。在最下面,若返回 True,则表明 GPU 适配成功,tensorflow 可以成功调用 GPU 了。

如果返回 False,说明适配失败,通常是因为 tensorflow 或者 tensorflow-gpu 和对应的 CUDA 或 cuDNN 版本或 python 版本不相配。建议参考 tensorflow 官网 https://www.tensorflow.org/install/source#linux 选择严格对应的版本。例如,常用的 tensorflow 1.14 和 1.15 版本都只支持 python 3.3-3.7,CUDA 10.0(虽然据说现在已经支持 10.1 了?不确定),以及 cuDNN 7.4 版。因此,这意味着,记得安装正确对应的 CUDA 和 cuDNN 版本!

删除 NVIDIA driver

如果非要删除显卡驱动,可以用如下暴力法:

sudo apt-get purge nvidia*
sudo apt-get purge cuda*
sudo apt-get autoremove
sudo apt-get autoclean
sudo rm -rf /usr/local/cuda*

这里删除了所有的和 NVIDIA 以及 CUDA 相关的文件。不过注意,这样可能会造成重启后屏幕黑屏。此时,重启进入 login 界面前,可以用快捷键 CTRL + ALT + F3 (某一个 F1-F8 之间的按键)进入 tty 终端,然后参照上面教程,重新从头开始安装 NVIDIA 显卡驱动。注意,此时你最好保留了之前下载过的 NVIDIA 驱动文件 .run,否则此时无法用浏览器,再下载相对麻烦一些(可以另外找到链接然后用 wget)。然后再重启应该就没问题了。

删除 CUDA

有时候会想要重新安装另一个版本的 CUDA,此时要先删除此前版本。近些年较新版本的 CUDA 都提供了一个 cuda-uninstaller 文件,在路径 /usr/local/cuda-10.1/bin/cuda-uninstaller(以 10.1 版本为例)。到该路径下,然后

sudo chmod +x cuda-uninstaller
sudo ./cuda-uninstaller

它会弹出窗口,选择全部的四个,然后删除。这样理论上就足够了。可以查看 /usr/local 路径,发现 cuda 文件夹此时已经不见了,cuda-10.1 文件夹中也只有一个空文件夹 targets 了(通常只是 cuDNN 的文件,直接删除即可)。

如果不放心,再加上一步暴力法:

sudo apt-get purge cuda*
sudo apt-get autoremove
sudo apt-get autoclean
sudo rm -rf /usr/local/cuda*

删除 cuDNN

cuDNN 就是一些拷贝到 /usr/local/cuda-10.1 路径下的文件(以 10.1 版本为例),直接删除即可,不留痕迹。