相关文章推荐
逃课的消炎药  ·  C# ...·  2 月前    · 
茫然的长颈鹿  ·  jQuery ...·  9 月前    · 
苦恼的地瓜  ·  PANDAS & glob - ...·  1 年前    · 
稳重的肉夹馍  ·  XStream、JAXB ...·  1 年前    · 

TensorRT学习之路(一)简介

简介

模型的推理性能一般考虑如下指标,推理的延时,推理的吞吐量,模型的精度,各类硬件平台为此纷纷推出了自家的产品,其中TensorRT是nvidia为深度学习模型在GPU上高性能推理而开发的一套SDK,主要包括inference optimizer和runtime,在CPU平台上intel也开发了类似的产品OPENVINO,在其他国产异构处理器SOC芯片上,也都提供了类似的SDK,总体来说都是根据自家的硬件特点,来对模型做优化,使之在自家硬件平台上发挥最佳的推理性能。

图一

图一来自nvidia官网,下面解释一下:

  1. 第一列显示TensorRT 优化过的模型推理性能是CPU的36倍,最新听说是40X,并且在低精度比如INT8,通过calibrate,推理精度也是比较高的,支持数据中心,边缘计算各种场景。
  2. 第二列显示tensorRT的实现基于CUDA编程模型,可以使用量化,层融合,kernel 调优,这一点我的理解是深度学习模型中的算子也是基于CUDA实现的,同一技术层面的两个不同的东西,是可以做功能上等价的替换,但是性能上在不同的场景会不一样。
  3. 第三列表示在实时应用场景,通过量化的方式来提高推理性能,并且模型精度的损失也比较小的,能满足应用的需求
  4. 第四列表示经过TensorRT优化的模型还可以部署到Triton server上,Triton是nvidia提供的模型推理的服务框架,类似tensorflow serving,部署到Triton的优点一是通过动态batch来达到高的QPS,二是模型是可以并发执行,三是可以把模型与其他模型组成一个推理的pipeline,跟其他模型串起来,model 的ensembles实际部署的时候也是很重要的,有的时候需要通过ensembles来提高模型的性能。

TensorRT的应用模式

主要有两种方式:

  1. 基于TensorRT提供的API定义网络模型,然后来优化
  2. 把其他深度学习框架下训练好的模型转成onnx模型,然后通过TensorRT的onnx parser 库导入到TensorRT中,然后来优化,通常大家都是使用这种方式来使用TensorRT的,如图二所示,图三作为GPU/CPU平台上对比,异构平台也有类似的架构。
图二


图三


TensorRT的编程模型

本节讲解TensorRT的编程模型,涉及到应用tensorRT的两个阶段及一些基本概念。

tensorRT应用流程涉及2个阶段,这两个阶段也对应到tensorRT两个重要的组件,optimizer和runtime

build 阶段

如图四所示,TensorRT提供builder接口,给builder喂一个onnx模型,builder会根据config的配置,吐一个经过优化的engine,engine可以经过序列化保存到本地。

图四

图四中onnx模型通过onnx parser导入到tensorRT之后,还需要指定模型的输入的tensor和输出的tensor,builder config用来指导对模型做哪些优化的一个配置。

runtime阶段

如图五所示:

图五

build阶段生成的engine可以序列化到本地保存,在runtime阶段通过反序列化加载进来,然后创建一个engine的context。一个engine可以创建多个engine context,并且这些engine conext是可以并行执行的。

当engine context创建好之后,我们为推理喂一个输入数据,然后调用enqueuev3把推理的任务加入到队列中,通过异步调用的方式让GPU去执行推理,HOST这边立即返回做一些其他的处理,最后通过 cudaStreamSynchronize 的方式来等待GPU执行完成。


TensorRT其他功能

除了上述编程模型外,tensorRT还提供其他功能

Plugins

onnx模型通过onnx parser解析的时候,有些算子可能不支持,目前tensorRT 最新的版本支持opset 7 ,所以当模型导出成onnx格式之后,首先使用 Polygraphy 这个工具来看一下,是不是存在ONNX parser某些算子不支持的问题,这类问题无论是TensorRT,还是OPENVINO,还是异构芯片提供的软件都存在类似的问题,通过plugin来实现一些TensorRT不支持的算子。

Types and precision

当前tensorRT支持FP32, FP16, INT8, INT32, UINT8, and BOOL

量化

把float数据通过线性压缩和取整编程一个INT8的整数,这样提高数字计算的吞吐率,并且减少了存储和对内存带宽的需求。

Dynamic shapes

默认情况下,TensorRT的input在优化的时候的shape是固定的,比如shape=[2,3,224,224],但是tensorRT可以通过config来使得input的维度在运行的时候batch 是可以变的,这个通过OptimizationProfile来实现

DLA

NVIDIA’s Orin SoCs这类芯片为了加速卷积,反卷积,全连接等计算,提供了DLA的硬件,这个硬件专门为这类算子提供加速,如图六所示,国内的很多加速芯片也是这个思路。

图六

Trtexec tool

TensorRT提供的一个命令行工具,不需要调用sdk的API,通过也该工具通过命令行的方式来使用tensorRT

Polygraphy

这个工具主要是用来调试模型,模型转换,查看模型信息,修改onnx模型等

总结

在GPU平台上模型部署首选TensorRT及Triton server,后续会有一系列的文章来讲如何使用TensorRT。

编辑于 2023-10-31 20:19 ・IP 属地江苏