原环境:显卡驱动 -- 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
cuda各版本可在https://developer.nvidia.com/cuda-toolkit-archive下载
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 结果如下:
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
下载地址为: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
若结果如下,则表示安装成功
在网址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
我的结果如下:
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;