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

news2024/9/28 7:34:57

系列文章目录

第一章 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.coloradmin.cn/o/1379488.html

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

相关文章

JVM基础(12)——G1调优

作者简介:大家好,我是smart哥,前中兴通讯、美团架构师,现某互联网公司CTO 联系qq:184480602,加我进群,大家一起学习,一起进步,一起对抗互联网寒冬 学习必须往深处挖&…

解释程序基本原理

解释程序基本原理 1、解释程序的基本结构2、高级语言编译与解释方式的比较 语言处理程序是一类系统软件的总称,其主要作用是将高级语言或汇编语言编写的程序翻译成某种机器语言程序,使程序可在计算机上运行。语言处理程序主要分为汇编程序、编译程序和解…

【详解】结构体的内存对齐(每步配图)

目录 引言: 为什么存在结构体内存对齐? 结构体内存对齐规则: 练习一: 测试代码: 结果如下: 第二个练习:结构体的嵌套问题 测试代码: 代码结果如下: 两个关于结构体的易错…

thinkphp递归实现无限级子分类合并上级children

//设别分类列表public function getCategoryList(){$list = Db::name(categorys)->select(

在vue中实现树形结构的表格,以及对数据结构的处理

需求:有一些告警数据,如果他们的计划编码相同则实现折叠效果,单击某行数据可以进行关闭,状态发生改变,关闭以后按钮禁用。 实现效果:目前所有告警消息都被关闭,如果未被关闭则可以进行关闭 实现…

leetcode 2645. 构造有效字符串的最少插入数-python

题目: 给你一个字符串 word ,你可以向其中任何位置插入 “a”、“b” 或 “c” 任意次,返回使 word 有效 需要插入的最少字母数。 如果字符串可以由 “abc” 串联多次得到,则认为该字符串 有效 。 解题方法 1.先判断字符串是否…

李沐之神经网络基础

目录 1.模型构造 1.1层和块 1.2自定义块 1.3顺序块 1.4在前向传播函数中执行代码 2.参数管理 2.1参数访问 2.2参数初始化 3.自定义层 3.1不带参数的层 3.2带参数的层 4.读写文件 4.1加载和保存张量 4.2加载和保存模型参数 1.模型构造 1.1层和块 import torch fr…

一种具有轨迹优化的无人驾驶车实时运动规划器 论文阅读

论文题目:A Real-Time Motion Planner with Trajectory Optimization for Autonomous Vehicles Abstract 本文的实时规划器首先将空间离散化,然后基于一组成本函数搜索出最佳轨迹。迭代优化所得到的轨迹的Path和Speed。post-optimization计算复杂度低&…

阿里云服务部署docker容器

1.1 为什么要用docker 问题 开发、测试、生产环境不统一,造成项目测试、部署时产生问题 解决方案 使用容器化技术,将环境和项目一起发送给测试、部署人员,测试人数和运维人员直接使用发过 来的环境和项目进行操作,避免环境不统一…

【卡梅德生物】单B细胞技术:牛单抗制备

1.牛单B细胞技术原理 单个B细胞抗体制备技术是近年来新发展的一类快速制备单克隆抗体的技术,基于流式细胞分选技术进行单B细胞单抗制备,利用每个B细胞只含有一个功能性重链可变区DNA序列和一个轻链可变区DNA序列且只产生一种特异性抗体的特性&#xff0c…

嵌入式linux 编译qt5(以v851s为例)

本文参考Blev大神的博客:Yuzuki Lizard V851S开发板 --移植 QT5.12.9教程(群友Blev提供) - Allwinner / 柚木PI-V851S - 嵌入式开发问答社区 (100ask.net) 一. 环境准备 1.下载qt5源码:Open Source Development | Open Source …

MathType绝对是我数学编辑的首选工具!

去年,微软曾说,要去掉Office里的公式编辑器,建议用户使用MathType编辑公式。目前Office用户可以到微软官网安装MathType的插件,现在免费使用,以后要收费。Word里安装这个插件以后,就会出现MathType的菜单。…

双交叉限幅控制总结

空燃比小于等于1使用下图:空燃比大于1,MAX变MIN,MIN变MAX,高低选互换即可。加负荷,先加空气,后加煤气,降负荷,先降煤气,后降空气。 交叉限幅和双交叉限幅的区别 交叉限幅…

磷酸铁锂电池生产污废水需要哪些工艺及设备

磷酸铁锂电池作为一种常见的锂离子电池,已广泛应用于电动汽车、储能系统等领域。然而,在磷酸铁锂电池的生产过程中,难免会产生一定量的污废水。为了有效处理和处理这些污废水,我们需要合适的工艺和设备。 首先,针对磷酸…

java期末复习题

1.任何一个Java程序都默认引入一个包,这个包的名字是________________。 正确答案:java.lang Java程序默认引入的包是java.lang包。这个包是Java语言的核心,它提供了Java中的基础类,包括基本Object类、Class类、String类、基本类…

react 项目结构配置

1 项目整体目录结构的搭建 如下图: 2 重置css样式: normalize.css reset.less ; 第一步 安装 npm i normalize.css 入口文件index.tsx导入:import ‘noremalize.css’ 第二步 创建自己的css样式:在assets文件夹中创建css…

【MySQL】:掌握SQL中DDL的数据库定义与操作

🎥 屿小夏 : 个人主页 🔥个人专栏 : MySQL从入门到进阶 🌄 莫道桑榆晚,为霞尚满天! 文章目录 📑前言一. SQL的分类二. DDL数据库操作2.1 查询所有数据库2.2 查询当前数据库2.3 创建数…

分类预测 | Matlab实现RP-LSTM-Attention递归图优化长短期记忆神经网络注意力机制的数据分类预测【24年新算法】

分类预测 | Matlab实现RP-LSTM-Attention递归图优化长短期记忆神经网络注意力机制的数据分类预测【24年新算法】 目录 分类预测 | Matlab实现RP-LSTM-Attention递归图优化长短期记忆神经网络注意力机制的数据分类预测【24年新算法】分类效果基本描述模型描述程序设计参考资料 分…

《设计模式的艺术》笔记 - 简单工厂模式

介绍 定义一个工厂类,它可以根据参数的不同返回不同类的实例,被创建的实例通常都具有相同的父类。因为在简单工厂模式中用于创建实例的方法是静态方法,因此简单工厂模式又被称为静态工厂方法模式,属于类创建型模式 实现 class Pr…

实现JavaScript的函数链式执行

本篇文章将会实现函数链式执行,链式步骤延时等操作。 1.工具类 const executor (name) > {/*** 执行器名称*/const executorName name;/*** 方法数组*/const methodArray [];/*** 同步执行某个方法*/function run(func){methodArray.push(func);return this…