三. 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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Centos7.9云计算CloudStack4.15 高级网络配置(3)

上两章的文章都是用的CloudStack的基本网络,这一篇我们来介绍CloudStack的高级网络,这里虚拟机用的是自己配置的内部网络,通过nat方式到物理网络。按照第一篇的文章,安装管理服务器和计算服务器。 并且在管理服务器配置好如下的全…

Ubuntu22.04.4 - apt - 笔记

一、修改源配置 这里使用的时候又出现了联不通的情况,换成国内镜像 在update cp /etc/apt/source.list /etc/apt/source.list.bak vim source.list 换源地址 修改完(网上有,注意:根据Ubuntu版本不一样,部分内同也会不…

免费一年期ssl证书怎么申请?看这里!(教育版、政务版)

自从去年年底开始,各大公有云陆续下架一年期的免费ssl证书,且申请数量都做了限制调整,那么现在去哪里申请免费一年期的ssl证书呢? 一、短期ssl证书 首先了解一下短期免费证书的平台,一般免费证书都为90天有效期&…

kubectl常用命令行介绍

1、kubectl用法概述 kubectl命令⾏的语法如下: $ kubectl [command] [type] [name] [flags] command:命令,用于操作Kubernetes集群资源对象的命令,例如create、delete、describe、get、apply等TYPE:资源对象的类型&am…

外包干了6天,技术明显退步。。。

我是一名大专生,自19年通过校招进入湖南某软件公司以来,便扎根于功能测试岗位,一晃便是近四年的光阴。今年3月,我如梦初醒,意识到长时间待在舒适的环境中,已让我变得不思进取,技术停滞不前。更令…

【xhs爬虫软件】把小红书评论comment接口封装成GUI采集工具!

用Python开发爬虫采集软件,可自动抓取小红书评论数据,并且含二级评论。 小红书的评论接口URL是: https://edith.xiaohongshu.com/api/sns/web/v2/comment/page 开发者模式分析过程: 进而封装成GUI界面软件,如下&…

线程池中常见的几大问题

说说你对线程池的了解? 线程池,是对一系列线程进行管理的资源池,当有任务来时,我们可以使用线程池中的线程,完成任务时不需要被销毁,会重新回到池子中,等待下一次的复用。 为什么要使用线程池…

深入了解直播美颜工具与视频美颜SDK的实现与优化策略

今天,小编将为大家详解视频美颜SDK技术的视线方案与优化策略。 一、美颜工具的实现原理 利用特征提取算法提取人脸的各种特征,如皮肤色调、眼睛大小等。接下来,根据用户设定的美颜参数,对提取的特征进行修改。最后,将…

NodeJS操作符空格漏洞

Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境,它使得 JavaScript 可以脱离浏览器在服务器端运行。Node.js 利用事件驱动、非阻塞 I/O 模型等技术提高了性能,从而在开发领域得到广泛应用,比如Web服务应用(尤其是非阻塞…

社区奶柜:您门前的新鲜便利店

社区奶柜:您门前的新鲜便利店 在快节奏的现代生活中,社区奶柜应运而生,为城市居民提供了极大的便利。这些位于住宅区的自助售卖设备,24小时提供新鲜的乳制品,让您的日常生活更加简单方便。 社区奶柜不仅能够确保提供…

前端代码常见的安全缺陷(一)

目录 1、使用不安全的target blank 问题描述: 修复建议: 2、Javascript 代码劫持 问题描述: 修复建议: 示例: 3、跨站请求伪造 问题描述: 修复建议: 4、遗留的调试代码 问题描述&am…

uniapp:小白1分钟学会使用webSocket(可无脑复制)

uni.connectSocket() uni.$emit页面通信 项目中使用uni.connectSocket()创建webSocket的总结,代码可无脑复制,直接使用。 1、main.js 引入vuex import store from ./store; Vue.prototype.$store store;vuex中封装webSocket 2、vuex的:index…

快速排序题目SelectK问题(力扣75.颜色分类、力扣215.数组中的第K个最大元素、面试题17.14最小K个数)

力扣75.颜色分类 给定一个包含红色、白色和蓝色、共 n 个元素的数组 nums ,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。 我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。 必须在不使用库内置的 sor…

C语言(二维数组)

Hi~!这里是奋斗的小羊,很荣幸各位能阅读我的文章,诚请评论指点,关注收藏,欢迎欢迎~~ 💥个人主页:小羊在奋斗 💥所属专栏:C语言 本系列文章为个人学习笔记&#x…

C语言趣味代码(二)

1.珠玑妙算 1.1 介绍 《珠玑妙算》(Mastermind)是英国Invicta公司于1973年开始销售的一款益智游戏,据说迄今为止已经在全世界销售了5000万套。《珠玑妙算》于1974年获奖后,在1975年传入美国,1976年leslieH.Autl博士甚至还出版了一本名为The…

狗都不学系列——虚拟机的基本使用

前言 虚拟机(Virtual Machine)指通过软件模拟的具有完整硬件系统功能的、运行在一个完全隔离环境中的完整计算机系统。在实体计算机中能够完成的工作在虚拟机中都能够实现。 简单来讲就是我们可以通过虚拟机来安装各种不同的操作系统进行体验。 这次主…

SQL约束

文章目录 约束约束的分类:按照约束的作用效果不同唯一约束主键约束外键约束检查约束非空约束默认值约束 按照是否跟随列和字段属性来创建约束行级约束表级约束 创建约束创建唯一约束创建完表之后创建唯一约束创建表的同时创建唯一约束行级约束表级约束 创建主键约束…

记录一下hive启动metestore服务时报错

【背景说明】 之前hadoop有问题,把hadoop和MySQL删了重装,hive没有动,然后启hive的metastore服务的时候,显示找不到metastore数据库 【报错】 Caused by: java.lang.reflect.InvocationTargetExceptionat sun.reflect.Generated…

完成学校官网页面制作

<!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8"> <title>教务系统</title> <style> .wap{ margin:0 auto; width:955px; } .top{ height:150px; padding-left:85px; …

内旋风铣也挺有意思,不够还没搞透

内旋风铣&#xff0c;这一术语在机械制造业中并不陌生&#xff0c;它代表着一种高效且精确的加工方法。这一技术的名称“内旋风铣”便揭示了其两大核心特点&#xff1a;一是“内”&#xff0c;指的是在工件内部进行加工&#xff0c;通常涉及到难以触及的复杂曲面&#xff1b;二…