四. TensorRT模型部署优化-quantization(quantization granularity)

目录

    • 前言
    • 0. 简述
    • 1. 量化粒度
    • 2. Per-tensor & Per-channel量化
    • 3. 量化粒度选择的推荐方法
    • 总结

前言

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

本次课程我们来学习课程第四章—TensorRT 模型部署优化,一起来学习量化粒度的选择

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

在这里插入图片描述

0. 简述

Goal:理解量化粒度是什么,如何正确的选择量化粒度,以及量化粒度与精度/计算量/计算效率的关系

这节我们学习量化的第二个小部分—Quantization Granularity(量化粒度),首先我们会讲量化粒度是什么以及为什么需要考虑它,然后讲下量化粒度的一个正确的选择方式是什么,我们什么时候选择什么样的量化粒度,以及这个量化粒度它跟精度,计算量和计算效率之间的关系是什么。

下面我们开始本次课程的学习🤗

1. 量化粒度

量化粒度Quantization Granularity)是量化中有一个非常重要的概念,也是很容易被大家忽视的一个概念,我们在利用 tensorRT 做模型部署的时候其实很少会去接触这个东西,因为 tensorRT 内部其实已经帮你选好了一个最好的量化粒度方案,那这个的话就是 tensorRT 的开发人员他们通过大量的实验得到的一个普遍性的方案。但值得我们注意的是这种普遍性的方案并不是说适用所有的模型,不是说每一个模型的量化都用同一种策略是最好的,我们需要根据不同的情况自己去修改一些量化方案中的量化粒度

那量化粒度到底指的是什么呢?量化粒度主要描述的是量化操作的细致程度或者说作用的局部范围,它其实指的是对于一个 tensor 以多大的粒度去共享 scale 和 z 或者 dynamic range,常见的量化粒度主要有以下几种:

  • per-tensor quantization
  • per-channel quantization
  • per-element quantization

在这里插入图片描述

per-tensor quantization 量化粒度方式我们可以理解为一个 tensor 中所有的 element,所有的 FP32 的数据量化成 INT8 数据时都共享同一个 dynamic range,共享同一个动态范围。上面的左图体现了 per-tensor 量化粒度,其中大的方块我们可以将它理解为一个 tensor,包含 H,W,C 三个维度,其中的每个小方块代表 tensor 中的一个 element 元素,左图中所有小方块都是同一个颜色代表在量化时这个 tensor 中所有的 element 的动态范围都是共享的

per-channel quantization 量化粒度我们可以理解为一个 tensor 中每一个 channel 它都有一个自己的 dynamic range,上面中间的图体现了 per-channel 量化粒度,我们可以看到每一个 channel 的小方块都是同一个颜色,不同 channel 的小方块颜色不同,这就代表在量化时这个 tensor 中每个 channel 中的 element 的动态范围都是共享的

per-element quantization 量化粒度我们可以理解为一个 tensor 中每一个 element 都有一个属于自己的 dynamic range,上面的右图体现了 per-element 量化粒度,我们可以看到每一个小方块的颜色都不同,这就代表在量化时这个 tensor 中每个元素都有一个动态范围,不共享

从上面的描述中我们可以知道其实每种量化粒度它代表的计算量和计算精度不同,比如 per-tensor 量化粒度中所有 element 的动态范围共享,也就是说存储的 scale 和 zero-point 其实都一样只要存储一份就行,计算比较方便;而像 per-element 量化粒度中所有 element 都有一个动态范围,那需要存储 scale 和 zero-point 的空间可能会比较大,计算起来也比较麻烦

2. Per-tensor & Per-channel量化

对于三种不同的量化粒度,比较常见的是 per-tensor 和 per-channel 量化粒度,那我们下面来着重分析这两种量化粒度,它们有什么区别,各自的优缺点有哪些呢?

我们先来看 per-tensor 量化,如下图所示:

在这里插入图片描述

per-tensor

上面图中展示的是一个 tensor 中两个不同 channel 的数据分布,我们可以看到虽然这两个 channel 的数据分布有所不同,但是在 per-tensor 量化粒度下它们选择的 dynamic range 动态范围都是相同的

per-tensor 量化的优缺点我们可以总结如下:

  • 优点:低延迟,一个 tensor 共享同一个量化参数
  • 缺点:高错误率,一个 scale 很难覆盖所有 FP32 的 dynamic range

相比之下我们来看看 per-channel 的量化,如下图所示:

在这里插入图片描述

per-channel

从图中我们可以清晰的看到 per-channel 和 per-tensor 的区别,对于 tensor 中每一个 channel 不同的数据分布 per-channel 量化粒度下它都有不同的量化参数即 dynamic range 动态范围都是不同的

per-channel 量化的优缺点我们可以总结如下:

  • 优点:低错误率,每一个 channel 都有自己的 scale 来体现这个 channel 中的数据的 dynamic range
  • 缺点:高延迟,需要使用 vector 来存储每一个 channel 的 scale

那现在我们可以思考一下,既然 per-tensor 和 per-channel 量化粒度各有优缺点,那我们什么情况下该用 Per-tensor,什么情况下该用 Per-channel 呢?

3. 量化粒度选择的推荐方法

重点!NVIDIA 从很多实验结果与测试中对于量化粒度的选择总结出了一个一般性的经验,那就是对于 activation values 的量化方法一般会选取 per-tensor 量化,而对于 weights 的量化方法一般会选取 per-channel 量化

在这里插入图片描述

上图展示了典型的 convolution 算子的量化过程,Input Activation Feature Maps 由于是 per-tensor 量化粒度,因此量化系数只有一个,相反 Filter Weights 是 per-channel 量化粒度,因此量化系数有多个,不同的 channel 都有属于自己的 dynamic range,这个就是 per-tensor 和 per-channel 量化粒度的一个选择

那我们来思考下为什么 weight 需要 per-channel 量化粒度呢?为什么不选择和 activation values 相同的 per-tensor 量化粒度呢?这个其实主要有以下两点考虑:

  • BN 计算与线性计算的融合(BN folding)
  • depthwise convolution

我们先来看下 BN 层的计算公式,如下所示:

在这里插入图片描述

另外我们之前的课程中有提到过 Conv 和 BN 一般是可以融合的,因为二者都是线性变换,具体融合公式如下:

在这里插入图片描述

因此线性变换 y = w ∗ x y=w*x y=wx 的 BN folding 虽然可以把 BN 的参数融合在线性计算中,但是因为 BN 的参数是 per-channel 的,如果 weight 用 per-tensor 的话会掉精度,所以因为 BN 的存在我们对于 weights 的量化方法一般会选择 per-channel

另外一个原因是因为 depthwise convolution,如下图所示:

在这里插入图片描述

depthwise convolution

depthwise convolution 中 kernel 的 channel size 是 1,每一个 kernel 针对输入的对应的 channel 做卷积,所以每一个 channel 中的参数可能差别会比较大,如果用 per-tensor 的话容易掉精度比较严重。

下面是一些韩君老师做的一些关于量化粒度选择的实验结果:

模型精度top1 score
MobileNetFP3271.88
MobileNetINT8 Per-channel weight quantization71.56
MobileNetINT8 Per-tensor weight quantization66.88
EfficientNetFP3276.85
EfficientNetINT8 Per-channel weight quantization76.72
EfficientNetINT8 Per-tensor weight quantization12.93

一般像 MobileNet 中存在 depthwise convolution,它在 FP32 的精度是 71.88,INT8 量化时对于权重如果选择的是 per-channel 的量化方式它的精度是 71.56 掉点不是那么严重,但是一旦把权重的量化方式修改为 per-tensor 之后其精度掉点特别严重变成了 66.88,下降了 5%

另外一个模型 EfficientNet 它里面也有 depthwise convolution,因此也有和 MobileNet 同样的问题,在做 INT8 量化时如果权重选择 per-tensor 量化其精度直接变成了 12.93,那几乎整个模型就崩溃了,这个是完全不可取的da

由此可见,我们对于权重的量化粒度选择一般来说都是 per-channel

值得注意的是,目前的 TensorRT 已经默认对于 Activation values 选用 Per-tensor,Weights 选用 Per-channel,这是他们做了多次实验所得出的结果。很多其他平台的 SDK 可能不会提供一些默认的量化策略,这时我们需要谨慎选择,尽快找到掉点的原因

总结

本次课程我们学习了量化粒度以及量化粒度的选择,针对于 activation values 我们一般会选择 per-tensor 的量化方式,而针对于 weights 我们一般会选择 per-channel 的量化方式,这是因为 BN 和 depthwise convolution 的存在如果选择 per-tensor 掉点比较严重。此外 tensorRT 内部其实已经帮我们选好了量化方式,而针对于其他的平台我们需要慎重选择

OK,以上就是量化的第二个小部分量化粒度的全部内容了,下节我们来学习 Calibration 校准,敬请期待😄

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

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

相关文章

[面试题]Spring Boot

[面试题]Java【基础】[面试题]Java【虚拟机】[面试题]Java【并发】[面试题]Java【集合】[面试题]MySQL[面试题]Maven[面试题]Spring Boot[面试题]Spring Cloud[面试题]Spring MVC Spring Boot 涉及到的知识点很多,在内容上,我们会分成两大块&#xff1a…

day38-39| 509. 斐波那契数 70. 爬楼梯 746. 使用最小花费爬楼梯 62.不同路径 343. 整数拆分 96.不同的二叉搜索树

文章目录 前言动态规划理论基础509. 斐波那契数思路方法一 完整动态规划方法二 dp简化版方法三 使用递归 70. 爬楼梯思路方法一 动态规划方法一2 教程里面的简化方法方法二 拓展 746. 使用最小花费爬楼梯思路方法一方法二 拓展 62.不同路径思路 动态规划方法一方法二 递归 63. …

POC EXP | woodpecker插件编写

woodpecker插件编写 目录 woodpecker介绍woodpecker使用插件编写 安装环境 woodpecker-sdkwoodpecker-request 创建Maven项目 Confluence OGNL表达式注入漏洞插件编写 创建Package包和Class类编写POC 漏洞POC代码编写导出jar包将jar包放入woodpecker的plugin目录运行woodpeck…

我主编的电子技术实验手册(07)——串联电路

本专栏是笔者主编教材(图0所示)的电子版,依托简易的元器件和仪表安排了30多个实验,主要面向经费不太充足的中高职院校。每个实验都安排了必不可少的【预习知识】,精心设计的【实验步骤】,全面丰富的【思考习…

宿舍用电管理模块一进三出的升级改造

宿舍用电管理模块一进三出石家庄光大远通电气有限公司产品在高校日常管理工作中,宿舍管理是一项重要工作。宿舍管理内容复杂,而且涉及学生的日常生活,意义重大。其中,学生宿舍内漏电,超负荷用电,违规用电等现象一直是困扰后勤管理的普遍问题。随着学生日常生活方式以及生活用品…

【Pandas驯化-04】Pandas中drop_duplicates、describe、翻转操作

【Pandas驯化-04】Pandas中drop_duplicates、describe、翻转操作 本次修炼方法请往下查看 🌈 欢迎莅临我的个人主页 👈这里是我工作、学习、实践 IT领域、真诚分享 踩坑集合,智慧小天地! 🎇 相关内容文档获取 微信公…

GPTZero:引领AI内容检测

随着人工智能技术的飞速发展,AI生成内容(AIGC)正在迅速改变我们获取和消费信息的方式。然而,AIGC的激增也带来了一系列挑战,尤其是在内容真实性和版权方面。正是在这样的背景下,一家由00后团队创立的公司——GPTZero,以其独特的AI检测工具,迅速崛起为行业的领军者。 一…

【LeetCode215】数组中的第K个最大元素

题目地址 1. 基本思路 用一个基准数e将集合S分解为不包含e在内的两个小集合 S 1 S_{1} S1​和 S 2 S_{2} S2​,其中 S 1 S_{1} S1​的任何元素均大于等于e, S 2 S_{2} S2​的任何元素均小于e,记 ∣ S ∣ |S| ∣S∣代表集合S元素的个数&…

JDBC常见的几种连接池使用(C3P0、Druid、HikariCP 、DBCP)

前言 数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是重新建立一个。连接池技术尽可能多地重用了消耗内存的资源,大大节省了内存。通过使用连接池,将大大提高程序运行效率。常用的…

Java——构造器(构造方法)和 this

一、什么是构造器 构造器(Constructor)是Java类的一种特殊方法,用于初始化对象的状态。构造器在创建对象时被调用,可以对对象的成员变量进行初始化。 我之前的文章《Java——类和对象-CSDN博客》中也提到了构造器。 二、构造器…

【面试题】MySQL常见面试题总结

备战实习,会定期给大家整理常考的面试题,大家一起加油! 🎯 系列文章目录 【面试题】面试题分享之JVM篇【面试题】面试题分享之Java并发篇【面试题】面试题分享之Java集合篇(三) 注意:文章若有错…

AI办公自动化:批量在多个Word文档中插入对应图片

工作任务:文件夹中有多个word文档和word文档名称一致的图片,要把这些图片都插入到word文档中 在chatpgt中输入提示词: 你是一个Python编程专家,写一个Python脚本,具体步骤如下: 打开文件夹:F:…

蓝队-溯源技巧

溯源技巧 大致思想 通常情况下,接到溯源任务时,获得的信息如下 攻击时间 攻击 IP 预警平台 攻击类型 恶意文件 受攻击域名/IP其中攻击 IP、攻击类型、恶意文件、攻击详情是溯源入手的点。 通过攻击类型分析攻击详情的请求包,看有没有攻击者…

零基础入门学用Arduino 第三部分(二)

重要的内容写在前面: 该系列是以up主太极创客的零基础入门学用Arduino教程为基础制作的学习笔记。个人把这个教程学完之后,整体感觉是很好的,如果有条件的可以先学习一些相关课程,学起来会更加轻松,相关课程有数字电路…

8、项目目录结构创建

项目目录结构创建 8.1 三层架构 在spring-boot 的web项目中大都是按照这个思路来的: controller层 —> service层(serviceImpl实现service接口)—> mapper层—> mapper.xml文件 创建目录 commen:存放公共代码的 config:存放配置代码的 controller:后端控制器,…

长连接的钟表程序

实验要求 实现1个钟表程序(服务),多个用户可以从该程序获得时间并在本地显示,用户也可以修改时间。 (1)用户程序可以在计算机上运行,也可以在手机上运行; (2&#xff…

了解统计学中不同类型的分布

目录 一、说明 二、均匀分布: 三、机器学习和数据科学中的均匀分布示例: 3.1 对数正态分布: 3.2 机器学习和数据科学中的对数正态分布示例: 四、 帕累托分布 4.1 什么是幂律? 4.2 机器学习和数据科学中的帕累托分布示例…

怎么找抖音视频素材?在哪里找爆款热门的素材呢?

在短视频时代,拍摄和分享短视频已经成为一种潮流。但是,许多人都会面临一个问题,那就是——视频素材从哪里来?今天,我将为大家介绍几个优质的网站,让你的视频素材不再愁。 蛙学府:https://www.…

如何连接达梦数据库?

连接达梦数据库(DM Database)可以通过多种方式进行,包括使用 JDBC(Java Database Connectivity)驱动程序,这是最常见的方式之一。以下是使用 Java 通过 JDBC 连接达梦数据库的详细步骤: 1. 准备…

pve8群晖rr方式安装(编译失败检查网络或磁盘空间error 23:200问题解决)

PVE 篇二:2024年PVE8最新安装使用指南|安装黑群晖|img格式镜像安装_NAS存储_什么值得买 (smzdm.com) 黑群晖 篇五:2023黑群晖最新安装方式|RR新手也可轻松上手_NAS存储_什么值得买 (smzdm.com) 编译引导提示:检查网络或磁盘空间er…