卸载原有显卡驱动(如有)

如果当前系统存在显卡驱动,直接安装新的显卡驱动可能会报错。建议先卸载掉旧驱动。

# 先查看驱动以及版本安装情况
ls /usr/src | grep nvidia

# 进入安装目录,用驱动自带卸载命令卸载
cd /usr/bin
ls nvidia-*
sudo nvidia-uninstall

然后再用下面的命令查看是否卸载干净,一般情况下没有输出:

ls /usr/src | grep nvidia

卸载完成后 reboot。

我也找到另一种方法,来自 Ubuntu Nvidia driver 驱动安装及卸载

# 直接卸载驱动
sudo ./显卡驱动包名称 --uninstall

# 卸载两件套
sudo apt-get purge nvidia*
sudo apt-get autoremove
sudo reboot

安装显卡驱动

  1. 首先更新设备信息,不然可能会识别不出来。
sudo update-pciids
  1. 更新后,可以查看显卡型号。这里的 rev a1 是 PCI 设备 revision,并不表示独显正在运行;真正要确认驱动是否正常工作,看后面的nvidia-smi
lspci | grep -i nvidia

funnywii@4060Ti:~$ lspci | grep -i nvidia
02:00.0 VGA compatible controller: NVIDIA Corporation AD106 [GeForce RTX 4060 Ti] (rev a1)
02:00.1 Audio device: NVIDIA Corporation Device 22bd (rev a1)
  1. 查看可用驱动信息。
ubuntu-drivers devices
  1. 更新软件列表并安装必要依赖。
sudo apt-get update
sudo apt-get install g++
sudo apt-get install gcc
sudo apt-get install make
  1. 禁用 nouveau。nouveau 是开源通用显卡驱动。
sudo gedit /etc/modprobe.d/blacklist.conf

在文件末尾加入:

blacklist nouveau
options nouveau modeset=0

更新变更并重启

sudo update-initramfs -u

重启后输入下面命令,没有任何输出表示禁用成功:

lsmod | grep nouveau
  1. 开始安装驱动。

目前安装驱动有 3 种方式:GUI 安装、.run 文件安装、命令行安装。其实这几种方法都差不多,恶心人。

注意,你也可以在安装 CUDA 的时候顺手安装 Driver,不一定必须使用这一步的方式。如果要使用这一方法,先看下方安装 CUDA 章节。

打开 Software & Updates 的 Additional Drivers,可以看到 NVIDIA Drivers 列表。正常来说,是按照 ubuntu-drivers devices 得到的 recommended 版本安装。比如我的推荐版本是 530-proprietary tested,不过我用尽三种方法、安装了 N 次也没有成功,最后安装了 530-proprietary 却成功了。如果建议版本安装不成功,可以尝试换其他版本。

NVIDIA Driver Install
  1. 安装完成后,重启并输入 nvidia-smi

输出如下结果,说明驱动安装成功。这里的 CUDA Version 表示该驱动支持的最高 CUDA runtime API 版本,不代表本机已经安装了对应版本的 CUDA Toolkit。

dt@dt:~$ nvidia-smi
Wed Dec 11 10:52:34 2024
+---------------------------------------------------------------------------------------+
| NVIDIA-SMI 535.216.01             Driver Version: 535.216.01   CUDA Version: 12.2     |
|-----------------------------------------+----------------------+----------------------+
| 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  NVIDIA GeForce GTX 1660 ...    Off | 00000000:01:00.0  On |                  N/A |
| 31%   40C    P2              37W / 125W |    588MiB /  6144MiB |      7%      Default |
|                                         |                      |                  N/A |
+-----------------------------------------+----------------------+----------------------+

锁定内核

为了避免内核自动更新导致 NVIDIA 显卡驱动挂掉,可以锁定内核。

# 查看内核版本
dt@dt:~$ uname -r
5.15.0-67-generic

然后锁定:

sudo apt-mark hold linux-image-5.15.0-67-generic
sudo apt-mark hold linux-modules-extra-5.15.0-67-generic

查看目前系统中被锁定的包:

dt@dt:~$ sudo apt-mark showhold
linux-headers-5.15.0-67-generic
linux-image-5.15.0-67-generic
linux-modules-5.15.0-67-generic
linux-modules-extra-5.15.0-67-generic

最后更新 grub 使之生效:

sudo update-grub

安装中出现的提示

我不太明白这个,根据网上一些文章的建议:

  1. Would you like to register the kernel module sources with DKMS? This will allow DKMS to automatically build a new module, if you install a different kernel later?

    DKMS 可以在内核更新后自动重建驱动模块。是否选择 DKMS 取决于你的安装方式,以及是否希望驱动跟随内核更新自动重建。网上有些教程建议选择 No,但这不是所有环境下的通用答案。

  2. Would you like to run the nvidia-xconfig utility to automatically update your x configuration so that the NVIDIA X driver will be used when you restart X? Any pre-existing x config file will be backed up.

    通常可以选择 Yes,让安装程序更新 X 配置。

  3. If you plan to no longer use the NVIDIA driver, you should make sure that no X screens are configured to use the NVIDIA X driver in your X configuration file. If you used nvidia-xconfig to configure X, it may have created a backup of your original configuration. Would you like to run 'nvidia-xconfig --restore-original-backup' to attempt restoration of the original X configuration file?

    这个提示通常出现在卸载或恢复配置场景中,是否选择取决于你是否要恢复原始 X 配置。

安装 CUDA

接下来安装 CUDA。目前本机 gcc 和 g++ 版本为 9.4.0,不过我这个版本的 driver 和 CUDA 12.1 似乎并不存在网上所说的 gcc 和 g++ 版本过高不兼容的问题,因此忽略。

若安装不成功,可以考虑网络上为 gcc 降级并切换版本的方法。具体 CUDA version 和支持 GCC version 可以参考下表。需要注意,这张表只是参考,最终以 NVIDIA 官方安装文档和当前 CUDA 版本 release note 为准。

CUDA version max supported GCC version
1212.1
11.4.1+, 11.5, 11.6, 11.7, 11.811
11.1, 11.2, 11.3, 11.4.010
119
10.1, 10.28
9.2, 10.07
9.0, 9.16
85.3
74.9
5.5, 64.8
4.2, 54.6
4.14.5
4.04.4

CUDA 下载地址:CUDA Toolkit Archive

CUDA 12

三种安装方式中,我选的是 deb(local)。安装命令不要完全照搬下面,去 NVIDIA 官网根据你需要的版本来。

需要注意,deb 安装可能会同时拉取 NVIDIA driver。

如果你已经安装好了其他版本的驱动,并且不希望 CUDA 安装过程改动驱动,可以安装更具体的 cuda-toolkit-x-y 包,或者使用 runfile 方式安装并取消 Driver 选项。

wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64/cuda-ubuntu2004.pin
sudo mv cuda-ubuntu2004.pin /etc/apt/preferences.d/cuda-repository-pin-600
wget https://developer.download.nvidia.com/compute/cuda/12.0.0/local_installers/cuda-repo-ubuntu2004-12-0-local_12.0.0-525.60.13-1_amd64.deb
sudo dpkg -i cuda-repo-ubuntu2004-12-0-local_12.0.0-525.60.13-1_amd64.deb
sudo cp /var/cuda-repo-ubuntu2004-12-0-local/cuda-*-keyring.gpg /usr/share/keyrings/
sudo apt-get update
sudo apt-get -y install cuda

安装完成后还需要配置 CUDA 环境变量。终端输入:

sudo gedit ~/.bashrc

在末尾添加下面文本,其中 cuda-x.x 需要改为实际安装的 CUDA 版本。当然也可以不指定具体版本,比如 /usr/local/cuda。如果设备中存在多个 CUDA 版本并需要切换,则建议显式指定版本。

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

最后,在终端输入:

source ~/.bashrc

之后就可以使用 nvcc -V 查看 CUDA Toolkit 安装信息。

CUDA samples 是否随安装包一起安装,会随 CUDA 版本和安装方式变化。新版本可从 GitHub 获取:NVIDIA/cuda-samples

Runfile 安装的 CUDA

如果使用 runfile 方式安装 CUDA,会有一个选项让你确认是否安装 NVIDIA 驱动,按需安装。

整体安装完成后,根据脚本输出内容修改 .bashrc,同样添加如下内容:

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

cuDNN 8.9.1

cuDNN 的安装更简单。cuDNN Archive 登录后可以下载。我选择的是 Local Installer for Ubuntu20.04 x86_64 (Deb)

cuDNN 8.9.1

安装流程可参考 Installing cuDNN on Linux。需要注意,cuDNN 8 和 cuDNN 9 的包名与安装方式存在差异,下面命令对应的是 cuDNN 8.x。

  1. 安装 Zlib。
sudo apt-get install zlib1g
  1. 进入下载 deb 的文件夹:
# sudo dpkg -i cudnn-local-repo-${distro}-8.x.x.x_1.0-1_amd64.deb
# 对应到我下载的版本就是
sudo dpkg -i cudnn-local-repo-ubuntu2004-8.9.1.23_1.0-1_amd64.deb
  1. 导入 CUDA GPG key。
sudo cp /var/cudnn-local-repo-ubuntu2004-8.9.1.23/cudnn-local-A9C84908-keyring.gpg /usr/share/keyrings/
sudo apt-get update
  1. 安装 runtime library、dev library、samples。
sudo apt-get install libcudnn8=8.9.1.23-1+cuda12.1
sudo apt-get install libcudnn8-dev=8.9.1.23-1+cuda12.1
sudo apt-get install libcudnn8-samples=8.9.1.23-1+cuda12.1
  1. 测试 cuDNN。
cp -r /usr/src/cudnn_samples_v8/ $HOME
cd $HOME/cudnn_samples_v8/mnistCUDNN
make clean && sudo make
./mnistCUDNN

最后会输出 Test passed!

如果 make 后报错 fatal error: FreeImage.h,需要安装:

sudo apt-get install libfreeimage3 libfreeimage-dev

安装后继续编译即可。

TensorRT 8.6.1

下载地址:TensorRT SDK

安装方式最好保持一致,以减少路径和依赖问题。例如 CUDA、cuDNN 都使用 deb 安装时,TensorRT 也使用 deb 通常更省心。但这不是强制规则,关键是 CUDA / cuDNN / TensorRT 版本 ABI 兼容,并且库路径配置正确。

TensorRT

选择 TensorRT 时也要根据自己的系统和 CUDA 版本,而且要下载 GA 版,EA 是测试中的版本。下载好对应的 deb 后执行:

sudo dpkg -i nv-tensorrt-local-repo-ubuntu2004-8.6.1-cuda-12.0_1.0-1_amd64.deb
sudo cp /var/nv-tensorrt-local-repo-ubuntu2004-8.6.1-cuda-12.0/nv-tensorrt-local-9A1EDFBA-keyring.gpg /usr/share/keyrings/
sudo apt-get update
sudo apt-get install tensorrt

然后验证安装是否成功。进入 /usr/src/tensorrt/samples/sampleOnnxMNIST 中执行 sudo make,随后进入 /usr/src/tensorrt/bin 文件夹,执行 ./sample_onnx_mnist

&&&& PASSED TensorRT.sample_onnx_mnist [TensorRT v8601] # ./sample_onnx_mnist

Tar 安装 TensorRT

先解压:

tar -zxvf TensorRT-8.6.1.6.Linux.x86_64-gnu.cuda-12.0.tar.gz

然后将其添加至环境变量:

export LD_LIBRARY_PATH=/home/dt/Downloads/TensorRT-8.6.1.6/lib:$LD_LIBRARY_PATH

运行上述测试内容即可。

将 trtexec 添加到环境变量

trtexec 是 TensorRT 自带的模型转换和性能测试工具。如果不添加到环境变量,则会出现 bash: trtexec: command not found 的问题。

# 没错我用了 vim
vim ~/.bashrc

在最后加入:

export PATH=/usr/src/tensorrt/bin:$PATH

之后执行:

source ~/.bashrc

我在这个过程中还遗漏了 :$PATH,因此出现了下面的报错:

Command 'gedit' is available in the following places
 * /bin/gedit
 * /usr/bin/gedit
The command could not be located because '/usr/bin:/bin' is not included in the PATH environment variable.
gedit: command not found

这个报错的原因是 PATH 被改变了,通过 echo $PATH 可以看出 PATH 已经发生改变:

funnywii@funnywii-4070Ti:~$ echo $PATH
/usr/local/TensorRT-8.6.1.6/bin

解决这个问题只需要运行:

export PATH=$PATH:/usr/bin

trtexec 的使用

这里主要介绍如何将 ONNX 转为 engine 格式的模型。这个步骤很关键,因为一般来说,在哪台设备部署模型,就需要在该设备上进行模型格式转换。

旧版本 TensorRT 可以使用:

trtexec --onnx=det_static.onnx --saveEngine=test.engine --workspace=4096 --best

新版本 TensorRT 中,--workspace 可能已经弃用,可以改用:

trtexec --onnx=det_static.onnx --saveEngine=test.engine --memPoolSize=workspace:4096 --best

不过每个模型自身属性不同,转换需求也不同,这个就要灵活变通。


参考文章

[1] Ubuntu Nvidia driver 驱动安装及卸载

[2] CUDA Toolkit Archive

[3] CUDA Samples

[4] cuDNN Archive

[5] Installing cuDNN on Linux

[6] TensorRT SDK