tensorRT

  • 基本网络构建

    • 创建builder
    • 创建network
    • 创建config
    • network添加输入
    • network添加层,绑定输入
    • network mark output,指定输出节点
    • builder编译network
    • 序列化,并储存为文件
  • 推理过程
    • 创建runtime
    • 反序列化engine
    • 创建执行上下文ExecuteContext
    • 获取binding的维度,并为输入输出节点分配内存
    • 为输入塞数据
    • 入队, context->enqueue(batch, void** bindings, stream, event);
    • 复制结果回主机
    • 流同步,等待推理结束
    • 打印结果
  • onnx解析器
    • tensorRT依赖onnx,onnx依赖protobuf
    • pytorch依赖onnx,onnx依赖protobuf
    • 其中如果onnx版本不匹配,或者pytorch的opset不匹配都会导致,导出失败
      • 如果遇到例如focus不匹配,是因为slice中-1的原因。解决方案是干掉他,合并到cuda核中
      • 如果遇到例如upsample不匹配,修改opset11中upsample符号,返回从Reisze改成Upsample[1, 2, 2]
        • 如果不是upsample2倍,此时需要考虑的是通过interpolate的参数获取到上采样倍数,而不是写死为2倍
        • 只要opset的导出与onnx解析器与tensorRT能够适配。可以考虑修改opset、或者修改onnx解析器实现
      • 如果遇到Gather的错误,通常是因为tensor.shape、tensor.size等被跟踪并生成节点造成,解决方案是加int(tensor.shape[0])断开跟踪
  • 老师带大家使用时,是基于4个维度考虑的,batch维度由tensorRT管理。实际控制的是CHW3个维度。实际上,tensorRT已经支持超过5个维度。但是复杂度高
  • int8量化,需要加入calibrator,用来标定校正模型。需要提供图像数据,正常提供例如100张图就够了。
  • 插件
    • pytorch中,对特殊节点做定义

      • 实现模块,继承自torch.autograd.Function

        • 实现3个方法

          • forward(ctx, input)

            • 在这里写的pytorch计算,不会被加入计算图
            • ctx.save_for_backward(input)可以储存input到backward阶段
          • backward(ctx, grad_output)
            • ctx.saved_tensors可以拿到forward时储存的tensor
            • 返回值,即为input的导数。如果多个input,则返回多项
          • symbolic(g, input)
            • 指定为onnx导出时解析的节点信息
            • attr_s,指节点的属性值为attr,类型是str
              • attr_i, attr_f
            • 老师设计的做法,是要求导出的节点类型为"Plugin",并且有属性name_s = “PluginName”,info_s = json.dumps({})
      • 实现Module,成员属性为autograd.Function的模块
        • forward时,使用autograd.Function的apply方法,其他照旧
    • 导出onnx,如果出现节点检查错误,可以设置enable_onnx_checker=False
    • tensorRT加载onnx编译,在onnx_plugin中添加自己的插件代码和实现
    • 使用

一、什么是TensorRT

TensorRT是可以在NVIDIA各种GPU硬件平台下运行的一个C++推理框架。

它旨在与TesnsorFlow、Caffe、Pytorch以及MXNet等训练框架以互补的方式进行工作,专门致力于在GPU上快速有效地进行网络推理。

我们利用Pytorch、TF或者其他框架训练好的模型,可以转化为TensorRT的格式,然后利用TensorRT推理引擎去运行我们这个模型,从而提升这个模型在英伟达GPU上运行的速度。

速度提升的比例是比较可观的。

借官方的话来说:

The core of NVIDIA® TensorRT™ is a C++ library that facilitates high-performance inference on NVIDIA graphics processing units (GPUs). TensorRT takes a trained network, which consists of a network definition and a set of trained parameters, and produces a highly optimized runtime engine that performs inference for that network. TensorRT provides API’s via C++ and Python that help to express deep learning models via the Network Definition API or load a pre-defined model via the parsers that allow TensorRT to optimize and run them on an NVIDIA GPU. TensorRT applies graph optimizations, layer fusion, among other optimizations, while also finding the fastest implementation of that model leveraging a diverse collection of highly optimized kernels. TensorRT also supplies a runtime that you can use to execute this network on all of NVIDIA’s GPU’s from the Kepler generation onwards. TensorRT also includes optional high speed mixed precision capabilities introduced in the Tegra™ X1, and extended with the Pascal™, Volta™, Turing™, and NVIDIA® Ampere GPU architectures.

TensorRT支持的平台如下:

支持计算能力在5.0及以上的显卡(当然,这里的显卡可以是桌面级显卡也可以是嵌入版式显卡),我们常见的RTX30系列计算能力是8.6、RTX20系列是7.5、RTX10系列是6.1,如果我们想要使用TensorRT,首先要确认下我们的显卡是否支持。

至于什么是计算能力(Compute Capability),咋说嘞,计算能力并不是描述GPU设备计算能力强弱的绝对指标,准确的说,这是一个架构的版本号。一般来说越新的架构版本号更高,计算能力的第一个数值也就最高(例如3080计算能力8.6),而后面的6代表在该架构前提下的一些优化特性,具体代表什么特性可以看这里:https://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html#compute-capabilities

可以通过这里查阅自己显卡的计算能力:https://developer.nvidia.com/zh-cn/cuda-gpus

说回TensorRT本身,TensorRT是由C++、CUDA、python三种语言编写成的一个库,其中核心代码为C++和CUDA,Python端作为前端与用户交互。当然,TensorRT也是支持C++前端的,如果我们追求高性能,C++前端调用TensorRT是必不可少的。

二、使用TensorRT的场景

TensorRT的使用场景很多。服务端、嵌入式端、家用电脑端都是我们的使用场景。

  • 服务端对应的显卡型号为A100、T4、V100等
  • 嵌入式端对应的显卡为AGX Xavier、TX2、Nano等
  • 家用电脑端对应的显卡为3080、2080TI、1080TI等

当然这不是固定的,只要我们显卡满足TensorRT的先决条件,用就对了。

三、TensorRT的加速效果怎么样

加速效果取决于模型的类型和大小,也取决于我们所使用的显卡类型。

对于GPU来说,因为底层的硬件设计,更适合并行计算也更喜欢密集型计算。TensorRT所做的优化也是基于GPU进行优化,当然也是更喜欢那种一大块一大块的矩阵运算,尽量直通到底。因此对于通道数比较多的卷积层和反卷积层,优化力度是比较大的;如果是比较繁多复杂的各种细小op操作(例如reshape、gather、split等),那么TensorRT的优化力度就没有那么夸张了。

为了更充分利用GPU的优势,我们在设计模型的时候,可以更加偏向于模型的并行性,因为同样的计算量,“大而整”的GPU运算效率远超“小而碎”的运算。

工业界更喜欢简单直接的模型和backbone。2020年的RepVGG(RepVGG:极简架构,SOTA性能,让VGG式模型再次伟大(CVPR-2021)),就是为GPU和专用硬件设计的高效模型,追求高速度、省内存,较少关注参数量和理论计算量。相比resnet系列,更加适合充当一些检测模型或者识别模型的backbone。

在实际应用中,TensorRT的加速效果:

  • SSD检测模型,加速3倍(Caffe)
  • CenterNet检测模型,加速3-5倍(Pytorch)
  • LSTM、Transformer(细op),加速0.5倍-1倍(TensorFlow)
  • resnet系列的分类模型,加速3倍左右(Keras)
  • GAN、分割模型系列比较大的模型,加速7-20倍左右(Pytorch)

什么模型可以转换为TensorRT

TensorRT官方支持Caffe、Tensorflow、Pytorch、ONNX等模型的转换(不过Caffe和Tensorflow的转换器Caffe-Parser和UFF-Parser已经有些落后了),也提供了三种转换模型的方式:

  • 使用TF-TRT,将TensorRT集成在TensorFlow中
  • 使用ONNX2TensorRT,即ONNX转换trt的工具
  • 手动构造模型结构,然后手动将权重信息挪过去,非常灵活但是时间成本略高,有大佬已经尝试过了:tensorrtx

不过目前TensorRT对ONNX的支持最好,TensorRT-8最新版ONNX转换器又支持了更多的op操作。而深度学习框架中,TensorRT对Pytorch的支持更为友好,除了Pytorch->ONNX->TensorRT这条路,还有:

  • torch2trt
  • torch2trt_dynamic
  • TRTorch

总而言之,理论上95%的模型都可以转换为TensorRT,条条大路通罗马嘛。只不过有些模型可能转换的难度比较大。如果遇到一个无法转换的模型,先不要绝望,再想想,再想想,看看能不能通过其他方式绕过去。




参考资料:
TensorRT详细入门指北,如果你还不了解TensorRT,过来看看吧!
什么是TensorRT
TensorRT简介–高性能深度学习支持引擎
TensorRT 介绍
TensorRT(1)-介绍-使用-安装
[深度学习]TensorRT为什么能让模型跑快快
内卷成啥了还不知道TensorRT?超详细入门指北,来看看吧!

TensorRT:在NVIDIA各种GPU硬件平台下运行的高性能推理C++库【Pytorch->ONNX->TensorRT】【实现神经网络提速(读取ONNX模型并运行)】【目前对ONNX的支持最好】相关推荐

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

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

  2. AI模型工业部署:综述【常用的部署框架:TensorRT、Libtorch】【常见提速方法:模型结构、剪枝、蒸馏、量化训练、稀疏化】【常见部署流程:onnx2trt】【常见服务部署搭配】

    作为深度学习算法工程师,训练模型和部署模型是最基本的要求,每天都在重复着这个工作,但偶尔静下心来想一想,还是有很多事情需要做的: 模型的结构,因为上线业务需要,更趋向于稳定有经验的,而不是探索一些新的 ...

  3. 【OpenCL开发入门】03 - 使用NVIDIA CUDA GPU 进行乘法运行算

    [OpenCL开发入门]03 - 使用NVIDIA CUDA GPU 进行乘法运行算 本系列文章汇总: <[OpenCL开发入门]01 - 搭建Visual Studio 2022+OpenCL ...

  4. Linux下监视NVIDIA的GPU使用情况

    在使用TensorFlow跑深度学习的时候,经常出现显存不足的情况,所以我们希望能够随时查看GPU时使用率.如果你是Nvidia的GPU,那么在命令行下,只需要一行命令就可以实现. 1. 显示当前GP ...

  5. 英伟达PyTorch优化神器TensorRT重磅更新!10亿参数大模型实时运行,GPT推理加速21倍...

      视学算法报道   编辑:好困 小咸鱼 [新智元导读]12月2日,英伟达发布了最新的TensorRT 8.2版本,对10亿级参数模型进行了优化,让实时运行NLP应用成为可能.与原始PyTorch模型 ...

  6. TensorRT重磅更新!10亿参数大模型实时运行,GPT推理加速21倍

    众所周知,PyTorch和TensorFlow是两个非常受欢迎的深度学习框架. 12月2日,英伟达发布了最新的TensorRT 8.2版本,对10亿级参数的NLP模型进行了优化,其中就包括用于翻译和文 ...

  7. TensorRT 概述、原理、Linux下安装

    聊聊TensorRT 随着传统的高性能计算和新兴的深度学习在百度.京东等大型的互联网企业的普及发展,作为训练和推理载体的GPU也被越来越多的使用. NVDIA本着让大家能更好地利用GPU,使其在做深度 ...

  8. 在NVIDIA A100 GPU上利用硬件JPEG解码器和NVIDIA nvJPEG库

    在NVIDIA A100 GPU上利用硬件JPEG解码器和NVIDIA nvJPEG库 根据调查,普通人产生的1.2万亿张图像可以通过电话或数码相机捕获.这样的图像的存储,尤其是以高分辨率的原始格式, ...

  9. TensorRT加速 ——NVIDIA终端AI芯片加速用,可以直接利用caffe或TensorFlow生成的模型来predict(inference)...

    官网:https://developer.nvidia.com/tensorrt 作用:NVIDIA TensorRT™ is a high-performance deep learning inf ...

最新文章

  1. NSThread的使用
  2. Javascript玩转继承(一)
  3. java 不用if_Java 不用for不用if写出九九乘法表算法
  4. Windows进程与线程学习笔记(四)—— 等待链表调度链表
  5. SpringAMQP--DirectExchange
  6. 巧用Notepad++代码粘贴功能
  7. 《JAVA 语言程序设计基础篇》chapter 5 方法
  8. 巧用 TypeScript(四)
  9. linux服务之NTP及chrony时间同步
  10. 软路由安装openwrt
  11. Anaconda||install报错:CondaHTTPError: HTTP 000 CONNECTION FAILED for url <https://mirrors.tuna.tsinghu
  12. 美团2018校园招聘 研发工程师(三)
  13. 树莓派智能家居homeassistant之homekit篇
  14. RGB和CIELAB颜色空间转换及偏色检测
  15. 大数据告诉你:凌晨4点的中国人都在做什么?
  16. 来自#Devoxx 2014的WebSocket螺母和螺栓的幻灯片
  17. 五点三次平滑的程序源代码
  18. Odoo产品分析 (三) -- 人力资源板块(5) -- 出勤(1)
  19. 自然几何之分形(2)
  20. (转载)机器学习方法的PPT .

热门文章

  1. 图片存储架构学习:缓存,架构师的美丽小三(一)
  2. GDB and OpenOCD
  3. 二、搭建mysql服务器,创建数据库
  4. pickle与.pkl文件
  5. 微服务使用knife4j进行在线接口调试
  6. 每个平台币都说自己是下一个 BNB,那么谁能担得起?
  7. Ipad在局域网中连接虚拟机最简单的办法
  8. Idea全局替换@RequestMapping
  9. 7月第1周榜单丨哔哩哔哩B站UP主排行榜发布!
  10. pogo pin镀金是通过哪些工序的,镀金的流程是怎样的?