TensorRT模型优化模型部署(七)--Quantization量化(PTQ and QAT)(二)

系列文章目录

第一章 TensorRT优化部署(一)–TensorRT和ONNX基础
第二章 TensorRT优化部署(二)–剖析ONNX架构
第三章 TensorRT优化部署(三)–ONNX注册算子
第四章 TensorRT模型优化部署(四)–Roofline model
第五章 TensorRT模型优化部署(五)–模型优化部署重点注意
第六章 TensorRT模型优化部署(六)–Quantization量化基础(一)
第七章 TensorRT模型优化模型部署(七)–Quantization量化(PTQ and QAT)(二)


文章目录

  • 系列文章目录
  • 前言
  • 一、(PTQ and quantization-analysis)
    • 1.1 PTQ 优缺点
    • 1.2 量化中的sensitive analysis
    • 1.2 Polygraphy
    • 1.3 FP16/INT8对计算资源的利用
  • 二、Quantization(QAT and kernel-fusion)
    • 1.Q/DQ是什么
    • 2.量化流程
  • 总结


前言

理解PTQ和QAT的区别,以及PTQ的优缺点和layer-wise sensitive analysis


一、(PTQ and quantization-analysis)

根据量化的时机,一般我们会把量化分为
• PTQ(Post-Training Quantization),训练后量化
• QAT(Quantization-Aware Training),训练时量化

在这里插入图片描述

PTQ一般是指对于训练好的模型,通过calibration算法等来获取dynamic range来进行量化。
但量化普遍上会产生精度下降。所以QAT为了弥补精度下降,在学习过程中通过Fine-tuning权
重来适应这种误差,实现精度下降的最小化。所以一般来讲,QAT的精度会高于PTQ。但并不
绝对。

1.1 PTQ 优缺点

PTQ(Post-training quantization)也被称作隐式量化(implicit quantization)。我们并不显式的
对算子添加量化节点(Q/DQ),calibration之后TensorRT根据情况进行量化。

优点
• 方便使用,不需要训练。可以在部署设备上直接跑
缺点

  1. 精度下降
    • 量化过程会导致精度下降。但PTQ没有类似于QAT这种fine-tuning的过程。所以权重不会更
    新来吸收这种误差
  2. 量化不可控
    • TensorRT会权衡量化后所产生的新添的计算或者访存, 是否用INT8还是FP16。
    • TensorRT中的kernel autotuning会选择核函数来做FP16/INT8的计算。来查看是否在CUDA
    core上跑还是在Tensor core上跑
    • 有可能FP16是在Tensor core上,但转为INT8之后就在CUDA core上了
  3. 层融合问题
    • 量化后有可能出现之前可以融合的层,不能融合了
    • 量化会添加reformatter这种更改tensor的格式的算子,如果本来融合的两个算子间添加了这
    个就不能被融合了
    • 比如有些算子支持int8,但某些不支持。之前可以融合的,但因为精度不同不能融合了

如果INT8量化后速度反而会比FP16/FP32要慢,我们可以从以上的2和3去分析并排查原因

1.2 量化中的sensitive analysis

从精度分析的角度去弥补PTQ的精度下降,我们可以进行layer-wise的量化分析。这种方法被称
作layer-wise sensitive analysis。每层对模型的重要度比例是不一样的,普遍来讲,模型框架中会有一些层的量化对精度的影响比较大。我们管它们叫做敏感层(sensitive layer)。对于这些敏感层的量化我们需要非常小心。尽量用FP16。敏感层一般靠近模型的输入输出

在这里插入图片描述

在这里插入图片描述

1.2 Polygraphy

Polygraphy 是英伟达推出的一款工具,用于可视化和分析深度学习模型的性能和效果。可以分析并查找模型精度下降并且影响比较大的地方

• onnxruntime与TensorRT engine的layer-wise的精度分析
• 输出每一层layer的权重histogram
• 截取影响整个网络中对精度影响最大的子网,并使用onnx-surgeon单独拿出来

在这里插入图片描述
跑一下Onnx模型再跑一下trt模型,两个模型对比,看激活值差别大概有多大,如果有一个层某个层精度下降比较大就会报错,然后把它取出来。

具体查看官方文档:https://github.com/NVIDIA/TensorRT/tree/main/tools/Polygraphy#examples

1.3 FP16/INT8对计算资源的利用

在做量化后,我们无法指定将量化后的conv或者gemm放在Tensor core还是在CUDA core上计算。这些是TensorRT在帮我们选择核函数的时候自动完成的。查看是否在用Tensor core可以通过下面三个办法

• 使用dlprof
• 使用nsight system
• 使用trtexec

DLProf
DLProf (Deep learning Profiler)工具可以把模型在GPU上的执行情况以TensorBoard的形式打印出来,分析TensorCore的使用情况。DLProf不支持Jetson系列的Profile。对于Jetson,我们可以使用Nsight system或者trtexec。具体查看官方文档:https://developer.nvidia.com/blog/profiling-and-optimizing-deep-neural-networks-with-dlprof-and-pyprof/

Nsight System/trtexec
如果是利用Nsight system的话,我们可以查看到哪一个kernel的时间占用率最高,之后从kernel的名字取推测这个kernel是否在用Tensor Core。
eg:

• h884 = HMMA = FP16 TensorCore
• i8816 = IMMA = INT8 TensorCore
• hcudnn = FP16 normal CUDA kernel (without TensorCore)
• icudnn = INT8 normal CUDA kernel (without TensorCore)
• scudnn = FP32 normal CUDA kernel (without TensorCore)

HMMA: Half-precision matrix multiply and accumulate
Nsight System/trtexec IMMA: Int-precision matrix multiply and accumulate

二、Quantization(QAT and kernel-fusion)

QAT(Quantization Aware Training)也被称作显式量化。我们明确的在模型中添加Q/DQ节点
(量化/反量化),来控制某一个算子的精度。并且通过fine-tuning来更新模型权重,让权重学习
并适应量化带来的精度误差。QAT的核心就是通过添加fake quantization,也就是Q/DQ节点,来模拟量化过程

1.Q/DQ是什么

Q/DQ node也被称作fake quantization node,是用来模拟fp32->int8的量化的scale和
shift(zero-point),以及int8->fp32的反量化的scale和shift(zero-point)。QAT通过Q和DQ
node里面存储的信息对fp32或者int8进行线性变换。
在这里插入图片描述

TensorRT对包含Q/DQ节点的onnx模型使用很多图优化,从而提高计算效率。主要分为
• Q/DQ fusion
通过层融合,将Q/DQ中的线性计算与conv或者linear这种线性计算融合在一起,实现int8计算
• Q/DQ Propagation
将Q节点尽量往前挪,将DQ节点尽量往后挪,让网络中int8计算的部分变得更长
在这里插入图片描述
在这里插入图片描述
QAT的学习过程
• 主要是训练weight来学习误差
Q/DQ中的scale和zero-point也是可以训练的。通过训练来学习最好的scale来表示dynamic range
• 没有PTQ中那样人为的指定calibration过程
不是因为没有calibration这个过程来做histogram的统计,而是因为QAT会利用fine-tuning的数
据集在训练的过程中同时进行calibration,这个过程是我们看不见的。这就是为什么我们在
pytorch创建QAT模型的时候需要选定calibration algorithm。

pytorch支持对已经训练好的模型自动添加Q/DQ节点。详细可以参考https://github.com/NVIDIA/TensorRT/tree/main/tools/pytorch-quantization

2.量化流程

  1. 先进行PTQ
    从多种calibration策略中选取最佳的算法,查看是否精度满足,如果不行再下一步。
  2. 进行partial-quantization
    通过layer-wise的sensitve analysis分析每一层的精度损失,尝试fp16 + int8的组合;fp16用在敏感层(网络入口和出口),int8用在计算密集处(网络的中间),查看是否精度满足,如果不行再下一步。(注意,这里同时也需要查看计算效率是否得到满足)
  3. 进行QAT来通过学习权重来适应误差
    选取PTQ实验中得到的最佳的calibration算法,通过fine-tuning来训练权重(大概是原本训练的10%个epoch),查看是否精度满足,如果不行查看模型设计是否有问题。(注意,这里同时也需要查看层融合是否被适用,以及Tensor core是否被用)

总结

下节介绍channel-level pruning的算法,以及如何使用L1-Norm来让权重稀疏

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

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

相关文章

国产麒麟系统开机没有网络需要点一下这个设置

问题描述: 一台国产电脑网线连接正常,打开网页后显示无法访问,那么是什么原因无法上网呢?下面就告诉你一个小方法去解决一下这个问题; 检查故障: 检测交换机、网线、水晶头全都正常,同房间摆放的…

Hive基础知识(十):Hive导入数据的五种方式

1. 向表中装载数据(Load) 1)语法 hive> load data [local] inpath 数据的 path[overwrite] into table student [partition (partcol1val1,…)]; (1)load data:表示加载数据 (2)local:表示…

【从0上手cornerstone3D】如何渲染一个基础的Dicom文件(含演示)

一、Cornerstone3D 是什么? Cornerstone3D官网:https://www.cornerstonejs.org/ 在线查看显示效果(加载需时间,可先点击运行),欢迎fork 二、代码示例 了解了Cornerstone是什么,有什么作用后&…

竞赛保研 基于深度学习的视频多目标跟踪实现

文章目录 1 前言2 先上成果3 多目标跟踪的两种方法3.1 方法13.2 方法2 4 Tracking By Detecting的跟踪过程4.1 存在的问题4.2 基于轨迹预测的跟踪方式 5 训练代码6 最后 1 前言 🔥 优质竞赛项目系列,今天要分享的是 基于深度学习的视频多目标跟踪实现 …

2024年湖北职称评审对论文的要求

1.期刊发表版面的时间节点2024年12月及之前 2.期刊是正规的期刊,有国内刊号 3.期刊能在国家出版社总署检索到 4.文章内容查重符合知网查重标准 5.论文方向和申报专业方向一致 6.必须要是第一作者或者独著 7.评正高的人才们要准备中文核心论文两篇或出版专业学术论著…

UE5 简易MC教程学习心得

https://www.bilibili.com/video/BV12G411J7hV?p13&spm_id_frompageDriver&vd_sourceab35b4ab4f3968642ce6c3f773f85138 ———— 目录 0.摧毁逻辑学习 1.发光材质灯方块 2.封装。想让子类 不更改父类的变量。 3.材质命名习惯。 0.摧毁逻辑学习 达到摧毁的条件…

用模方软件进行模型的透明贴图,为什么翻出来透明部分是黑的?

答:透贴需要用PNG格式。 模方是一款针对实景三维模型的冗余碎片、水面残缺、道路不平、标牌破损、纹理拉伸模糊等共性问题研发的实景三维模型修复编辑软件。模方4.1新增自动单体化建模功能,支持一键自动提取房屋结构,平均1栋复杂建筑物只需3…

JAVA毕业设计121—基于Java+Springboot的房屋租赁管理系统(源代码+数据库+9000字文档)

毕设所有选题: https://blog.csdn.net/2303_76227485/article/details/131104075 基于JavaSpringboot的房屋租赁管理系统(源代码数据库9000字文档)121 一、系统介绍 本项目还有ssm版本,分为用户、房东、管理员三种角色 1、用户: 注册、登…

【机器学习300问】5、什么是强化学习?

我将从三个方面为大家简明阐述什么是强化学习,首先从强化学习的定义大家的了解强化学习的特点,其次学习强化学习里特殊的术语加深对强化学习的理解,最后通过和监督学习与无监督学习的比较,通过对比学习来了解强化学习。 一、强化…

thinkphp6报错Driver [Think] not supported.

thinkphp6报错Driver [Think] not supported. 问题解决方法测试 问题 直接使用 View::fetch();渲染模板报错 解决方法 这个报错是由于有安装视图驱动造成的 运行如下命令安装即可 composer require topthink/think-view官方文档中是这么写的 视图功能由\think\View类配合视…

JavaScript基础03

1 - 循环 1.1 for循环 语法结构 for(初始化变量; 条件表达式; 操作表达式 ){//循环体 } 名称作用初始化变量通常被用于初始化一个计数器,该表达式可以使用 var 关键字声明新的变量,这个变量帮我们来记录次数。条件表达式用于确定每一次循环是否能被执行…

Python元组(tuple)

目录 元组元组的创建和删除访问元组元素修改元组元组方法 元组 元组是有序且不可更改的集合。在 Python 中,元组是用圆括号编写的。 元组的创建和删除 实例 创建元组: thistuple ("a", "b", "c") print(thistuple)删除…

redis夯实之路-哨兵(Sentinel)机制详解

Sentinel(哨兵)保证了redis的高可用性,一个Sentinel或多个Sentinel组成的系统监视多个主从服务器,当主服务器下线时,自动将一个从服务器升级为主服务器。 sentinel的主要功能 集群监控:负责监控redis mas…

Nightingale 夜莺监控系统 - 监控篇(2)

Author:rab 官方文档:https://flashcat.cloud/docs/content/flashcat-monitor/categraf/3-configuration/ 目录 前言一、Categraf 配置文件二、Input 插件配置文件2.1 插件说明2.2 通用配置2.2.1 配置采集频率 interval2.2.2 配置采集实例 instances2.2…

word写标书的疑难杂症总结

最近在解决方案工作,与office工具经常打交道,各种问题,在此最下记录: 1.word中文档距离文档顶端有距离调整不了 1.疑难杂症问题1,多个空格都是不能解决 #解决办法:word中--布局-下拉框---“版式”--“垂直…

css3基础语法与盒模型

css3基础语法与盒模型 前言CSS3基础入门css3的书写位置内嵌式外链式导入式(工作中几乎不用)行内式 css3基本语法css3选择器标签选择器id选择器class类名原子类复合选择器伪类元素关系选择器序号选择器属性选择器css3新增伪类![在这里插入图片描述](https…

canvas设置渐变色文字(线性、径向)

查看专栏目录 canvas示例教程100专栏,提供canvas的基础知识,高级动画,相关应用扩展等信息。canvas作为html的一部分,是图像图标地图可视化的一个重要的基础,学好了canvas,在其他的一些应用上将会起到非常重…

gitee完整使用教程,创建项目并上传

目录 一 什么是gitee 二 安装Git 三 登录gitee,生成密钥 四 配置SSH密钥 五 创建项目 六 克隆仓库到本地 七 关联本地工程到远程仓库 八 添加文件 九 异常处理 十 删除仓储 十一 git常用命令 一 什么是gitee gitee是开源中国推出的基于git的代码托管服务…

Sqoop性能优化:高效数据传输的技巧

当使用Apache Sqoop进行数据传输时,性能优化至关重要。高效的数据传输可以减少任务运行时间,减轻集群负载,提高整体工作效率。在本文中,将深入探讨Sqoop性能优化的关键技巧,并提供丰富的示例代码,以帮助大家…

短视频账号矩阵剪辑分发系统技术源头开发

1.技术开发必备的开发文档说明: 1.1系统架构: 抖音SEO排名系统主要由以下几个模块组成: 1. 数据采集模块:负责采集抖音上的相关数据,包括视频、用户、话题等。 2. 数据处理模块:对采集到的数据进行处理&a…