三. TensorRT基础入门-TensorRT简介

目录

    • 前言
    • 0. 简述
    • 1. 什么是TensorRT
    • 2. TensorRT的工作流介绍
    • 3. TensorRT的一些限制
    • 总结
    • 参考

前言

自动驾驶之心推出的 《CUDA与TensorRT部署实战课程》,链接。记录下个人学习笔记,仅供自己参考

本次课程我们来学习课程第三章—TensorRT 基础入门,一起来了解 TensorRT

课程大纲可以看下面的思维导图

在这里插入图片描述

0. 简述

本小节目标:理解 TensorRT 的工作流程,TensorRT 的优化极限,以及其他 DNN 编译器

这节开始我们进入第三章节-TensorRT 基础入门的学习,第三章节内容主要分为以下五个部分:

  • TensorRT 简介
  • TensorRT 的应用场景
  • TensorRT 的模块
  • 导出 ONNX 以及修改 ONNX 的方法
  • 初步使用 TensorRT

这次课程我们来学习 TensorRT 简介,这次课程结束之后希望大家理解 TensorRT 的工作流程,TensorRT 的一些局限以及与其它 DNN 编译器相比优势和劣势分别是什么

1. 什么是TensorRT

首先什么是 TensorRT,官方定义如下:

NVIDIA® TensorRT™, an SDK for high-performance deep learning inference, includes a deep learning inference optimizer and runtime that delivers low latency and high throughput for inference applications.

在这里插入图片描述

我们可以把 TensorRT 理解为一种针对 NVIDIA GPU 的一种优化编译器,它具备以下几个功能:

  • 自动优化模型
    • 寻找模型中可以并行处理的地方
    • 针对当前部署的 GPU 框架,寻找最优的调度和并行策略
  • 支持多框架输入
    • ONNX
  • Python/C++ API 接口
    • 可以方便在自己的程序中调用 TensorRT API 来实现推理

在这里插入图片描述

现在的大多数 DL framework 都可以通过 TensorRT 生成推理引擎部署在硬件上

  • 比较常见的组合:Pytorch->ONNX->TensorRT
  • 目前自动驾驶的部署硬件大多都会采用 NVIDIA
    • DRVIE series
    • Jetson series

很多厂商除了 NVIDIA 也会有很多其它选择,比较典型的是高通的 Heterogeneous Architecture 如下图所示:

在这里插入图片描述

Qualcomm

另外一个比较小众的是 Hailo 如下图所示,它是中东那边开发的一个比较典型的小型 Edge Device for DNN,它的功耗低且效率高,有很多量化和调度的技巧,此外它针对自己的硬件而设计的 Dataflow Compiler 也很精妙

在这里插入图片描述
在这里插入图片描述

Hailo

Note:Dataflow 数据流是一个很传统的概念,最近针对 DNN 的硬件设计有偏向 Dataflow 的趋势。大家感兴趣的同学可以自学一下,建议参考 Hailo, Google TPU, MIT Eyeriss 的 paper

Google 的 TPU 是属于 dataflow architecture 的一个例子,TPU 内部有一个 on-chip memory 叫做 HBM(high-bindwidth memory),当读取数据的时候,HBM 里的数据会以 queue 的形式放到 MXU(Matrix Multiplication Unit)进行数据的流动以及计算

为了理解 TPU 的工作原理,我们不妨了解一下其他加速器如何应对训练机器学习模型的计算挑战,以下内容 copy 自:https://cloud.google.com/tpu/docs/intro-to-tpu?hl=zh-cn

CPU 的工作方式

CPU 是一种基于冯·诺依曼结构的通用处理器。这意味着 CPU 与软件和内存协同工作,如下所示:

在这里插入图片描述

CPU 最大的优点是它们的灵活性。您可以在 CPU 上为许多不同类型的应用加载任何类型的软件。例如,您可以使用 CPU 在 PC 上处理文字、控制火箭引擎、执行银行事务,或使用神经网络对图片进行分类。

对于每次计算,CPU 从内存加载值,对值执行计算,然后将结果存储回内存中。与计算速度相比,内存访问速度较慢,并可能会限制 CPU 的总吞吐量。这通常称为冯·诺依曼瓶颈。

对于每次计算,CPU 从内存加载值,对值执行计算,然后将结果存储回内存中。与计算速度相比,内存访问速度较慢,并可能会限制 CPU 的总吞吐量。

GPU 的工作方式

为了提高吞吐量,GPU 在单个处理器中包含数千个算术逻辑单元 (ALU)。现代 GPU 通常包含 2500 - 5000 个 ALU。大量处理器意味着您可以同时执行数千次乘法和加法运算。

在这里插入图片描述

这种 GPU 架构非常适合并行处理大量运算(例如神经网络中的矩阵运算)的应用。实际上,在用于深度学习的典型训练工作负载上,GPU 的吞吐量可比 CPU 高出一个数量级。

不过,GPU 仍然是一种通用处理器,必须支持许多不同应用和软件。因此,GPU 与 CPU 存在相同的问题。对于数千个 ALU 中的每一次计算,GPU 都必须访问寄存器或共享内存,以读取运算对象以及存储中间计算结果。

TPU 的工作方式

Google 设计了 Cloud TPU,它们是专门用于神经网络工作负载的矩阵处理器。TPU 不能运行文字处理程序、控制火箭引擎或执行银行交易,但它们可以很快地处理神经网络中使用的大量矩阵运算。

TPU 的主要任务是矩阵处理,这是乘法和累加运算的组合。TPU 包含数千个乘法累加器,这些累加器彼此直接连接以形成大型物理矩阵。这称为脉动阵列架构。在单个处理器上,Cloud TPU v3 包含两个 128 x 128 ALU 的收缩阵列。

TPU 主机将数据流式传输到馈入队列中。TPU 从馈入队列加载数据,并将其存储在 HBM 内存中。计算完成后,TPU 会将结果加载到馈出队列中。然后,TPU 主机从馈出队列读取结果并将其存储在主机的内存中。

为了执行矩阵操作,TPU 将参数从 HBM 内存加载到矩阵乘法单元 (MXU) 中。

在这里插入图片描述

然后,TPU 从内存加载数据。每次执行乘法运算时,所得结果都会传递给下一个乘法累加器。输出是数据和参数之间所有乘法结果的总和。在矩阵乘法过程中,不需要访问内存。

在这里插入图片描述

以下是三者的对比:

  • CPU
    • 需要最高灵活性的快速原型设计
    • 训练时间不长的简单模型
    • 有效批量大小较小的小型模型
    • 包含许多使用 C++ 编写的自定义 TensorFlow 操作的模型
    • 受主机系统可用 I/O 或网络带宽限制的模型
  • GPU
    • 具有大量自定义且必须至少部分在 CPU 上运行的 TensorFlow/PyTorch/JAX 操作的模型
    • 具有不能在 Cloud TPU 上使用的 TensorFlow 操作的模型
    • 有效批量大小较大的中到大型模型
  • TPU
    • 由矩阵计算主导的模型
    • 在主训练循环内没有自定义 TensorFlow/PyTorch/JAX 操作的模型
    • 需要训练数周或数月的模型
    • 有效批量大小较大的大型模型

在这里插入图片描述

OK,我们回归正题,市场上有很多部署硬件但为什么 NVIDIA 和 TensorRT 一直都很火呢?主要有以下几个原因:

  • 整体硬件设计和编译技术很成熟
    • BUG 算比较少的那种
    • 对量化的支持比较全面以及完善
    • SDK 很充足(polygraphonnxsurgeon
  • 可以参考的文档比较多
    • 官方给的资源还是相当丰富的
    • 给的 sample 也很适合学习
  • Community 很大
    • 出现问题的时候可以讨论

但是:

  • 价格偏贵,当面向量产的时候价格是很需要重视的
  • 过大的 TOPS 是否真的就很好?
  • TOPS(Tera Operations per second)是衡量一个硬件的计算力的常用指标,之后我们会详细讲,现阶段有个认识就好

2. TensorRT的工作流介绍

TensorRT 的工作流如下图所示:

在这里插入图片描述

主要可以分为以下几部分:

  • 1. 将训练好的模型转为 TensorRT 可识别的模型
  • 2. TensorRT 逐个 Layer 进行分析并尝试各种优化策略(量化、层融合、调度、多流执行、内存复用等等)
  • 3. 生成推理引擎,可以从 C++/Python 程序中调用

3. TensorRT的一些限制

但是 TensorRT 也存在一些限制,主要有以下几点:

1. 针对不支持的算子

  • 看看不同 TensorRT 版本中是否有做了支持
    • Pytorch:Facebook
    • ONNX:Microsoft
    • TensorRT:NVIDIA
    • 部署时一般是 Pytorch->ONNX->TensorRT,我们可以看到中间跨越了三个不同的厂家,所以不同厂家由于算子版本不同带来的兼容性问题会很头痛
    • 比如 LayerNormalization 算子在 TensorRT-8.6-GA 中就有支持,而在之前的版本没有
  • 修改 PyTorch 的算子选择,让它使用一些 TensorRT 支持的算子
  • 自己写插件,内部实现自定义算子以及自定义 CUDA 加速核函数
  • 不使用 ONNX 自己创建 parser 直接调用 TensorRT API 逐层创建网络
    • 比如 tensorrtx 这个 repo

2. 不同 TensorRT 版本的优化策略是不一样的

  • 比如对 Transformer 的优化 TensorRT-7.x 和 TensorRT-8.x 跑出来的性能是不一样
  • 如果我们希望好的优化策略那我们就可以考虑比较新的 TensorRT 版本去做模型部署

3. 有时你预期 TensorRT 的优化和实际的优化是不一样的

  • 比如说你期望 TensorRT 使用 Tensor core 但 kernel autotuning 之后 TensorRT 觉得使用 Tensor core 反而会效率降低,结果给你分配 CUDA core 使用。因为内部需要做一些额外的处理
  • 比如说 INT8 量化的结果比 FP16 还要慢,这是 TensorRT 内部的一些优化调度所导致的

4. 天生并行性差的 layer,TensorRT 也没有办法

  • 1x1 conv 这种 layer 再怎么优化也没有 7x7 conv 并行效果好

重点注意:TensorRT 虽然很方便但不要过分的依赖 TensorRT 给你的结果,你需要结合部署的硬件特性做一些 Benchmark 和 Profiling,学习使用一些 Profile tools 去分析模型的计算瓶颈在哪里,以及去分析你的预测优化策略和实际优化策略产生分歧的原因在哪里。

总结

本次课程我们学习了解了 TensorRT,TensorRT 是 NVIDIA 针对 DNN 推出的一个优化编译器,它可以优化经过训练的深度学习模型以实现高性能推理,它的整个工作流程分为三部分,首先转换为 TensorRT 可识别的模型比如 ONNX,接着 TensorRT 尝试各种策略(算子/层融合、量化等)进行优化,最后生成对应的 engine 利用 API 调用。

当然我们也需要认识到 TensorRT 本身是存在一些限制的,我们不要过分的依赖 TensorRT 的结果,而需要学会结合硬件特性利用一些工具来分析模型的计算瓶颈

OK,以上就是第 1 小节有关 TensorRT 简介的全部内容了,下节我们来学习 TensorRT 的应用场景,敬请期待😄

参考

  • Qualcomm Software Architecture
  • Detail of Hailo AI Edge Accelerator Emerge
  • Hailo-15 quad-core AI Vision processor delivers up to 20 TOPS for Smart Cameras
  • Introduction to Cloud TPU
  • NVIDIA Deep Learning TensorRT Documentation
  • NVIDIA TensorRT

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/826679.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

三、Flask模型基础

ORM 创建模型 # exts.py:插件管理 # 扩展的第三方插件 # 1.导入第三方插件 from flask_sqlalchemy import SQLAlchemy # ORM插件 from flask_migrate import Migrate # 2. 初始化 db = SQLAlchemy() # ORM migrate = Migrate() # 数据迁移 # 3. 和app对象绑定 def init_ex…

kafka实验部署

一、前期准备 二、kafka实验 在zookeeper后继续进行操作 2.1 为ndoe1、node2、node3作出部署 2.1.1 解压kafka压缩包(node1举例) 2.1.2 操作 将解压后的kafka移动到kafka,进入到kafka下的config中,复制文件 2.1.2.1 编辑server.pr…

【笔试训练】day7

1.在字符串中找出连续最长的数字串 思路&#xff1a; 简单双指针&#xff0c;随便怎么暴力 代码&#xff1a; #define _CRT_SECURE_NO_WARNINGS 1 #include <iostream> #include<string> using namespace std;int main() {string str;cin >> str;int ans …

聚道云软件连接器助力医疗器械有限公司打通金蝶云星辰与飞书

摘要 聚道云软件连接器成功将金蝶云星辰与飞书实现无缝对接&#xff0c;为某医疗器械有限公司解决采购订单、付款单同步、审批结果回传、报错推送等难题&#xff0c;实现数字化转型升级。 客户介绍 某医疗器械有限公司是一家集研发、生产、销售为一体的综合性医疗器械企业。…

【linux运维】系统常见管理命令

系列综述&#xff1a; &#x1f49e;目的&#xff1a;本系列是个人整理为了学习基本的shell编程和linux命令&#xff0c;整理期间苛求每个知识点&#xff0c;平衡理解简易度与深入程度。 &#x1f970;来源&#xff1a;材料主要源于b站大学——linux运维课程进行的&#xff0c;…

安装多个MySQL版本时如何连接到不同的数据库

当安装多个版本的数据库时&#xff0c;不同版本的端口名不一样&#xff0c;可以使用以下命令进行连接 mysql -uroot -p数据库密码 -h主机名 -P端口号 数据库主机名默认是localhost&#xff0c;端口号默认是3306&#xff0c;当安装多个版本数据库时&#xff0c;需要记住数据库的…

【多线程】CAS的应用 | CAS的概念 | 实现原子类 | 实现自旋锁

文章目录 一、CAS1.什么是CAS2.实现原子类3.实现自旋锁 一、CAS 1.什么是CAS Compare and swap 比较并交换。 比较交换的是 内存 和 寄存器 比如此时有一个内存 : M。 还有两个寄存器A,B ​ CAS ( M , A , B ) :如果M和A的值相同的话&#xff0c;就把M和B的值进行交换(交换的…

排序之插入排序:从斗地主到插入排序

目录 1.斗地主如何摸牌 2.从摸牌想到插入排序 3.完成插入排序 4.结束语 1.斗地主如何摸牌 不知道各位是否玩过几乎人人都玩过的斗地主游戏呢&#xff1f;相必各位或多或少都玩过一点&#xff0c;再没玩过也看别人打过。今天博主就将从这个游戏为大家讲解我们的插入排序。 在…

React vs Vue.js:两种流行框架背后的设计哲学差异

Vue.js 和 React 虽然都是流行的前端框架,但在设计哲学上有一些显著差异。这些差异源自它们不同的设计目标和出发点。 vue.js Vue.js 的核心设计原则是"渐进式"。它旨在尽可能降低学习成本和入门门槛,并与其他库和项目保持良好的整合性。Vue 的设计注重简单性和直观…

C语言堆区内存管理

一、C语言编译的内存分配 二、堆区空间的分配 1、malloc函数 功能&#xff1a;从堆区分配内存 #include <stdlib.h> void *malloc(unsigned int size)//size 分配内存的字节数2、free函数 功能&#xff1a;释放内存 #include <stdlib.h> void free(void *ptr)…

数据恢复宝典:应对磁盘损坏无法读取的终极攻略

当电脑屏幕上突然弹出“磁盘损坏无法读取”的提示时&#xff0c;许多人的心情都会瞬间跌入谷底。那些存储在磁盘中的重要文件、珍贵的回忆&#xff0c;似乎在一瞬间都化为乌有。面对这样的困境&#xff0c;我们该如何应对&#xff1f;本文将深入探讨磁盘损坏无法读取的原因&…

常见的经典目标检测算法

目标检测是计算机视觉领域的一个核心任务&#xff0c;它涉及到识别图像中的物体并确定它们的位置。以下是一些常见的经典目标检测算法&#xff1a; R-CNN系列 R-CNN&#xff08;Region-based Convolutional Neural Network&#xff09;是一种用于目标检测的算法&#xff0c;它…

深度学习500问——Chapter08:目标检测(2)

文章目录 8.2.4 R-FCN 8.2.5 FPN 8.2.6 Mask R-CNN 8.2.4 R-FCN R-FCN 有哪些创新点 R-FCN仍然属于two-stage目标检测算法&#xff1a;RPN R-FCN Fully convolutional位置敏感得分图&#xff08;position-sentive score maps&#xff09; our region-based detector is ful…

OpenVINO安装教程 npm版

从 npm Registry安装 OpenVINO™ 工具套件的英特尔发行版 请注意&#xff1a; 仅提供 JavaScript API 专用于所有主要操作系统的用户&#xff1a;Windows、Linux 和 macOS &#xff08;所有 x86_64 / ARM64 架构&#xff09; macOS 仅支持 CPU 推理 系统要求软件要求 Window…

Python 数据结构和算法实用指南(二)

原文&#xff1a;zh.annas-archive.org/md5/66ae3d5970b9b38c5ad770b42fec806d 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 第四章&#xff1a;列表和指针结构 我们已经在 Python 中讨论了列表&#xff0c;它们方便而强大。通常情况下&#xff0c;我们使用 Python…

【C语言】求最小新整数(贪心算法)

文章目录 题目描述方法一方法二 题目描述 给定一个十进制正整数n(0 < n < 1000000000)&#xff0c;每个数位上数字均不为0。n的位数为m。 现在从m位中删除k位(0<k < m)&#xff0c;求生成的新整数最小为多少&#xff1f; 例如: n 9128456, k 2, 则生成的新整数最…

windows ubuntu 子系统:肿瘤全外篇,2. fq 数据质控,比对。

目录 1.质控 2.比对并排序 3.标记PCR重复,使用picard 4.samtools建立索引 首先我们先下载一组全外显子测序数据。nabi sra库&#xff0c;随机找了一个。 来自受试者“16177_CCPM_1300019”(SRR28391647, SRR28398576)的样本“16177_CCPM_1300019_BB5”的基因组DNA配对端文库…

# 从浅入深 学习 SpringCloud 微服务架构(三)注册中心 Eureka(3)

从浅入深 学习 SpringCloud 微服务架构&#xff08;三&#xff09;注册中心 Eureka&#xff08;3&#xff09; 段子手168 1、eureka&#xff1a;高可用的引入 Eureka Server 可以通过运行多个实例并相互注册的方式实现高可用部署&#xff0c; Eureka Server 实例会彼此增量地…

python爬虫小案例——汽车之家

本篇文章是使用bs4中的BeautifulSoup和requests解析网页和获取数据&#x1f451;&#x1f31f; 文章目录 &#x1f31f;前言一、&#x1f349;bs4中的BeautifulSoup二、&#x1f349;bs4的语法三、&#x1f349;内容实践1. 确定想要爬取的内容2. 分析网页3. 获取数据分析 &…

JAVA并发编程面试题

作者有话说&#xff1a;目前正在跟新一系列的java面试题&#xff0c;持续不断更新。需要找工作或者不需要找工作的猴子们&#xff0c;都可以关注一下。着急的可以评论区留留言&#xff0c;面试文档以及简历模板。看到了我会发 1. 说说进程和线程的区别 进程 当一个程序在计算机…