定点化和模型量化(二)

1.量化器的种类——均匀/

https://arxiv.org/pdf/1806.08342

1.1 Uniform Affine Quantizer

这是一种最朴素的量化:

s表示step,可以看作量化的最小单位;z是zero point,因为当浮点x=0时,对应的量化结果就是z。

可以看到,量化产生了两种误差,截断误差(clipping error)和舍入误差(rounding error),分别由截断和四舍五入运算引入。当浮点x=0时,量化没有产生误差,所以zero padding是没有量化误差的。

对于伪量化后的卷积,两个偏置z会以乘积的形式作为一个加项:

1.2 Uniform symmetric quantize

当Uniform Affine Quantizer中的偏置为0时,就是Uniform symmetric quantize。量化结果可以是带正负符号的,也可以是无符号的:

1.3 Stochastic quantizer

随机量化,在以步长归一化之前,对浮点叠加了一个随机值。

没看明白,说是有时会退化为浮点本身,对计算梯度有优势,但推理时大部分硬件不支持。

2.量化的对象——权重/激活层

2.1 Weight only

当只量化weights时,只需要一行命令就可以完全,不需要validation data。一般当不关心运行误差,只是为了便于传输模型和存储时只量化权重。

2.2 weights and activations

神经网络量化(一):激活函数 - 知乎

很多人不理解激活层怎么量化。虽然激活层没有可训练的参数,但它作为一个函数,其实是有参数的。就算是有参数,为什么要量化激活层呢?只量化weights有什么问题呢?

我想有两个可能的问题。一个问题是激活函数之后可能新产生浮点数据,而浮点运算是硬件不支持的;一个问题是原有的激活函数是为分布在0~1的数据设计的,以sigmoid为例,浮点的时候要无限接近于1它才等于1,但量化数据很容易就大于1了,但从整个分布看这个值其实还处于比较低的水平。

relu这样的函数过于简单,只是一个求最大值的过程,但如leaky relu和sigmoid这样的,函数本身就包含浮点数。那我们做的就是把激活函数中的浮点数定点化吗?

对leaky relu来说,只需要把浮点数定点化就可以了,但对于sigmoid来说,只定点化函数中的e,其实还是存在上述提到的第二个问题。所以,对于激活层的量化,我们更关注的是数据的分布。

所以需要calibration data 计算激活层的动态范围,对映射后的数据一一量化。对每个值量化不太现实,所以做法一般是先量化一些特定的点,其余点通过泰勒展开得到。对于定点数的除法,还需要用到newton-raphson算法。

量化激活层带来的误差是很小的,这意味着量化误差基本上全部来自于对权重的量化。

当网络结构中有ReLU6或者Batch normalization with no scaling时,前者的feature map范围被限制在0~6中,后者的feature maps激活层有0均值和同一方差的特性。这两种特性都有助于激活层的动态范围很小,有利于缩小激活层的量化误差。

3.量化的粒度——layer/channel

一个tensor有多种划分方法,如何把这个tensor划分,就是粒度Granularity of quantization。

以一个四维tensor为例,它由多个3维kernel构成。每个kernel是有意义的,它和feature map一一对应。一个合理的想法是对每个kernel涉及一个量化器,即不同kernel对应的量化器的s和z是不同的,这就是per-channel quantization。而如果不对tensor划分,对整个tensor进行量化,那就是per-layer quantization。

对于activations的量化不使用per channel,因为会使得内积的计算更加复杂。所以对权重使用per channel,对激活层使用per layer。

We do not consider per-channel quantization for activations as this would complicate the inner product computations at the core of conv and matmul operations.

We recommend that per-channel quantization of weights and per-layer quantization of activations be the preferred quantization scheme for hardware acceleration and kernel optimization.

 

从上表中可以看到,对只量化weights的情况,per channel的精度更好。尤其是MobileNet,使用per layer量化将带来巨大的误差。可能的原因是ResNet这样的网络参数量更大,而参数量越大,对量化误差的鲁棒性也越好。

4.量化的种类——是否训练

pytorch把量化分为三种:Introduction to Quantization on PyTorch | PyTorch,第一种Dynamic Quantization其实针对的是量化的对象。从量化与训练的相对顺序来说,其实可以分为两种:

4.1Post-Training Quantization

Post Training Quantization (PTQ) — Torch-TensorRT v1.4.0+7d1d80773 documentation

https://www.tensorflow.org/lite/performance/post_training_quantization

顾名思义,就是在已经训练得到浮点模型之后,使用一些工具把它转换为量化后的模型。TensorRT需要calibration step,作用是使得INT8和FP32的推理结果尽可能差异最小。把权重和激活层都量化到INT8是最高级别的量化,在FP32和INT8之间,还可以有一些中间形态:

4.2 Quantization Aware Training

https://www.tensorflow.org/model_optimization/guide/quantization/training

之前的PTQ量化都只关心forward,而QAT还关心backward。

在这里weights和activations 都被假量化,模拟clamping and rounding带来的量化损失,但是所有的计算仍然使用浮点。虽然使用浮点计算,但此时的梯度是基于量化数据计算得到的,所以仍然是有意义的。这样让网络在训练阶段就意识到有量化这个操作,从而达到更高的精度。

即便使用4bit量化,QAT的准确性都要好于PTQ。

QAT可以是从头开始训练from scratch,也可以是基于原来的浮点模型fine tune,关键是训练中包含fake quantization operations。

此时训练得到的模型仍然是一个浮点模型,只不过因为考虑到了量化损失,这个浮点模型对量化是更友好的。所以还是需要一个Convert model的过程,把weights变为int类型,同时还要记录激活层的量化信息。在tf中通过tensorflow converter (TOCO)把Convert model的结果存放在flatbuffer中。

5. 高通论文

高通作为移动端的王者,对量化有着深刻的认识。综述性的可以看高通的白皮书,这里简单看一篇更加具体的文章:Data-Free Quantization Through Weight Equalization and Bias Correction,原文链接。

正如前面提到的,MobileNetV2的后量化会面临70.9% to 0.1%的准确度下降,但这篇文章不需要per channel量化,也不需要训练就可以得到接近原始精度的量化效果。

首先弄清楚为什么下降这么厉害。MobileNetV2有一个结构特点是depthwise-separable,这就造成不同channel的权重分布差异特别大:

如此大的差异,导致整个tensor一同量化的时候出现顾此失彼的情况。

另外一个原因来自于假设性条件无法满足。量化会产生误差,误差的期望是0就是无偏的,这是我们期望的。但实际上量化误差是有偏的,这就会影响下一层的输入分布。

data-free quantization method (DFQ)从下面三个方面进行解决:

5.1 range equalization

根据线性关系,将相邻两层卷积层重参数化reparameterize:

重参数化之后,权重W根据选定的S发生了变化,所以原则上调整S就可以使得W的分布更加相似,便于量化,解决上述提到的不同kernel波动大的问题。

5.2 Absorbing high biases

s小的话偏置b就要大,这样就导致进入激活层时范围过于大。这里仍然是利用relu的特点:

进一步重参数化,把偏置大传递到下一层。

5.3 Quantization bias correction

就像基于算数平均值估计方差时一样,如果是有偏估计,可以把这个偏差减去。可以看到,偏移同时和x的期望和量化误差有关:

文章假设了BN-->relu这样的顺序结构,因此BN层得到的高斯分布,只有正半轴的部分保留了下来,此时不能直接使用BN的均值作为 E[x] 。文中提供了两种方法来计算relu后的 E[x]。分别是有calibration和没有calibration时。

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

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

相关文章

【SQL学习进阶】从入门到高级应用(七)

文章目录 ✨数据处理函数✨if函数✨cast函数✨加密函数 ✨分组函数✨max✨min✨avg✨sum✨count✨分组函数组合使用✨分组函数注意事项 ✨分组查询✨group by✨having✨组内排序 ✨总结单表的DQL语句 🌈你好呀!我是 山顶风景独好 💕欢迎来到我…

推荐系统三十六式学习笔记:01|你真的需要个性化推荐系统吗?

目录 什么是推荐系统你需要推荐系统吗总结 什么是推荐系统 让我们来换一个角度回答三个问题,从而重新定义什么是推荐系统: 1、它能做什么? 2、它需要什么? 3、它怎么做。 对于第一个问题“它能做什么”,我的回答是:推…

跨境电商如何收款?6大常用收款方式对比!

收款是跨境中关键的一环,选择一个安全、高效、成本合理的收款工具很重要。每个跨境人都要先想好选择合适的收款方式,今天就给跨境人们总结了6个主流的跨境收款工具,大家可以根据自己的实际情况进行对比选择。 1、PayPal 适用平台:…

Vue3使用mitt进行组件通信

mitt:事件总线,是第三方插件。 Vue2.x 使用 EventBus 事件总线进行兄弟组件通信,而在Vue3中 EventBus 事件总线模式已经被移除,官方建议使用外部的、实现了事件触发器接口的库,例如 mitt 或 tiny-emitter。 比起 Vue…

华为大咖说 | 企业应用AI大模型的“道、法、术”—— 法:场景篇

本文作者:郑岩(华为云AI变革首席专家)全文约5000字,阅读约需10分钟 这是我的AI应用系列第二篇,想谈谈“如何找个好场景”。场景找对了,那就成功一大半,这个道理放在AI大模型的应用上&#xff0c…

谷歌为其AI搜索结果辩护,称问题出在“数据空白”和边缘案例|TodayAI

近日,谷歌 Google 在推出其AI生成的搜索结果后,引发了广泛争议。该公司表示,一些不准确的搜索结果是由于“数据空白”和边缘案例导致的。 上周,谷歌向数百万用户推出了AI搜索结果,旨在提供更好的搜索体验。然而&#…

[Redis]Hash类型

基本命令 hset命令 设置 hash 中指定的字段(field)的值(value) 返回值:添加的字段的个数(注意是添加的个数,而不包括修改的) hset key field value [field value ...] hget命令 …

RabbitMQ(三)SpringBoot整合,可靠性投递,死信队列,延迟队列,消费端限流,消息超时

文章目录 整合Springboot概述消费者生产者 消息可靠性投递故障原因解决方案生产者端消息确认机制(故障情况1)故障情况2解决方案故障情况3解决方案 消费端限流概念 消息超时概念队列层面:配置队列过期消息本身:配置消息过期 死信队…

GUI 01:GUI 编程概述,AWT 相关知识,Frame 窗口,Panel 面板,及监听事件的应用

一、前言 记录时间 [2024-05-30] 疑问导航 GUI 是什么?GUI 如何使用?GUI 有哪些应用? 学习目的 写一些自己心中的小工具;Swing 界面的维护;了解 MVC 架构,以及监听事件。 本文对图形用户界面&#xff08…

Django——Admin站点(Python)

#前言: 该博客为小编Django基础知识操作博客的最后一篇,主要讲解了关于Admin站点的一些基本操作,小编会继续尽力更新一些优质文章,同时欢迎大家点赞和收藏,也欢迎大家关注等待后续文章。 一、简介: Djan…

【Spring Cloud】微服务日志收集系统-ELK+Kafka

目录 任务背景本文相关文件资料Elasticsearch特性 LogstashKibanaELKELK的缺点引入消息中间件 ELKKafkaKafka概念 ELKKafka环境搭建1.将安装素材上传至服务器 cd /usr/local/soft2.防止Elasticsearch因虚拟内存问题启动失败3.创建镜像li/centos7-elasticsearch4.创建容器5.验证…

编译安装PHP服务(LAMP3)

目录 1.初始化设置,将安装PHP所需软件包传到/opt目录下 (1)关闭防火墙 (2)上传软件包到/opt目录 2.安装GD库和GD库关联程序,用来处理和生成图片 3.配置软件模块 4.编译及安装 5.优化把PHP 的可执行程…

先导微型数控桌面式加工中心

随着数控技术、传感器技术、人工智能等技术的不断发展,制造业的快速发展和技术的不断进步,小型五轴加工中心的性能将不断提升,五轴联动技术作为解决异性复杂零件高效优质加工问题的重要手段,使其具有更广泛的应用前景。小型五轴加…

【康耐视国产案例】智能AI相机:深度解析DataMan 380大视野高速AI读码硬实力

随着读码器技术的不断更新迭代,大视野高速应用成为当前工业读码领域的关键发展方向。客户对大视野高速读码器的需求源于其能显著减少生产成本并提升工作效率。然而,大视野应用场景往往伴随着对多个条码的读取需求,这无疑增加了算法的处理负担…

Playwright 自动化操作

之前有见同事用过playwright进行浏览器模拟操作,但是没有仔细了解,今天去详细看了下,发现playwright着实比selenium牛逼多了 Playwright 相对于selenium优点 1、自动下载chromnium, 无需担心chrome升级对应版本问题; 2、支持录屏操…

突破 LST/LRT 赛道中心化困境,Puffer Finance 何以重塑以太坊再质押未来

纵观过去的 2023 年,LST 赛道竞争进入“白热化”状态。去中心化、DeFi 增强、全链化成为市场争夺关键词,诸多 LST 赛道老牌项目纷纷陷入“中心化矛盾”,指责对方在以太坊去中心化进程中的不利作为。 在这样的竞争情形下,以太坊联…

从Socket到WebSocket

前言 不知道大家在学习网络编程的时候都是怎样的一种方式,我谨以此文章来记录我自己从头开始学习C网络编程时的经历,中间有许多我自己的一些想法和思考。当然作为一个刚开始学习的新手来说,有些内容也许不那么正确,只是代表了我在…

flink 操作mongodb的例子

简述 该例子为从一个Collection获取数据然后插入到另外一个Collection中。 Flink的基本处理过程可以清晰地分为以下几个阶段: 数据源(Source): Flink可以从多种数据源中读取数据,如Kafka、RabbitMQ、HDFS等。Flink会…

通过 CXCR4 靶向纳米线修补细胞表面以抑制癌症转移

引用信息 文 章:Cell surface patching via CXCR4-targeted nanothreads for cancer metastasis inhibition. 期 刊:Nature Communications(影响因子:16.6) 发表时间:2024/3/29 作 者&#xff1…

基于springboot实现大学生一体化服务平台系统项目【项目源码+论文说明】计算机毕业设计

基于springboot实现大学生一体化服务平台系统演示 摘要 如今社会上各行各业,都喜欢用自己行业的专属软件工作,互联网发展到这个时候,人们已经发现离不开了互联网。新技术的产生,往往能解决一些老技术的弊端问题。因为传统大学生综…