模型量化 | Pytorch的模型量化基础

官方网站:Quantization — PyTorch 2.1 documentation

Practical Quantization in PyTorch | PyTorch

量化简介

量化是指执行计算和存储的技术 位宽低于浮点精度的张量。量化模型 在张量上执行部分或全部操作,精度降低,而不是 全精度(浮点)值。这允许更紧凑的模型表示和 在许多硬件平台上使用高性能矢量化操作。 与典型的 FP32 模型相比,PyTorch 支持 INT8 量化,

  • 模型大小减少 4 倍
  • 内存带宽减少 4 倍
  • INT8 计算的硬件支持通常为 2 到 4 个 与 FP32 计算相比,速度快几倍

量化主要是一种技术 加速推理,量化仅支持前向传递 运营商。

PyTorch 支持多种量化深度学习模型的方法。在 大多数情况下,模型在 FP32 中训练,然后将模型转换为 INT8 中。此外,PyTorch 还支持量化感知训练,这 使用以下方法对前向和后向传递中的量化误差进行建模 假量化模块。请注意,整个计算是在 浮点。在量化感知训练结束时,PyTorch 提供 转换函数,用于将训练好的模型转换为较低精度的模型。

在较低级别,PyTorch 提供了一种表示量化张量和 使用它们执行操作。它们可用于直接构建模型 以较低的精度执行全部或部分计算。更高级别 提供了包含转换 FP32 模型的典型工作流的 API 以最小的精度损失降低精度。

pytorch从1.3 版开始,提供了量化功能,PyTorch 1.4 发布后,在 PyTorch torchvision 0.5 库中发布了 ResNet、ResNext、MobileNetV2、GoogleNet、InceptionV3 和 ShuffleNetV2 的量化模型。

PyTorch 量化 API 摘要

PyTorch 提供了两种不同的量化模式:Eager Mode Quantization 和 FX Graph Mode Quantization。

Eager Mode Quantization 是一项测试版功能。用户需要进行融合并指定手动进行量化和反量化的位置,而且它只支持模块而不是功能。

FX Graph Mode Quantization 是 PyTorch 中一个新的自动化量化框架,目前它是一个原型功能。它通过添加对函数的支持和自动化量化过程来改进 Eager Mode Quantization,尽管人们可能需要重构模型以使模型与 FX Graph Mode Quantization 兼容(符号上可追溯到 )。请注意,FX Graph Mode Quantization 预计不适用于任意模型,因为该模型可能无法符号跟踪,我们将它集成到 torchvision 等域库中,用户将能够量化类似于 FX Graph Mode Quantization 支持的域库中的模型。对于任意模型,我们将提供一般准则,但要真正使其工作,用户可能需要熟悉,尤其是如何使模型具有符号可追溯性。torch.fxtorch.fx

PyTorch量化结构

  • PyTorch 具有与量化张量对应的数据类型,这些张量具有许多张量的特征。
  • 人们可以编写具有量化张量的内核,就像浮点张量的内核一样,以自定义其实现。PyTorch 支持将常见操作的量化模块作为 和 name-space 的一部分。torch.nn.quantizedtorch.nn.quantized.dynamic
  • 量化与 PyTorch 的其余部分兼容:量化模型是可跟踪和可编写脚本的。服务器和移动后端的量化方法几乎相同。可以轻松地在模型中混合量化和浮点运算。
  • 浮点张量到量化张量的映射可以使用用户定义的观察者/假量化模块进行自定义。PyTorch 提供了适用于大多数用例的默认实现。

【量化张量,量化模型 ,工具上的量化】

PYTORCH的三种量化模式

🫧动态量化 Dynamic qunatization:使权重为整数(训练后)

🤖训练后静态量化 Static quantization:使权值和激活值为整数(训练后)

量化感知训练 Quantization aware training:以整数精度对模型进行训练

🫧动态量化

PyTorch 支持的最简单的量化方法称为动态量化。这不仅涉及将权重转换为 int8(就像所有量化变体一样),还涉及在进行计算之前将激活转换为 int8(因此是“动态”的)。因此,计算将使用高效的 int8 矩阵乘法和卷积实现来执行,从而加快计算速度。但是,激活以浮点格式读取和写入内存。

🤖训练后静态量化

可以通过将网络转换为同时使用整数算术和 int8 内存访问来进一步提高性能(延迟)。静态量化执行额外的步骤,即首先通过网络提供批量数据并计算不同激活的结果分布(具体来说,这是通过在记录这些分布的不同点插入“观察者”模块来完成的)。此信息用于确定在推理时应如何具体量化不同的激活

量化感知训练

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

官网中提供的一些建议,不同的网络选择不同的量化模式:

结果显示在性能和精度上都有提高

计算机视觉模型精度

语音和自然语言处理精度

量化实例

目前torchvision【2】中提供的7个量化模型如图(截止20231227)

实例1:量化resnet18网络

(beta) Quantized Transfer Learning for Computer Vision Tutorial — PyTorch Tutorials 2.2.0+cu121 documentation

 实例2:量化MobileNet v2 网络

양자화 레시피 — 파이토치 한국어 튜토리얼 (PyTorch tutorials in Korean)

 

Q&A

【Q&A1】模型量化,剪枝的区别是什么?

模型量化和剪枝是两种不同的技术,用于减小神经网络模型的大小、加速推理过程并降低模型的计算复杂度。它们的主要区别在于优化模型的方式和目标。

模型量化(Quantization)

  • 定义:模型量化是通过减少模型中参数的表示精度来实现模型压缩的过程。通常,神经网络模型中的参数是使用浮点数表示的,而量化则将这些参数表示为更少比特的定点数或整数,从而减小了内存占用和计算成本。
  • 目标:减小模型的存储空间和加速推理过程。通过使用较少位数的表示来存储权重和激活值,模型的存储需求减少,且在硬件上执行推理时,可以更快地进行计算。

剪枝(Pruning)

  • 定义:剪枝是一种技术,通过减少神经网络中的连接或参数来减小模型的大小。在剪枝过程中,通过将权重较小或对模型贡献较小的连接移除或设为零,从而减少模型的复杂度。
  • 目标:减小模型的尺寸和计算负载。剪枝不仅可以减少模型的存储需求,还可以在推理时减少乘法操作,因为移除了部分连接或参数,从而提高推理速度。

虽然两者都致力于减小模型的大小和计算复杂度,但方法和实现方式略有不同。模型量化侧重于减小参数表示的精度,而剪枝则专注于减少模型的连接或参数数量。通常,这两种技术可以结合使用,以更大程度地减小神经网络模型的尺寸和提高推理效率。

【Q&A2】减小模型的大小的方法有什么?

深度压缩(Deep Compression)

  • 这是一种综合性的方法,包括剪枝、权重共享和 Huffman 编码等步骤。它不仅剪枝模型中的连接,还可以通过权重共享和 Huffman 编码来进一步减小模型的大小。这种方法通常能够在保持模型性能的同时大幅减小模型大小。

知识蒸馏(Knowledge Distillation)

  • 这是一种将大型模型中的信息转移到小型模型的技术。通过训练一个较小的模型去模仿大型模型的行为,以捕捉大型模型的复杂性和性能。这样可以在不损失太多性能的情况下使用更小的模型。

低秩近似(Low-Rank Approximation)

  • 通过矩阵分解等方法将模型中的权重矩阵近似为低秩矩阵,从而减少模型参数数量。这种方法可以有效地减小模型的尺寸,但有时会对模型性能产生一定影响。

网络架构优化

  • 重新设计模型架构以减少参数数量和计算量。可以通过精心设计模型结构,如使用轻量级网络、深度可分离卷积等技术,来降低模型的复杂度。

权重量化和编码

  • 类似于模型量化,可以对权重进行更复杂的编码或量化方式,以更有效地表示权重并减少模型大小。

这些方法可以单独使用,也可以组合使用,根据具体的情况和需求来选择合适的技术来减小模型的大小。常常需要在压缩模型尺寸和保持模型性能之间找到平衡。

参考文献

【1】Introduction to Quantization on PyTorch | PyTorch

【2】vision/torchvision/models/quantization at main · pytorch/vision (github.com) 

【3】量化自定义PyTorch模型入门教程 - 知乎 (zhihu.com)

【4】 深度学习知识六:(模型量化压缩)----pytorch自定义Module,并通过其理解DoReFaNet网络定义方法。_pytorch dorefa save_for_backward-CSDN博客

【5】端到端Transformer模型的混合精度后量化_量化 端到端-CSDN博客 

【6】transformers 保存量化模型并加载_from transformers import autotokenizer, automodel-CSDN博客 【7】使用 Transformers 量化 Meta AI LLaMA2 中文版大模型 - 苏洋博客 (soulteary.com)

【8】Model Compression - 'Quantization' | LeijieZhang (leijiezhang001.github.io) 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

多线程编程(二)信号量

上边的函数是获取资源,下边的函数是释放资源。信号量就是当有多个线程争夺共享资源的时候信号量相当于管控的,57个人去50个位置的餐厅吃饭,信号量是管理开关门的呢个。 QSemaphore freesapce(buffersize);//缓冲区大小。 QSemaphore usedsp…

Oracle数据updater如何回滚

1.查询update语句执行的时间节点 ; select t.FIRST_LOAD_TIME, t.SQL_TEXT from v$sqlarea t where to_char(t.FIRST_LOAD_TIME) > 2023-03-19/17:00:00 order by t.FIRST_LOAD_TIME desc;开启表的行迁移 alter table test enable row movement;3.回滚表数据到…

uni-app/vue封装etc车牌照输入,获取键盘按键键值

先看下效果如下&#xff1a; 动态图如下 uniapp的keyup获取不到keyCode和compositionstart&#xff0c;compositionend&#xff0c;所以需要监听input节点的keyup事件&#xff0c; 思路以及代码如下&#xff1a; 1.将每一个字符用文本框输入&#xff0c;代码如下 <view …

volatile关键字的作用是什么?

大家好&#xff0c;我是"java继父"伯约&#xff0c;这篇对大家有帮助的话求一个赞&#xff0c;另外文章末尾放了我从月入7k到现在3W的学习资料&#xff0c;大家可以去领一下&#xff08;无偿&#xff09;。 1.防重排序 我们从一个最经典的例子来分析重排序问题。大家…

[python]python使用M-LSD直线检测算法onnx部署模型实时检测

介绍 github地址&#xff1a;https://github.com/navervision/mlsd LSD (M-LSD)一种用于资源受限环境的实时轻量线段检测器。它利用了极其高效的 LSD 架构和新颖的训练方案&#xff0c;包括 SoL 增强和几何学习方案。模型可以在GPU、CPU甚至移动设备上实时运行。算法已开源&a…

云原生机器学习平台cube-studio开源项目及代码简要介绍

1. cube-studio介绍 云原生机器学习平台cube-studio介绍&#xff1a;https://juejin.cn/column/7084516480871563272 cube-studio是开源的云原生机器学习平台&#xff0c;目前包含特征平台&#xff0c;支持在/离线特征&#xff1b;数据源管理&#xff0c;支持结构数据和媒体标…

maven工具的搭建以及使用

文章目录 &#x1f412;个人主页&#x1f3c5;JavaEE系列专栏&#x1f4d6;前言&#xff1a;&#x1f380;首先进行maven工具的搭建&#x1f993;1.[打开下载 maven 服务器官网](http://maven.apache.org)&#x1fa85;2.解压之后&#xff0c;配置环境变量&#x1f3e8;3.打开设…

EasyExcel导出

1.简介 官网&#xff1a;EasyExcel官方文档 - 基于Java的Excel处理工具 | Easy Excel 2.案例 2.1 实现的效果 效果图如下&#xff1a; 2.2 实现步骤 三种情景&#xff0c;主要是表头和数据有区别&#xff0c;简列实现步骤如下&#xff1a; 2.3 具体实现 2.3.1 前置-依赖导入…

双向链表基本操作及顺序和链表总结

目录 基本函数实现 链表声明 总的函数实现声明 创建一个节点 初始化链表 打印 尾插 尾删 头插 头删 查找 pos前插入 删除pos位置 销毁链表 顺序表和链表总结 基本函数实现 链表声明 typedef int DLTDataType;typedef struct DListNode {struct DListNode* nex…

小白必学!手把手教你从零打造Facebook脸书商城

Facebook 脸书商城已经逐渐成为了跨境电商开拓市场的选择&#xff0c;这是因为脸书商城背靠 Facebook 巨大的平台流量&#xff0c;可以链接卖家的品牌&#xff0c;增加品牌曝光率&#xff0c;提高流量&#xff0c;是一个非常好的流量洼地。如果你还没有注册脸书商城&#xff0c…

图像处理-周期噪声

周期噪声 对于具有周期性的噪声被称为周期噪声&#xff0c;其中周期噪声在频率域会出现关于中心对称的性质&#xff0c;如下图所示 带阻滤波器 为了消除周期性噪声&#xff0c;由此设计了几种常见的滤波器&#xff0c;其中 W W W表示带阻滤波器的带宽 理想带阻滤波器 H ( u …

【Fastadmin】通用排序weigh不执行model模型的事件

在model模型类支持的before_delete、after_delete、before_write、after_write、before_update、after_update、before_insert、after_insert事件行为中&#xff0c;我们可以快捷的做很多操作&#xff0c;如删除缓存、逻辑判断等 但是在fastadmin的通用排序weigh拖动中无法触发…

Flink项目实战篇 基于Flink的城市交通监控平台(上)

系列文章目录 Flink项目实战篇 基于Flink的城市交通监控平台&#xff08;上&#xff09; Flink项目实战篇 基于Flink的城市交通监控平台&#xff08;下&#xff09; 文章目录 系列文章目录1. 项目整体介绍1.1 项目架构1.2 项目数据流1.3 项目主要模块 2. 项目数据字典2.1 卡口…

Goby 漏洞发布| Apache OFBiz webtools/control/ProgramExport 远程代码执行漏洞(CVE-2023-51467)

漏洞名称&#xff1a;Apusic 应用服务器 createDataSource 远程代码执行漏洞 English Name&#xff1a;Apache OFBiz webtools/control/ProgramExport remote code execution vulnerability (CVE-2023-51467) CVSS core: 9.8 影响资产数&#xff1a; 5912 漏洞描述&#xf…

堡垒机的演变过程

堡垒机的概念源自跳板机&#xff08;前置机&#xff09;。早在20世纪90年代末21世纪初期&#xff0c;部分中大型企业为了能对运维人员的远程登录进行集中管理&#xff0c;会在机房部署一台跳板机。跳板机其实就是一台unix/windows操作系统的服务器。并且所有运维人员都需要先远…

如何使用甘特图进行项目管理?

或许你在工作中或项目启动会议上听说过“甘特图”一词&#xff0c;但对此了解不多。虽然这些图表可能变得相当复杂&#xff0c;但基础知识并不难掌握。通过本文&#xff0c;你将清楚地了解什么是甘特图、何时使用甘特图、创建甘特图的技巧等等。 什么是甘特图&#xff1f; 甘特…

HBase 例行灾备方案:快照备份与还原演练

博主历时三年精心创作的《大数据平台架构与原型实现&#xff1a;数据中台建设实战》一书现已由知名IT图书品牌电子工业出版社博文视点出版发行&#xff0c;点击《重磅推荐&#xff1a;建大数据平台太难了&#xff01;给我发个工程原型吧&#xff01;》了解图书详情&#xff0c;…

UDP协议工作原理及实战(二)UDP客户端代码实现

这个是一个测试我们写的函数是否正确。 启动服务&#xff1a;这里边的udpsocket->bind(port)就是对端口号进行连接。

【OpenAI Q* 超越人类的自主系统】DQN :Q-Learning + 深度神经网络

深度 Q 网络&#xff1a;用深度神经网络&#xff0c;来近似Q函数 强化学习介绍离散场景&#xff0c;使用行为价值方法连续场景&#xff0c;使用概率分布方法实时反馈连续场景&#xff1a;使用概率分布 行为价值方法 DQN&#xff08;深度 Q 网络&#xff09; 深度神经网络 Q-L…

【本地缓存篇】LFU、LRU 等缓存失效算法

LFU、LRU 等缓存失效算法 ✔️ 解析✔️FIFO✔️LRU✔️LFU✔️W-TinyLFU ✔️ 解析 缓存失效算法主要是进行缓存失效的&#xff0c;当缓存中的存储的对象过多时&#xff0c;需要通过一定的算法选择出需要被淘汰的对象&#xff0c;一个好的算法对缓存的命中率影响是巨大的。常见…