1.卸載原環境
原環境:顯卡驅動 -- 470.57.02
cuda -- 10.0
cudnn -- 7.6
TensorRT 7.0.0.11
卸載cuda10.0以及相應的cudnn:
cd /usr/local/cuda/bin
sudo ./uninstall_cuda_10.0.pl
cd ..
sudo rm -rf cuda-10.0
2.安裝cuda 11.3及相應的cudnn
cuda安裝

cuda各版本可在https://developer.nvidia.com/cuda-toolkit-archive下載
下載cuda 11.3的選擇如下:

sudo wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/cuda-ubuntu1804.pin
sudo mv cuda-ubuntu1804.pin /etc/apt/preferences.d/cuda-repository-pin-600
sudo wget https://developer.download.nvidia.com/compute/cuda/11.3.0/local_installers/cuda-repo-ubuntu1804-11-3-local_11.3.0-465.19.01-1_amd64.deb
sudo dpkg -i cuda-repo-ubuntu1804-11-3-local_11.3.0-465.19.01-1_amd64.deb
sudo apt-key add /var/cuda-repo-ubuntu1804-11-3-local/7fa2af80.pub
sudo apt-get update
sudo apt-get -y install cuda
這里遇到了坑,運行最后一句時報錯,錯誤資訊是:
cuda : 依賴: cuda-11-3 (>= 11.3.0) 但是它將不會被安裝
解決方案:
1. 安裝aptitude-> sudo apt-get install aptitude
2.將apt-get換成aptitude -> sudo aptitude install cuda
3.顯示有許多沖突,其中包括需要將470驅動更換為465驅動的提示,選擇y進行安裝(這里我選擇y并沒有安裝,
且沒有任何反應,反而是先選擇了n,后選擇了y才安裝成功,可作參考)
4. 重啟 -> nvidia-smi
5. nvcc --version 顯示版本號,成功
最后 nvidia-smi 結果如下:

nvcc --version 結果如下:

配置環境變數
sudo gedit ~/.bashrc
在檔案最后添加
export PATH=/usr/local/cuda-11.3/bin${PATH:+:${PATH}}
export LD_LIBRARY_PATH=/usr/local/cuda/lib64${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}
export CUDA_HOME=/usr/local/cuda
保存,并輸入
source ~/.bashrc
生效
測驗是否生效
cd /usr/local/cuda-11.3/samples/1_Utilities/deviceQuery
sudo make
./deviceQuery
若結果為如下,則表示配置成功

cudnn安裝
下載地址為:https://developer.nvidia.com/rdp/cudnn-archive
這里我選擇的是

下載好壓縮包后,將壓縮包解壓,并cd到解壓的檔案路徑/到該路徑下打開終端
1.分別輸入
sudo cp cuda/include/cudnn.h /usr/local/cuda-11.3/include/
sudo cp cuda/include/cudnn_version.h /usr/local/cuda-11.3/include/
sudo cp cuda/lib64/libcudnn* /usr/local/cuda-11.3/lib64/
sudo chmod a+r /usr/local/cuda-11.3/include/cudnn.h
2.輸入下列代碼查看版本
cat /usr/local/cuda/include/cudnn_version.h | grep CUDNN_MAJOR -A 2
若結果如下,則表示安裝成功

3.安裝TensorRT 8.0
在網址https://developer.nvidia.com/nvidia-tensorrt-8x-download下載
對應的版本為下圖中第三個

官網指南:NVIDIA Deep Learning TensorRT Documentation
下載的包是:nv-tensorrt-repo-ubuntu1804-cuda11.3-trt8.0.1.6-ga-20210626_1-1_amd64.deb
切換到下載包的目錄,并執行:
sudo dpkg -i nv-tensorrt-repo-ubuntu1804-cuda11.3-trt8.0.1.6-ga-20210626_1-1_amd64.deb
sudo apt-key add /var/nv-tensorrt-repo-ubuntu1804-cuda11.3-trt8.0.1.6-ga-20210626/7fa2af80.pub
sudo apt-get update
sudo apt-get install tensorrt
如你使用3.X版本的python,則運行
sudo apt-get install python3-libnvinfer-dev
驗證安裝
dpkg -l | grep TensorRT
我的結果如下:

4.python及c++運行TensorRT
python
事實上,我在完成上述安裝后并不能成功import tensorrt成功,不知是否與我用anaconda環境有關,所以我決定曲線救國,下載tar版本的TensorRT,利用tar檔案解壓后的whl進行python的環境搭建,具體步驟如下:
(1)進入官網下載tar格式檔案,即下圖第一個,

(2)解壓后,進入解壓的TensorRT-8.0.1.6檔案夾,進入python檔案夾,打開終端運行
pip install tensorrt-8.0.1.6-cp36-none-linux_x86_64.whl // 記得對應自己的python版本號
cd ../uff
pip install uff-0.6.9-py2.py3-none-any.whl
cd ../graphsurgeon
pip install graphsurgeon-0.4.5-py2.py3-none-any.whl
cd ../onnx_graphsurgeon
pip install onnx_graphsurgeon-0.3.10-py2.py3-none-any.whl
// 運行python
python
// 輸入
import tensorrt
tensorr.__version__
// 輸出8.0.1.6即安裝成功
(3)創建engine的代碼略有改變(也可能是我原來的代碼不夠規范,僅作參考)
原代碼
with trt.Builder(TRT_LOGGER) as builder, builder.create_network(EXPLICIT_BATCH) as network, trt.OnnxParser(
network, TRT_LOGGER) as parser:
builder.max_batch_size = 10
builder.max_workspace_size = 1 << 5
with open(engine_path, 'rb') as model:
if not parser.parse(model.read()):
raise TypeError("Parser parse failed.")
engine = builder.build_cuda_engine(network)
現代碼
with trt.Builder(TRT_LOGGER) as builder, builder.create_network(EXPLICIT_BATCH) as network, \
builder.create_builder_config() as config, trt.OnnxParser(network, TRT_LOGGER) as parser, \
trt.Runtime(TRT_LOGGER) as runtime:
config.max_workspace_size = 1 << 28
with open(engine_path, 'rb') as model:
if not parser.parse(model.read()):
raise TypeError("Parser parse failed.")
plan = builder.build_serialized_network(network, config)
engine = runtime.deserialize_cuda_engine(plan)
C++
我用的C++ide是codeblocks,吐槽一句ubuntu18.04的codeblocks就是屑,動不動閃退
(1)設定
把滑鼠放至你的檔案樹的根目錄,也就是你的工程那兒,右鍵->build options...->出現如下界面,輸入圖示的
相關資訊,!!!注意改成自己的路徑,



(2)構建engine的代碼沒什么改變,需注意的是,若用TensorRT 7保存的序列化結果檔案,是無法用TensorRT 8直接反序列化加載運行的,需要重新用TensorRT 8來序列化并保存engine,其次,gLogger的構建代碼略有改變,具體如下:
class Logger:public ILogger
{
void log(Severity severity, const char* msg) noexcept // 即將原本的override改為noexcept就可以了,
// 具體為啥我也不知- -
{
// suppress info-level messages
if(severity != Severity::kINFO)
cout << msg << endl;
}
}gLogger;
以上,若有問題,歡迎評論留言,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/299907.html
標籤:AI
