模型量化 | 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) 

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

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

相关文章

在Vue2中快速使用ECharts

在Vue2中快速使用ECharts ECharts这里简单介绍一下ECharts的图表其他图表 背景: 因为博主在做项目时,有一个需求要求是可视化渲染出文章的分类信息以及文章内容,当时第一时间就想到了ECharts,因此就引入了在Vue2中快速使用ECharts。 ECharts …

行人重识别数据集-统一为market1501数据集进行多数据集联合训练

一、前言 常用的数据集: 数据集下载链接:https://kaiyangzhou.github.io/deep-person-reid/datasets.html https://kaiyangzhou.github.io/deep-person-reid/datasets.html#sensereid-sensereid 二、数据集合并 第一步:market1501的数据集…

数据分析工具 Top 8

你能想象一个没有工具箱的水管工吗? 没有,对吧? 数据从业者也是如此。如果没有他们的数据分析工具,数据从业者就无法分析数据、可视化数据、从数据中提取价值,也无法做数据从业者在日常工作中做的许多很酷的事情。 根据你最感兴趣的数据科学职业——数…

【架构】企业信息安全体系架构详解

企业信息安全体系架构来说,是包含技术、运维、管理3个层面。本文说的安全架构,主要集中讨论偏研发技术层面的安全架构。 安全性是软件研发技术体系,系统架构设计阶段的一个关键DFX能力,与可靠性、可服务性、性能等架构属性并列。由于安全性设计自身的特点,涉及到系统架构…

highcharts的甘特图设置滚动时表头固定,让其他内容跟随滚动

效果图:最左侧的分类列是跟随甘特图滚动的,因为这一列如果需要自定义,比如表格的话可能会存在行合并的情况,这个时候甘特图是没有办法做的,然后甘特图的表头又需要做滚动时固定,所以设置了甘特图滚动时&…

3dsmax渲染太慢,用云渲染农场多少钱?

对于许多从事计算机图形设计的创作者来说,渲染速度慢是一个常见问题,尤其是对于那些追求极致出图效果的室内设计师和建筑可视化师,他们通常使用3ds Max这样的工具,而高质量的渲染经常意味着长时间的等待。场景复杂、细节丰富&…

15-网络安全框架及模型-BLP机密性模型

目录 BLP机密性模型 1 背景概述 2 模型原理 3 主要特性 4 优势和局限性 5 困难和挑战 6 应用场景 7 应用案例 BLP机密性模型 1 背景概述 BLP模型,全称为Bell-LaPadula模型,是在1973年由D.Bell和J.LaPadula在《Mathematical foundations and mod…

ApiPost插件⭐️与IDEA的搭配使用,通过引入插件直接在项目里一键开测

小伙伴们大家好,用接口测试工具有一段时间了,最近发现该工具有提供插件直接可以在项目里测试接口,并且页面布局不输应用 目录 一、ApiPost插件介绍 二、安装插件 一、ApiPost插件介绍 Apipost 是一个用于测试和调试 API 接口的 IDEA 插件…

MariaDB单机多实例的配置方法

1、什么是数据库的单机多实例 数据库的单机多实例是指在一台物理服务器上运行多个数据库实例。这种部署方式允许多个数据库实例共享相同的物理资源,如CPU、内存和存储,从而提高硬件利用率并降低成本。每个数据库实例可以独立运行,处理不同的…

cpp_07_类型转换构造_析构函数_深拷贝_静态成员

1 类型转换构造函数 1.1 why? 基本类型之间的转换,编译器内置转换规则:int -> double 类类型之间的转换,编译器不知道转换规则,需要用户提供:Cat -> Dog // consconv_why.cpp 为什么需要自定义转换 #includ…

【机器学习】西瓜书第6章支持向量机课后习题6.1参考答案

【机器学习】西瓜书学习心得及课后习题参考答案—第6章支持向量机 1.试证明样本空间中任意点x到超平面(w,b)的距离为式(6.2)。 首先,直观解释二维空间内点到直线的距离: 由平面向量的有关知识,可得: 超平面的法向量为 w w w&am…

「Kafka」入门篇

「Kafka」入门篇 基础架构 Kafka 快速入门 集群规划 集群部署 官方下载地址:http://kafka.apache.org/downloads.html 解压安装包: [atguiguhadoop102 software]$ tar -zxvf kafka_2.12-3.0.0.tgz -C /opt/module/修改解压后的文件名称: [a…

排列组合算法(升级版)

前言 在上一期博客中我们分享了一般的排列组合算法(没看的话点这里哦~),但是缺点很明显,没法进行取模运算,而且计算的范围十分有限,而今天分享的排列组合升级版算法能够轻松解决这些问题,话不多…

构建高效数据中台:集群规划与搭建的最佳实践指南

架构设计 Rack(机架)配置建议 大数据集群规划 安装细节见配套文档 两地三中心 两地三中心是一种信息技术架构模式,通常用于灾难恢复和业务连续性计划。这种模式设计有两个物理位置(两地),在这两个位置上部署了三个数据中心(三中心):一个主数据中心和两个备份数据中心…

使用Visual Studio 2022 winform项目打包成安装程序.exe

winform项目打包 1.安装扩展插件 Microsoft Visual Studio Installer Projects 20222.在解决方案上新建一个setup project 项目3.新建成功如下图,之后添加你的winform程序生成之后的debug下的文件4.在Application Folder上点击右键->Add->项目输出->主输出…

【xdma】 pcie.bar设置

FPGA优质开源项目– PCIE通信 xdma 两者保持一致 FPGA开源项目 – PCIE I/O控制卡 xdma PCIe的XDMA应用 读写部分分为两种,一种是数据的读写,另一种是配置数据的读写,在数据读写部分,DMA通过MIG控制DDR完成数据读写。配置数据…

EasyExcel导出

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

Centos开启防火墙和端口命令

Centos开启防火墙和端口命令 1 课堂小知识1.1 centos7简介1.2 iptables方式开启防火墙 2 操作步骤2.1 开启查看关闭firewalld服务状态2.2 查看端口是否开放2.3 新增开放端口2.4 查看开放的端口 3 防火墙的其他指令 1 课堂小知识 1.1 centos7简介 CentOS 7是CentOS项目发布的开…

【Linux】 last 命令使用

last 命令 用于检索和展示系统中用户的登录信息。它从/var/log/wtmp文件中读取记录,并将登录信息按时间顺序列出。 著者 Miquel van Smoorenburg 语法 last [-R] [-num] [ -n num ] [-adiox] [ -f file ] [name...] [tty...]last 命令 -Linux手册页 选项及作用…

泰迪智能科技“供需对接就业育人项目”介绍

为帮助用人单位培养和招聘更多实用型、复合型和紧缺型人才,推动高校人才培养与就业有机联动、人才供需有效对接促进高校毕业生更加充分更高质量就业,经广东泰迪智能科技股份有限公司申报、全国高校毕业生就业创业指导委员会专家组审核,泰迪智能科技“供需…