用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 eployment 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);

  1. // parse the caffe model to populate the network, then set the outputs

  2. INetworkDefinition* network = builder->createNetwork();

  3. CaffeParser parser;

  4. auto blob_name_to_tensor = parser.parse(“deploy.prototxt”,

  5. trained_file.c_str(),

  6. *network,

  7. DataType::kFLOAT);

  8. // specify which tensors are outputs

  9. network->markOutput(*blob_name_to_tensor->find(“prob”));

  1. // Build the engine

  2. builder->setMaxBatchSize(1);

  3. builder->setMaxWorkspaceSize(1 << 30);

  4. 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 kernelc
ontext.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构造深度神经网络相关推荐

  1. NVIDIA TensorRT高性能深度学习推理

    NVIDIA TensorRT高性能深度学习推理 NVIDIA TensorRT™ 是用于高性能深度学习推理的 SDK.此 SDK 包含深度学习推理优化器和运行时环境,可为深度学习推理应用提供低延迟和 ...

  2. 线上直播 | NVIDIA TensorRT在神经机器翻译中的应用

    神经机器翻译(Neural Machine Translation,简称 NMT)存在于各种各样的消费者应用程序中,包括 web 站点.路标.在外语中生成字幕等. NVIDIA 的可编程推理加速器 T ...

  3. 基于TensorRT的神经网络推理与加速

    一. 引言 NVIDIA TensorRT是一种高性能神经网络推理(Inference)引擎,用于在生产环境中部署深度学习应用程序,应用于图像分类.分割和目标检测等,可提供最大的推理吞吐量和效率.Te ...

  4. NVIDIA GPU的神经网络自动调度

    NVIDIA GPU的神经网络自动调度 针对特定设备和工作负载的自动调整对于获得最佳性能至关重要.这是一个关于如何使用自动调度器为NVIDIA GPU调整整个神经网络的资料. 为了自动调整一个神经网络 ...

  5. NVIDIA® TensorRT™ supports different data formats

    NVIDIA® TensorRT™ supports different data formats NVIDIA®TensorRT公司™ 支持不同的数据格式.需要考虑两个方面:数据类型和布局. 数据类 ...

  6. NVIDIA TensorRT:可编程推理加速器

    NVIDIA TensorRT:可编程推理加速器 一.概述 NVIDIA TensorRT™是一个用于高性能深度学习推理的SDK.它包括一个深度学习推理优化器和运行时间,为深度学习推理应用程序提供低延 ...

  7. Ultralytics公司YOLOv8来了(训练自己的数据集并基于NVIDIA TensorRT和华为昇腾端到端模型加速)--跟不上“卷“的节奏

    Official YOLOv8 训练自己的数据集并基于NVIDIA TensorRT和华为昇腾端到端模型加速 说明: 本项目支持YOLOv8的对应的package的版本是:ultralytics-8. ...

  8. NVIDIA TensorRT (python win10)安装成功分享

    文章目录 1.TensorRT 下载 2.安装 3.测试 4.运行 5.TensorRT-优化-原理 补充 1.TensorRT 下载 TensorRT 各个版本的下载网址(用这个网址可以跳过 老黄的 ...

  9. 利用TensorRT实现神经网络提速(读取ONNX模型并运行)

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到网站. 前言 这篇文章接着上一篇继续讲解如何具体使用TensorRT. 在之前已经写到过一篇去介绍什么是Te ...

最新文章

  1. 机器学习:协方差矩阵
  2. as [Frame]元标签
  3. Python--day41--事件和信号量之模拟连接数据库并在连接三次后抛出连接超时异常...
  4. RedHat 6 安装配置Tomcat 7
  5. HR 的那些黑话大全,太扎心了!(漫画)
  6. [css] 使用css实现悬浮提示文本
  7. cad pu插件下载lisp_CAD自动编号lisp插件下载
  8. 二、Get和Post的区别
  9. GAN 优化 Yelp 形象图片广告
  10. matlab有限差分一维导热,一维导热方程 有限差分法 matlab实现
  11. python 深度优先遍历_Python算法-二叉树深度优先遍历
  12. Tomcat假死的原因及解决方案
  13. Go语言详解内存对齐
  14. 计算机运行速度靠什么,怎么让电脑运行速度变快?一招搞定
  15. php 0xc0000135,php 错误代码 0xc0000135是什么情况
  16. java 任务定时调度(定时器)
  17. JavaScript使用手册(一)
  18. SwiftUI学习笔记[path绘制]
  19. 淘宝中的UV,PV,IPV
  20. 3月第5周业务风控关注 | 央视曝光偷密码的“万能钥匙”,9亿人个人信息存风险

热门文章

  1. 将Eclipse中Web项目打成war包
  2. Go 学习笔记(79)— Go 标准库 net(获取本机IP地址)
  3. 【数据结构】链表中的 指针,地址
  4. 【C#】集合_哈希表_字典_泛型_文件
  5. torch.nn.functional.cross_entropy.ignore_index
  6. tensorflow兼容处理 tensorflow.compat.v1 tf.contrib
  7. python sys.argv是什么?
  8. LeetCode简单题之数组的度
  9. LeetCode简单题之按照频率将数组升序排序
  10. LeetCode简单题之至少是其他数字两倍的最大数