用NVIDIA-TensorRT构造深度神经网络
用NVIDIA-TensorRT构造深度神经网络
Deploying Deep Neural Networks with NVIDIA TensorRT
NVIDIA TensorRT是一个用于生产环境的高性能深度学习推理库。电源效率和响应速度是部署的深度学习应用程序的两个关键指标,因为直接影响用户体验和所提供服务的成本。Tensor RT为运行时性能自动优化训练的神经网络,在Tesla P100 GPU上提供高达16倍的能效(性能/瓦),而普通的CPU专用深度学习推理系统(见图1)。图2显示了NVIDIA Tesla P100和K80使用TensorRT和相对复杂的GoogLenet神经网络架构运行推理的性能。
在本文中,将向展示如何在基于GPU的部署平台上使用Tensor RT从经过训练的深层神经网络中获得最佳的效率和性能。
深度学习训练和部署
用深层神经网络求解有监督机器学习问题涉及两步过程。
第一步是利用gpu对海量标记数据进行深层神经网络训练。在这一步中,神经网络学习数以百万计的权值或参数,使其能够将输入数据示例映射到正确的响应。由于目标函数相对于网络权值最小,训练需要在网络中反复向前和向后传递。为了估计真实世界的性能,通常需要训练几个模型,并根据训练期间没有看到的数据验证模型的准确性。
下一步——推理——使用经过训练的模型根据新数据进行预测。在此步骤中,在生产环境(如数据中心、汽车或嵌入式平台)中运行的应用程序中使用经过最佳训练的模型。对于一些应用,如自动驾驶,推理是实时进行的,因此高吞吐量是至关重要的。
Figure 3: Deep learning training to deployment workflow with NVIDIA DIGITS and Tensor RT.
要了解更多关于训练和推理之间的区别,请参阅Michael Andersch关于GPUs推理的文章。
目标部署环境引入了训练环境中通常不存在的各种挑战。例如,如果目标是使用经过训练的神经网络感知其周围环境的嵌入式设备,则通过该模型的正向推理将直接影响设备的总体响应时间和功耗。优化的关键指标是功率效率:每瓦特的推理性能。
每瓦特性能也是最大化数据中心运营效率的关键指标。在这种情况下,需要最小化在地理上和时间上完全不同的大量请求上使用的延迟和能量,这限制了形成大批量的能力。
NVIDIA TensorRT
Tensor RT是一个高性能的推理引擎,旨在为常见的深度学习应用(如图像分类、分割和目标检测)提供最大的推理吞吐量和效率。Tensor RT优化训练的神经网络以获得运行时性能,并为web/移动、嵌入式和汽车应用程序提供GPU加速推理。
Figure 4: The TensorRT workflow, showing the two key functionalities of TensorRT: the TensorRT neural network optimizer (middle) and the TensorRT target runtime (right).
TensorRT的使用分为两个阶段:构建和部署。在构建阶段,TensorRT对网络结构进行优化,并生成一个用于计算深神经网络前向传递的优化计划。该计划是一个优化的目标代码,可以序列化并存储在内存或磁盘上。
部署阶段通常采用长时间运行的服务或用户应用程序的形式,该服务或用户应用程序接受成批输入数据,通过对输入数据执行计划来执行推理,并返回成批输出数据(分类、对象检测等)。使用TensorRT,不需要在部署硬件上安装和运行深入学习框架。关于推理服务的批处理和管道的讨论是另一篇文章的主题;相反,将重点讨论如何使用TensorRT进行推理。
TensorRT构建阶段
Tensor RT运行时需要三个文件来部署分类神经网络:
网络体系结构文件(deploy.prototxt文件),
训练重量(net.caffemodel网站),和
为每个输出类提供名称的标签文件。
此外,还必须定义批大小和输出层。代码清单1演示了如何将Caffe模型转换为TensorRT对象。构建者(第4-7行)负责读取网络信息。或者,如果不提供网络体系结构文件,则可以使用生成器定义网络信息(deploy.prototxt文件)。
Tensor RT支持以下层类型。
- Convolution: 2D
- Activation: ReLU, tanh and sigmoid
- Pooling: max and average
- ElementWise: sum, product or max of two tensors
- LRN: cross-channel only
- Fully-connected: with or without bias
- SoftMax: cross-channel only
- Deconvolution
卷积:二维
激活:ReLU,tanh和sigmoid
池化:最大值和平均值
元素:两个张量的和、积或最大值
LRN:仅跨信道
全连接:有无偏倚
SoftMax: 仅跨通道
反卷积
1. IBuilder* builder = createInferBuilder(gLogger);
2.
3. // parse the caffe model to populate the network, then set the outputs
4. INetworkDefinition* network = builder->createNetwork();
5.
6. CaffeParser parser;
7. auto blob_name_to_tensor = parser.parse(“deploy.prototxt”,
8. trained_file.c_str(),
9. *network,
10. DataType::kFLOAT);
11.
12. // specify which tensors are outputs
13. network->markOutput(*blob_name_to_tensor->find("prob"));
14.
15. // Build the engine
16. builder->setMaxBatchSize(1);
17. builder->setMaxWorkspaceSize(1 << 30);
18. ICudaEngine* engine = builder->buildCudaEngine(*network);
还可以使用张量RT C++ API来定义没有CAFE解析器的网络,如清单2所示。可以使用API定义任何受支持的层及其参数。可以定义在网络之间变化的任何参数,包括卷积层权重维度和输出,以及池化层的窗口大小和步长。
ITensor* in = network->addInput(“input”, DataType::kFloat, Dims3{…});
IPoolingLayer* pool = network->addPooling(in, PoolingType::kMAX, …);
在定义或加载网络之后,必须如清单1的第13行所示指定输出张量;在示例中,输出是“prob”(表示概率)。接下来,定义批大小(第16行),根据部署场景的不同,批大小可能有所不同。清单1使用的批处理大小为1,但可以选择更大的批处理大小来满足应用程序需要和系统配置。下面,TensorRT执行层优化以减少推理时间。虽然这对API用户是透明的,但是分析网络层需要内存,因此必须指定最大工作空间大小(第17行)。
最后一步是调用buildCudaEngine执行层优化,并根据提供的输入和参数使用优化的网络构建引擎。一旦模型转换为TensorRT对象,就可以部署,可以在主机设备上使用,也可以保存并在其地方使用。
TensorRT对神经网络图进行了一些重要的转换和优化。首先,消除未使用输出的层,以避免不必要的计算。接下来,在可能的情况下,卷积层、偏压层和ReLU层被融合形成一个单层。图6显示了图5中原始网络上垂直层融合的结果(融合层在图6中标记为CBR)。层融合提高了在GPU上运行张量RT优化网络的效率。
Figure 5: An example convolutional neural network with multiple convolutional and activation layers.
另一个转换是水平层融合或层聚合,以及聚合层到各自输出所需的划分,如图7所示。水平层融合通过合并具有相同源张量的层并应用具有相似参数的相同操作来提高性能,从而产生一个更大的层以获得更高的计算效率。图7中的示例显示了图5中3个1×1 CBR层的组合,这些层将相同的输入合并到一个更大的1×1 CBR层中。请注意,必须分解此层的输出,以便从原始输入图馈入不同的后续层。
在TensorRT解析器读取经过训练的网络和配置文件之后,TensorRT在构建阶段对API用户透明地执行转换,如清单1所示。
TensorRT Deploy Phase
推理生成器(IBuilder)buildCudaEngine方法返回指向新的推理引擎运行时对象(ICudaEngine)的指针。此运行时对象已准备好立即使用;或者,可以将其状态序列化并保存到磁盘或对象存储以供分发。序列化的目标代码称为计划。
如前所述,与运行时推断引擎之间的批处理和流式处理数据的整个范围超出了本文的范围。清单3演示了使用推理机处理一批输入数据以生成结果所需的步骤。
/ The execution context is responsible for launching the
// compute kernels
IExecutionContext *context = engine->createExecutionContext();
// In order to bind the buffers, we need to know the names of the
// input and output tensors.
int inputIndex = engine->getBindingIndex(INPUT_LAYER_NAME),
int outputIndex = engine->getBindingIndex(OUTPUT_LAYER_NAME);
// 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);
// Use CUDA streams to manage the concurrency of copying and executing
cudaStream_t stream;
cudaStreamCreate(&stream);
// Copy Input Data to the GPU
cudaMemcpyAsync(buffers[inputIndex], input,
batchSize * size_of_single_input,
cudaMemcpyHostToDevice, stream);
// Launch an instance of the GIE compute kernel
context.enqueue(batchSize, buffers, stream, nullptr);
// Copy Output Data to the Host
cudaMemcpyAsync(output, buffers[outputIndex],
batchSize * size_of_single_output,
cudaMemcpyDeviceToHost, stream));
// 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);
使用TensorRT最大化性能和效率
TensorRT 1.0现在可以免费下载给NVIDIA开发者程序的成员。
NVIDIA TensorRT使能够轻松地部署神经网络,以最高的性能和效率为产品添加深度学习功能。在构建阶段,TensorRT识别优化网络的机会,在部署阶段,TensorRT以最小化延迟和最大吞吐量的方式运行优化的网络。
如果运行的是由数据中心服务器支持的web或移动应用程序,TensorRT的低开销意味着可以部署更多样、更复杂的模型,为产品添加智能,让用户感到高兴。如果正在使用深入学习来创建下一代智能设备,TensorRT将帮助部署具有高性能、高精度和高能效的网络。
此外,TensorRT使能够利用gpu的能力,使用混合精度FP16数据执行神经网络推理。在Tesla P100和jetsontx2gpu上使用FP16进行神经网络推理可以减少一半的内存使用,并提供更高的性能。
用NVIDIA-TensorRT构造深度神经网络的更多相关文章
- NVIDIA TensorRT 让您的人工智能更快!
NVIDIA TensorRT 让您的人工智能更快! 英伟达TensorRT™是一种高性能深度学习推理优化器和运行时提供低延迟和高通量的深度学习推理的应用程序.使用TensorRT,您可以优化神经网络 ...
- NVIDIA TensorRT高性能深度学习推理
NVIDIA TensorRT高性能深度学习推理 NVIDIA TensorRT 是用于高性能深度学习推理的 SDK.此 SDK 包含深度学习推理优化器和运行时环境,可为深度学习推理应用提供低延迟和高 ...
- NVIDIA TensorRT:可编程推理加速器
NVIDIA TensorRT:可编程推理加速器 一.概述 NVIDIA TensorRT是一个用于高性能深度学习推理的SDK.它包括一个深度学习推理优化器和运行时间,为深度学习推理应用程序提供低延迟 ...
- NVIDIA GPU的神经网络自动调度
NVIDIA GPU的神经网络自动调度 针对特定设备和工作负载的自动调整对于获得最佳性能至关重要.这是一个关于如何使用自动调度器为NVIDIA GPU调整整个神经网络的资料. 为了自动调整一个神经网络 ...
- Nvidia TensorRT开源软件
TensorRT开源软件 此存储库包含NVIDIA TensorRT的开源软件(OSS)组件.其中包括TensorRT插件和解析器(Caffe和ONNX)的源代码,以及演示TensorRT平台使用和功 ...
- NVIDIA® TensorRT™ supports different data formats
NVIDIA TensorRT supports different data formats NVIDIATensorRT公司 支持不同的数据格式.需要考虑两个方面:数据类型和布局. ...
- TensorRT加速 ——NVIDIA终端AI芯片加速用,可以直接利用caffe或TensorFlow生成的模型来predict(inference)
官网:https://developer.nvidia.com/tensorrt 作用:NVIDIA TensorRT™ is a high-performance deep learning inf ...
- TensorRT简介-转载
前言 NVIDIA TensorRT是一种高性能神经网络推理(Inference)引擎,用于在生产环境中部署深度学习应用程序,应用有 图像分类.分割和目标检测等,可提供最大的推理吞吐量和效率.Tens ...
- 初见-TensorRT简介<转>
下面是TensorRT的介绍,也可以参考官方文档,更权威一些:https://developer.nvidia.com/tensorrt 关于TensorRT首先要清楚以下几点: 1. TensorR ...
随机推荐
- 编译Android 4.4.4 r1的源码刷Nexus 5手机详细教程
本文博客地址:http://blog.csdn.net/qq1084283172/article/details/54562606 网上关于编译Android源码的教程已经很多了,但是讲怎么编译And ...
- CVE-2013-0077:Microsoft DirectShow quartz.dll m2p 文件堆溢出漏洞简单分析
0x01 前言 2012 年 10 月 5 日,exploit-db 漏洞公布站点上发布了 QQplayer.exe 3.7.892 m2p quartz.dll Heap Pointer OverW ...
- <JVM上篇:内存与垃圾回收篇>02-类加载子系统
笔记来源:尚硅谷JVM全套教程,百万播放,全网巅峰(宋红康详解java虚拟机) 同步更新:https://gitee.com/vectorx/NOTE_JVM https://codechina.cs ...
- Day001 Typora Markdown语法学习
# Markdown语法 ## 标题 ### 三级标题 #### 四级标题 注:最多支持到六级标题 ## 字体 **hello,world!** *hello,world!* ***hello,wor ...
- Schema的快速入门
Schema的快速入门 如果是简单元素直接 <element name="" type=""></element> Schema开发过 ...
- 从刚毕业的5K测试到20K测试大佬,与薪资相匹配的永远是实力!
有个话题"软件测试的工资高还是开发者的工资高?"软件测试和软件开发门槛有差异,在职业起步阶段收入也会有一定的差异,这算是行业内公开的秘密.但随着工作年限的增加,经验的逐步积累,软件 ...
- Python数模笔记-Sklearn(4)线性回归
1.什么是线性回归? 回归分析(Regression analysis)是一种统计分析方法,研究自变量和因变量之间的定量关系.回归分析不仅包括建立数学模型并估计模型参数,检验数学模型的可信度,也包括利 ...
- 一些代码小技巧&经典代码
请说明逻辑与(&&)在下边表达式中起到的重要作用 count != 0 && sum/count 答:该表达式使用逻辑与(&&)来确保 sum/coun ...
- Codeforces Round #713 (Div. 3)AB题
Codeforces Round #713 (Div. 3) Editorial 记录一下自己写的前二题本人比较菜 A. Spy Detected! You are given an array a ...
- OO_Unit3_JML规格模式
---恢复内容开始--- [CSDN博客链接](https://blog.csdn.net/weixin_43387647/article/details/90451173) @[toc] ## 一. ...