三. TensorRT基础入门-TensorRT内部的优化模块

目录

    • 前言
    • 0. 简述
    • 1.TensorRT的优化策略
    • 2. Layer Fusion
    • 3. Kernel Auto-Tuning
    • 4. Quantization
    • 总结
    • 参考

前言

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

本次课程我们来学习课程第三章—TensorRT 基础入门,一起来学习 TensorRT 内部优化的策略

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

在这里插入图片描述

0. 简述

本小节目标:简单理解 Tensor 中每个优化策略,为什么可以做层融合以及理解量化的意义

这节我们学习第三章节第三小节—TensorRT 内部的优化模块,这个小节跟大家介绍一下 TensorRT 内部的优化都有哪些以及内部优化策略比如层融合、量化、调度等等是怎么做的

1.TensorRT的优化策略

首先我们来回顾一下 TensorRT 内部的优化策略,如下图所示:

在这里插入图片描述

TensorRT的各类优化策略

2. Layer Fusion

我们一个个看,我们先看层融合,层融合主要包括以下两种方式:

  • Vertical layer fusion(垂直层融合)
    • 用的比较常见,针对 Conv+BN+ReLU 进行融合
  • Horizontal layer fusion(水平层融合)
    • 当模型中有水平方向上比较多的同类 layer 会直接进行融合

在这里插入图片描述

上图中有三个 kernel,分别是 kernel1、kernel2、kernel3,在 kernel 之间有一个 kernel launch 的空档期,存在一个延迟,所以我们就希望减少这个延迟,那如果这三个 kernel 访问的是同一块内存的同一片区域,那么我们就想能不能只访问一次数据,一次就把计算全部做了呢?一个非常直观的方法就是把 kernel1、kernel2 以及 kernel3 全部都放到一个 kernel 上进行实现

所以层融合的优点就在于它可以减少启动 kernel 的开销与 memory 操作,从而提高效率,同时有些计算可以通过层融合优化后跟其它计算合并

在这里插入图片描述

TensorRT vertical layer fusion

在这里插入图片描述

上图是 TensorRT 中垂直层融合的一个典型案例,将 Conv、BN、ReLU 进行层融合

在这里插入图片描述

TensorRT horizontal layer fusion

在这里插入图片描述

上图是 TensorRT 中水平层融合的一个典型案例,将水平方向上的 3 个 1x1 conv 合并,水平层融合在 transformer 和 self-attention 中还是比较常见的,在 transformer 中 q、k、v 的生成过程会用到水平的层融合

我们思考下为什么 Conv、BN、ReLU 三个算子可以进行垂直层融合呢?这其实是与 BN 层的计算有关的,我们先回顾一下 Batch Normalization 的公式,如下所示:

在这里插入图片描述

其中:

  • μ B \mu_B μB:代表均值
  • σ B 2 \sigma_B^2 σB2:代表方差
  • ϵ \epsilon ϵ:一个大于 0 的浮点数,用于防止分母为 0
  • γ \gamma γ:scaling,缩放因子
  • β \beta β:shift,偏移因子

BN 层就是把一个 batch 的图片减均值除以方差,另外需要缩放因子 γ \gamma γ 和偏移因子 β \beta β 参与训练学习的过程,而上面提到的这些数值在推理的时候都是可以提前计算出来

接下来我们把 Conv 和 BN 结合起来看一下,Conv 过程就是一个线性变化,融合 BN 后的整个推导过程如下所示:

在这里插入图片描述

接着再进行展开如下所示:

在这里插入图片描述

其中 w ^ \hat{w} w^ b ^ \hat{b} b^ 这两个参数值可以提前计算出来,所以你的 convolution 和 batch normalization 融合之后依旧是一个线性变换,只是线性变换的参数发生了相应的变化

那我们接着看 ReLU 为什么可以和 Conv+BN 融合呢?

在这里插入图片描述

ReLU function

ReLU 的函数如上图所示,我们可以看到 ReLU 只是做一个截取大于 0 的值,内部没有计算,因此它也可以融合到 Conv+BN 的线性变换公式里面

Tips最近的很多模型经常会有很多种类的 activation function,比如 GELU、Swish、Mish 等等,这些激活函数往往由于计算复杂很难加速,可以尝试改成 ReLU 看看精度和改变后性能的提升

3. Kernel Auto-Tuning

我们要讲的另外一个 TensorRT 优化策略是 Kernel auto-tuning,前面我们利用 CUDA 做矩阵乘法计算 M × N = P M\times N=P M×N=P 的过程中需要手动去调整 grid size、block size 等大小来得到最佳的性能

在这里插入图片描述

GPU的GEMM计算

但实际上 TensorRT 内部对于同一个层会自动使用不同 kernel 函数进行性能测试

  • 比如对于 FC 层中的矩阵乘法,根据 tile size 有很多种 kernel function
  • 例如 32x32、32x64、64x64、64x128、128x128,针对不同硬件 TensorRT 有不同策略

在这里插入图片描述

Volta architecture block diagram

Tips有时你的模型架构由于计算密度不够高的原因,在 kernel auto tuning 时 TensorRT 认为没必要选择 Tensor core 而给你分配 CUDA core 使用

4. Quantization

我们再来看 TensorRT 中非常重要的一个优化策略—量化,这里我们简单介绍下大家有个基本印象就像后续课程我们会详细来介绍。量化是压缩模型的一个很重要的策略,它主要是将单精度类型(FP32)训练权重转变为半精度(FP16)或者整型(INT8,INT4),如下图所示:

在这里插入图片描述

FP32->INT8的量化

我们如何表示浮点数呢?例如圆周率 3.1415926… 该如何表示呢?很显然我们用 8bit 是无法表达这种小数的,IEEE 745 standard 规定了一种表示浮点数的方法,它将浮点数分为三个部分:

  • sign
  • expond(range)
  • significant(fraction,precision)

在这里插入图片描述

FP16表示方法

对于浮点数 0.00368 我们该如何用 IEEE 745 standard 来表示呢?其中的 sign、expond、significant 分别是多少呢?我们如果用 FP16 来表示 0.00368,它其实是 0.00368 = − 1 0 ⋅ 3.68 ⋅ 1 0 − 3 0.00368 = -1^0\cdot3.68\cdot10^{-3} 0.00368=103.68103,因此 FP16 中的 sign=0、expond=-3、significant=3.68

我们来具体看一个例子,浮点数 −6.650390625… 如果用 FP16 来表示,那么它的 sign、expond、significant 三部分内容分别是多少呢?具体表示方法如下图所示,大家可以自己推导下:

在这里插入图片描述

那表示浮点数的方式有很多,上面提到的 FP16 只是其中的一种,那还有 FP32、TF32、BF16 等等,如果浮点数所占用的 bits 越多则表示的精度越高,但随之而来的就是占用的内存空间越大,计算时间越长

在这里插入图片描述

训练的时候因为需要优先考虑精度而不太需要重视速度,所以会使用 FP32 来表示权重和激活值,但在部署的时候,我们需要想办法把 FP32 的数据尽量压缩,因此会用16bits、8bits 甚至 4 bits 来表示它们,这个过程就被称作量化(Quantization)

在这里插入图片描述

那其实在 Training 的时候为了加快速度也有使用两个的技巧,这个方法被称作 Mix precision training(混合精度学习),大家感兴趣的可以看看 Baidu 和 NVIDIA 发表在 ICLR2018 上的 Mixed precision training 这篇 paper

Note:由于量化太过于重要,技巧很多,并且也是目前模型部署最优先考虑的策略,所以下一章节会单独拿出来详细介绍,目前只需要知道量化是干什么的就 OK 了。

总结

本次课程我们主要学习了 TensorRT 的优化策略,并对其中的层融合、Kernel 调度以及量化三个优化策略进行了简单的介绍。层融合的优点就在于它可以减少启动 kernel 的开销与 memory 操作从而提高效率;TensorRT 内部还会对于同一个层自动使用不同 kernel 函数进行性能测试以此来选择适合当前硬件的最佳配置;量化则是一个非常重要的策略,它可以压缩模型同时提高计算速度

OK,以上就是第 3 小节有关 TensorRT 内部的优化模块的全部内容了,下节我们来学习剖析 ONNX 架构,敬请期待😄

参考

  • NVIDIA TensorRT
  • TensorRT 3: Faster TensorFlow Inference and Volta Support
  • What is ReLU and Sigmoid activation function?
  • Matrix Multiplication Background User’s Guide
  • Achieving FP32 Accuracy for INT8 Inference Using Quantization
  • Aware Training with NVIDIA TensorRT
  • Mixed precision training

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

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

相关文章

C++ | 类和对象(上)

目录 什么是类 类的介绍 struct在两种语言中的有何区别 私有变量命名注意点 类的作用域 类的声明定义分离 类的访问限定符 封装 类的实例化 类对象的存储 this指针 一道this指针相关的王炸题: 结语 什么是类 类的介绍 我们举一个日常生活中的例子&…

罗宾斯《管理学》第15版笔记/课后习题/考研真题答案

第Ⅰ篇 管理导论 第1章 工作场所中的管理者和你 1.1 知识结构导图 1.2 考点难点归纳 1.3 课后习题详解 1.4 考研真题详解 附加模块一 管理史 知识结构导图 考点难点归纳 课后习题详解 考研真题详解 第2章 决 策 2.1 知识结构导图 2.2 考点难点归纳 2.3 课后习题详解…

C之·标准库<string.h>

系列文章目录 文章目录 前言一、字符串分割函数1.strtok()2. 总结 前言 <stdlib.h> 是C语言中的一个头文件&#xff0c;提供了一系列用于操作字符串的函数。例如查找子字符串、拼接字符串、比较字符串等等。为了方便开发者进行字符串操作&#xff0c;C语言提供了一个标准…

python爬虫学习-------scrapy的第一部分(二十九天)

&#x1f388;&#x1f388;作者主页&#xff1a; 喔的嘛呀&#x1f388;&#x1f388; &#x1f388;&#x1f388;所属专栏&#xff1a;python爬虫学习&#x1f388;&#x1f388; ✨✨谢谢大家捧场&#xff0c;祝屏幕前的小伙伴们每天都有好运相伴左右&#xff0c;一定要天天…

做App小程序h5的软件 校园小程序有哪些小程序源码平台 微信小程序里发表的展示圈子 怎么将小程序分享到朋友圈小程序社区 小程序在大学校

最近几年&#xff0c;校园外卖跑腿服务市场迅速兴起。由于学生每天课程繁忙&#xff0c;很多人没有时间去食堂或外面的餐厅用餐&#xff0c;校园外卖跑腿平台提供了便捷和快速的解决方案&#xff0c;满足了学生的饮食跑腿需求&#xff0c;并受到越来越多学生的喜爱。 那么&…

C语言程序设计(二)

1、算法、数据结构、程序 为解决一个问题而采取的方法和步骤&#xff0c;就称为“算法”。 2、算法的5大特征 3、判断n是否为素数&#xff1a;只需要从2循环到根号n。 优化原理&#xff1a;素数是因子为1和本身&#xff0c; 如果num不是素数&#xff0c;则还有其他因子&…

stm32单片机开发三、DMA

DMA其实就是一种将ADC的数据寄存器、串口的数据寄存器等等一些数据放到sram中特定位置&#xff0c;方便CPU去读取 比如ADC转换&#xff0c;DMA直接转换的ADC的值放在内存中的特定位置&#xff0c;CPU可以直接去读取 uint16_t AD_Value[4]; //定义用于存放AD转换结果的全局…

上市企业数字赋能指数数据集-2001到2022年(TF-IDF)

01、数据简介 上市公司数字赋能指数是一个用来衡量上市公司利用数字技术提高业务能力和效率的指标。这个指数反映了上市公司利用大数据、云计算和人工智能等数字技术&#xff0c;高效地利用商业资源和信息&#xff0c;并扩展供应关系的能力。市公司数字赋能指数是一种综合性的…

怎么给字符串字段加索引?

怎么给字符串字段加索引&#xff1f; 现在&#xff0c;几乎所有的系统都支持邮箱登录&#xff0c;如何在邮箱这样的字段上建立合理的索引&#xff0c;是我们今天要讨论的问题。 假设&#xff0c;你现在维护一个支持邮箱登录的系统&#xff0c;用户表是这么定义的&#xff1a; …

美富特 | 邀您参加2024全国水科技大会暨技术装备成果展览会

王涛 四川美源环能科技有限公司 技术总监 报告题目&#xff1a;绿色智慧水岛如何助力工业园区污水及再生水资源化利用降碳增效 拥有十余年的环保行业从业经验&#xff0c;对各类前沿物化、生化及膜技术均有丰富的研发、设计及应用经验&#xff0c;先后参与多项重点核心技术…

日本宇宙航空研究“Int-Ball2”自由飞行相机机器人采用的Epson IMU

IMU有助于飞行的稳定控制和电池充电的自动对接- 精工爱普生公司&#xff08;TSE:6724&#xff0c;“Epson”&#xff09;很高兴地宣布&#xff0c;日本宇宙航空研究开发机构&#xff08;JAXA&#xff09;选择了爱普生M-G370系列的惯性测量单元&#xff08;IMU&#xff09;&…

开源相机管理库Aravis例程学习(五)——camera-api

开源相机管理库Aravis例程学习&#xff08;五&#xff09;——camera-api 简介例程代码函数说明arv_camera_get_regionarv_camera_get_pixel_format_as_stringarv_camera_get_pixel_formatARV_PIXEL_FORMAT_BIT_PER_PIXEL 简介 本文针对官方例程中的&#xff1a;03-camera-api…

Swift - 可选项(Optional)

文章目录 Swift - 可选项&#xff08;Optional&#xff09;1. 可选项&#xff08;Optional&#xff09;2. 强制解包&#xff08;Forced Unwrapping&#xff09;3. 判断可选项是否包含值4. 可选项绑定&#xff08;Optional Binding&#xff09;5. 等价写法6. while循环中使用可选…

【论文阅读】互连网络的负载平衡路由算法 (CQR, Channel Queue Routing 通道队列路由)

Channel Queue Routing (CQR) 通道队列路由 1. Channel Queue Routing (CQR) 的动机 (1) 排队论(queueing theory)模型(2) GAL’s latency on tornado traffic(3) Routing tornado traffic with CQR 2. Channel Queue Routing 通道队列路由3. CQR 的性能4. 总结 Channel Queu…

白话机器学习1:分类问题中的评价指标

机器学习中的评价指标非常多&#xff0c;它们用来衡量模型的性能和预测能力。不同类型的机器学习任务可能需要不同的评价指标。以下是一些常见的评价指标&#xff0c;按照不同类型的机器学习任务分类&#xff1a; 对于分类问题&#xff1a; 准确率&#xff08;Accuracy&#…

[NeurIPS-23] GOHA: Generalizable One-shot 3D Neural Head Avatar

[pdf | proj | code] 本文提出一种基于单图的可驱动虚拟人像重建框架。基于3DMM给粗重建、驱动结果&#xff0c;基于神经辐射场给细粒度平滑结果。 方法 给定源图片I_s和目标图片I_t&#xff0c;希望生成图片I_o具有源图片ID和目标图片表情位姿。本文提出三个分支&#xff1a;…

pytorch中创建maskrcnn模型

0.模型输入/输出参数参见 链接: pytorch的mask-rcnn的模型参数解释 核心代码 GeneralizedRCNN(这里以mask-rcnn来解释说明) # 通过输入图像获取fpn特征图,注意这里的backbone不是直接的resnet,而是fpn化后的 features self.backbone(images.tensors) # 由于是mask-rcnn,故而…

SpringCloud系列(10)--Eureka集群原理及搭建

前言&#xff1a;当注册中心只有一个&#xff0c;而且当这个注册中心宕机了&#xff0c;就会导致整个服务环境不可用&#xff0c;所以我们需要搭建Eureka注册中心集群来实现负载均衡故障容错 Eureka架构原理图 1、Eureka集群原理 2、创建Eureka Server端服务注册中心模块 (1)在…

R语言使用sjPlot包优雅绘制回归模型的交互效应图

交互作用效应(p for Interaction)在SCI文章中可以算是一个必杀技&#xff0c;几乎在高分的SCI中必出现&#xff0c;因为把人群分为亚组后再进行统计可以增强文章结果的可靠性&#xff0c;进行可视化后可以清晰的表明变量之间的关系。不仅如此&#xff0c;交互作用还可以使用来进…

Dockerfile实战(SSH、Systemctl、Nginx、Tomcat)

目录 一、构建SSH镜像 1.1 dockerfile文件内容 1.2 生成镜像 1.3 启动容器并修改root密码 二、构建Systemctl镜像 2.1 编辑dockerfile文件 ​编辑2.2 生成镜像 2.3 启动容器&#xff0c;并挂载宿主机目录挂载到容器中&#xff0c;然后进行初始化 2.4 进入容器验证 三、…