卸载原有显卡驱动(如有)
如果当前系统存在显卡驱动,直接安装新的显卡驱动可能会报错。建议先卸载掉旧驱动。
# 先查看驱动以及版本安装情况
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
安装显卡驱动
- 首先更新设备信息,不然可能会识别不出来。
sudo update-pciids
- 更新后,可以查看显卡型号。这里的 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)
- 查看可用驱动信息。
ubuntu-drivers devices
- 更新软件列表并安装必要依赖。
sudo apt-get update
sudo apt-get install g++
sudo apt-get install gcc
sudo apt-get install make
- 禁用 nouveau。nouveau 是开源通用显卡驱动。
sudo gedit /etc/modprobe.d/blacklist.conf
在文件末尾加入:
blacklist nouveau
options nouveau modeset=0
更新变更并重启:
sudo update-initramfs -u
重启后输入下面命令,没有任何输出表示禁用成功:
lsmod | grep nouveau
- 开始安装驱动。
目前安装驱动有 3 种方式:GUI 安装、.run 文件安装、命令行安装。其实这几种方法都差不多,恶心人。
注意,你也可以在安装 CUDA 的时候顺手安装 Driver,不一定必须使用这一步的方式。如果要使用这一方法,先看下方安装 CUDA 章节。
打开 Software & Updates 的 Additional Drivers,可以看到 NVIDIA Drivers 列表。正常来说,是按照 ubuntu-drivers devices 得到的 recommended 版本安装。比如我的推荐版本是 530-proprietary tested,不过我用尽三种方法、安装了 N 次也没有成功,最后安装了 530-proprietary 却成功了。如果建议版本安装不成功,可以尝试换其他版本。
- 安装完成后,重启并输入
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
安装中出现的提示
我不太明白这个,根据网上一些文章的建议:
-
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,但这不是所有环境下的通用答案。
-
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 配置。
-
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 |
|---|---|
| 12 | 12.1 |
| 11.4.1+, 11.5, 11.6, 11.7, 11.8 | 11 |
| 11.1, 11.2, 11.3, 11.4.0 | 10 |
| 11 | 9 |
| 10.1, 10.2 | 8 |
| 9.2, 10.0 | 7 |
| 9.0, 9.1 | 6 |
| 8 | 5.3 |
| 7 | 4.9 |
| 5.5, 6 | 4.8 |
| 4.2, 5 | 4.6 |
| 4.1 | 4.5 |
| 4.0 | 4.4 |
CUDA 下载地址:CUDA Toolkit Archive
三种安装方式中,我选的是 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)。
安装流程可参考 Installing cuDNN on Linux。需要注意,cuDNN 8 和 cuDNN 9 的包名与安装方式存在差异,下面命令对应的是 cuDNN 8.x。
- 安装 Zlib。
sudo apt-get install zlib1g
- 进入下载 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
- 导入 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
- 安装 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
- 测试 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 时也要根据自己的系统和 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 驱动安装及卸载
[3] CUDA Samples
[4] cuDNN Archive
[6] TensorRT SDK
评论