TensorRT-安装-使用
TensorRT-安装-使用
一.安装
这里 是英伟达提供的安装指导,如果有仔细认真看官方指导,基本上按照官方的指导肯定能安装成功。
问题是肯定有很多人不愿意认真看英文指导,比如说我就是,我看那个指导都是直接找到命令行所在,直接敲命令,然后就出了很多问题,然后搜索好长时间,最后才发现,原来官方install guide里是有说明的。
这里使用的是 deb 包安装的方式,以下是安装过程,我是cuda 8.0 ,cuda9.0也是类似的。
进行下面三步时最好先将后面记录的遇到的问题仔细看看,然后回过头来按照 一二三 步来安装。
第一步:
$ sudo dpkg -i nv-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 CUDA
Toolkit 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 目录下,共有七个,分别为:
1 2 3 4 5 6 7 |
/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库):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
/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-$(shell dpkg-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过程:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
//创建一个builder IBuilder* builder = createInferBuilder(gLogger); // parse the caffe model to populate the network, then // 创建一个network对象,不过这时network对象只是一个空架子 INetworkDefinition* network = builder->createNetwork(); //tensorRT提供一个高级别的API:CaffeParser,用于解析Caffe模型 //parser.parse函数接受的参数就是上面提到的文件,和network对象 //这一步之后network对象里面的参数才被填充,才具有实际的意义 CaffeParser parser; auto 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 = |
上面的过程使用了一个高级别的API:CaffeParser,直接读取
caffe的模型文件,就可以解析,也就是填充network对象。解析的过程也可以直接使用一些低级别的C++API,比如:
1 2 |
ITensor* in = network->addInput(“input”, IPoolingLayer* pool = network->addPooling(in, |
解析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流获取
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
// The execution context is responsible for launching // compute kernels 创建上下文环境 context,用于启动kernel IExecutionContext *context = engine->createExecutionContext(); // In order to bind the buffers, we need to know the // input and output tensors. //获取输入,输出tensor索引 int inputIndex = int outputIndex = //申请GPU显存 // Allocate GPU memory for Input / Output data void* buffers = malloc(engine->getNbBindings() cudaMalloc(&buffers[inputIndex], batchSize * cudaMalloc(&buffers[outputIndex], batchSize * //使用cuda 流来管理并行计算 // Use CUDA streams to manage the concurrency of 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 // in flight on the GPU in different streams. // The host can then sync on a given stream and use the 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-安装-使用的更多相关文章
- TensorRt安装
1.下载 https://developer.nvidia.com/nvidia-tensorrt-5x-download 选择5 GA版本,注意选择与自己CUDA匹配的版本 2.安装 参考:http ...
- 矩池云安装/修改 cuda、cudnn、nvcc、tensorRT 教程
在整个机器学习的过程中,配置环境一直是一个比较复杂的事情,今天介绍几种根据英伟达官方文档来配置环境的方法. 安装方案 https://gitlab.com/nvidia/container-image ...
- TensorRT学习总结
TensorRT是什么 建议先看看这篇https://zhuanlan.zhihu.com/p/35657027 深度学习 训练 部署 平常自学深度学习的时候关注的更多是训练的部分,即得到一个模型.而 ...
- TensorRT 介绍
引用:https://arleyzhang.github.io/articles/7f4b25ce/ 1 简介 TensorRT是一个高性能的深度学习推理(Inference)优化器,可以为深度学习应 ...
- TensorRT 开始
TensorRT 是 NVIDIA 自家的高性能推理库,其 Getting Started 列出了各资料入口,如下: 本文基于当前的 TensorRT 8.2 版本,将一步步介绍从安装,直到加速推理自 ...
- Nanodet模型部署(ncnn,openvino)/YOLOX部署(TensorRT)
Nanodet模型部署(ncnn,openvino) nanodet官方代码库nanodet 1. nanodet模型部署在openvino上 step1: 参考链接 nanodet官方demo op ...
- 10分钟内基于gpu的目标检测
10分钟内基于gpu的目标检测 Object Detection on GPUs in 10 Minutes 目标检测仍然是自动驾驶和智能视频分析等应用的主要驱动力.目标检测应用程序需要使用大量数据集 ...
- TensorRT下安装pycuda
为了模型小型化,效率更高,使用TensorRT进行优化.前提是你必须要安装pycuda,可是费了我一番功夫.做一个笔记如下: 1.参考网址: https://wiki.tiker.net/PyCuda ...
- (原)Ubuntu安装TensorRT
转载请注明出处: https://www.cnblogs.com/darkknightzh/p/11129472.html 参考网址: https://docs.nvidia.com/deeplear ...
随机推荐
- hdu2435最大流最小割
2435 There is a war 题意: 给你一个有向图,其中可以有一条边是无敌的,这条边可以是图中的边,也可以是自己任意加上去的图中没有的边,这条无敌的边不可以摧毁,让1和n无法 ...
- Apache Tomcat examples directory vulnerabilities(Apache Tomcat样例目录session操纵漏洞)复现
目录 Session操控漏洞 示例: Session操控漏洞 在Apache tomcat中,有一个默认的example示例目录,该example目录中存着众多的样例,其中/examples/serv ...
- Windowsw核心编程 第13章 Windows内存结构
第1 3章 Wi n d o w s的内存结构 13.1 进程的虚拟地址空间 每个进程都被赋予它自己的虚拟地址空间.对于 3 2位进程来说,这个地址空间是4 G B,因为3 2位指针可以拥有从0 x ...
- 码农飞升记-02-OracleJDK是什么?OracleJDK的版本怎么选择?
目录 1.Oracle JDK 是什么? 2.Oracle JDK 版本如何选择? 1.Java SE 发布节奏以及不同版本的差距 1.Java SE 8 以及之前版本的发布节奏和不同版本的差距 1. ...
- nginx 配置后页面访问是报500错
该问题是html文件权限问题. 用jenkins 并远程服务器上传到另一台服务器的html ,在配置好nginx 的location root 绝对位置后还是报错500 手工用root上传时访问正常 ...
- Django(3)pycharm创建项目
创建项目 我们创建django项目有两种方式,命令行方式和使用pycharm工具创建,本文就介绍常用的pycharm工具创建 首先点击django,输入项目的名称,选择创建好的虚拟环境,最后点击c ...
- Java并发工具篇
theme: juejin highlight: an-old-hope 作者:汤圆 个人博客:javalover.cc 前言 随着天气的逐渐变热,整个人也开始浮躁不安 当然这里说的不是我,因为我是一 ...
- 网络层协议及ARP攻击
一:网络层介绍及ICMP协议 1,网络层 网络层位于OSI参考模型的第三层,位于传输层和数据链路层之间.向传输层提供最基本的端到端的数据传送服务.定义了基于IP协议的逻辑地址,连接不同媒介类型,选择数 ...
- 消息队列RabbitMQ(三):消息确认机制
引言 RabbitMQ的模型是生产者发送信息到 Broker (代理),消费者从 Broker 中取出信息.但是生产者怎么知道消息是否真的发送到 Broker 中了呢?Broker 又怎么知道消息到底 ...
- 阿里云上安装 OpenStack 是什么体验
阿里云上跑火车(安装 OpenStack Train 版本),猜猜最终花了多少钱? 前言 前面给大家提供了用虚拟机安装 OpenStack 的镜像,虽然已经很简便了,但还是略显笨重.一来镜像文件比较大 ...