TensorRT-安装-使用

一.安装

这里 是英伟达提供的安装指导,如果有仔细认真看官方指导,基本上按照官方的指导肯定能安装成功。

问题是肯定有很多人不愿意认真看英文指导,比如说我就是,我看那个指导都是直接找到命令行所在,直接敲命令,然后就出了很多问题,然后搜索好长时间,最后才发现,原来官方install guide里是有说明的。

这里使用的是 deb 包安装的方式,以下是安装过程,我是cuda 8.0 ,cuda9.0也是类似的。

进行下面三步时最好先将后面记录的遇到的问题仔细看看,然后回过头来按照 一二三 步来安装。

第一步:

$ sudo dpkg -inv-tensorrt-repo-ubuntu1604-ga-cuda8.0-trt3.0-20171128_1-1_amd64.deb

$ sudo apt-get update

$ sudo apt-get install tensorrt

其中的deb包要换成与自己cuda和系统 对应的版本。

第二步:

使用python2则安装如下依赖

$ sudo apt-get install python-libnvinfer-doc

这个是为了安装一些依赖的:比如 python-libnvinfer python-libnvinfer-dev swig3.0

如果是python3则安装如下依赖

$ sudo apt-get install python3-libnvinfer-doc

第三步:

$ sudo apt-get install uff-converter-tf

这个是安装通用文件格式转换器,主要用在 TensorRT 与TensorFlow 交互使用的时候。

不过我安装的时候还是出问题了:

安装tensorRT之前要将cuda的两个deb包添加上,因为TensorRT依赖好多cuda的一些东西比如 cuda-cublas-8-0 ,我之前cuda是用runfile安装的,所以TensorRT安装时有些依赖库找不到导致出错,如下图:

​上面提示缺少依赖包,但是实际上 libnvinfer4 的包是tensorRT安装了之后才有的,那现在反而成了依赖包了,不管他,缺什么安装什么,但是还是出错,如下:

还是缺少依赖包,这次是缺 cuda-cublas-8-0 ,现在知道了,缺的是cuda的相关组件。

后来把 cuda 的两个deb包安装之后就没问题了,cuda 8.0 的deb包 在这里 ,如下图,下载红框里的两个deb包。

如果用的是 runfile 的方式安装的cuda的话,很容易出错,因为网上大部分cuda安装教程都是用runfile的方式安装的。所以如果cuda就是用deb包安装的话,就没有这个问题,如果使用runfile安装的话,安装tensorRT之前要把这两个deb包安装上,安装方式如下:

$ sudo dpkg -i cuda-repo-ubuntu1604-8-0-local-cublas-performance-update_8.0.61-1_amd64.deb

$ sudo dpkg -i cuda-repo-ubuntu1604-8-0-local-ga2_8.0.61-1_amd64.deb

以上是自己摸索出来的,折腾了一番之后才发现原来官方的 install guide已经说明了,如下:

The debian installation automatically installs any dependencies, but:

requires sudo root privileges to install
provides no flexibility
as to which location TensorRT is installed into
requires that the CUDA
Toolkit has also been installed with a debian package.

注意最后一条,意思是如果用deb包安装TensorRT,那么前提是 你的CUDA也是用deb包安装的。

怪自己没有认真看,要是多花个5分钟仔细看一下,就不用折腾这么久了,由此深有感触,文档还是官方英文原版的最好,而且要认真看。

不过不知道用 runfile cuda+Tar File Installation tensorRT的组合安装方式是怎么样的,没试过。

tensorRT 3 支持CUDA 8 和 CUDA 9,但是只支持 cuDNN 7,我第一次安装的时候cuDNN是5.1的,结果总是出错,错误是啥忘记了,反正换成cuDNN 7就好了,这个官方指导也有说明,不过比较隐蔽,他是放在 4.2
Tar File Installation 一节说明的:

Install the following dependencies, if not already present:

  ‣ Install the CUDAToolkit v8.0, 9.0 or 9.2‣ cuDNN 7.1.3‣ Python 2 or Python 3

我试过只要大版本是 cudnn7就可以。这个也容易忽略。

安装好后,使用 $ dpkg -l | grep TensorRT 命令检测是否成功,输出如下所示即为成功

安装后会在 /usr/src 目录下生成一个 tensorrt 文件夹,里面包含 bin , data , python , samples 四个文件夹, samples 文件夹中是官方例程的源码; data , python 文件中存放官方例程用到的资源文件,比如caffemodel文件,TensorFlow模型文件,一些图片等;bin 文件夹用于存放编译后的二进制文件。

可以把 tensorrt 文件夹拷贝到用户目录下,方便自己修改测试例程中的代码。

进入 samples 文件夹直接 make,会在 bin 目录中生成可执行文件,可以一一进行测试学习。

另外tensorRT是不开源的, 它的头文件位于 /usr/include/x86_64-linux-gnu 目录下,共有七个,分别为:
/usr/include/x86_64-linux-gnu/NvCaffeParser.h
/usr/include/x86_64-linux-gnu/NvInfer.h
/usr/include/x86_64-linux-gnu/NvInferPlugin.h
/usr/include/x86_64-linux-gnu/NvOnnxConfig.h
/usr/include/x86_64-linux-gnu/NvOnnxParser.h
/usr/include/x86_64-linux-gnu/NvUffParser.h
/usr/include/x86_64-linux-gnu/NvUtils.h

TensorRT4.0相比于3.0新增了对ONNX的支持。

tensorRT的库文件位于 /usr/lib/x86_64-linux-gnu 目录下,如下(筛选出来的,掺杂了一些其他nvidia库):

/usr/lib/x86_64-linux-gnu/libnvinfer.so
/usr/lib/x86_64-linux-gnu/libnvToolsExt.so
/usr/lib/x86_64-linux-gnu/libnvinfer_plugin.a
/usr/lib/x86_64-linux-gnu/libnvinfer_plugin.so.4
/usr/lib/x86_64-linux-gnu/libnvcaffe_parser.so
/usr/lib/x86_64-linux-gnu/libnvparsers.so.4.1.2
/usr/lib/x86_64-linux-gnu/stubs/libnvrtc.so
/usr/lib/x86_64-linux-gnu/libnvcaffe_parser.a
/usr/lib/x86_64-linux-gnu/libnvidia-opencl.so.1
/usr/lib/x86_64-linux-gnu/libnvvm.so
/usr/lib/x86_64-linux-gnu/libnvinfer.a
/usr/lib/x86_64-linux-gnu/libnvvm.so.3
/usr/lib/x86_64-linux-gnu/libnvToolsExt.so.1
/usr/lib/x86_64-linux-gnu/libnvrtc.so.7.5
/usr/lib/x86_64-linux-gnu/libnvparsers.a
/usr/lib/x86_64-linux-gnu/libnvblas.so.7.5
/usr/lib/x86_64-linux-gnu/libnvToolsExt.so.1.0.0
/usr/lib/x86_64-linux-gnu/libnvcaffe_parser.so.4.1.2
/usr/lib/x86_64-linux-gnu/libnvinfer_plugin.so
/usr/lib/x86_64-linux-gnu/libnvrtc-builtins.so
/usr/lib/x86_64-linux-gnu/libnvparsers.so
/usr/lib/x86_64-linux-gnu/libnvrtc-builtins.so.7.5.18
/usr/lib/x86_64-linux-gnu/libnvblas.so.7.5.18
/usr/lib/x86_64-linux-gnu/libnvvm.so.3.0.0
/usr/lib/x86_64-linux-gnu/libnvrtc.so
/usr/lib/x86_64-linux-gnu/libnvrtc-builtins.so.7.5
/usr/lib/x86_64-linux-gnu/libnvinfer.so.4.1.2
/usr/lib/x86_64-linux-gnu/libnvidia-opencl.so.390.30
/usr/lib/x86_64-linux-gnu/libnvrtc.so.7.5.17
/usr/lib/x86_64-linux-gnu/libnvblas.so
/usr/lib/x86_64-linux-gnu/libnvinfer.so.4
/usr/lib/x86_64-linux-gnu/libnvparsers.so.4
/usr/lib/x86_64-linux-gnu/libnvinfer_plugin.so.4.1.2
/usr/lib/x86_64-linux-gnu/libnvcaffe_parser.so.4

编译

将 /usr/src/tensorrt 文件夹拷贝到用户目录下,假设路径为
<tensorrt_srcpath> 。

第一个问题:

在 <tensorrt_srcpath>/tensorrt/samples 文件夹中有个
Makefile.config 文件,里面第4行:

CUDA_VER?=cuda-(shelldpkg−query−f′(shell dpkg-query -f '(shelldpkg−query−f′${version}\n’ -W ‘cuda-cudart-[0-9]*’ | cut -d . -f 1,2 | sort -n | tail -n 1)

这一句是为了获取cuda版本的,我的机器是 CUDA 8.0 。我记得我第一次安装时,后面dpkg命令 输出的不是8.0,是一个很奇怪的数字,导致我不能编译 tensorRT 例程。 后来我直接在这句后面添加了一句:
CUDA_VER=cuda-8.0 ,简单粗暴解决问题了。

这个问题好像是还是因为我之前安装 cuda 时是用 runfile 的方式安装的,用这种方式安装的cuda不会安装cuda的deb包,所以上面语句输出的是不对的,导致找不到cuda库目录,编译不能进行。

可以使用命令sudo dpkg -i cuda-repo-ubuntu1604-8-0-local-ga2_8.0.61-1_amd64.deb ,安装deb包,就可以了。或者像我那样添加 CUDA_VER=cuda-8.0 也可以。

如果安装cuda就是使用deb包安装的话,就不会出现这个问题。

第二个问题:

如果机器上安装了多个cuda版本,像我这个机器上 cuda8.0,9.0,9.1都装上了,上面语句得到的就只是 CUDA_VER=9.1,如果安装的是其他版本cuda的TensorRT的话肯定是不对的。

可以直接在第4行下面添加:

CUDA_INSTALL_DIR=/usr/local/cuda-9.0

二.TensorRT 使用流程

这是个很简单的流程,先简单了解一下,以后会深入研究更高级的用法。

在使用tensorRT的过程中需要提供以下文件(以caffe为例):

A network architecture file (deploy.prototxt), 模型文件
Trained weights (net.caffemodel), 权值文件
A label file to provide a name for each output class. 标签文件

前两个是为了解析模型时使用,最后一个是推理输出时将数字映射为有意义的文字标签。

tensorRT的使用包括两个阶段, build and deployment:

build:Import and optimize trained models to generate inference engines

build阶段主要完成模型转换(从caffe或TensorFlow到TensorRT),在模型转换时会完成前述优化过程中的层间融合,精度校准。这一步的输出是一个针对特定GPU平台和网络模型的优化过的TensorRT模型,这个TensorRT模型可以序列化存储到磁盘或内存中。存储到磁盘中的文件称之为 plan file。

下面代码是一个简单的build过程:

IBuilder* builder = createInferBuilder(gLogger);
// parse the caffe model to populate the network, then
set the outputs
// 创建一个network对象,不过这时network对象只是一个空架子
INetworkDefinition* network = builder->createNetwork();
//tensorRT提供一个高级别的API:CaffeParser,用于解析Caffe模型
//parser.parse函数接受的参数就是上面提到的文件,和network对象
//这一步之后network对象里面的参数才被填充,才具有实际的意义
CaffeParser parser;
auto
blob_name_to_tensor = parser.parse(“deploy.prototxt”,
trained_file.c_str(),

*network,

DataType::kFLOAT);

// 标记输出 tensors
// specify which tensors are outputs
network->markOutput(blob_name_to_tensor->find(“prob”));
// Build the engine
// 设置batchsize和工作空间,然后创建inference engine
builder->setMaxBatchSize(1);
builder->setMaxWorkspaceSize(1 << 30);
//调用buildCudaEngine时才会进行前述的层间融合或精度校准优化方式
ICudaEngine
engine =
builder->buildCudaEngine(*network);

上面的过程使用了一个高级别的API:CaffeParser,直接读取
caffe的模型文件,就可以解析,也就是填充network对象。解析的过程也可以直接使用一些低级别的C++API,比如:

ITensor* in = network->addInput(“input”,
DataType::kFloat, Dims3{…});
IPoolingLayer* pool = network->addPooling(in,
PoolingType::kMAX, …);

解析caffe模型之后,必须要指定输出tensor,设置batchsize,和设置工作空间。设置batchsize就跟使用caffe测试是一样的,设置工作空间是进行前述层间融合和张量融合的必要措施。层间融合和张量融合的过程是在调用builder->buildCudaEngine时才进行的。

deploy:Generate runtime inference engine for inference

deploy阶段主要完成推理过程,Kernel Auto-Tuning 和 Dynamic Tensor Memory 应该是在这里完成的。将上面一个步骤中的plan文件首先反序列化,并创建一个 runtime engine,然后就可以输入数据(比如测试集或数据集之外的图片),然后输出分类向量结果或检测结果。

tensorRT的好处就是不需要安装其他深度学习框架,就可以实现部署和推理。

以下是一个简单的deploy代码:这里面没有包含反序列化过程和测试时的batch流获取

ontext is responsible for launching
the
// compute kernels 创建上下文环境 context,用于启动kernel
IExecutionContext context = engine->createExecutionContext();
// In order to bind the buffers, we need to know the
names of the
// input and output tensors. //获取输入,输出tensor索引
int inputIndex =
engine->getBindingIndex(INPUT_LAYER_NAME),
int outputIndex =
engine->getBindingIndex(OUTPUT_LAYER_NAME);
//申请GPU显存
// Allocate GPU memory for Input / Output data
void
buffers = malloc(engine->getNbBindings()

  • sizeof(void*));
    cudaMalloc(&buffers[inputIndex], batchSize *
    size_of_single_input);
    cudaMalloc(&buffers[outputIndex], batchSize *
    size_of_single_output);
    //使用cuda 流来管理并行计算
    // Use CUDA streams to manage the concurrency of
    copying and executing
    cudaStream_t stream;
    cudaStreamCreate(&stream);
    //从内存到显存,input是读入内存中的数据;buffers[inputIndex]是显存上的存储区域,用于存放输入数据
    // Copy Input Data to the GPU
    cudaMemcpyAsync(buffers[inputIndex], input,

batchSize * size_of_single_input,

cudaMemcpyHostToDevice, stream);
//启动cuda核计算
// Launch an instance of the GIE compute kernel
context.enqueue(batchSize, buffers, stream, nullptr);
//从显存到内存,buffers[outputIndex]是显存中的存储区,存放模型输出;output是内存中的数据
// Copy Output Data to the Host
cudaMemcpyAsync(output, buffers[outputIndex],

batchSize * size_of_single_output,

cudaMemcpyDeviceToHost, stream));
//如果使用了多个cuda流,需要同步
// It is possible to have multiple instances of the
code above
// in flight on the GPU in different streams.
// The host can then sync on a given stream and use the
results
cudaStreamSynchronize(stream);

可见使用了挺多的CUDA 编程,所以要想用好tensorRT还是要熟练 GPU编程。

4 Performance Results

来看一看使用以上优化方式之后,能获得怎样的加速效果:

可见使用tensorRT与使用CPU相比,获得了40倍的加速,与使用TensorFlow在GPU上推理相比,获得了18倍的加速。效果还是很明显的。

以下两图,是使用了INT8低精度模式进行推理的结果展示:包括精度和速度。

可见精度损失很少,速度提高很多。

上面还是17年 TensorRT2.1的性能,这里 是一个最新的TensorRT4.0.1的性能表现,有很详细的数据展示来说明TensorRT在inference时的强劲性能。

后面的博客中会进一步学习 tensorRT,包括官方例程和做一些实用的优化。

TensorRT-安装-使用相关推荐

  1. win10 tensorrt安装 踩坑记录

    常见网络tensorrt c++版实现: https://github.com/wang-xinyu/tensorrtx win10 tensorrt安装 下载地址: https://develope ...

  2. TensorRT安装及使用教程

    常见网络tensorrt c++版实现: https://github.com/wang-xinyu/tensorrtx 参考:TensorRT安装及使用教程_ZONGXP的博客-CSDN博客_ten ...

  3. Ubuntu16.04 下 tensorRT安装

    环境准备 主要是根据工程环境需要,参考trt文档安装trt 1.查看trt适配情况 :链接跳转,注意,不同版本的trt有不同版本的文档,请以最新文档为准. 2.根据自己系统情况下载相关包 因为我自己拉 ...

  4. tensorrt安装_利用TensorRT对深度学习进行加速

    前言 TensorRT是什么,TensorRT是英伟达公司出品的高性能的推断C++库,专门应用于边缘设备的推断,TensorRT可以将我们训练好的模型分解再进行融合,融合后的模型具有高度的集合度.例如 ...

  5. tensorrt安装_[深度学习] TensorRT安装

    TensorRT的安装并不难,最好的办法就是看官方文档. Deep Learning SDK Documentation 过去的一周,我在几个平台上装了三次TensorRT,踩的坑不少,所以将这个过程 ...

  6. tensorrt安装_基于TensorRT的BERT推断加速与服务部署

    BERT的出现真是广大NLPer的福音,在很多任务上能取得显著提升.不例外,作者在工作过程中也使用了BERT进行下游任务训练,但在感叹BERT真香的时候,它及其漫长的推断时间让人感到很为难.本文就记录 ...

  7. 加速深度学习在线部署,TensorRT安装及使用教程

    向AI转型的程序员都关注了这个号???????????? 机器学习AI算法工程   公众号:datayx 1 什么是TensorRT 一般的深度学习项目,训练时为了加快速度,会使用多GPU分布式训练. ...

  8. TensorRT安装教程

    简介 本文介绍在Ubuntu系统下安装TensorRT的具体步骤,主要支持C++的调用,理论上适合各种Linux发行版. 准备工作 CUDA安装 首先需要确保正确安装CUDA,可以参考我之前的博文,通 ...

  9. 【模型加速】TensorRT安装、测试及常见问题

    ■ 安装过程 一.安装依赖环境 ● Ubuntu 20.04 ● CUDA 11.1 ● cuDNN 8.0.4 ● python 3.8.5 – 可以通过命令查看cuda.cudnn.python版 ...

  10. 【windows版】TensorRT安装教程

    一.参考资料 TensorRT 深度学习模型剪枝.量化和TensorRT推理 深度学习模型PyTorch训练并转ONNX与TensorRT部署 TensorRT(1)-介绍-使用-安装 TensorR ...

最新文章

  1. python定制框架知识点_我的第一个python web开发框架(25)——定制ORM(一)
  2. libevent源码深度剖析八
  3. xml读取异常Invalid byte 1 of 1-byte UTF-8 sequence
  4. 使用Nexus搭建私有Nuget仓库
  5. SolrCloud集群配置
  6. 吴恩达深度学习—— 3.4 多个例子中的向量化
  7. JAVE amr转换mp3
  8. Mysql的存储过程(以Mysql为例进行讲解)
  9. 力扣题目——637. 二叉树的层平均值
  10. 安装NVIDIA显卡驱动
  11. PHP在线预览word、excel等office文档
  12. 从零开始的FPGA学习5-同步复位D触发器、异步复位D触发器
  13. 水星网卡 linux驱动,水星网卡驱动下载_硬件驱动下载
  14. 高性能消息中间件 NSQ 解析-应用实践
  15. Linux_29_Linux-Vsftpd
  16. SCardTransmit 返回 SCARD_W_RESET_CARD
  17. 转载《美团容器平台架构及容器技术实践》
  18. Android异步消息处理机制之looper机制
  19. Java中this关键字和super关键字用法
  20. 如何在上传的图片上写字

热门文章

  1. c++ 进程快照_如何在 Linux 中找出内存消耗最大的进程
  2. linux高效办公环境配置(vim、tmux、bash_profile)
  3. python学习之pip常用命令
  4. debian 10 静态ip配置
  5. JAVA如何实现发送短信
  6. ModuleNotFoundError: No module named 'tools.nnwrap' pytorch 安装
  7. 程序员应该吃透的集合List
  8. 智能物联网(AIoT,2020年)(下)
  9. MindSpore网络模型类
  10. 全景分割:CVPR2019论文解析