体系结构论文(四十七):MERSIT: A Hardware-Efficient 8-bit Data Format with Enhanced Post-Training 【DAC‘24】

MERSIT: A Hardware-Efficient 8-bit Data Format with Enhanced Post-Training Quantization DNN Accuracy Nguyen-Dong Ho, Gyujun Jeong, Cheol-Min Kang, Seungkyu Choi and Ik-Joon Chang Kyung Hee University
 

文章主要介绍了MERSIT,一个新提出的8位数据格式,专门为深度神经网络(DNN)的后训练量化(PTQ)设计。MERSIT的设计初衷是解决现有的8位整数(INT8)和浮点数(FP8)格式在进行后训练量化时,准确率大幅下降的问题

一、文章背景及相关知识

1. 后训练量化(PTQ)与量化感知训练(QAT)

  • PTQ:这是一个在模型训练完成后进行量化的方法,只需要少量的数据集来校准模型的权重和激活值。尽管这种方法成本较低,操作简单,但在精度上比QAT略差。
  • QAT:这种技术在模型训练过程中进行量化,更具侵略性,能够提供更高的精度,但代价是需要大量的计算资源和更长的训练时间。

后量化训练:

一个已经训练好的神经网络模型上,将模型的参数(比如权重和激活值)从高精度(比如32位浮点数,FP32)转化为低精度(比如8位整数,INT8)来减少模型大小并加速计算。【实际上是将训练好的模型再训练以加速推理】。

  • 优点:操作简单,不需要重新训练模型,只需要用少量的数据对模型进行简单校准。
  • 缺点:因为精度减少了,模型的准确率可能会有一定下降,尤其是对于复杂的模型,精度损失可能更明显。

量化感知训练:
在模型训练过程中,已经考虑到量化的需求,从一开始就让模型适应低精度的数值表示。【在训练的同时,模型已经习惯了使用8位的数值来处理数据】

  • 优点:通过QAT训练的模型通常精度更高,因为它在训练时已经考虑到了量化的影响。
  • 缺点:需要更多的计算资源和更长的训练时间,因为你得在低精度下重新训练模型。

这里解释一下为什么用INT训练反而精度更高:

1. 模型在训练过程中适应了低精度计算

在QAT中,模型从训练开始就知道它会在低精度(INT8)环境下运行。因此,它在训练过程中会调整权重和激活函数,使其在低精度的表示范围内保持稳定。换句话说,模型学会了如何在INT8的限制下做出更好的决策,这让它在推理时精度不容易受到量化误差的影响。

2. FP32训练的模型不适应量化误差

相比之下,使用FP32训练的模型在训练过程中没有经历量化的过程,所以它在高精度下表现很好,但一旦完成训练并直接量化为INT8,可能会出现不适应量化误差的情况。也就是说,模型在没有准备好的情况下被强制缩减精度,导致精度下降。

2. 现有8位格式的局限

  • INT8格式:这种格式广泛用于DNN的量化,尤其是一些轻量级视觉模型和大规模语言模型(LLM),但其动态范围有限,在某些复杂模型中会出现显著的精度下降。
  • FP8格式:相比INT8,FP8的动态范围更广,因此它在DNN中可以提供更好的量化精度。但它也有其局限性,尤其是不同模型对指数位数的需求不同,使得FP8的硬件实现较为复杂且效率低下。

 FP格式运算慢,这是因为系统需要:

  1. 比较指数位:如果两个浮点数的指数不同,首先需要比较它们的指数位,找到较大的指数值。

  2. 对齐尾数(对齐小数点):将指数较小的那个数的尾数右移,使得它的指数与较大的数的指数相同。这相当于将较小数值的数放在与较大数值同一个数量级上。

  3. 进行运算:在指数对齐之后,才可以对尾数部分进行加法或减法运算。

  4. 归一化:运算结果可能会导致尾数超出正常范围(即不再是1.xxxxx的形式),因此需要将结果重新归一化,并根据归一化的结果调整指数。

3. Posit数据格式的优点与挑战

  • Posit格式(2017年提出):这种格式引入了regime位,可以动态调整小数部分的精度,根据数据范围自适应调整。这使得Posit在处理不同的DNN架构时能够保持较好的精度。然而,Posit的解码逻辑非常复杂,导致其在硬件实现时占用大量面积和功耗。
  • 研究表明,与FP8相比,Posit的8位乘法器需要多80%的面积,并且功耗增加了46%,使得Posit的应用范围受到了限制。

1. Regime位的定义

在Posit和MERSIT格式中,Regime位决定数值的数量级(即数值的范围有多大或多小)。它与浮点数中的指数位相似,但它的表示方法是动态的。Regime位通过一系列连续的相同值(1或0)来编码数值的大小:

  • 如果Regime是连续的1,则表示数值比较大。

  • 如果Regime是连续的0,则表示数值比较小。

Regime的长度是可变的,随着数值的大小变化,Regime位的长度也会相应变化。

2. Regime的作用

Regime位用来调整Posit或MERSIT数值的动态范围。通过编码更多的1或0,Regime位可以表示更大的数值范围,或者通过较短的Regime位表示更小的数值范围。

3. Regime位的编码方式

Regime位的长度和内容可以通过以下规则进行解释:

  • 当遇到连续的1时,Regime值逐渐增大,数值变得越来越大。这个过程一直持续到遇到第一个0为止。

  • 反之,当遇到连续的0时,Regime值逐渐减小,表示数值变小,直到遇到第一个1。

例如:

  • 1110:三个连续的1后跟一个0,表示较大的数值。

  • 0001:三个连续的0后跟一个1,表示较小的数值。

Regime值的计算公式

  • 如果Regime是连续的1,Regime值为正,即 g。

  • 如果Regime是连续的0,Regime值为负,即 −(g+1),其中 g 是连续0或1的长度。

4. Regime位与指数和尾数的关系

  • 指数:Regime位确定了数值的基本范围,而指数则用于进一步精细调整数值的大小。指数的位数通常较少,在Regime位之后出现。

  • 尾数:尾数是小数部分,用于表示精度。在数值较小时,尾数位会占用更多的位数,而在数值较大时,Regime位占据的位数较多,尾数位较少。

5. Regime位的实际例子

(省略第一位符号位。1为- 0为+)

  • 1110100

    • 111:前三位是1,表示Regime为正,数值比较大(譬如数量级是10^7)。

    • 0:接着遇到0,停止解析Regime位,进入指数部分。

    • 后面的位将用于表示指数和尾数。指数位的长度由格式中的exponent size参数决定,通常是1位或2位。

另一个例子:

  • 0001100:这个数值代表较小的数。

    • 000:前三位是0,表示Regime为负,数值比较小(譬如数量级是10^-7)。

    • 1:遇到1,停止解析,后面部分用于表示指数和尾数。

【注意:Regime位的长度是可变的,具体取决于连续的1或0的数量。需要从符号位之后开始数,直到遇到第一个不同的位(即1后跟0,或者0后跟1)。】

6. Regime位的优势

Regime位的优势在于它能够动态地调整数值的范围,从而扩大Posit数格式的动态范围,而不需要像浮点数那样有固定的指数位。这样Posit和类似格式可以在相对较少的位数下表示更大范围的数值。

4. MERSIT的提出

  • MERSIT继承了Posit格式的一些优点,如使用regime位信息和动态小数安排,但通过合并解码方案,减少了硬件开销。
  • 具体来说,MERSIT通过将多个位组合成组来表示regime信息,从而降低了解码的复杂度,同时能够在不同的DNN模型上保持高精度。
  • MERSIT与Posit类似,能够在不需要额外硬件开销的情况下,提供一种通用的配置方案。

5. MERSIT的贡献

  • 可调节的指数位数:MERSIT允许调整指数位的合并级别,文章中主要研究了(8,2)和(8,3)两种配置,并与FP8和Posit的配置进行了比较。
  • PTQ精度表现:MERSIT在多个DNN模型中的精度与8位Posit相当,显著优于INT8和FP8。
  • 硬件效率:MERSIT的硬件效率远优于Posit格式。研究表明,MERSIT的硬件实现相比8位Posit减少了26.6%的面积,并降低了22.2%的功耗,同时保持了与FP8相当的效率。

二、相关背景 

 

  • FP8:由1位符号位、4位指数位和3位尾数位组成,运算方式和正常浮点数类似。

  • Posit8:由1位符号位、变长的regime位、1位指数位和剩余的尾数位组成。

    • 公式: 中间2^[(2^es)*k]是和正常公式不一样的,相当于针对FP多了一个数量级的拓展。m是连续1或者0的数量,es表示指数位长度,exp表示指数位值。
    • 表示范围:Posit8的log2刻度分布范围从-10到10,比FP8的范围更广。

2.1 已有的8位数据格式

FP8

FP8是一种浮点数表示方法,它将一个数分为符号位、指数位和尾数位。与常见的32位浮点数(FP32)和16位浮点数(FP16)不同,FP8并没有严格的标准,意味着它不遵循固定的IEEE 754标准,因此它有更大的灵活性,可以根据应用需求调整指数位和尾数位的比例。该灵活性使FP8可以在不同的场景中进行优化,但同时也可能导致不同实现之间的不一致性。

FP8的特点

  • FP8使用次正规化来扩展其表示的数值范围。当指数为0时,次正规化允许表达非常小的数,这有助于提高数值的精度。
  • 指数位的数量可以根据需求进行调整,以在动态范围和精度之间找到平衡。
  • 尾数部分固定,用于提供数值的精度。
Posit8

Posit8是一种基于Posit数表示法的8位数值格式。Posit数是一种相对较新的浮点数表示方法,由John Gustafson提出,用来替代传统的浮点数格式。Posit8的一个显著特点是引入了regime位,这让它比FP8拥有更广的动态范围。Regime位的长度是可变的,取决于数值的大小。

Posit8的特点

  • Posit8通过regime位来调整指数和尾数位的长度。这意味着随着数值的增大或减小,regime位长度也会动态变化,从而调整数值的表示范围。
  • 符号位决定数的正负,regime位确定数值的大小范围,指数位尾数位用于进一步细化数值的精度。
  • Posit8的动态范围比FP8更大,这使得它在处理非常大或非常小的数时表现得更好。
  • 缺点是Posit8的解码逻辑更复杂,硬件实现的成本更高,尤其是在高精度计算时。

 

 

 

图2展示了三种格式(FP8、Posit8、MERSIT)的MAC单元设计,包括FP(8,4)、Posit(8,1)和MERSIT(8,2)。图中重点介绍了不同数据格式在硬件实现中的动态范围(Dynamic Range)和所需的位宽(W),并对不同格式进行了对比。

从图中可以看到,不同的数据格式在实现MAC单元时,所需的位宽(W)和动态范围不同。Posit(8,1)格式由于其更广的动态范围,需要更宽的位宽,增加了硬件实现的复杂度。而MERSIT(8,2)通过较好的动态范围和位宽之间的平衡,减少了硬件的面积和功耗。

2.2 MAC 单元设计

Kulisch累加器是一种专门设计的固定点累加器,用来提高MAC单元的硬件效率。它通过简化加法逻辑,减少了传统浮点运算的开销。在传统的浮点数MAC单元中,累加器需要进行复杂的指数对齐和加法运算,这会消耗大量的硬件资源。而Kulisch累加器通过将乘法结果直接累加在一个较大的固定点表示中,避免了每次乘法后的指数对齐问题。

换句话说:Kulisch累加器通过固定点运算解决了指数对齐问题。并不需要每次累加时都对齐指数,而是直接将所有的乘法结果累加在一个固定点格式的大寄存器中。这个大寄存器足够宽,可以直接存储所有的中间结果,而不需要在每次累加时进行指数对齐。

MAC单元设计与各数据格式的兼容性

文中展示了FP8、Posit8和MERSIT8在MAC单元中的实现方式。每种格式的动态范围和所需的位宽不同,直接影响了硬件设计的复杂度。

  • FP8(8,4):动态范围较窄,MAC单元的总位宽为33位。
  • Posit8(8,1):动态范围最大,但MAC单元的复杂度和总位宽也最大,达到了45位。
  • MERSIT8(8,2):动态范围在FP8和Posit8之间,硬件实现上也相对平衡,总位宽为35位。

通过比较,可以看到Posit8虽然在表示范围上有优势,但硬件复杂度较高;而FP8相对简单,但表示范围较窄。MERSIT8通过结合两者的优点,在保持较大动态范围的同时,减少了硬件的复杂性。

三、MERSIT

3.1 MERSIT数据格式

右侧:

  • 从左往右检查:从 b5 开始检查,先看是否有连续的1。逻辑与操作用于检测该组位的值是否为1。
  • 检测到第一个0后停止:一旦检测到第一个0,LZD停止检测并返回对应的g值,这表示已经确定了Regime的长度。
  • 返回g值:当检测到0时,会返回相应的g值:
    • 如果第一个检测到0的组是 b5,b4,返回 g=0
    • 如果第一个0是在 b3,b2,返回 g=1
    • 如果第一个0是在 b1,b0,返回 g=2
MERSIT结构说明

MERSIT格式由三个主要部分组成:

  1. 符号位

    • 符号位位于最高位(如图中的 b7),用于表示数值的正负性。
    • 符号位的作用是:如果为0,表示正数;如果为1,表示负数。
  2. regime与指数位

    • Regime Sign Indicator ks:在MERSIT格式中,regime信息通过多个指数候选位(ECs)中的前导零位置来确定。通过合并的设计,指数和regime位被一起表示。
    • 通过检测包含前导零的EC来选择有效指数,并根据该指数的位置来确定regime的值。
  3. 尾数位

    • 在MERSIT中,尾数位的数量取决于regime的值,即regime值越小,尾数位越多。

Regime的计算公式

Regime的值 k 通过以下公式计算:

  • 其中,g 是通过前导零检测得到的,表示regime的长度。如果前导零后出现1,则表示正的regime;如果前导零后出现0,则表示负的regime。
硬件解码过程

在硬件实现中,MERSIT使用了前导零检测来确定指数的起始位置。具体来说,指数候选位通过逻辑与运算检测前导零,然后找到第一个出现0的地方,接下来计算出对应的regime值。

例子:
  • 0111111 表示零。
  • 1111111 表示无穷大。
  • 对于11110xx,尾数位数为2,指数范围为5。

3.2 动态范围和精度比较

图 4:不同8位数据格式的范围和精度

FP8数据格式::随着指数位数增加,动态范围扩大,但尾数位数减少。这意味着更大的数值范围可以表示,但精度有所降低。

Posit8数据格式:Posit8的数据格式可以在较大的范围内表示数值,同时保持较高的精度。但其硬件复杂度较高,尤其是在指数解码方面。

MERSIT8数据格式::MERSIT(8,2)保持了较好的动态范围,并在较宽的数值范围内提供了4位的尾数,这使得它在保证精度的同时具备较大的动态范围。与Posit(8,1)相比,MERSIT在相对较小的范围内可以保持更高的精度,而Posit(8,1)则更擅长表示极端的大值或小值。

这一节比较了不同8位数据格式的动态范围和精度(尾数位数),包括FP8、Posit8和MERSIT8。

FP8格式

FP8格式通过不同的指数位数设置(如FP(8,2)、FP(8,3)、FP(8,4))来控制动态范围和精度。随着指数位数增加,动态范围扩大,但尾数位数减少。这意味着FP8能够表示较大的数值范围,但精度会有所降低。

Posit8格式

Posit8可以表示较大的动态范围,同时保持较高的精度。然而,Posit8的硬件复杂度较高,特别是在指数解码方面。

MERSIT8格式

MERSIT8在动态范围和精度之间找到了平衡。MERSIT(8,2)在较宽的数值范围内提供了4位的尾数,这意味着它能够在较大范围内保持较好的精度。

关键比较:
  • FP(8,4) 的最大精度为3位,Posit(8,1) 可以提供最高4位的精度,并且有最广的动态范围。
  • 尽管MERSIT(8,2) 的整体动态范围小于Posit(8,1),但在保持4位精度的范围内,MERSIT(8,2) 的范围比Posit(8,1)更广。

3.3 MERSIT解码方案

 5(a) 解码器工作流程

  • 前导零检测器(LZD):通过3位前导零检测器,确定第一个0的位置,计算出regime值。

  • 动态移位器:根据前导零的数量调整指数和尾数的位置。

  • 加法器:用于计算有效指数。

5(b) 具体真值表

MERSIT的解码设计基于合并的指数和regime位,这是与Posit的主要区别之一。MERSIT的解码器通过检测前导零来确定指数位置,并计算出regime值和指数。

解码器工作流程
  • 前导零检测器(LZD):通过检测前导零的位置,确定有效指数和regime值。
  • 动态移位器(Dynamic Shifter):根据检测结果,动态调整尾数和指数之间的对齐。
  • 加法器(Adder):用于计算有效指数值 。
优化硬件设计
  • 与Posit的逐位解码相比,MERSIT采用了按组解码的方式(每次2位),这减少了硬件解码的复杂度。
  • LZD通过较少的逻辑门实现有效指数和regime的解码。
  • 硬件优势:MERSIT的解码方案在面积和功耗上比Posit更为高效,尤其是在深度神经网络的乘加运算单元中。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

D了一天bug忘了编译

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值