热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

TensorRT模型加速|网络结构优化|低精度推理

前言TensorRT优化主要包括网络结构优化和低精度推理,本文将详细介绍这两种优化方式。其中网络结构优化通过“网络层及张量融合”实现,低精度推理通过使

 前言

TensorRT 优化主要包括网络结构优化低精度推理,本文将详细介绍这两种优化方式。其中网络结构优化通过“网络层及张量融合”实现,低精度推理通过使用FP16或INT8进行模型推理实现。


一、低精度推理

背景:神经网络在训练时采用高精度保存参数,一般采用 32 位浮点数(Floating-Point, FP32),因此模型最后的 weights 也是 FP32 格式。

但是一旦完成训练,所有的网络参数就已经是最优,在推理过程中是无需进行反向迭代的,因此可以在推理中使用半精度浮点数 fp16 和 8 位整形数(INT8)计算从而获得更小的模型,低的显存占用率和延迟以及更高的吞吐率。 


1.1 简介

低精度推理是一种较为常用的模型量化算法,通过将原始深度神经网络的高精度数据类型 转换为 低精度类型以达到显著减少网络运算时间的效果。

低精度推理方式,通常有两种:


  • 采用半精度浮点数(Half-Precision Floating-Point,FP16)
  • 或 8 位整形数(INT8)

来代替单精度浮点数(Single-Precision Floating-Point,FP32)的推理以保证模型具有较高的推理速度和精度。



1.2 低精度推理 的原理

训练阶段:卷积神经网络在训练阶段的误差反向传播过程中,有时参数的梯度更新微小,因此其数值表示需要较高的精度,参数需使用单精度浮点数(FP32)进行运算和存储。


即:深度网络训练阶段的前向推理计算损失函数和反向梯度传播、权重参数更新等都是 采用 FP32 方式运算和存储。


推理阶段:可将模型用于前向推理任务(它不需要 计算损失函数和反向梯度传播), 此过程对参数的精度要求较低,因此可以通过稍微降低数据精度的方式来加快模型的前 向推理进程。使用采用半精度浮点数(FP16)或8 位整形数(INT8)。

单精度浮点数(FP32)存储方式如下图所示:

 FP32 数据类型占用 32 位的计算机内存,包含符号位、指数位和 尾数位三个部分,采用浮点基数表示数值的动态范围。


  • 第一部分是符号位,占用 1 个 bit, 符号位为 0 代表该数据为正数,符号位为 1 代表该数据为负数。
  • 第二部分是指数位,占 用 8 个 bits,使用科学计数法表示。
  • 第三部分是尾数位,占用 23 个 bits。

半精度浮点数(FP16)的存储方式如下图所示:

 在计算机内存中占用 16 位,与 FP32 类似,同样包含符号位、指数位和尾数位三个部分。


  • 第一部分 符号位占用 1 个 bit,符号位 为 0 代表该数据为正数,符号位为 1 代表该数据为负数。
  • 第二部分 指数位占用 5 个 bits。
  • 第三部分 尾数位 占用 10 个 bits。

从模型存储方式来看,FP16 模型相比 FP32 模型所占用的存储空间更少, 理论上 FP16 模型占用的存储空间为 FP32 的二分之一。

此外,FP16 模型执行前向推理 运算时占用显存少,网络计算效率高,延迟时间短并且模型吞吐量更大。


二、网络层及张量融合


2.1 简介 

一般的网络结构中都含有较多的层,当模型执行前向推理运算时,每一层的计算都需要通过硬件中的 GPU 调用不同的 CUDA 核心函数来完成相应的计算。


通常 CUDA 核心函数执行张量计算的速度非常快,但是调用 CUDA 核心函数以及读写每一网络层的输入、输出张量消耗大量的时间,导致出现 GPU 资源浪费内存带宽占用等问题。


TensorRT 并不会改变最底层的运算内容,而是对计算流图进行优化。通过合并相同的运算来简化网络。如下图所示,(a)  具有多个卷积层和激活层的网络;(b) Tensor RT 优化后的网络结构。

 (a),这个网络结构中有很多层,在部署模型推理时,每一层的运算操作都是由 GPU 完成的,但实际上是 GPU 通过启动不同的 CUDA 核心来完成计算的。

分析:CUDA 核心计算张量的速度很快,但是大量的时间是浪费在 CUDA 核心的启动和对每一层输入/输出张量的读写操作上面,这造成了内存带宽的瓶颈和GPU资源的浪费。

解决方案:TensorRT 通过对层间横向或纵向合并,合并后的结构称为 CBR(Convolution,Bias and Re LU),使得层的数量大大减少。


纵向合并可以把卷积、偏置和激活层合并成一个 CBR,只占用一个 CUDA 核心。

横向合并可以把结构相同,但是权值不同的层合并成一个更宽的层,也只占用一个 CUDA 核心,如图 (b)中的超宽的 1×1 CBR。


同时,通过预分配输出缓存以及跳跃式写入方法来消除 concat 层。

通过这样的优化,TensorRT 可以获得更小、更快、更高效的计算流图,其拥有更少层的网络结构。下表列出了常见的 3 个网络在 TensorRT 优化后的网络层数量,明显的看到 Tensor RT 可以有效的优化网络结构、较少网络层数从而带来的性能的提升。


2.2 案例:Inception模块 进行网络层及张量融合

TensorRT 解析网络计算图时,通过将网络层及张量进行融合,从而减少CUDA 核心函数的调用次数以及网络层输入、输出张量的读写操作时间,达到模型前向推理加速的目的。

如下图所示,GoogLeNet中的 Inception 模块,以该模块为例阐述网络层及张量融合的过程。


  • 第一步如图(a)为原始网络结构,首先特征图经过 Concat 操作后输入(Input)进模 块,接下来是多组卷积层(Conv)、偏置层(Bias)和激活层(ReLU),然后将多个结 果 Concat 到一起,最终得到下一个输出(Next Input)。
  • 第二步如图(b)所示,将网 络结构进行纵向融合,把神经网络中依次连接的 Conv、Bias 和 ReLU 融合为一层,即 “CBR”层。


  • 第三步如图(c)所示,将网络结构进行横向融合,横向融合是把神经 网路中输入为相同张量以及执行相同操作的层融合为一层,此过程将图 4.3(b)中 3 个 相连的 1×1 CBR 层融合为图 4.3(c)中一个更大的 1×1 CBR 层。
  • 第四步如图(d) 所示,Concat 操作用于实现多个输出矩阵的拼接,TensorRT 能够实现多个输出矩阵与缓 冲区的直接连接,并不需要专门的 Concat 操作,因此可以将其删除,网络当前层的输 出直接输入到下一层网络。

参考文献:

[1] 尹昱航. 基于特征融合的交通场景目标检测方法研究[D]. 大连:大连理工大学, 2021.

[2] 葛壮壮. 基于嵌入式 GPU 的交通灯及数字检测[D]. 四川:电子科技大学, 2020.

 本文直供大家参考学习,谢谢!


推荐阅读
  • 兆芯X86 CPU架构的演进与现状(国产CPU系列)
    本文详细介绍了兆芯X86 CPU架构的发展历程,从公司成立背景到关键技术授权,再到具体芯片架构的演进,全面解析了兆芯在国产CPU领域的贡献与挑战。 ... [详细]
  • Ihavetwomethodsofgeneratingmdistinctrandomnumbersintherange[0..n-1]我有两种方法在范围[0.n-1]中生 ... [详细]
  • 最详尽的4K技术科普
    什么是4K?4K是一个分辨率的范畴,即40962160的像素分辨率,一般用于专业设备居多,目前家庭用的设备,如 ... [详细]
  • 在机器学习领域,深入探讨了概率论与数理统计的基础知识,特别是这些理论在数据挖掘中的应用。文章重点分析了偏差(Bias)与方差(Variance)之间的平衡问题,强调了方差反映了不同训练模型之间的差异,例如在K折交叉验证中,不同模型之间的性能差异显著。此外,还讨论了如何通过优化模型选择和参数调整来有效控制这一平衡,以提高模型的泛化能力。 ... [详细]
  • 在《Linux高性能服务器编程》一书中,第3.2节深入探讨了TCP报头的结构与功能。TCP报头是每个TCP数据段中不可或缺的部分,它不仅包含了源端口和目的端口的信息,还负责管理TCP连接的状态和控制。本节内容详尽地解析了TCP报头的各项字段及其作用,为读者提供了深入理解TCP协议的基础。 ... [详细]
  • 题目解析给定 n 个人和 n 种书籍,每个人都有一个包含自己喜好的书籍列表。目标是计算出满足以下条件的分配方案数量:1. 每个人都必须获得他们喜欢的书籍;2. 每本书只能分配给一个人。通过使用深度优先搜索算法,可以系统地探索所有可能的分配组合,确保每个分配方案都符合上述条件。该方法能够有效地处理这类组合优化问题,找到所有可行的解。 ... [详细]
  • 深入解析经典卷积神经网络及其实现代码
    深入解析经典卷积神经网络及其实现代码 ... [详细]
  • 2020年9月15日,Oracle正式发布了最新的JDK 15版本。本次更新带来了许多新特性,包括隐藏类、EdDSA签名算法、模式匹配、记录类、封闭类和文本块等。 ... [详细]
  • 本文节选自《NLTK基础教程——用NLTK和Python库构建机器学习应用》一书的第1章第1.2节,作者Nitin Hardeniya。本文将带领读者快速了解Python的基础知识,为后续的机器学习应用打下坚实的基础。 ... [详细]
  • 三角测量计算三维坐标的代码_双目三维重建——层次化重建思考
    双目三维重建——层次化重建思考FesianXu2020.7.22atANTFINANCIALintern前言本文是笔者阅读[1]第10章内容的笔记,本文从宏观的角度阐 ... [详细]
  • 非计算机专业的朋友如何拿下多个Offer
    大家好,我是归辰。秋招结束后,我已顺利入职,并应公子龙的邀请,分享一些秋招面试的心得体会,希望能帮助到学弟学妹们,让他们在未来的面试中更加顺利。 ... [详细]
  • 本文介绍如何使用OpenCV和线性支持向量机(SVM)模型来开发一个简单的人脸识别系统,特别关注在只有一个用户数据集时的处理方法。 ... [详细]
  • 本文介绍了几种常用的图像相似度对比方法,包括直方图方法、图像模板匹配、PSNR峰值信噪比、SSIM结构相似性和感知哈希算法。每种方法都有其优缺点,适用于不同的应用场景。 ... [详细]
  • Java Socket 关键参数详解与优化建议
    Java Socket 的 API 虽然被广泛使用,但其关键参数的用途却鲜为人知。本文详细解析了 Java Socket 中的重要参数,如 backlog 参数,它用于控制服务器等待连接请求的队列长度。此外,还探讨了其他参数如 SO_TIMEOUT、SO_REUSEADDR 等的配置方法及其对性能的影响,并提供了优化建议,帮助开发者提升网络通信的稳定性和效率。 ... [详细]
  • 能够感知你情绪状态的智能机器人即将问世 | 科技前沿观察
    本周科技前沿报道了多项重要进展,包括美国多所高校在机器人技术和自动驾驶领域的最新研究成果,以及硅谷大型企业在智能硬件和深度学习技术上的突破性进展。特别值得一提的是,一款能够感知用户情绪状态的智能机器人即将问世,为未来的人机交互带来了全新的可能性。 ... [详细]
author-avatar
iris
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有