RepQ-ViT 阅读笔记

news2024/9/20 18:35:29

RepQ-ViT: Scale Reparameterization for Post-Training Quantization of Vision Transformers

ICCV 2023
中国科学院自动化研究所

Abstract

RepQ-ViT,一种新的基于量化缩放因子(quantization scale)重参数化的PTQ框架

解耦量化和推理过程:

  1. 量化步骤部署了复杂的量化器
  2. 推理步骤采用量化缩放因子参数化的简化量化器
    以保证精确的量化和高效的推理

重点关注具有极端分布的两个组件

  1. LayerNorm后的activations
    1. 具有严重的通道间差异
  2. Softmax后的activations
    1. 幂律分布

关注的是对 activation 的量化方法

最初对两部分数据分别采用: channel-wise 量化 和 l o g 2 log\sqrt 2 log2 量化

推理时 将scale重参数化成硬件友好的 layer-wise 和 l o g 2 log 2 log2 量化

1. Introduction

影响ViT量化性能的关键组件: LayerNorm、Softmax 以及 GELU

作者将前人方法性能差的原因归结于:始终遵循着传统的量化范式,量化器的初始设计必须考虑未来的推理开销

作者指出:复杂的量化器和硬件标准并不总是对立的;相反,这两者可以通过 scale reparameterization 明确地联系起来

具体做法:在初始量化中使用复杂的量化器以充分保留原始的参数分布,然后通过尺度重新参数化将其转换为简单的硬件友好量化器进行实际推理,从而获得了较高的量化精度和推理效率。

对于LayerNorm之后的激活,我们首先使用逐通道量化来保持其严重的通道间变化,然后将尺度重新参数化到逐层量化以匹配硬件,这是通过调整LayerNorm的仿射因子和下一层的权重来实现的;
对于后Softmax激活,由于我们的研究表明它们的幂律分布和注意力分数的性质更倾向于log√2量化器,因此,我们感兴趣的是重新参数化尺度,将基改为2,以便在推理中实现比特移位操作。

涉及的量化器、计算范式包括:

  1. per-channel 量化
  2. per-Layer(per-Tensor)量化
  3. l o g 2 log\sqrt 2 log2 量化
  4. l o g   2 log\ 2 log 2 量化

![[Pasted image 20240809122519.png]]

2. Related Works

2.1. Vision Transformers

3. Methodology

Overview

主要的挑战是:将初始的复杂量化器转换为简单量化器进行推理
主要的点在于:将量化缩放因子重参数化

总体的算法如下图所示:
在这里插入图片描述

3.1. Preliminaries
ViTs’ standard structure

Y l − 1 = MSA ( LayerNorm ( X l − 1 ) ) + X l − 1 \begin{equation} Y_{l-1} = \text{MSA}(\text{LayerNorm}(X_{l-1})) + X_{l-1}\end{equation} Yl1=MSA(LayerNorm(Xl1))+Xl1
X l = MLP ( LayerNorm ( Y l − 1 ) ) + Y l − 1 \begin{equation} X_l = \text{MLP}(\text{LayerNorm}(Y_{l-1})) + Y_{l-1}\end{equation} Xl=MLP(LayerNorm(Yl1))+Yl1

l = 1 , 2 , ⋯   , L l=1,2,\cdots, L l=1,2,,L 是 Transformer Blocks 的数量

[ Q i , K i , V i ] = X ′ W q k v + b q k v i = 1 , 2 , . . . , h \begin{equation} [Q_{i},K_{i},V_{i}]=X'W^{qkv}+b^{qkv} \quad i=1,2,...,h \\ \end{equation} [Qi,Ki,Vi]=XWqkv+bqkvi=1,2,...,h
A t t n i = S o f t m a x ( Q i ⋅ K i T D h ) V i \begin{equation} \mathrm{Attn}_{i}=\mathrm{Softmax}\left(\frac{Q_{i}\cdot K_{i}^{T}}{\sqrt{D_{h}}}\right)V_{i} \end{equation} Attni=Softmax(Dh QiKiT)Vi
M S A ( X ′ ) = [ A t t n 1 , A t t n 2 , . . . , A t t n h ] W o + b o \begin{equation} \mathrm{MSA}(X')=[{\rm Attn}_{1},{\rm Attn}_{2},...,{\rm Attn}_{h}]W^{o}+b^{o}\\ \end{equation} MSA(X)=[Attn1,Attn2,...,Attnh]Wo+bo
M L P ( Y ′ ) = G E L U ( Y ′ W 1 + b 1 ) W 2 + b 2 \begin{equation} \mathrm{MLP}(Y')={\rm GELU}(Y'W^{1}+b^{1})W^{2}+b^{2} \end{equation} MLP(Y)=GELU(YW1+b1)W2+b2

量化矩阵乘法的所有权重和输入,保留LayerNorm和Softmax操作为浮点类型
也即,LayerNorm和Softmax本身的计算过程不做量化

Hardware-friendly quantizers

下面介绍几种常见的、硬件友好的量化器:

  1. 均匀量化器:
    Q u a n t : x ( Z ) = c l i p ( ⌊ x s ⌉ + z , 0 , 2 b − 1 ) D e Q u a n t : x ^ = s ( x ( Z ) − z ) ≈ x \begin{align} \mathrm{Quant:} & x^{(\mathbb Z)}=\mathrm{clip}\left(\big \lfloor \frac{x}{s}\big\rceil+z,0,2^{b}-1\right)\\ \mathrm{DeQuant:}& \hat x=s\left(x^{(\mathbb Z)}-z\right)\approx x \end{align} Quant:DeQuant:x(Z)=clip(sx+z,0,2b1)x^=s(x(Z)z)x
    其中, s ∈ R + s\in \mathbb R^{+} sR+ 是 量化缩放因子, z ∈ Z z\in \mathbb Z zZ 是 零点,二者都取决于 x x x 的上下界,具体计算公式如下:
    s = m a x ( x ) − m i n ( x ) 2 b − 1 , z = ⌊ − m i n ( x ) s ⌉ \begin{align} s=\frac{{max(x)-min(x)}}{{2^{b}-1}},\quad z=\Big\lfloor -\frac{min(x)}{s} \Big\rceil \end{align} s=2b1max(x)min(x),z=smin(x)

  2. log2量化器:
    本文中仅将其用于 Softmax 后的 activation,因此,仅仅考虑 对正数 的量化:
    Q u a n t : x ( Z ) = c l i p ( ⌊ − log ⁡ 2 x s ⌉ , 0 , 2 b − 1 ) D e Q u a n t : x ^ = s ⋅ 2 − x ( Z ) ≈ x \begin{align} \mathrm{Quant:} x^{(\mathbb Z)}&=\mathrm{clip}\left(\big \lfloor -\log_{2} \frac{x}{s}\big\rceil,0,2^{b}-1\right) \\ \mathrm{DeQuant:} \hat x &= s \cdot 2^{-x^{(\mathbb Z)}} \approx x \end{align} Quant:x(Z)DeQuant:x^=clip(log2sx,0,2b1)=s2x(Z)x

log2函数和base - 2幂函数都可以通过快速高效的比特移位操作实现

log2运算可以近似对应寻找数值中最左侧的’1’的位置
位运算的奇技淫巧(二) - RioTian - 博客园 (cnblogs.com)

对于以上量化器的应用粒度,权重的通道级量化和激活的层级量化可以平衡精度和效率

3.2. Scale Reparam for LayerNorm Activations

LayerNorm的计算公式:
LayerNorm ( X n , : ) = X n , : − E [ X n , : ] V a r [ X n , : ] + ϵ ⊙ γ + β \text{LayerNorm}(X_{n,:})=\frac{X_{n,:}-E[X_{n,:}]}{\sqrt{Var[X_{n,:}]+\epsilon}}\odot \gamma + \beta LayerNorm(Xn,:)=Var[Xn,:]+ϵ Xn,:E[Xn,:]γ+β
其中, n = 1 , 2 , ⋯   , N ,   E [ X n , : ] n=1,2,\cdots,N,\ E[X_{n,:}] n=1,2,,N, E[Xn,:] V a r [ X n , : ] Var[X_{n,:}] Var[Xn,:] 分别是 均值 和 方差

通过对LayerNorm后激活的研究,我们发现它们具有严重的通道间差异,这是对量化性能的一个重要限制

![[Pasted image 20240809152633.png]]

上图为 DeiT-S 中 第1个模块 LayerNorm 后 激活 的 第300~350通道 的分布箱线图

简单地将统一的量化尺度应用于每个通道的逐层量化不能适应如此严重的通道间差异,从而导致显著的精度下降

提出一种将通道量化转换为层量化的LayerNorm后激活 scale reparameterization 方法

具体做法是,首先通过 通道级 量化获取 scale 和 zero-point s ∈ R D ,   z ∈ Z D \boldsymbol{s}\in R^{D},\ \boldsymbol{z}\in Z^{D} sRD, zZD
将其重参数化为 s ~ = s ~ ⋅ 1 ,   z ~ = z ~ ⋅ 1 \boldsymbol{\widetilde s}=\widetilde s\cdot\boldsymbol{1},\ \boldsymbol{\widetilde z}=\widetilde z\cdot\boldsymbol{1} s =s 1, z =z 1
文中将 s ~ , z ~ \widetilde s, \widetilde z s ,z 设为相应的均值, s ~ = E ( s ) ,   z ~ = E ( z ) \widetilde s=E(\boldsymbol{s}), \ \widetilde z=E(\boldsymbol{z}) s =E(s), z =E(z)

定义 variation factors r 1 = s / s ~ r_{1}=s / \widetilde s r1=s/s r 2 = z − z ~ r_{2}=z-\widetilde z r2=zz
代入(9)可得, z ~ = z − r 2 = ⌊ − [ min ⁡ ( X : , d ′ ) ] 1 ≤ d ≤ D + s ⊙ r 2 s ⌉ ( 13 ) \widetilde z=z-r_{2}=\Big\lfloor - \frac{[\min(X'_{:,d})]_{1\le d\le D}+s\odot r_{2}}{s} \Big\rceil\quad(13) z =zr2=s[min(X:,d)]1dD+sr2(13) s ~ = s r 1 = [ max ⁡ ( X : , d ′ ) − min ⁡ ( X : , d ′ ) ] 1 ≤ d ≤ D / r 1 2 b − 1 ( 14 ) \widetilde s=\frac{s}{r_{1}}=\frac{[\max(X'_{:,d})-\min(X'_{:,d})]_{1\le d\le D}/r_{1}}{2^{b}-1}\quad(14) s =r1s=2b1[max(X:,d)min(X:,d)]1dD/r1(14)

对 LayerNorm 的 仿射因子 以及 下一层的权重和偏移值 做 可解释性的调整,可以将 channel-wise 量化得到的 quantization scale 和 zero-point 重参数化为 Layer-wise 的 quantization scale 和 zero-point(设置为原始向量的均值)
同时需要再做 Calibration 进行调整

对LayerNorm:
β ~ = β + s ⊙ r 2 r 1 , γ ~ = γ r 1 \begin{align} \widetilde \beta=\frac{{\beta+s\odot{r_{2}}}}{{r_{1}}},\quad \widetilde\gamma=\frac{\gamma}{r_{1}} \end{align} β =r1β+sr2,γ =r1γ
对下一层参数:
W ~ : , j q k v = r 1 ⊙ W : , j q k v b ~ j q k v = b j q k v − ( s ⊙ r 2 ) W : , j q k v \begin{align} \widetilde{W}^{qkv}_{:,j}&=r_{1}\odot W_{:,j}^{qkv} \\ \widetilde{b}^{qkv}_{j}&=b_{j}^{qkv}-(s\odot r_{2})W_{:,j}^{qkv} \end{align} W :,jqkvb jqkv=r1W:,jqkv=bjqkv(sr2)W:,jqkv

3.3. Scale Reparam for Softmax Activations

Softmax后激活,具有远离高斯和拉普拉斯分布的幂律分布,这是极不平衡的,因此被确定为量化的另一个关键障碍

在这里插入图片描述

大部分激活集中在相对较小的数值上,只有少数激活离散分布在较大的数值(接近1)上

较大的数值反映了块之间的重要相关性,必须在量化过程中很好地保留它们

前人使用 log2 量化器 对 Softmax 后激活进行量化,然而,这种方式 对重要注意力分数的描述过于稀疏
例如: [ 2 − 1.5 ,   2 − 0.5 ] [2^{-1.5},\ 2^{-0.5}] [21.5, 20.5] 之间的数都会被舍入成 2 − 1 2^{-1} 21

而 log√2量化器为大值提供了更高的量化分辨率,可以更准确地描述分布
缺点是:对硬件不友好

log ⁡ 2 \log \sqrt 2 log2 量化器 转换为 log ⁡ 2 \log 2 log2 量化器:

A ( Z ) = clip ( ⌊ − log ⁡ 2 A s ⌉ , 0 , 2 b − 1 ) = clip ( ⌊ − 2 log ⁡ 2 A s , 0 , 2 b − 1 ) \begin{align} A^{(\mathbb Z)}&=\text{clip}\left(\lfloor -\log_{\sqrt 2} \frac{A}{s} \rceil,0,2^{b}-1\right) \\ &=\text{clip}\left(\lfloor -2\log_{2} \frac{A}{s},0,2^{b}-1\right) \end{align} A(Z)=clip(log2 sA,0,2b1)=clip(2log2sA,0,2b1)

A ^ = s ⋅ 2 − A ( Z ) 2 = { s ⋅ 2 − A ( Z ) 2 A ( Z ) = 2 k , k ∈ Z s ⋅ 2 − A ( Z ) + 1 2 ⋅ 2 A ( Z ) = 2 k + 1 , k ∈ Z = s ⋅ 2 ⌊ − A ( Z ) 2 ⌋ ⋅ [ 1 ( A ( Z ) ) ⋅ ( 2 − 1 ) + 1 ] \begin{align} \hat A&=s\cdot 2^{- \frac{{A^{(\mathbb Z)}}}{{2}}}\\ &=\begin{cases} s\cdot 2^{- \frac{{A^{(\mathbb Z)}}}{{2}}}\quad &A^{(\mathbb Z)}=2k,k\in \mathbb Z\\ s\cdot 2^{- \frac{{A^{(\mathbb Z)}+1}}{{2}}}\cdot \sqrt 2 \quad &A^{(\mathbb Z)}=2k+1,k\in \mathbb Z\\ \end{cases}\\ &=s\cdot 2^{\lfloor - \frac{A^{(\mathbb Z)}}{2} \rfloor}\cdot [\mathbb 1(A^{(\mathbb Z)})\cdot(\sqrt 2-1)+1] \end{align} A^=s22A(Z)={s22A(Z)s22A(Z)+12 A(Z)=2k,kZA(Z)=2k+1,kZ=s22A(Z)[1(A(Z))(2 1)+1]

经过上述分析,只需将 量化缩放因子 做如下 处理:
s ~ = s ⋅ [ 1 ( A ( Z ) ) ⋅ ( 2 − 1 ) + 1 ] \widetilde s=s\cdot [\mathbb 1(A^{(\mathbb Z)})\cdot(\sqrt 2-1)+1] s =s[1(A(Z))(2 1)+1]

4. Experiments

在这里插入图片描述

在这里插入图片描述

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

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

相关文章

ios使用plist实现相册功能

第一步:照片复制到Assets文件夹再创建plist 第二步:页面设计 第三步:代码实现 // // PhotoViewController.m // study2024 // // Created by zhifei zhu on 2024/8/11. //#import "PhotoViewController.h"interface PhotoView…

JAVA打车小程序APP打车顺风车滴滴车跑腿源码微信小程序打车系统源码

🚗💨打车、顺风车、滴滴车&跑腿系统,一键解决出行生活难题! 一、出行新选择,打车从此不再难 忙碌的生活节奏,让我们常常需要快速、便捷的出行方式。打车、顺风车、滴滴车系统,正是为了满足…

通天星CMSV6代码审计

fofa指纹 body"./open/webApi.html"||body"/808gps/" /gpsweb/WEB-INF/classes/config/version.conf中可以查看版本。 框架分析 默认安装目录为C:\Program Files\CMSServerV6\ 默认账户:admin/admin 框架结构 跟进web.xml,可以看…

WebGL 入门:开启三维网页图形的新篇章(上)

一、引言 介绍 WebGL 的背景和意义 一、背景 WebGL 是一种 JavaScript API,用于在网页上呈现三维图形。 它是在 2009 年由 Khronos Group 提出的,并于 2011 年成为 W3C 的标准。 在 WebGL 出现之前,网页上的三维图形主要是通过插件&…

TEMU卖家们如何提高temu店铺排名、权重、流量、采购测评成功率?

一、什么叫做自养号测评? 自养号测评类似于国内的某宝S单,就是通过搭建海外的服务器和IP采用海外真实买家资料来注册、养号、下单。 二、自养号测评有哪些作用? 自养号快速提高产品的排名、权重和销量,可以提升订单量、点赞(rat…

Excel工作表同类数据合并工具

下载地址:https://pan.quark.cn/s/81b1aeb45e4c 在Excel表格中,把多行同类数据合并为一行是件令人无比头痛的事情:首先,你得确定哪几条记录是可合并的同类数据,人工对比多个字段难免顾此失彼挂一漏万;其次&…

【深度学习】【文本LLM】如何使用文本相似度挑选语料?

在GitHub上挑选和优化语料库的开源工具与方法 在GitHub上挑选和优化语料库的开源工具与方法 在数据科学和自然语言处理(NLP)的世界里,拥有一个干净且高质量的语料库是成功的关键。然而,随着数据量的增加,处理和优化这些数据变得尤为重要。幸运的是,GitHub上提供了许多开…

分享一个基于SpringBoot的戏剧戏曲科普平台的设计与实现(源码、调试、LW、开题、PPT)

💕💕作者:计算机源码社 💕💕个人简介:本人 八年开发经验,擅长Java、Python、PHP、.NET、Node.js、Android、微信小程序、爬虫、大数据、机器学习等,大家有这一块的问题可以一起交流&…

汇编语言:loop指令

loop指令是循环指令,在8086CPU中,所有的循环指令都是短转移,其对应的机器指令有2个字节,低8位字节存放的是操作码;高8位字节存放的是转移位移(相对于当前IP的位移),用补码形式表示&a…

C# NetworkStream、ConcurrentDictionary、Socket类、SerialPort、局域网IP 和广域网IP

一、NetworkStream 什么是NetworkStream? NetworkStream 是 .NET Framework 中用于在网络上进行数据传输的流类。它属于System.Net.Sockets 命名空间,并提供了通过网络连接进行读写操作的功能。NetworkStream 主要用于处理从网络套接字(Soc…

input 控制光标所在的位置

需求:鼠标一点击input输入框 就要将焦点至于 输入框的最后面,使用户不能在内容的中间 删除或者修改 const focusEnd (value) > {var inpEl value.target // 获取dom元素console.log(inpEl, LLL);var length value.target.value.length // 获取输入…

【Hot100】LeetCode—48. 旋转图像

目录 1- 思路两次遍历实现(先行,后主对角互换) 2- 实现⭐48. 旋转图像——题解思路 3- ACM 实现 原题连接:48. 旋转图像 1- 思路 两次遍历实现(先行,后主对角互换) 技巧:旋转 90 …

通过反汇编解析crash问题

背景: 用户反馈的问题,有时候我们拿到log,发现有crash问题,有堆栈打印,能看到具体出错的函数,但是无法定位具体出错的行数和内容,这个时候就需要用到反汇编辅助我们定位问题。 反汇编方法: 通过objdump反汇…

一起学习LeetCode热题100道(43/100)

43.验证二叉搜索树(学习) 给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。 有效 二叉搜索树定义如下: 节点的左子树只包含 小于 当前节点的数。 节点的右子树只包含 大于 当前节点的数。 所有左子树和右子树自身必须也是二叉搜索树。…

spring bean的循环依赖

在Spring框架中,Bean的循环依赖是一个常见的问题,它指的是两个或多个Bean之间通过构造函数、Setter方法或字段注入等方式形成了相互依赖的闭环。Spring框架提供了强大的依赖注入功能,同时也提供了多种机制来处理循环依赖的情况,确…

【SCI论文写作】工程类论文写作(二)引言

写在前面: 🌟 欢迎光临 清流君 的博客小天地,这里是我分享技术与心得的温馨角落。📝 个人主页:清流君_CSDN博客,期待与您一同探索 移动机器人 领域的无限可能。 🔍 本文系 清流君 原创之作&…

护眼灯对眼睛有伤害吗?防止三大禁忌隐患

护眼灯对眼睛有伤害吗?护眼灯是现代生活中非常常见的照明工具,它在家庭和办公场所都得到了广泛应用。然而,随着人们对眼睛健康的关注日益增加,关于护眼灯是否可能对眼睛造成伤害的疑问也随之产生。这些疑问不仅涉及到人们的视力健…

黄晓娟:钱输光了她还伺候你?赵本山:她不伺候谁伺候?

黄晓娟:钱输光了她还伺候你?赵本山:她不伺候谁伺候? --小品《麻将豆腐》(中1)的台词与解说 (接上) 赵本山(饰演大姐夫):诈和了 瞅好啊整不好让…

工作任务紧急程度如何快速区分?

在繁忙的工作中,我们每天都需要处理大量的工作任务。如果不将这些任务仔细区分,就很难保证按时完成所有任务。面对如此多的任务,仅凭脑力很难将它们一一整理和区分。这时,选择一款高效的待办事项管理软件,就成了一个不…

深度学习入门-01

1、安装Anaconda 创建一个虚拟环境,在Anaconda Prompt中创建,环境名称叫做pytorch,使用的python版本是3.10 conda create -n pytorch python3.10在这环境中需要安装的包,选择yes 激活环境: conda activate pytorch如…