神经网络(模型)量化介绍 - PTQ 和 QAT

news2024/9/21 0:33:32

神经网络(模型)量化介绍 - PTQ 和 QAT

  • 1. 需求目的
  • 2. 量化简介
  • 3. 三种量化模式
    • 3.1 Dynamic Quantization - 动态量化
    • 3.2 Post-Training Static Quantization - 训练后静态量化
    • 3.3 Quantization Aware Training - 量化感知训练
  • 4. PTQ 和 QAT 简介
  • 5. 设备和运算符支持
  • 6. 选择一种方法
  • 7. 性能结果
  • 8. 精度结果
  • 9. 结论
  • 参考资料

1. 需求目的

  在开发机器学习应用程序时,有效利用服务器端和设备上的计算资源非常重要。为了支持在服务器和边缘设备上更高效的部署,对模型量化的支持将变的更加重要。

  量化利用8位整数(int8)指令来减小模型大小并更快地运行推断(减少延迟),并且可以是实现服务质量目标或甚至适合移动设备上可用资源的模型之间的差异。即使在资源不太受限的情况下,它也可以使您部署更大、更准确的模型。

2. 量化简介

  量化主要是一种加速推理的技术,量化运算符仅支持前向传递。量化是指使用精度较低的数据进行计算和内存访问的技术,与浮点实现相比,通常是 int8。这可以在几个重要领域实现性能提升:

  • 模型尺寸缩小 4 倍;
  • 内存带宽减少 2-4 倍;
  • 由于内存带宽的节省和使用 int8 算法的更快计算,推理速度提高了 2-4 倍(确切的加速取决于硬件、运行时和模型)。

  然而,量化并非没有额外代价。从根本上说,量化意味着引入近似值,由此产生的网络精度略低。这些技术试图最小化完整浮点精度和量化精度之间的差距。

3. 三种量化模式

3.1 Dynamic Quantization - 动态量化

  PyTorch支持的最简单的量化方法称为动态量化。这不仅涉及将权重转换为int8(正如所有量化变量中所发生的那样),而且还涉及在执行计算之前将激活转换为int 8(因此为“动态”)。因此,将使用高效的int8矩阵乘法和卷积实现来执行计算,从而实现更快的计算。然而,激活是以浮点格式读取和写入内存的。

3.2 Post-Training Static Quantization - 训练后静态量化

  通过将网络转换为同时使用整数算术和int8内存访问,可以进一步提高性能(延迟)。静态量化执行额外的步骤,首先通过网络输入数据批,并计算不同激活的结果分布(具体来说,这是通过在记录这些分布的不同点插入“观察者”模块来完成的)。该信息用于确定不同的激活应该在推断时量化的具体程度(一种简单的技术是将整个激活范围简单地划分为256个级别,但我们也支持更复杂的方法)。重要的是,这一附加步骤允许我们在操作之间传递量化值,而不是在每个操作之间将这些值转换为浮点值,然后再转换为整数,从而大大加快了速度。

在PyTorch中,支持几个允许用户优化静态量化的功能:

  • 观察者:可以自定义观察者模块,指定如何在量化之前收集统计信息,以尝试更高级的方法来量化数据。
  • 运算符融合:可以将多个操作融合为一个操作,节省内存访问,同时提高操作的数值精度。
  • 每通道量化:我们可以在卷积/线性层中独立量化每个输出通道的权重,这可以以几乎相同的速度获得更高的精度。

3.3 Quantization Aware Training - 量化感知训练

  量化感知训练(QAT)是第三种方法,也是这三种方法中精度最高的一种。使用QAT,所有权重和激活在训练的前向和后向过程中都是“伪量化”的:也就是说,浮点值被舍入为模拟int8值,但所有计算仍然使用浮点数字完成。因此,训练期间的所有权重调整都是在“感知到”模型最终将被量化这一事实的情况下进行的;因此,在量化之后,该方法通常比其他两种方法产生更高的精度。

4. PTQ 和 QAT 简介

  依据是否要对量化后的参数进行调整,我们可以将量化方法分为量化感知训练(QAT)和训练后量化(PTQ)。 这两种方法的操作区别如下图所示(图左为QAT,图右为PTQ):

此处 " 训练后量化(PTQ) " 通常为 " 静态训练后量化 "

在这里插入图片描述

  量化感知训练 QAT 是将训练过的模型量化后又再进行重训练。由于定点数值无法用于反向梯度计算,实际操作过程是在某些op前插入伪量化节点(fake quantization nodes), 用于在训练时获取流经该op的数据的截断值,便于在部署量化模型时对节点进行量化时使用。我们需要在训练中通过不断优化精度来获取最佳的量化参数。由于它需要对模型进行训练, 对操作人员技术要求较高。

  训练后量化 PTQ 是使用一批校准数据对训练好的模型进行校准, 将训练过的FP32网络直接转换为定点计算的网络,过程中无需对原始模型进行任何训练。只对几个超参数调整就可完成量化过程, 且过程简单快速, 无需训练, 因此此方法已被广泛应用于大量的端侧和云侧部署场景, 我们优先推荐您尝试PTQ方法来查看是否满足您的部署精度和性能要求 。

5. 设备和运算符支持

  量化支持仅限于可用运算符的子集,具体取决于所使用的方法,有关支持的运算符列表,请参阅https://pytorch.org/docs/stable/quantization.html上的文档。

  可用运算符集和量化数值还取决于用于运行量化模型的后端。当前量化运算符仅支持以下后端中的 CPU 推理:x86 和 ARM。量化配置(张量应该如何量化和量化内核(量化张量的算术)都是后端相关的。

  但是,量化感知训练以全浮点形式进行,可以在 GPU 或 CPU 上运行。当训练后静态或动态量化不能产生足够的准确性时,量化感知训练通常仅用于 CNN 模型。对于为实现小尺寸而高度优化的模型(例如 Mobilenet),可能会发生这种情况。

6. 选择一种方法

  选择使用哪种方案取决于多种因素:

  • 模型/目标要求:某些模型可能对量化敏感,需要进行量化感知训练。
  • 运算符/后端支持:一些后端需要完全量化的运算符。

目前,运算符的覆盖范围有限,可能会限制下表中列出的选择:下表提供了一个指南。

模型类型首选方案为什么
LSTM/RNN动态量化吞吐量由权重的计算/内存带宽决定
BERT/Transformer动态量化吞吐量由权重的计算/内存带宽决定
CNN静态量化吞吐量受激活的内存带宽限制
CNN量化感知训练在静态量化无法达到精度的情况下

7. 性能结果

  与浮点实现相比,量化可将模型大小减少 4 倍,并将速度提高 2 至 3 倍,具体取决于硬件平台和基准测试模型。一些样本结果是:

模型浮点延迟(毫秒)量化延迟(毫秒)推理性能增益设备注释
BERT5813131.8倍Xeon-D2191 (1.6GHz)批量大小 = 1,最大序列长度 = 128,单线程,x86-64,动态量化
Resnet-502141032倍Xeon-D2191 (1.6GHz)单线程,x86-64,静态量化
Mobilenet-v297175.7倍Samsung S9静态量化,浮点数基于 Caffe2 运行时,未优化

8. 精度结果

  我们还将静态量化模型的准确性与 ImageNet 上的浮点模型进行了比较。对于动态量化,我们在 MRPC 的 GLUE 基准上比较了 BERT 的 F1 分数。

计算机视觉模型精度

模型Top-1 Accuracy(浮点)Top-1 Accuracy(量化)量化方案
Googlenet69.869.7静态训练后量化
Inception-v377.577.1静态训练后量化
ResNet-1869.869.4静态训练后量化
Resnet-5076.175.9静态训练后量化
ResNext-101 32x8d79.379静态训练后量化
Mobilenet-v271.971.6量化感知训练
Shufflenet-v269.468.4静态训练后量化

语音和 NLP 模型准确性

模型F1 (GLUEMRPC) 浮点F1 (GLUEMRPC) 量化量化方案
BERT0.9020.895动态量化

9. 结论

  要开始在 PyTorch 中量化您的模型,请从PyTorch 网站上的教程开始。如果您正在处理序列数据,请从LSTM或BERT的动态量化开始。如果您正在处理图像数据,那么我们建议您从量化迁移学习教程开始。然后你可以探索静态训练后量化。如果你发现训练后量化的精度下降太高,那么尝试量化感知训练。

参考资料

参考资料1

  • 标题:Introduction to Quantization on PyTorch
  • 作者:Raghuraman Krishnamoorthi, James Reed, Min Ni, Chris Gottbrath, and Seth Weidman
  • 链接:https://pytorch.org/blog/introduction-to-quantization-on-pytorch/

参考资料2

  • 标题:deploying quantization-aware trained networks using tensorrt
  • 作者:Dheeraj Peri, Jhalak Patel, Josh Park
  • 链接:https://developer.download.nvidia.cn/video/gputechconf/gtc/2020/presentations/s21664-toward-int8-inference-deploying-quantization-aware-trained-networks-using-tensorrt.pdf

参考资料3

  • 链接:https://developer.horizon.ai/forum

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

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

相关文章

Flutter 小技巧之 3.7 性能优化background isolate

Flutter 3.7 的 background isolate 绝对是一大惊喜,尽管它在 release note 里被一笔带过 ,但是某种程度上它可以说是 3.7 里最实用的存在:因为使用简单,提升又直观。 Background isolate YYDS 前言 我们知道 Dart 里可以通过新建…

CODESYS开发教程9-文件读写(CAA File库)

今天继续我们的小白教程,老鸟就不要在这浪费时间了😊。 前面一期我们介绍了CODESYS的定时器及触发相关的功能块。这一期主要介绍CODESYS的CAA.File库中的目录和文件读写功能块,主要包括文件路径、名称、大小的获取以及文件的创建、打开、读、…

软测(概念) · 软件测试的基本概念 · 什么是需求 · 测试用例的概念 · 软件错误(bug)的概念

一、什么是软件测试软件测试和开发的区别测试和调试的区别一个优秀的软件测试人员具备的素质二、什么是需求从测试人员角度看待需求三、测试用例的概念四、软件错误(bug)的概念一、什么是软件测试 最常见的解释是:软件测试就是找 BUG&#x…

个人博客美化

总体参考: Butterfly 文档:https://butterfly.js.organzhiyu :https://anzhiy.cn张洪 Heo :https://blog.zhheo.comLeonus :https://blog.leonus.cn 注:博客所有美化大部分(全部)都参…

React项目实战之租房app项目(九)登录模块基础布局和功能实现

前言 目录前言一、房屋详情模块二、登录模块2.1 登录模块效果图2.2 基础布局2.3 调用接口实现登录2.4 实现表单验证功能2.4.1 formik介绍2.4.2 formik基本使用2.4.3 添加表单验证2.5 代码优化总结一、房屋详情模块 房屋详情模块主要是展示之前获取到的房源信息,由于…

为防护加码,飞凌嵌入式i.MX93系列开发板让通信安全又稳定

来源:飞凌嵌入式官网www.forlinx.com随着新基建的加快推进,智能制造迎来了更好的发展时机,嵌入式板卡等智能设备也在更多的应用场景中大放异彩。但随着现场的设备数量的剧增,环境中的各种干扰信号也随之增加,这就对设备…

windows下GitHub的SSH key配置

SSH Key 是一种方法来确定受信任的计算机,从而实现免密码登录。 Git是分布式的代码管理工具,远程的代码管理是基于SSH的,所以要使用远程的Git则需要SSH的配置。 下面的步骤将完成 生成SSH密钥 并 添加公共密钥到GitHub上的帐户 先设置GitHub…

Apifox接口测试工具详细解析

最近发现一款接口测试工具--apifox,我我们很难将它描述为一款接口管理工具 或 接口自测试工具。 官方给了一个简单的公式,更能说明apifox可以做什么。 Apifox Postman Swagger Mock JMeter Apifox的特点: 接口文档定义: Apif…

接口测试学习第二天

1、全局变量 概念:在postman全局生效的变量,全局唯一。设置: 代码设置:pm.globals.set("glb_age",100)//示例: pm.globals.set("glb_age",100) 获取: 代码获取:var 接收值…

Java的内部类详解(成员内部类、静态内部类、局部内部类、匿名内部类)

Java知识点总结:想看的可以从这里进入 目录2.2.4、 内部类1、成员内部类2、静态内部类3、局部内部类4、匿名内部类2.2.4、 内部类 一个类定义在另一个类内,那么这个类就是一个内部类,比如:在类A中定义一个类B,B就是内…

英特尔锐炫秒杀RTX 3060,XeSS现已支持超过35款游戏!

一款显卡的性能可以达到什么程度?除了架构、规格等硬件因素,驱动的优化程度同样至关重要。Intel携带Arc锐炫回归独立显卡市场,作为“后起之秀”,驱动的优劣更是关键中的关键。Intel也正是这么做的。2022年6月,Intel正式…

2023 NFT防骗指南:六大骗局,3招带你远离…

网上流传着一句:币圈一天,人间一年。在刚刚过去的农历新年,一直低迷的加密领域迎来了“短暂性复苏”,加密市场总市值重回万亿美元。 同时复苏的还有NFT市场,据欧科云链OKLink链上数据显示,2023年1月份的NFT…

计算机网络-http协议版本对比

概述 HTTP 是基于 TCP/IP 协议的一个应用层协议,是现代互联网的一个基础协议。规定了客户端与服务端之间的通信格式以及所占用的服务端口80(HTTPS是443)。 超文本传输协议(Hyper Text Transfer Protocol,HTTP)是一个简单的请求-响…

【Flutter】Flutter Developer 101 入门小册 专栏指引

你好,我是小雨青年,一名程序员。 在2023年,我决定做这个Flutter专栏,从基础到部署,一站式解决大家对于Fulltter的学习需求。 目前本专栏的大概目录为本文最后所示,后续随着内容的不断更新,会逐…

2023年“华数杯”国际大学生数学建模B题赛题发布

ICM 问题B:社会稳定早期预警研究 背景 人类和所有的动物一样,都有寻求利益和避免伤害的本能。人类成为创造之主 的关键在于,他们比其他动物更善于避免伤害。危机总是潜伏着未来。人类发展的 历史是一部不断尝试超越危机的历史 (严耀军&#x…

鸿蒙开发学习|基础环境和开发工具

系列文章目录 第一章 HarmonyOS是什么 第二章 基础环境和开发工具 文章目录系列文章目录前言一、DevEco Studio工具简介二、DevEco Studio搭建开发流程1.运行环境要求2.下载和安装DevEco Studio三、安装HarmonyOS开发插件总结前言 HUAWEI DevEco Studio是基于IntelliJ IDEA C…

三阶魔方七步还原法公式备忘录

魔方公式备忘 转动符号图解 魔方七步公式: 1.底面十字还原 2.底角还原 3.中间层还原 上棱到左棱 U’L’U’LUFUF’ 上棱到右棱 URUR’U’F’U’F 4.顶面十字 循环做FRUR’U’F’直到出现十字 5.顶面还原(小鱼公式) 左手 L’U’LU’L’U’2L …

2、Maven——IDEA与eclipse(MyEclipse)创建工程的区别、Maven创建基本java工程

目录 一、IDEA与eclipse创建工程的区别 二、IDEA创建多个工程 1、 创建空工程:Empty Project 2、创建Module 三、Maven创建基本java工程 1、pom.xml 2、依赖坐标的使用 3、远程Maven仓库 4、Maven项目框架 (1) main目录 &#xff…

MySQL之主从复制集群搭建

简述 这篇文章主要记录使用docker compose搭建MySQL主从复制集群搭建,方便后续进行本地测试开发。 这篇文章主要介绍一主一从的搭建过程。 主从架构,可以缓解MySQL的数据存储以及访问的压力。 一. 主从复制原理 原理图如下: 步骤&#xf…

AVL平衡树(Java实现)

概念 AVL树可以定义为高度平衡二叉搜索树,其中每个节点与平衡因子相关联,该平衡因子通过从其左子树的子树中减去其右子树的高度来计算。AVL树是由GM Adelson - Velsky和EM Landis于1962年发明的。为了纪念其发明者,这树结构被命名为AVL。 定…