文章目录

  • 一、什么是 ONNX
  • 二、PyTorch 转 ONNX
  • 三、什么是 TensorRT
  • 四、ONNX 转 TensorRT

在深度学习模型落地的过程中,会面临将模型部署到边端设备的问题,模型训练使用不同的框架,则推理的时候也需要使用相同的框架,但不同类型的平台,调优和实现起来非常困难,因为每个平台都有不同的功能和特性。如果需要在该平台上运行多种框架,则会增加复杂性,所以 ONNX 便派上了用场。可以通过将不同框架训练的模型转换成通用的 ONNX 模型,再进而转换成各个平台支持的格式,就可以实现简化部署。

一、什么是 ONNX

ONNX 是 Open Neural Network Exchange 的简称,也叫开放神经网络交换,是一个用于表示深度学习模型的标准,可使模型在不同框架直接转换。

ONNX 是迈向开放式生态系统的第一步,使得开发人员不局限于某种特定的开发工具,为模型提供了开源格式。

ONNX 目前支持的框架有:Caffe2、PyTorch、TensorFlow、MXNet、TensorRT、CNTK 等

ONNX 通常来说就是一个中介,是一种手段,在把模型转换成 ONNX 之后,再转换成可部署的形式,如 TensorRT。

典型的结构转换路线:

  • Pytorch → ONNX → TensorRT
  • Pytorch → ONNX → TVM
  • TF → ONNX → NCNN

二、PyTorch 转 ONNX

import onnxruntime
import torch
torch.onnx.export(model, (img_list, ), 'tmp.onnx',input_names=['input.1'],output_names=['output'],export_params=True,keep_initializers_as_inputs=False,verbose=show,opset_version=opset_version,dynamic_axes=dynamic_axes))
# onnx 模型简化:
python3 -m onnxsim tmp.onnx tmp_simplify.onnx

三、什么是 TensorRT

TensorRT 是一个高性能的深度学习推理(inference)优化器,是可以在 NVIDIA 各种 GPU 硬件平台下运行的一个 C++ 推理框架,可以为深度学习提高低延时、高吞吐率的部署推理,可用于对嵌入式平台、自动驾驶平台的推理加速。

将 TensorRT 和 NVIDIA 的 GPU 结合起来,能在几乎所有框架中进行快速和高效的部署推理。从而提升这个模型在英伟达GPU上运行的速度。速度提升的比例是比较可观的。

我们已知模型包括训练和推理两个阶段,训练的时候包含了前向传播和反向传播,推理只包含前向传播,所以预测时候的速度更重要。

在训练的时候,一般会使用多 GPU 分布式训练,在部署推理的时候,往往使用单个 GPU 甚至嵌入式平台。模型训练时采样的框架会不同,不同机器的性能会存在差异,导致推理速度变慢,无法满足高实时性。而 TensorRT 就是推理优化器,把 ONNX 模型转换为 TensorRT 之后,就可以在相关边端部署了。

TensorRT 的优化方法:

TensorRT 有多种优化方法,最主要的是前两种:

  • 层间融合或张量融合:

    TensorRT通过对层间的横向或纵向合并(合并后的结构称为CBR,意指 convolution, bias, and ReLU layers are fused to form a single layer),使得层的数量大大减少。横向合并可以把卷积、偏置和激活层合并成一个CBR结构,只占用一个CUDA核心。纵向合并可以把结构相同,但是权值不同的层合并成一个更宽的层,也只占用一个CUDA核心。合并之后的计算图)的层次更少了,占用的CUDA核心数也少了,因此整个模型结构会更小,更快,更高效。

  • 数据精度校准:

    大部分深度学习框架在训练神经网络时网络中的张量都是32位浮点数的精度(Full 32-bit precision,FP32),一旦网络训练完成,在部署推理的过程中由于不需要反向传播,完全可以适当降低数据精度,比如降为FP16或INT8的精度。更低的数据精度将会使得内存占用和延迟更低,模型体积更小。

  • Kernel Auto-Tuning:

    网络模型在推理计算时,是调用 GPU 的 CUDA 进行计算的,TensorRT 可以真的不同的算法、不同的模型结构、不同的 GPU 平台等,进行 CUDA 调整,以保证当前模型在特定平台上以最优的性能计算。

    假设在 3090 和 T4 上要分别部署,则需要分别在这两个平台上进行 TensorRT 的转换,然后在对应的平台上使用,而不能在相同同的平台上转换,在不同的平台上使用。

  • Dynamic Tensor Memory:

    在每个 tensor 使用期间,TensorRT 会为其指定显存,避免显存重复申请,减少内存占用和提高重复使用效率

四、ONNX 转 TensorRT

def convert_tensorrt_engine(onnx_fn, trt_fn, max_batch_size, fp16=True, int8_calibrator=None, workspace=2_000_000_000):network_creation_flag = 1 << (int)(trt.NetworkDefinitionCreationFlag.EXPLICIT_BATCH)with trt.Builder(TRT_LOGGER) as builder, builder.create_network(network_creation_flag) as network, trt.OnnxParser(network, TRT_LOGGER) as parser:builder.max_workspace_size = workspacebuilder.max_batch_size = max_batch_sizebuilder.fp16_mode = fp16if int8_calibrator:builder.int8_mode = Truebuilder.int8_calibrator = int8_calibratorwith open(onnx_fn, "rb") as f:if not parser.parse(f.read()):print("got {} errors: ".format(parser.num_errors))for i in range(parser.num_errors):e = parser.get_error(i)print(e.code(), e.desc(), e.node())returnelse:print("parse successful")print("inputs: ", network.num_inputs)# inputs = [network.get_input(i) for i in range(network.num_inputs)]# opt_profiles = create_optimization_profiles(builder, inputs)# add_profiles(config, inputs, opt_profiles)for i in range(network.num_inputs):print(i, network.get_input(i).name, network.get_input(i).shape)print("outputs: ", network.num_outputs)for i in range(network.num_outputs):output = network.get_output(i)print(i, output.name, output.shape)engine = builder.build_cuda_engine(network)with open(trt_fn, "wb") as f:f.write(engine.serialize())print("done")

【TensorRT】将 PyTorch 转化为可部署的 TensorRT相关推荐

  1. TensorRT和PyTorch模型的故事

    点击上方"视学算法",选择加"星标"或"置顶" 重磅干货,第一时间送达 作者丨伯恩legacy 来源丨https://zhuanlan.zh ...

  2. 加速深度学习在线部署,TensorRT安装及使用教程

    向AI转型的程序员都关注了这个号???????????? 机器学习AI算法工程   公众号:datayx 1 什么是TensorRT 一般的深度学习项目,训练时为了加快速度,会使用多GPU分布式训练. ...

  3. jenson nano对YoloV5进行部署以及TensorRT加速

    部署是软件开发生命周期中非常重要的环节,它直接影响到系统的安全性.可用性和性能.因此,在进行部署前需要仔细检查和准备,确保软件能够在目标环境中顺利运行,并进行后期的监控和维护.那么今天这篇文章就来记录 ...

  4. Pytorch模型通过paddlelite部署到嵌入式设备

    Pytorch模型通过paddlelite部署到嵌入式设备 一.把模型转为嵌入式设备能够识别的格式 1.把.pt或.pth的pytorch模型转为.onnx格式中间过渡状态模型格式,github上X2 ...

  5. 【TensorRT】PyTorch模型转换为ONNX及TensorRT模型

    文章目录 1. PyTorch模型转TensorRT模型流程 2. PyTorch模型转ONNX模型 3. ONNX模型转TensorRT模型 3.1 TensorRT安装 3.2 将ONNX模型转换 ...

  6. pytorch模型转ONNX转TensorRT,模型转换和推理部署

    一.pth模型转ONNX import os import sys import torch import numpy as npfrom feat.model import ResNet # 导入自 ...

  7. 多任务分类训练,模型转化与c++部署

    根据数据决定是否适合用多任务分类. 比如菊花.玫瑰花- 黄.白.红-数据大致均衡的可以做多任务分类. 但是比如花.草.树- 红.白.黄-很难做到数据均衡,训出来的模型效果也非常差.例如jx的项目. 1 ...

  8. Pytorch项目打包和部署(1)——理论

    文章目录 一.什么是模型打包部署 二.模型打包部署的作用 三.学习模型打包部署的目的 四.模型部署语言 五.模型部署平台 六.模型部署设备 七.模型部署方式 八.模型部署接口(服务器部署) 九.模型部 ...

  9. yolov5模型的部署之TensorRT

    写在前面,利用TensorRT加速推理速度是以时间换取精度的做法,意味着在推理速度上升的同时将会有精度的下降,不过不用太担心,精度下降微乎其微.此外,要有NVIDIA显卡,经测试,CUDA10.2可以 ...

最新文章

  1. 2018-07-12 第六十七天 EsayUI
  2. 【视频课】如何掌握好深度学习之视频分类与行为识别?这一门课足矣!
  3. 从FTP服务器进行文件的上传和下载
  4. bootstrap 辅助类
  5. ETL__pentaho__SPOON_PDI
  6. 设计模式原则之四:迪米特法则
  7. 大学生毕业如何选择职业?
  8. 香港推广“绿色年宵” 呼吁商贩和市民惜物减废
  9. Could not mount the media/drive ‘D:\......./VBoxGuestAdditions.iso‘ (VERR_PDM_MEDIA_LOCKED)
  10. Windows7 64bit oracle 11g plsql错误 Initialhation orrlr SQK*NET properly installed
  11. python生成华氏度-摄氏度转换表
  12. macd指标计算机应用,macd是怎么计算的
  13. 集合的特性(成员操作符、for循环遍历)
  14. 关于简历,网申,笔试,面试过程的分享
  15. 如何开启全新旅途,实现旅游市场活力复苏
  16. .net4.0 使用低版本生成的dll, 混合模式程序集市针对V1.1.4322,无法在 4.0 运行时中加载该程序解决办法
  17. Hadoop安装配置
  18. Java高级编程5-姜国海
  19. 会议管理系统怎么用好,这些细节你注意到了吗?
  20. unity如何改变重力方向

热门文章

  1. makefile:2: *** 遗漏分隔符 。 停止
  2. ffplay的快捷键以及选项
  3. 2013/01/04作业raid+lvm+quota
  4. C#多线程学习(三) 生产者和消费者
  5. CheckedListBox扩展方法代码
  6. 更改python默认路径_Linux下多版本python共存时,默认执行路径修改方法
  7. 将图的广度优先遍历在邻接矩阵和邻接表存储结构上分别实现_图解:什么是“图”?
  8. honeywell新风系统控制面板说明_新风系统——不开窗也能清新呼吸
  9. 南京工程学院计算机组成原理第二版答案,南大__计算机组成原理第二次作业
  10. 计算机组成原理主存储器知识点,计算机组成原理(存储器).ppt