模型量化(Model Quantization)

news2024/9/28 19:27:12

1. 简介

模型量化(Model Quantization)通过某种方法将浮点模型转为定点模型。比如说原来的模型里面的权重(weight)都是float32,通过模型量化,将模型变成权重(weight)都是int8的定点模型

模型量化有 8/4/2/1 bit等:

  • 16位: (半精度(FP16),单精度(FP32),双精度(FP64)) Floating points
  • 8位 最常见也相对成熟。各种主流框架和硬件都支持。
  • 8位以下目前而言学界相对玩得多些,工业界有少量支持,但还没有太成熟。8位以下主要是4,2和1位(因为位数为2的幂次性能会更好,也更容易实现)。如果精度低至1位,也就是二值化,那可以用位运算进行计算。这对处理器而言是很友好的。

IEEE标准中的FP16格式如下:

取值范围是5.96× 10−8 ~ 65504,而FP32则是1.4×10-45 ~ 3.4×1038。

从FP16的范围可以看出,用FP16代替原FP32神经网络计算的最大问题就是精度损失。所以量化:

  • 减少内存带宽和存储空间:不仅模型大小明显降低, activation 采用 8-bit 之后也将明显减少对内存的使用,这也意味着低精度推理过程将明显减少内存的访问带宽需求,提高高速缓存命中率,尤其对于像 batch-norm, relu,elmentwise-sum 这种内存约束(memory bound)的 element-wise 算子来说,效果更为明显。
  • 提高系统吞吐量(throughput),降低系统延时(latency):当数据类型为 FP32 而言一条指令能一次处理 16 个数值,但是当我们采用 8-bit 表示数据时,一条指令一次可以处理 64 个数值。因此,在这种情况下,可以让芯片的理论计算峰值增加 4 倍
  • 模型量化增加了操作复杂度,在量化时需要做一些特殊的处理,否则精度损失更严重
  • 模型量化会损失一定的精度,虽然在微调后可以减少精度损失,但推理精度确实下降
案例:量化与反量化

量化的分类

量化主要分为:离线量化(Post Training Quantization,PTQ) 量化感知训练(Quantization Aware Training,QAT)。高通在 2019 年的一篇paper里,为生产量化模型定义了4 种等级:一般我们用的多的就是level2 和level3。

  • Level 1:无数据离线量 无需数据,不需要反向传播,一个 API 调用完成量化模型生产
  • Level 2:有数据离线量化 需要数据,不需要反向传播,数据用于校准 BN,或者统计激活值分布,用于降低误差
  • Level 3:量化感知训练 需要数据,需要反向传播。通过训练和微调使量化模型达到可接受的精度,一般需要完整的训练过程和超参数调整
  • Level 4:修改网络结构的量化感知训练 需要数据,需要反向传播,同时调整网络结构。需要明显更多的训练时间和细致的超参数调整

 2. 方法

量化可分为均匀量化和非均匀量量化。

  • 均匀量化:
    • 二值化: 用1个bit位进行量化
    • 线性量化(对称、非对称、Ristretto):根据Z (zero_point) 是否为0,线性量化可以分为对称量化和非对称量化
  • 非均匀量化
    • 对数量化
    • 其他

如下图所示,量化还可分为对称量化和非对称量化。量化前后0点的值不变的称为对称量化。但在实际过程中,量化的对象分布式不均匀的,不一定在0点值两边对称,所下图右侧所示,量化前后0点的值不同的称为非对称量化。

本质:模型量化就是建立一种浮点数据和定点数据间的映射关系,使得以较小的精度损失代价获得了较大的收益,要弄懂模型量化的原理就是要弄懂这种数据映射关系。

在定点与浮点等数据之间建立一种数据映射关系,将信号的连续取值 近似为 有限多个离散值,并使得以较小的精度损失代价获得了较好的收益。这个映射过程一般用下面的公式来表示:

Q = round(scale factor * clip(x,α,β))+ zero point

这个公式中:x 代表需要量化的数,也就是量化对象,是个浮点型数据。Q代表量化后的数,是个整型数据。公式涉及到3个操作,round操作,clip操作和 scale factor 选取。以及需要确定的值α,β,是clip操作的上下界,称为clipping value

  • zero point 代表的是原值域中的0在量化后的值。在weight或activation中会有不少0(比如padding,或者经过ReLU),因此我们在量化时需要让实数0在量化后可以被精确地表示。
  • round操作:其实就是一种映射关系,决定如何将原来的浮点值按照一定的规律映射到整型值上。举个例子,我们可以选用四舍五入「假设5.4 则取值为5,5.5 则取值为6」的原则,也可以选用最近左顶点「5.4 和 5.5 都取值为5」或者最近右顶点原则等。
  • clip操作:其实就是切片操作,如何来选择这个量化对象的范围。为什么要选这个范围呢,因为量化到n位数后,可以用来表示量化后的整型值就是固定的,只有 2^N 个,这么有限的数据,怎么才能更好去映射原来的浮点值分布呢?这个范围选的太大了(按照原来的最大最小值来选,如下图所示),此时如果在头尾的浮点值只有零星的几个,而且距离其他值非常远,(如果此时是均匀量化)那么这个对于图中 α-α,β-β的离散值可能就被浪费了,这样浮点值到整型值的映射后导致的误差可能就会很大。这个取值是门艺术,大了浪费比特位,小了把就把太多有用信息“切”掉。

所以当前不同的量化算法和优化策略往往是寻找一个恰当的[α,β],使得 clip 和 round 操作导致的误差较小。

scale factor:是表述浮点数和整数之间的比例关系【不同的量化形式取不同的值】,如果是线性均匀量化,那么

总结下,量化的过程就是选取合适量化参数(如scaling factor,zero point,clipping value)以及数据映射方式,让原来的浮点值映射到整型值后,尽量保持准确率不下降(或者在可控范围)。

3. 模型的量化粒度

根据不同的模型量化参数选择范围,可将模型量化的粒度分为:

  • 通道量化(Per-axis/per-channel):对tensor的单个轴有单独的量化参数,如per-channel就是weight的每个channel使用单独的量化参数。通常情况下,per-channel 因为量化的粒度更细致,量化参数的自由度更高,往往更优于 per-tensor 的量化精度。
  • 层量化(Per-tensor/per-layer):每个tensor有单独的量化参数。对于卷积或全连接层这些的话这也就意味着每层独立的量化参数。
  • Global:即整个网络使用相同的量化参数。一般来说,对于8位量化,全局量化参数影响不明显,但到更低精度,就会对准确率有较大影响。

References

一文搞懂模型量化 - 知乎

模型量化 - 知乎

模型量化基本概念介绍 - 知乎

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

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

相关文章

c++ qt--事件过滤(第七部分)

c qt–事件过滤(第七部分) 一.为什么要用事件过滤 上一篇博客中我们用到了事件来进行一些更加细致的操作,如监控鼠标的按下与抬起,但是我们发现如果有很多的组件那每个组件都要创建一个类,这样就显得很麻烦&#xff…

Vue3.0 新特性以及使用变更总结

Vue3.0 在2020年9月正式发布了,也有许多小伙伴都热情的拥抱Vue3.0。去年年底我们新项目使用Vue3.0来开发,这篇文章就是在使用后的一个总结, 包含Vue3新特性的使用以及一些用法上的变更。 图片.png 为什么要升级Vue3 使用Vue2.x的小伙伴都熟悉…

亚马逊云科技 re:Inforce 大会云安全合规与技术实践及 Security Jam 大赛,快来报名吧!...

‍‍ 2023年8月31日在北京 亚马逊云科技 re:Inforce 大会 首次登陆中国! 我们期待您的莅临, 并与您一起迎接 AI 时代, 开启全面智能的安全旅程! 在13:00-17:00的 培训与动手实验环节中 云安全合规与技术实践 及 Security Jam 大赛…

APP爬虫之-Protobuf协议逆向解析

在做APP抓取时,会发现有的APP Response回来的数据有“加密”。不知道返回的内容是什么。 如下: 如上,内容不是明文的,没办法解析数据。APP常见的对数据加密有三种情况:第一种是,用诸如AES这类加密算法对数…

图神经网络和分子表征:3. 不变网络最后的辉煌

写这篇文章的时候已经是2023年的8月份,GNN for molecule property prediction 这个小领域正在变得火热起来,各大榜单被不断刷新,颇有当年 CNN 刷榜 imagenet 的势头。 由于对力、维里等性质有着内禀优势,当下高居榜首的模型毫无疑…

设计模式--工厂模式(Factory Pattern)

一、 什么是工厂模式 工厂模式(Factory Pattern)是一种创建型设计模式,它提供了一种创建对象的接口,但是将对象的实例化过程推迟到子类中。工厂模式允许通过调用一个共同的接口方法来创建不同类型的对象,而无需暴露对…

<C++> STL_vector

1.vector的介绍 vector是表示可变大小数组的序列容器。就像数组一样,vector也采用的连续存储空间来存储元素。也就是意味着可以采用下标对vector的元素进行访问,和数组一样高效。但是又不像数组,它的大小是可以动态改变的,而且它的…

【JavaEE】Spring事务-事务的基本介绍-事务的实现-@Transactional基本介绍和使用

【JavaEE】Spring事务(1) 文章目录 【JavaEE】Spring事务(2)1. 为什么要使用事务2. Spring中事务的实现2.1 事务针对哪些操作2.2 MySQL 事务使用2.3 Spring 编程式事务(手动挡)2.4 Spring 声明式事务&#…

匈牙利算法 in 二分图匹配

https://www.luogu.com.cn/problem/P3386 重新看这个算法,才发现自己没有理解。 左边的点轮流匹配,看是否能匹配成功。对右边的点进行记录是否尝试过 然后有空就进,别人能退的就进 遍历左部点: 尝试匹配过程:

报错处理:Docker容器无法启动

具体报错: Error response from daemon: OCI runtime create failed: container_linux.go:349: starting container process caused "exec: \"program\": executable file not found in $PATH": unknown. 报错环境: 该报错出现在使用…

网络编程套接字(2): 简单的UDP网络程序

文章目录 网络编程套接字(2): 简单的UDP网络程序3. 简单的UDP网络程序3.1 服务端创建(1) 创建套接字(2) 绑定端口号(3) sockaddr_in结构体(4) 数据的接收与发送接收发送 3.2 客户端创建3.3 代码编写(1) v1_简单发送消息(2) v2_小写转大写(3) v3_模拟命令行解释器(4) v4_多线程版…

软件测试 day3

今天目标 执行用例(课上案例编写的用例) 缺陷相关知识 能够说出软件缺陷判定标准 能够说出项目中缺陷的管理流程 能够使用Excel对于缺陷进行管理 能使用工具管理缺陷一、用例执行 说明:执行结果与用例的期望结果不一致(含义&…

Lingo软件安装包分享(附安装教程)

目录 一、软件简介 二、软件下载 一、软件简介 Lingo是一款专门为解决线性和非线性优化问题而设计的专业软件,广泛应用于运筹学、工程管理、交通管理、生产调度、物流管理等领域。它提供了一个易于使用的界面和灵活的求解器,能够高效地求解大规模的线性…

前端需要理解的Vue知识

1 模板语法 Vue使用基于 HTML 的模板语法,能声明式地将其组件实例的数据绑定到DOM。所有Vue 模板可以被符合规范的浏览器和 HTML 解析器解析。Vue 会将模板编译成高度优化的 JavaScript 代码。结合响应式系统,当应用状态变更时,Vue 能够智能…

Android 实现资源国际化

前言 国际化指的是当Android系统切换语言时,相关设置也随之改变,从而使用不同的国家地区; 简而言之,就是我们的Android App中的文字和图片会随着不同国家的地区变化从而切换为不同语言文字和不同国家的图片 文字图片国际化 只要…

Python绘图系统9:新建绘图类型控件,实现混合类型图表

文章目录 绘图类型控件改造AxisList更改绘图逻辑源代码 Python绘图系统: 从0开始实现一个三维绘图系统自定义控件:坐标设置控件📉坐标列表控件📉支持多组数据的绘图系统图表类型和风格:散点图和条形图📊混…

【已解决】在 SpringBoot 中使用 CloseableHttpClient 调用接口时,接收参数中的中文变为“?“

问题描述 由于项目需要,需要在代码中使用POST请求去调用另一个服务的接口,即不通过前端,A 项目直接在方法中发起HTTP请求调用 B 项目的接口,当请求体中的参数有中文时,参数接收后中文会变为“?”。 具体原因是参数的…

玩转git第7章节,本地git的用户名和密码的修改

一 本地git的用户名和密码 1.1 本地用户名和密码修改 1.本地用户名修改 2.凭据管理 3.进行修改密码 1.2 代码提交操作

8、Spring_整合Mybatis

五、Spring整合Mybatis 1.添加依赖 添加依赖 <dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.2.17.RELEASE</version></dependency><depend…

Nuxt.js--》添加路由、视图和过渡效果

博主今天开设Nuxt.js专栏&#xff0c;带您深入探索 Nuxt.js 的精髓&#xff0c;学习如何利用其强大功能构建出色的前端应用程序。我们将探讨其核心特点、灵活的路由系统、优化技巧以及常见问题的解决方案。无论您是想了解 Nuxt.js 的基础知识&#xff0c;还是希望掌握进阶技巧&…