使用 deb 包的方式安装 TensorRT
使用 deb 包的方式安装 TensorRT
完成日期:2022 年 4 月 17 日
最后修改:----
此文使用 markdown 完成
写在前面
要在 ubuntu 下使用 TensorRT,可以选择下载 deb 包本地安装。和使用 pip wheel 不同,这种安装方式可以同时支持 python 和 C++ 的接口。这种方式会把 TensorRT 给安装到我们的操作系统里,和安装其他的一些包类似,也不用再配置一些环境变量之类的东西,但是这样的话就只能安装一个版本的 TensorRT,不可以多版本共存。如果想要同时能用不同的版本,要用 tar 包的方式安装。
需要的组件
- 一块英伟达的 GPU(这不是废话吗 →_→)
- 安装好 GPU 驱动
- 安装好 CUDA
安装的 CUDA 版本要与 驱动和 TensorRT 保持一致,驱动可以直接打开“软件和更新”->“附加驱动”,里面选一个,建议不要用最新的,因为目前 TensorRT 8.2 支持到 CUDA 11.5,如果装的是 11.6 之类的(比如说我)后面会报错。如果出现类似下面这样的错误:
下列软件包有未满足的依赖关系:
tensorrt : 依赖: libnvinfer5 (= 5.0.2-1+cuda9.0) 但是它将不会被安装
依赖: libnvinfer-dev (= 5.0.2-1+cuda9.0) 但是它将不会被安装
依赖: libnvinfer-samples (= 5.0.2-1+cuda9.0) 但是它将不会被安装
E: 无法修正错误,因为您要求某些软件包保持现状,就是它们破坏了软件包间的依赖关系。
那估计就是是 CUDA 版本的问题。这里错误说的是包之间不兼容,可能的原因有:
- 没装驱动(没驱动当然找不到合适的包啦)
- 没装 CUDA
- TensorRT 版本选错了
- 上一次安装错误的 TensorRT 没有被卸载干净
这里又有两个巨坑:
- ubuntu 用“软件和更新”这个图形化的界面安装驱动的时候,不会自动安装 CUDA,所以安装 TensorRT 的时候一定会提示“有未满足的依赖关系”,即使是第一次安装,系统是完全干净的。所以有一些资料会说,安装驱动和 TensorRT 时都需要用 deb 包的方式安装。
- 如果碰到第一种情况,有些憨憨(比如我)可能会去换个版本安装,这时候一般的卸载方式是删不干净的,还会残留配置文件。于是乎,后面安装的版本和残留的配置文件又对不上,又会报错。
安装 CUDA
先说怎么安装 CUDA,它的版本要和驱动的一致。如果自己手动用命令行安装驱动,可以在装驱动的时候顺便把 CUDA 也一起装了。这里是官方的 CUDA 安装文档,没装的话,可以先用 nvidia-smi
命令来查询,会出来一个表格,右上角可以看到 CUDA 版本:
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 470.103.01 Driver Version: 470.103.01 CUDA Version: 11.4 |
|-------------------------------+----------------------+----------------------+
| 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 ... Off | 00000000:01:00.0 Off | N/A |
| N/A 52C P5 N/A / N/A | 158MiB / 4046MiB | 7% Default |
| | | N/A |
+-------------------------------+----------------------+----------------------+
之后直接去下载安装就行,这里是英伟达 CUDA 下载页面,选择好自己的系统、版本等信息,建议最后一项选择“deb[local]”,先下载下来本地安装,英伟达的网络有时候也不咋地。这个页面默认提供的是最新版的 CUDA,如果要安装旧版本的,需要点击下方的“Archive of Previous CUDA Releases”页面,选择我们需要的版本。需要注意的是,这里会把 CUDA 安装在操作系统里,如果需要在 Conda 虚拟环境里使用 TensorRT,还是要在虚拟环境里重新安装一下 CUDA。
安装 TensorRT deb 包
安装 TensorRT 的过程很简单,直接按官方教程来就行了。先使用下面的命令解包:
sudo dpkg -i [之前下载好的 deb 包的名字]
再添加本地仓库的源秘钥,我们安装的时候会把刚刚解包好的目录作为一个本地源,从那里安装,就不是像一般用 apt 命令安装的时候一样,从网络源下载了。添加完成后可以从图形界面的 “软件和更新” -> “其他软件”里面看到,弄错了可以从这里删掉。
sudo apt-key add /var/[还是 deb 包的名字]/7fa2af80.pub
上面那个目录其实就是之前用 dpkg 命令解包出来,默认是放在 /var/
路径下面,里面会有一个秘钥,添加它就行了。之后直接安装就行
sudo apt-get update # 也可以先更新一下源信息
sudo apt-get install tensorrt
到这一步其实就已经安装完了,还有几个小组件可以一并装上:
sudo apt-get install python3-libnvinfer-dev # 这玩意是用 python 接口推理用的,
# 装之前要先装 numpy
pip install protobuf # 这俩是配合 TensorFlow 使用的,有一些 TensorRT 例子会用到,
sudo apt-get install uff-converter-tf # 不过貌似现在不太用 uff,一般用 onnx
pip numpy onnx # 这俩是配合 onnx 模型使用的,有时候要使用官方的 TensorRT plugins,
apt-get install onnx-graphsurgeon # 就要用 onnx-graphsurgeon 去修改 onnx 图
验证安装
安装完成后,使用管道命令查询一下包列表,看看有没有安装成功:
dpkg -l | grep TensorRT
如果成功的话,会列出所有 TensorRT 相关的包,看起来像下面这样:
ii graphsurgeon-tf 8.2.4-1+cuda11.4 amd64 GraphSurgeon for TensorRT package
ii libnvinfer-bin 8.2.4-1+cuda11.4 amd64 TensorRT binaries
ii libnvinfer-dev 8.2.4-1+cuda11.4 amd64 TensorRT development libraries and headers
ii libnvinfer-doc 8.2.4-1+cuda11.4 all TensorRT documentation
ii libnvinfer-plugin-dev 8.2.4-1+cuda11.4 amd64 TensorRT plugin libraries
...
...
关于那两个巨坑
第 1 个坑说白了就是要在安装前,一定要先验证一下有没有装好 CUDA,可以用下面的命令查询一下:
dpkg -l | grep cuda # 会像上面一样,列出所有 CUDA 相关的包
不要用 nvcc
命令去查询,系统只会提示没有安装好 nvidia-cuda-toolkit,我们只需要单独的 CUDA,实测装了 nvidia-cuda-toolkit 也没啥用,还是会提示找不到 CUDA
第 2 个巨坑就是 dpkg 命令的原因的。第一次安装失败后,会有残留的配置文件,会导致第二次安装失败,使用 dpkg --remove <软件包名>
命令卸载时,--remove
是不会删除配置文件,只有用 --purge
命令才会删除相应的配置文件,用 dpkg -l
列出所安装的包时,前面的 ii
表示正常安装的包,如果是 re
开头的,就表示包已经被移除,但仍然还保留着它的配置文件,可以使用下面的命令来清理:
sudo dpkg -P <软件包名> # -P 就是 --purge 的短选项形式,是一样的
总结
- TensorRT 依赖有:显卡驱动、CUDA
- pycuda 需要在安装 CUDA 后再安装
- 安装失败的残留文件要清理掉,不然会出现冲突
- 使用
dpkg -P <软件包名>
可以完全清理,包括配置文件