使用 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 <軟件包名>
可以完全清理,包括配置文件