添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

1 TensorRT 介绍

1.1. 认识TensorRT

TensorRT 是NVIDIA开发的高性能的深度学习 推理SDK ,它包括深度学习推理优化器和运行时的 低延时 数据高吞吐量

TensorRT 是有助于在 NVIDIA图像处理单元(GPU) 的高性能 推理的C++库 ,旨在与 TensorFlow、Caffe、Pytorch、MXNet 等训练框架形成互补方式工作,从而使 预训练的模型 快速的在 GPU上进行工作 ,生成结果。

TensorRT 是基于 NVIDIA 并行编程模型CUDA 构建的,TensorRT为深度学习推理的生产部署提供 INT8 FP6 优化,例如视频流、语音识别、推荐和自然语言处理等, 通过降低精度可以减少程序的延迟 ,这位许多 实时服务 嵌入式程序 所必需的。

1) TensorRT官网介绍

2) TensorRT的官方python API和C++ API使用教程

3) TensorRT的GitHub官网

4) TensorRT官网提供的安装教程

1.2 使用TensorRT的好处

训练神经网络之后 ,TensorRT可是使 网络在运行时进行压缩、优化和部署 ,而无需框架的开销。

目前成功应用TensorRT的场景

  • 深度学习巡礼那和部署框架
  • 自动语音识别
  • 1.3 TensorRT是如何工作的

    构建图层优化:

  • 消除不使用的输出图层
  • 消除一些无用的操作
  • 卷积、偏差、ReLU等操作的融合
  • 把特别相似的参数和相同源的张量进行融合
  • 1.4 TensorRT提供哪些功能

    TensorRT在所有平台提供 C++实现 ,在 x86、aarch64和ppc64le 上提供 python实现

    TensorRT核心库中的关键接口:

  • 网络定义:网络定义接口为应用程序提供了指定网络定义的方法, 更多参考
  • 优化配置文件:优化配置文件指定对动态尺寸的约束, 更多参考
  • Builder配置::“构建器配置”界面指定用于创建引擎的详细信息。它允许应用程序指定优化配置文件,最大工作空间大小,最小可接受的精度水平,用于自动调整的定时迭代计数以及用于量化网络以8位精度运行的接口。 更多参考
  • Builder:构建器接口允许根据网络定义和构建器配置创建优化的引擎。 更多参考
  • 引擎Engine:Engine接口允许应用程序执行推理。它支持同步和异步执行,概要分析以及枚举和查询引擎输入和输出的绑定。单引擎可以具有多个执行上下文,从而允许将一组训练有素的参数用于同时执行多个批次, 更多参考
  • Caffer解析器:该解析器可用于解析在BVLC Caffe或NVCaffe 0.16中创建的Caffe网络,关于 C++ Caffe解析器更多详细信息参考 ,关于 python Caffe解析器参考
  • UFF解析器:该解析器用于解析UFF格式的网络,关于 C++ UFF解析器参考 ,关于 python UFF解析器参考
  • ONNX解析器:该解析器用于 解析ONNX模型 ,关于 C++解析器参考 ,关于 Python ONNX解析器参考
  • 1.5 Tensor的优化和性能

    1、权重和激活精度校准(Weight & Activation Precision Calibration)

    通过将 模型量化为INT8 最大化吞吐量 ,同时 保持精度

    2、层和张量融合(Layer & Tensor Fusion)

    通过 融合内核 中的 节点 优化CPU内存 宽带 的使用

    3、内核自动调整(Kernel Auto-Tuning)

    根据目标GPU平台选择最佳数据层和算法

    4、动态张量内存(Dynamic Tensor Memory)

    最大限度地 减少内存占用 ,并有效地 重用张量的内存

    5、多流执行

    可扩展设计,并行处理多个输入流

    2 安装构建TensorRT

    这里安装是以TensorRT7.1.3版本为例

    2.1 安装前须知

  • 1)TensorRT的 Windows zip 软件包 不提供python支持 ,未来可能会支持python
  • 2)在使用 TensorRT Python APi 的时候需要安装 PyCUDA ,关于安装 PyCUDA参考 。如果你在编译过程中遇到问题,可能需要重新编译。更多信息参考 在Linux上安装PyCUDA
  • 3)确保你已经安装了 CUDA工具包 ,支持 10.2 11.0RC 版本
  • 4)从TensorFlow到TensorRT模型导出需要 TensorFlow1.15.2
  • 5)PyTorch实例已经在 PyTorch1.4.0中进行了测试
  • 6)从TensorRT5.0开始,动态库 libnvcaffe_parser.so 链接指向 libnvparsers.so ,静态库 libnvcaffe_parser.a 链接指向 libnvparsers_static.a
  • 2.2 下载TenosrRT的安装包

    1、 下载TensorRT developer.nvidia.com/tensorrt

    2、进入下载之前需要有一个NVIDIA的账号登录之后才可以下载

    我的账号:谷歌邮箱
    密码:S...  大写字母 小写字母  数字组合
    

    3、点进去之后还需要填写一份问卷,之后就可以下载了

    4、下载TensorRT,根据自己的系统环境下载指定的版本

  • 本人系统环境:Ubuntu18.04,使用cat /etc/issue命令查看系统版本
  • 本人系统安装cuda版本:CUDA10.2,使用 cat /usr/local/cuda/version.txt命令查看
  • 本人系统安装cudnn版本:cudnn7.6.5,使用cat /usr/local/cuda/include/cudnn.h | grep CUDNN_MAJOR -A 2命令查看
  • 我根据自己的系统环境,下载(如果下载的比较慢,就不要不要科学上网了,这个不需要外网也可以下载很快的):

    可以看到上面有两种可选的安装包:

    1、Debian和RPM安装包

    DebianRPM安装会自动安装依赖,但要求:

  • 必须root权限安装
  • 无法灵活的将TensorRT安装到指定位置
  • 要求使用Debian或RPM软件包安装了CUDA Toolkit和cuDNN
  • 不允许同时安装多个版本的TensorRT
  • 2、tar文件安装包提供了更大的灵活性

  • 可以同时安装多个TensorRT版本,但是必须要确保你已经安装了必要的依赖项,同时管理LD_LIBRARY_PATH,详细安装参考
  • 3、zip文件安装包 ip文件是Windows当前唯一的选项。除了Windows,它不支持任何其他平台。确保您已经安装了必要的依赖项。有关更多信息,请参见Zip文件安装

    TensorRT的版本控制信息如下:

    下面介绍TensorRT的几种安装方法

    2.3 Debian安装1

    安装前确保:

  • Debian安装,要求系统时Ubuntu
  • 下面需要替换ubuntu1x04, cudax.x, trt7.x.x.x-gayyyymmdd为自己本机环境对应的版本
  • 2.3.1 下载与自己Ubuntu版本匹配的TensorRT库包

    我下载的TensorRT的版本如下

    nv-tensorrt-repo-ubuntu1804-cuda10.2-trt7.1.3.4-ga-20200617_1-1_amd64.deb

    2.3.2 从Debian本地仓库软件包中安装TensorRT

    os="ubuntu1x04" tag="cudax.x-trt7.1.3.4-ga-yyyymmdd" sudo dpkg -i nv-tensorrt-repo-${os}-${tag}_1-1_amd64.deb sudo apt-key add /var/nv-tensorrt-repo-${tag}/7fa2af80.pub sudo apt-get update sudo apt-get install tensorrt cuda-nvrtc-x-y

    把上面的命令改成对应的版本,主要利用环境变量,替换安装包指定版本,对于cuda-nvrtc后的x-y替换成10-211-0和自己系统对应的cuda版本如下:

    os="ubuntu1804" tag="cuda10.2-trt7.1.3.4-ga-yyyymmdd" sudo dpkg -i nv-tensorrt-repo-${os}-${tag}_1-1_amd64.deb sudo apt-key add /var/nv-tensorrt-repo-${tag}/7fa2af80.pub sudo apt-get update sudo apt-get install tensorrt cuda-nvrtc-10-2

    2.3.3 安装python

    1、如果安装python2.7,使用如下命令:

    sudo apt-get install python-libnvinfer-dev

    安装python依赖包

    python-libnvinfer

    2、如果安装python3.x,使用如下命令:

    sudo apt-get install python3-libnvinfer-dev

    安装python依赖包

    python3-libnvinfer

    2.3.4 将TensorRT和TensorFlow结合使用

    如果要将TensorRT和TensorFlow结合使用,需要安装如下库包

    sudo apt-get install uff-converter-tf

    2.3.5 验证是否安装成功

    使用服下命令验证TensorRT安装是否成功

    dpkg -l | grep TensorRT

    安装成功之后会显示如下信息:

    ii  graphsurgeon-tf	7.1.3-1+cuda11.0	amd64	GraphSurgeon for TensorRT package
    ii  libnvinfer-bin		7.1.3-1+cuda11.0	amd64	TensorRT binaries
    ii  libnvinfer-dev		7.1.3-1+cuda11.0	amd64	TensorRT development libraries and headers
    ii  libnvinfer-doc		7.1.3-1+cuda11.0	all	TensorRT documentation
    ii  libnvinfer-plugin-dev	7.1.3-1+cuda11.0	amd64	TensorRT plugin libraries
    ii  libnvinfer-plugin7	7.1.3-1+cuda11.0	amd64	TensorRT plugin libraries
    ii  libnvinfer-samples	7.1.3-1+cuda11.0	all	TensorRT samples
    ii  libnvinfer7		7.1.3-1+cuda11.0	amd64	TensorRT runtime libraries
    ii  libnvonnxparsers-dev		7.1.3-1+cuda11.0	amd64	TensorRT ONNX libraries
    ii  libnvonnxparsers7	7.1.3-1+cuda11.0	amd64	TensorRT ONNX libraries
    ii  libnvparsers-dev	7.1.3-1+cuda11.0	amd64	TensorRT parsers libraries
    ii  libnvparsers7	7.1.3-1+cuda11.0	amd64	TensorRT parsers libraries
    ii  python-libnvinfer	7.1.3-1+cuda11.0	amd64	Python bindings for TensorRT
    ii  python-libnvinfer-dev	7.1.3-1+cuda11.0	amd64	Python development package for TensorRT
    ii  python3-libnvinfer	7.1.3-1+cuda11.0	amd64	Python 3 bindings for TensorRT
    ii  python3-libnvinfer-dev	7.1.3-1+cuda11.0	amd64	Python 3 development package for TensorRT
    ii  tensorrt		7.1.3.x-1+cuda11.0 	amd64	Meta package of TensorRT
    ii  uff-converter-tf	7.1.3-1+cuda11.0	amd64	UFF converter for TensorRT package
    

    2.3 Debian安装2

    可以把这种方式理解为在线安装。上面的方式理解成离线安装,需要取官网先下载安装包。

    该安装方法使用与已经熟悉TensorRT,并希望快速运行实现程序或设置自动化,例如(在使用容器时)的高级用户

    2.3.1 安装NVIDIA CUDA网络仓库安装包

    使用wget直接下载TensorRT安装库包,然后安装,命令如下:

    os="ubuntu1x04"
    cuda="x.y.z"
    wget https://developer.download.nvidia.com/compute/cuda/repos/${os}/x86_64/cuda-repo-${os}_${cuda}-1_amd64.deb
    sudo dpkg -i cuda-repo-*.deb
    
  • 系统版本:Ubuntu1x04要么是1604,要么是1804
  • CUDA版本:x.y.z要么是10.2.89,要么是11.0.x
  • 根据自己的系统环境,选择下载指定的TensorRT版本

    2.3.2 安装NVIDIA 机器学习的网络仓库安装包

    os="ubuntu1x04"
    wget https://developer.download.nvidia.com/compute/machine-learning/repos/${os}/x86_64/nvidia-machine-learning-repo-${os}_1.0.0-1_amd64.deb
    sudo dpkg -i nvidia-machine-learning-repo-*.deb
    sudo apt-get update
    

    2.3.3 安装适合你需求的TensorRT软件包

    1、对仅运行TensorRT C++的应用程序

    sudo apt-get install libnvinfer7 libnvonnxparsers7 libnvparsers7 libnvinfer-plugin7 cuda-nvrtc-x-y

    2、对于也构建TensorRT C++的应用程序

    sudo apt-get install libnvinfer-dev libnvonnxparsers-dev libnvparsers-dev libnvinfer-plugin-dev

    3、对于运行TensorRT Python的应用程序

    sudo apt-get install python-libnvinfer python3-libnvinfer

    2.3.4 安装cuda的版本

    使用NVIDIA机器学习网络仓库安装包时,Ubuntu默认安装TensorRT会获取最新的CUDA版本。使用以下命令安装指定的CUDA版本

    version="7.x.x-1+cudax.x"
    sudo apt-get install libnvinfer7=${version} libnvonnxparsers7=${version} libnvparsers7=${version} libnvinfer-plugin7=${version} libnvinfer-dev=${version} libnvonnxparsers-dev=${version} libnvparsers-dev=${version} libnvinfer-plugin-dev=${version} python-libnvinfer=${version} python3-libnvinfer=${version}
    sudo apt-mark hold libnvinfer7 libnvonnxparsers7 libnvparsers7 libnvinfer-plugin7 libnvinfer-dev libnvonnxparsers-dev libnvparsers-dev libnvinfer-plugin-dev python-libnvinfer python3-libnvinfer
    

    如果想升级TensorRT的最新版本或CUDA最新版本,则可以使用unhold解开libnvinfer7,命令如下:

    sudo apt-mark unhold libnvinfer7 libnvonnxparsers7 libnvparsers7 libnvinfer-plugin7 libnvinfer-dev libnvonnxparsers-dev libnvparsers-dev libnvinfer-plugin-dev python-libnvinfer python3-libnvinfer

    2.4 RPM安装TensorRT

    RPM安装包的安装系统环境必须是CentOS和RedHat系统

    2.4.1 下载与你自己系统环境对应的TensorRT版本

    2.4.2 从本地下载的TensorRT的RPM包安装TensorRT

    安装命令如下(版本号同样需要替换,这里我就重复了):

    tag="cudax.x-trt7.x.x.x-ga-yyyymmdd"
    sudo rpm -Uvh nv-tensorrt-repo-rhel7-${tag}-1-1.x86_64.rpm
    sudo yum clean expire-cache
    

    其他你可以选择的安装包如下:

    graphsurgeon-tf.x86_64
    libnvinfer-bin.x86_64
    libnvinfer-devel.x86_64
    libnvinfer-doc.x86_64
    libnvinfer-plugin-devel.x86_64	
    libnvinfer-plugin7.x86_64
    libnvinfer-samples.x86_64
    libnvinfer7.x86_64
    libnvonnxparsers-devel.x86_64
    libnvonnxparsers7.x86_64
    libnvparsers-devel.x86_64
    libnvparsers7.x86_64
    python-libnvinfer.x86_64
    python-libnvinfer-devel.x86_64	
    python3-libnvinfer.x86_64
    python3-libnvinfer-devel.x86_64
    tensorrt.x86_64
    uff-converter-tf.x86_64
    

    然后安装TensorRT

    sudo yum install tensorrt cuda-nvrtc-x-y

  • 对于cuda-nvrtc后的x-y替换成10-211-0和自己系统对应的cuda版本
  • 2.4.3 安装python

    1、安装python2.7

    sudo yum install python-libnvinfer-devel

    安装python的依赖包

    python-libnvinfer

    2、安装python3

    udo yum install python3-libnvinfer-devel

    安装python依赖包

    python3-libnvinfer

    2.3.4 安装UFF转换器

    当你需要把TensorRT和TensorFlow结合使用时,需要安装如下库包:

    sudo yum install uff-converter-tf

    2.3.5 验证TensorRT是否安装成功

    1、验证方式1

    rpm -qa | grep tensorrt

    显示如下内容,表示安装成功

    tensorrt-7.1.3.x-1.cuda11.0.x86_64

    2、验证方式2

    rpm -qa | grep -e libnvinfer -e libnv.*parsers

    显示如下内容,表示安装成功

    libnvinfer-doc-7.1.3-1.cuda11.0.x86_64
    libnvinfer-plugin7-7.1.3-1.cuda11.0.x86_64
    libnvinfer-devel-7.1.3-1.cuda11.0.x86_64
    libnvinfer-bin-7.1.3-1.cuda11.0.x86_64
    libnvinfer7-7.1.3-1.cuda11.0.x86_64
    libnvinfer-samples-7.1.3-1.cuda11.0.x86_64
    libnvinfer-plugin-devel-7.1.3-1.cuda11.0.x86_64
    libnvonnxparsers7-7.1.3-1.cuda11.0.x86_64
    libnvonnxparsers-devel-7.1.3-1.cuda11.0.x86_64
    libnvparsers7-7.1.3-1.cuda11.0.x86_64
    libnvparsers-devel-7.1.3-1.cuda11.0.x86_64
    python3-libnvinfer-7.1.3-1.cuda11.0.x86_64
    python3-libnvinfer-devel-7.1.3-1.cuda11.0.x86_64
    python-libnvinfer-7.1.3-1.cuda11.0.x86_64
    python-libnvinfer-devel-7.1.3-1.cuda11.0.x86_64
    

    3、验证方式3

    rpm -qa | grep graphsurgeon-tf

    显示如下内容,表示安装成功

    graphsurgeon-tf-7.1.3-1.cuda11.0.x86_64

    4、验证方式4

    rpm -qa | grep uff-converter-tf

    显示如下内容,表示安装成功

    uff-converter-tf-7.1.3-1.cuda11.0.x86_64

    2.4 RPM安装TensorRT——在线安装

    可以把这种方式理解为在线安装。上面的方式理解成离线安装,需要取官网先下载安装包。

    2.4.1 在线下载NVIDIA CUDA的网络仓库安装包

    cuda="x.y.z"
    wget https://developer.download.nvidia.com/compute/cuda/repos/rhel7/x86_64/cuda-repo-rhel7-${cuda}-1.x86_64.rpm
    sudo rpm -Uvh cuda-repo-*.rpm
    

    CUDA的版本x.y.z,要么是10.2.89,要么是11.0.x

    2.4.2 安装NVIDIA 机器学习网络仓库安装包

    wget https://developer.download.nvidia.com/compute/machine-learning/repos/rhel7/x86_64/nvidia-machine-learning-repo-rhel7-1.0.0-1.x86_64.rpm
    sudo rpm -Uvh nvidia-machine-learning-repo-*.rpm
    

    2.4.3 安装适合你特定需求的TensorRT软件包

    1、对仅运行TensorRT C++的应用程序

    sudo yum install libnvinfer7 libnvparsers7 libnvonnxparsers7 libnvinfer-plugin7 cuda-nvrtc-x-y

  • 对于cuda-nvrtc后的x-y替换成10-211-0和自己系统对应的cuda版本
  • 2、对于也构建TensorRT C++的应用程序

    sudo yum install libnvinfer-devel libnvparsers-devel libnvonnxparsers-devel libnvinfer-plugin-devel

    3、对于运行TensorRT Python的应用程序

    sudo yum install python-libnvinfer python3-libnvinfer

    2.4.4 使用NVIDIA机器学习默认安装包

    使用NVIDIA机器学习网络仓库安装包时,RHEL默认安装TensorRT会获取最新的CUDA版本。使用以下命令安装指定的CUDA版本

    version="7.x.x-1.cudax.x"
    sudo yum downgrade libnvinfer7-${version} libnvparsers7-${version} libnvonnxparsers7-${version} libnvinfer-plugin7-${version} libnvinfer-devel-${version} libnvparsers-devel-${version} libnvonnxparsers-devel-${version} libnvinfer-plugin-devel-${version} python-libnvinfer-${version} python3-libnvinfer-${version}
    sudo yum install yum-plugin-versionlock
    sudo yum versionlock libnvinfer7 libnvparsers7 libnvonnxparsers7 libnvinfer-plugin7 libnvinfer-devel libnvparsers-devel libnvonnxparsers-devel libnvinfer-plugin-devel python-libnvinfer python3-libnvinfer
    

    如果想升级TensorRT的最新版本或CUDA最新版本,则可以使用unhold解开libnvinfer7,命令如下:

    sudo yum versionlock delete libnvinfer7 libnvparsers7 libnvonnxparsers7 libnvinfer-plugin7 libnvinfer-devel libnvparsers-devel libnvonnxparsers-devel libnvinfer-plugin-devel python-libnvinfer python3-libnvinfer

    2.5 Tar文件安装

    2.5.1 安装依赖项

    1、安装如下的依赖项

  • CUDA 10.211.0 RC
  • cuDNN 8.0.0预览
  • Python 3(可选)
  • 2.5.2 下载与自己Linux系统匹配的TensorRT tar文件

    根据自己系统环境下载对应的版本,我下载如下:

    TensorRT-7.1.3.4.Ubuntu-18.04.x86_64-gnu.cuda-10.2.cudnn8.0.tar.gz

    2.5.3 可指定TensorRT的安装位置

    如果你选择TensorRT的安装位置,这个tar文件会将所有的安装内容都装到一个名为:TensorRT-7.xxx的目录下

    2.5.4 解压tar文件

    version="7.x.x.x"
    os="<os>"
    arch=$(uname -m)
    cuda="cuda-x.x"
    cudnn="cudnn8.x"
    tar xzvf TensorRT-${version}.${os}.${arch}-gnu.${cuda}.${cudnn}.tar.gz
    
  • 7.xxx是你的TensorRT版本
  • Ubuntu-16.04
  • Ubuntu-18.04
  • CentOS的7.6
  • CUDA-XX是CUDA版本 10.2 要么 11.0
  • cudnn8.xcuDNN版本 8.0
  • 安装目录TensorRT-7.x.x.x有如下的子目录:

    ls TensorRT-${version}
    bin  data  doc  graphsurgeon  include  lib  python  samples  targets  TensorRT-Release-Notes.pdf  uff
    

    2.5.5 添加绝对路径到TesnorRT的lib到绝对路径

    export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:<TensorRT-${version}/lib>

    2.5.6 安装python TensorRT wheel文件

    cd TensorRT-${version}/python

    1、如果使用python2.7

    sudo pip2 install tensorrt-*-cp27-none-linux_x86_64.whl

    2、如果使用python3.x

    sudo pip3 install tensorrt-*-cp3x-none-linux_x86_64.whl

    2.5.7 安装Python UFF wheel文件

    当要把TensorRT和TensorFlow结合使用的时候需这样做

    cd TensorRT-${version}/uff

    1、如果使用python2.7

    sudo pip2 install uff-0.6.9-py2.py3-none-any.whl

    2、如果使用python3.x

    sudo pip3 install uff-0.6.9-py2.py3-none-any.whl

    不论那种方法,检查是否安装成功uff(查看系统中可执行文件的路径)

    which convert-to-uff

    2.5.8 安装Python graphsurgeon wheel文件

    cd TensorRT-${version}/graphsurgeon

    1、如果使用python2.7

    sudo pip2 install graphsurgeon-0.4.5-py2.py3-none-any.whl

    2、如果使用python3.x

    sudo pip3 install graphsurgeon-0.4.5-py2.py3-none-any.whl

    2.5.9 验证安装是否成功

  • 确保已安装的文件在正确的目录中
  • 生成并运行其中的一个示例,例如,样本MNIST在安装目录中。您应该能够在没有其他设置的情况下编译和执行示例。有关更多信息,请参见TensorRT的“ Hello World”(sampleMNIST)
  • Python的samples位于:samples/python
  • 2.6 zip文件的安装

    zip的安装环境是在Windows下,这里不介绍了,参考官网

    2.7 更新TesnorRT

    参考官网,更新TensorRT

    2.8 卸载TensorRT

    参考官网,卸载TensorRT

    2.9 安装PyCUDA

    安装PyCUDA之前需要先确定nvcc可用,安装PyCUDA比较简单,直接用pip安装即可

    pip install 'pycuda>=2019.1.1'

    3 我使用tar包安装TensorRT7.1.3.4的实际过程

    3.1 下载TensorRT软件包

    我下载的TensorRT的tar软件包名如下:

    TensorRT-7.0.0.11.Ubuntu-18.04.x86_64-gnu.cuda-10.2.cudnn7.6.tar.gz

    从这个软件包可以看出一些版本信息,也与下面我们要设置的变量相关

  • TensorRT版本呢:TesnorRT-7.0.0.11
  • Ubuntu系统版本:Ubuntu-18.04
  • 系统的位数:x86_64 (可是使用uname -m 查看)
  • cuda版本:10.2
  • cudnn版本:7.6
  • 下载TensorRT软件包去官网,需要登录,也可以用wget下载

    wget https://developer.nvidia.com/compute/machine-learning/tensorrt/secure/7.0/7.0.0.11/tars/TensorRT-7.0.0.11.Ubuntu-18.04.x86_64-gnu.cuda-10.2.cudnn7.6.tar.gz

    3.2 先新建了一个虚拟环境

    1、创建虚拟环境

    conda create -n TensorRT python=3.7 2、 激活虚拟环境 conda activate TensorRT 3、 退出虚拟环境 conda deactivate

    3.3 在虚拟环境中安装cuda和cudnn

    首先需要添加国内的镜像源,这样下载速度会块一些

    conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/
    conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/
    conda config --set show_channel_urls yes
    

    1、安装cuda10.2

    conda install cudatoolkit=10.2

    2、安装cudnn7.6.5

    conda install cudnn=7.6.5

    按照官方的教程,应该安装的cudnn=8.0版本,但是使用conda search cudnn,可以看到conda软件仓库包中最新的cudnn=7.6.5版本。这是因为最新版本的TensorRT-7.1.3.4版本需要使用cudnn=8.0版本,我们下载底一点的TensorRT版本即可:TensorRT-7.0.0.11

    3.4 开始安装TensorRT

    以上环境已经基本准备好了,现在开始安装TensorRT

    3.4.1 先设置一些变量对应的版本

    version="7.0.0.11"
    os="Ubuntu-18.04"
    arch=$(uname -m)
    cuda="cuda-10.2"
    cudnn="cudnn7.6"
    

    3.4.2 解压下载的TensorRT的tar安装包

    tar xzvf TensorRT-${version}.${os}.${arch}-gnu.${cuda}.${cudnn}.tar.gz

    或者直接用如下命令,就不需要设置变量

    tar xzvf TensorRT-7.0.0.11.Ubuntu-18.04.x86_64-gnu.cuda-10.2.cudnn7.6.tar.gz

    1、这里我是把自己的压缩文件解压到用户的home目录下(使用下面的命令不用设置变量),你们也可以默认路径,和压缩文件同级目录:

    tar xzvf TensorRT-7.0.0.11.Ubuntu-18.04.x86_64-gnu.cuda-10.2.cudnn7.6.tar.gz -C ~/

    2、查看解压后TensorRT-7.0.0.11有如下的子目录:

    3.4.3 添加绝对路径到TesnorRT-7.0.0.11的lib目录到绝对路径

    1、查看TesorRT-7.0.0.1下的lib目录绝对路径

    2、把该绝对路径添加到LD_LIBRARY_PATH环境变量中,打开:vi ~/.bashrc配置文件,添加如下命令

    export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/shl/TensorRT-7.0.0.11/lib

    3、添加完之后,使用下面命令让其生效

    source ~/.bashrc

    如果跳出虚拟环境,就再激活一次:conda activate TensorRT,始终保持自己在虚拟环境下进行操作

    3.4.4 安装TensorRT,使pyhon可以调用

    1、进入python目录中

    cd TensorRT-7.0.0.11/python

    可以看出,提供安装的TesnorRT版本,以及与python关联版本有如下这些:

  • 1)tensorrt-7.0.0.11-cp27-none-linux_x86_64.whl :python2.7
  • 2)tensorrt-7.0.0.11-cp34-none-linux_x86_64.whl :python3.4
  • 3)tensorrt-7.0.0.11-cp35-none-linux_x86_64.whl :python3.5
  • 4)tensorrt-7.0.0.11-cp36-none-linux_x86_64.whl :python3.6
  • 5)tensorrt-7.0.0.11-cp37-none-linux_x86_64.whl :python3.7
  • 2、我们虚拟环境python3.7版本,因此安装TensorRT版本如下

    pip install tensorrt-7.0.0.11-cp37-none-linux_x86_64.whl

  • 根据你python的版本安装指定的TensorRT版本
  • 3、测试TensorRT能否在python中正常导入

    (TensorRT) shl@zfcv:~/TensorRT-7.0.0.11/python$ pip install tensorrt-7.0.0.11-cp37-none-linux_x86_64.whl
    Looking in indexes: https://pypi.tuna.tsinghua.edu.cn/simple
    Processing ./tensorrt-7.0.0.11-cp37-none-linux_x86_64.whl
    Installing collected packages: tensorrt
    Successfully installed tensorrt-7.0.0.11
    (TensorRT) shl@zfcv:~/TensorRT-7.0.0.11/python$ python
    Python 3.7.7 (default, May  7 2020, 21:25:33)
    [GCC 7.3.0] :: Anaconda, Inc. on linux
    Type "help", "copyright", "credits" or "license" for more information.
    >>> import tensorrt
    

    3.4.5 安装Python UFF wheel文件

    1、当要把TensorRT和TensorFlow结合使用的时候需这样做

    cd TensorRT-7.0.0.11/uff

    2、安装uff

    sudo pip install uff-0.6.5-py2.py3-none-any.whl

    3、检查是否安装成功uff(查看系统中可执行文件的路径)

    which convert-to-uff

    成功安装uff,会返回可执行文件的路径:

    (TensorRT) shl@zfcv:~/TensorRT-7.0.0.11/uff$ which convert-to-uff
    /usr/local/bin/convert-to-uff
    

    4、查看能否在python中正确导入uff 正确导入如下:

    如果报错:ImportError: ERROR: Failed to import module(cannot import name ‘GraphDef)`,请:参考这篇博客

    3.4.6 安装Python graphsurgeon wheel文件

    1、进入到graphsurgeon目录

    cd TensorRT-7.0.0.11/graphsurgeon/

    2、安装graphsurgeon

    sudo pip install graphsurgeon-0.4.1-py2.py3-none-any.whl

    3、检查graphsurgeon是否安装成功

    如果报错:ImportError: cannot import name 'NodeDef' from 'tensorflow' ,如下图,请参考这篇博客

    3.4.7 安装PyCUDA

    安装PyCUDA之前需要先确定nvcc可用,安装PyCUDA比较简单,直接用pip安装即可

    pip install 'pycuda>=2019.1.1'

    4 验证TensorRT-7.0.0.11是否安装成功

  • 确保已安装的文件在正确的目录中
  • 生成并运行其中的一个示例,例如,样本MNIST在安装目录中。您应该能够在没有其他设置的情况下编译和执行示例。有关更多信息,请参见TensorRT的“ Hello World”(sampleMNIST)
  • Python的samples位于:samples/python
  • 4.1 先看一个C++的示例

    该示例是在MNIST数据集上训练的Caffe模型,该示例sampleMNIST相当于是TensorRT的一个入门hello world示例,它使用Caffe解析器执行TensorRT的基本设置和初始化

    目录切换到TensorRT的示例目录下,是一个关于sampleMNISTC++示例

    cd TensorRT-7.0.0.11/samples/sampleMNIST

    4.1.1 编译文件

    编译结果如下

    上面编译生成的可执行文件:会放到/home/shl/TensorRT-7.0.0.11/bin目录下

    4.1.2 执行编译生成的可执行文件

    1、在执行该可执行文件之前,我们先看看这个可执行文件有哪些参数

    ./sample_mnist -h 或 ./sample_mnist --help 查看参数

    (TensorRT) shl@zfcv:~/TensorRT-7.0.0.11/bin$ ls
    chobj  common  dchobj  giexec  sample_mnist  sample_mnist_debug  trtexec
    (TensorRT) shl@zfcv:~/TensorRT-7.0.0.11/bin$ ./sample_mnist -h
    Usage: ./sample_mnist [-h or --help] [-d or --datadir=<path to data directory>] [--useDLACore=<int>]
    --help          Display help information
    --datadir       Specify path to a data directory, overriding the default. This option can be used multiple times to add multiple directories. If no data directories are given, the default is to use (data/samples/mnist/, data/mnist/)
    --useDLACore=N  Specify a DLA engine for layers that support DLA. Value can range from 0 to n-1, where n is the number of DLA engines on the platform.
    --int8          Run in Int8 mode.
    --fp16          Run in FP16 mode.
    (TensorRT) shl@zfcv:~/TensorRT-7.0.0.11/bin$
    

    下面解释一下这些参数的含义

  • --help:查看帮助信息
  • --datadir:该参数的是指定数据目录的路径,可以多次使用该参数添加多个目录路径,如果没有给出数据目录路径,则默认使用:data/samples/mnist/, data/mnist/
  • --useDLACore=N:支持DLA的层指定一个DLA引擎。值的范围可以从0到n-1,其中n平台上的DLA引擎的数量
  • --int8:在int8模式下运行
  • --fp16:在fp16模式下运行
  • 2、参数--datadir的具体值是什么

    --datadir参数后面跟的是一个目录,存取的是三个Caffe文件来构建网络

  • mnist.prototxt :包含网络结构prototxt文件
  • mnist.caffemodel: 包含网络训练的权重模型文件
  • mnist_mean.binaryproto :包含均值的binaryproto文件

    3、参数--useDLACore=N参数是指深度学习加速引擎DLA,即英伟达的深度学习加速器(NVIDIA Deepl Learning Accelerator),并不是指显卡,如果机器没有该设别,就不要加该参数了!

    4、参数--int8--fp16是不同精度下的预测

    4.1.3 执行可执行文件的示例

    1、在运行之前,需要先生成一些测试MNIST的测试用例图片:

    /home/shl/TensorRT-7.0.0.11/data/mnist

    然后运行该目录下的download_pgms.py文件

    python download_pgms.py

    之后会在当前目录下生成0.pgm~9.pgm十张MNIST的图片(PGM 是便携式灰度图像格式(portable graymap file format),在黑白超声图像系统中经常使用PGM格式的图像

    一定要先生成.pgm文件,否则会报错Could not find 7.pgm in data directories: 找不到文件

    2、运行C++的测试用例生成的可执行文件

    ./sample_mnist [-h] [--datadir=/path/to/data/dir/] [--useDLA=N] [--fp16 or --int8]

    完整上面的命令:

    ./sample_mnist --datadir ~/TensorRT-7.0.0.11/data/mnist - --int8

    验证样本是否成功运行。如果样本成功运行,应该会看到类似以下的输出;输入图像ASCII渲染,数字为7

    (TensorRT) shl@zfcv:~/TensorRT-7.0.0.11/bin$ ./sample_mnist --datadir ~/TensorRT-7.0.0.11/data/mnist - --int8
    &&&& RUNNING TensorRT.sample_mnist # ./sample_mnist --datadir /home/shl/TensorRT-7.0.0.11/data/mnist --int8 -
    [07/28/2020-14:28:27] [I] Building and running a GPU inference engine for MNIST
    [07/28/2020-14:28:28] [W] [TRT] Calibrator is not being used. Users must provide dynamic range for all tensors that are not Int32.
    [07/28/2020-14:28:29] [W] [TRT] No implementation of layer (Unnamed Layer* 9) [Constant] obeys the requested constraints in strict mode. No conforming implementation was found i.e. requested layer computation precision and output precision types are ignored, using the fastest implementation.
    [07/28/2020-14:28:30] [W] [TRT] No implementation of layer ip2 obeys the requested constraints in strict mode. No conforming implementation was found i.e. requested layer computation precision and output precision types are ignored, using the fastest implementation.
    [07/28/2020-14:28:30] [W] [TRT] No implementation of layer prob obeys the requested constraints in strict mode. No conforming implementation was found i.e. requested layer computation precision and output precision types are ignored, using the fastest implementation.
    [07/28/2020-14:28:30] [W] [TRT] No implementation obeys reformatting-free rules, at least 3 reformatting nodes are needed, now picking the fastest path instead.
    [07/28/2020-14:28:30] [I] [TRT] Detected 1 inputs and 1 output network tensors.
    [07/28/2020-14:28:30] [W] [TRT] Current optimization profile is: 0. Please ensure there are no enqueued operations pending in this context prior to switching profiles
    [07/28/2020-14:28:30] [I] Input:
    @@@@@@@@@@@@@@@@@@@@@@@@@@@@
    @@@@@@@@@@@@@@@@@@@@@@@@@@@@
    @@@@@@@@@@@@@@@@@@@@@@@@@@@@
    @@@@@@@@@@@@@@@@@@@@@@@@@@@@
    @@@@@@@@@@@@@@@@@@@@@@@@@@@@
    @@@@@@@@@@@@@@@@@@@@@@@@@@@@
    @@@@@@@@@@@@@@@@@@@@@@@@@@@@
    @@@@@@@@@@@@@@@++-  .@@@@@@@
    @@@@@@@@@@@@#+-      .@@@@@@
    @@@@@@@@%:..   :     .@@@@@@
    @@@@@@@#.     %@%#.  :@@@@@@
    @@@@@@@:    +#@@@=  .@@@@@@@
    @@@@@@#   .#@@@@@:  =@@@@@@@
    @@@@@@:  :#@@@@@*  :#@@@@@@@
    @@@@@@*.:%@@@@@+  .%@@@@@@@@
    @@@@@@@@@@@@@@*   +@@@@@@@@@
    @@@@@@@@@@@@@@   +@@@@@@@@@@
    @@@@@@@@@@@@@=   %@@@@@@@@@@
    @@@@@@@@@@@@@:  +@@@@@@@@@@@
    @@@@@@@@@@@@+  -@@@@@@@@@@@@
    @@@@@@@@@@@-  +@@@@@@@@@@@@@
    @@@@@@@@@@%  .@@@@@@@@@@@@@@
    @@@@@@@@@%- .%@@@@@@@@@@@@@@
    @@@@@@@@@-  +@@@@@@@@@@@@@@@
    @@@@@@@@%: =%@@@@@@@@@@@@@@@
    @@@@@@@@= .%@@@@@@@@@@@@@@@@
    @@@@@@@@# *@@@@@@@@@@@@@@@@@
    @@@@@@@@@@@@@@@@@@@@@@@@@@@@
    [07/28/2020-14:28:30] [I] Output:
    7: **********
    &&&& PASSED TensorRT.sample_mnist # ./sample_mnist --datadir /home/shl/TensorRT-7.0.0.11/data/mnist --int8 -
    (TensorRT) shl@zfcv:~/TensorRT-7.0.0.11/bin$
    

    4.2 模型转换为trt模型时报错

    在模型转换为trt模型的时候报错:CUDA initialization failure with error 35. Please check your CUDA installation

    或者你在导入tensorrt的时候报错;

    TypeError: pybind11::init(): factory function returned nullptr.
    

    这两个问题都是由于显卡驱动版本太低导致的 问题,更新显卡驱动即可,如下提供亲测可用的版本对应:

  • cuda:10.2
  • cudnn:7.6.5
  • tensorrt:7.0.0.11
  • NVIDIA Driver:450
  • 更多tensorrt和cuda版本对应关系,可以参考这里

  •