目标:C++ 部署深度模型
当前水平:会点 Python、Pytorch、C语言
TensorRT 下载地址:https://developer.nvidia.com/zh-cn/tensorrt
官网版本对应的版本号(2022.9.7):
TensorRT 8.4 GA Update 2:8.4.3.1
TensorRT 8.4 GA Update 1:8.4.2.4
TensorRT 8.4 GA:8.4.1.5
TensorRT 8.4 EA:8.4.0.6
选择下载 TensorRT 8.4 GA Update 2 for Linux x86_64 and CUDA 11.0, 11.1, 11.2, 11.3, 11.4, 11.5, 11.6 and 11.7 TAR Package
显卡型号 → \to → 显卡驱动 → \to → CUDA版本 → \to → cuDNN版本
现有的东西能不动就不动,之前碰到改了下显卡驱动系统都进不去了。
显卡驱动查询和下载
CUDA版本和显卡驱动对应表
CUDA下载地址
cuDNN下载地址
查看显卡驱动版本:nvidia-smi
(Driver Version: 470.82.01,根据表格只能装<=11.4的CUDA)
查看操作系统内核:uname -a
(x86_64)
查看操作系统版本:cat /proc/version
(18.04.1-Ubuntu)
查看cuda版本:nvcc -V
(11.4.152)
查看cudnn版本:cat /usr/local/cuda/include/cudnn.h | grep CUDNN_MAJOR -A 2
,没有输出,原因为cudnn版本较新,版本号不在 cudnn.h 中,cat /usr/local/cuda/include/cudnn_version.h | grep CUDNN_MAJOR -A 2
(8.3.2)
"""
#define CUDNN_MAJOR 8
#define CUDNN_MINOR 3
#define CUDNN_PATCHLEVEL 2
--
#define CUDNN_VERSION (CUDNN_MAJOR * 1000 + CUDNN_MINOR * 100 + CUDNN_PATCHLEVEL)
"""
根据 在线文档 进行安装,点击 NVIDIA TensorRT Installation Guide 进入 安装指南,里面提供了多种安装方式:
(1)Debian 和 RPM 安装:
(2)tar 文件
LD_LIBRARY_PATH
(3)zip 文件
(1)解压
tar -xzvf TensorRT-8.4.3.1.Linux.x86_64-gnu.cuda-11.6.cudnn8.4.tar.gz
(2)添加环境变量
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:
,此方法只在当前终端有效,可以选择在 ~/.bashrc
中添加环境变量:
打开终端输入:vim ~/.bashrc
点击 i
进入插入模式,在文件末尾插入
export LD_LIBRARY_PATH=/home/jesswork/app/TensorRT-8.4.3.1/lib:$LD_LIBRARY_PATH
Esc
退出插入模式,输入 :wq
保存并退出
(3)安装各种 Python 文件
conda create -n tensorrt python=3.7
conda activate tensorrt
cd TensorRT-8.4.3.1/python
python3 -m pip install tensorrt-8.4.3.1-cp37-none-linux_x86_64.whl
cd TensorRT-8.4.3.1/uff
python3 -m pip install uff-0.6.9-py2.py3-none-any.whl
cd TensorRT-8.4.3.1/graphsurgeon
python3 -m pip install graphsurgeon-0.4.6-py2.py3-none-any.whl
cd TensorRT-8.4.3.1/onnx_graphsurgeon
python3 -m pip install onnx_graphsurgeon-0.3.12-py2.py3-none-any.whl
https://github.com/NVIDIA/TensorRT,方便查看各个例子的 readme
在 TensorRT-8.4.3.1/samples/sampleMNIST
路径下运行 make
,然后在 TensorRT-8.4.3.1/bin
路径下运行 ./sample_mnist
,可看到运行结果。
这个例子在 PyTorch 中训练模型,在 TensorRT 中重新创建网络,从训练的模型中导入权重,最后使用 TensorRT 引擎运行推理。
这里没有按照官方文档中的 python3 -m pip install -r requirements.txt
配置环境,因为里面是装的 CPU 版 Pytorch。选择安装了CUDA 11.3 的 Pytorchv1.10.0,Pytorch 安装
conda install pytorch==1.10.0 torchvision==0.11.0 torchaudio==0.10.0 cudatoolkit=11.3 -c pytorch -c conda-forge
在 TensorRT-8.4.3.1/samples/python/network_api_pytorch_mnist
路径下运行 python3 sample.py
即可。
运行问题:
(1)UserWarning: The given NumPy array is not writeable, and PyTorch does not support non-writeable tensors.
发生在 return torch.from_numpy(parsed.astype(m[2], copy=False)).view(*s)
,只需要把 copy=False
去掉即可。
(2)TensorRT was linked against cuDNN 8.4.1 but loaded cuDNN 8.3.2
由于电脑 CUDA 环境是装好的,安装过程中发现了 cuDNN 版本和要求的不一致但没重装,示例代码能运行暂时不管了。
(3)后续碰到了个坑 torch.cuda.is_available()
是 False,最后发现是装的时候直接 yes 没注意是 cpu 版的 pytorch,卸载重装也不行,最后开了个新的虚拟环境先装 pytorch 再装 tensorrt 就好了。
一般转模型的时候会通过 pytorch → \to → onnx → \to → tensorrt,但可能会碰到一些不支持的操作或者层。这项工作将训练好的 pytorch 模型权重导出到 wts 文件,并直接用 tensorrt 定义网络并加载权重。
https://github.com/wang-xinyu/pytorchx
https://github.com/wang-xinyu/tensorrtx
按照给出的 lenet5 demo 进行测试,由于是用 tar 安装的 tensorrt,只需修改一下 CMakeLists.txt,其余按指定步骤操作即可。
# tensorrt
include_directories(/usr/include/x86_64-linux-gnu/)
link_directories(/usr/lib/x86_64-linux-gnu/)
'修改为'
# tensorrt
include_directories(安装目录/TensorRT-8.4.3.1/include)
link_directories(安装目录/TensorRT-8.4.3.1/lib)
同样按 教程 操作并修改 CMakeLists.txt 即可。
到这两行报错: ./yolov5: error while loading shared libraries: libinference_engine.so: cannot open shared object file: No such file or directory
,解决办法是去掉 sudo
,原因可能是一些中间文件的权限问题。
sudo ./yolov5 -s yolov5s.wts yolov5s.engine s
sudo ./yolov5 -d yolov5s.engine ../samples