• 【论文阅读】I-BERT: Integer-only BERT Quantization



    1. 论文信息

    作者:Sehoon Kim, Amir Gholami, Zhewei Yao, Michael W. Mahoney, Kurt Keutzer
    发表单位:University of California, Berkeley 加州大学伯克利分校
    会议:ICML2021
    发表时间:2021.6.8

    2. 研究背景

    • NLP里面的预训练模型都太大了,无法高效部署并达到实时运行的效果;
    • 之前对transformer的量化工作仍然存在大量的浮点运算,如GELU, softmax,LayerNorm,不能高效地利用纯整型的计算单元来进行加速,比如Turing Tensor Cores,或者传统的integer-only ARM处理器;

    比较Transformer架构中应用于自我注意层的不同量化方案:
    在这里插入图片描述

    • (左)模拟量化(伪量化): 所有操作都使用浮点算术执行,参数被量化并存储为整数,但它们被反量化为浮点来进行推断。
    • (中)模拟量化(伪量化): 只有一部分操作是用整数算法执行的。,比如这个图中的Softmax是用浮点算法执行的,所以Softmax的输入应该被去量化(Dequantize);Softmax的输出应该被量化回整数,以执行后续的整数MatMul。
    • (右)本文提出的纯整数量化: 在整个推理过程中,既没有浮点运算,也没有去量化。

    3. 方法

    基本思想:利用多项式来近似非线性函数

    挑战:找到一个好的低阶多项式,可以接近Transformer中使用的非线性函数。

    • 选择高阶的话,虽然近似误差小,但计算量大;
    • 低精度整型乘法容易造成溢出,需要更多的位宽来保存来累加值。

    3.1 Integer-only GELU

    原始GELU函数:
    在这里插入图片描述
    尝试过的方法:
    a. 使用ReLU近似:GELU和ReLU在特别大正数/负数部分很相似,但是在0附近的值差异很大;

    如下图片参考:https://blog.csdn.net/weixin_43791477/article/details/124871734
    在这里插入图片描述

    b. 直接求解 erf 积分项不靠谱,计算量很大
    c. 根据前人的理论,使用sigmoid函数来近似erf(但是sigmoid需要浮点数计算,因此不可行!),需要再用h-sigmoid来进一步近似sigmoid,最后可以得到h-GELU,但近似误差还是太大。
    在这里插入图片描述
    在这里插入图片描述
    本文方法:多项式近似

    • 优化问题如下:
      在这里插入图片描述
    • 选择了二阶,但直接优化这个公式,会得到一个很差的近似,因为erf的值域太广了,而实际上erf在较大值上趋近±1,所以我们可以设置一个小的范围来进行优化,因为erf是奇函数,所以只需要考虑正数部分,从而得到新的二阶近似函数L(x)。
      在这里插入图片描述
    • 从而得到 i-GELU
      在这里插入图片描述

    对比:近似GELU函数

    在这里插入图片描述
    结果: 上图可以观察到,I-GELU(蓝色曲线)和原GELU函数(红色曲线)非常接近,特别是在0点附近的时候;h-GELU(黄色曲线)近似误差还是比较大;RELU(绿色曲线)就不用说了,本身在零点附近和GELU就不太一样。

    误差分析

    在这里插入图片描述

    分析结果: i-GELU的平均误差为8.2 × 10−3,最大误差为1.8 × 10−2。这比h-GELU的平均误差和最大误差分别为3.1 × 10−2和6.8 × 10−2的精度提高了3倍。此外,i-GELU甚至略优于基于Sigmoid的erf近似,但没有使用任何浮点算术。

    这里的误差导致了后面i-GELU比h-GELU精度更好!


    3.2 Integer-only Softmax

    Softmax将输入向量归一化,并将其映射到概率分布:
    在这里插入图片描述
    以前的transformer都是用浮点运算处理这一层,但是不利于那些只支持整型运算的加速器的部署;
    难点: 指数函数输入是无界的,一直在动态变化

    尝试过的方法:
    a. 查找表:占用内存大,不够优雅,因此要避免查找表;
    b. 简单的多项式近似:需要使用高阶来近似exp,并且值越大,近似误差越大,需要高阶。

    本文方法:限制范围的多项式近似

    • 指数位先减去最大值,使得都是负数,类似pytorch当中防softmax溢出一样的操作;

    • 然后将这个负数解码成如下形式,其中z是非负整数,p是(-ln2, 0)之间的一个浮点数
      在这里插入图片描述

      • 于是可以将exp(x)变换成如下形式,其中exp§的范围固定,z为整数
        在这里插入图片描述
    • 针对这个范围有限的exp§采用二项式来近似就很容易,且误差不会很大,最后得到的整型推理exp的形式如下:
      [图片]

    对比:i-exp与指数函数

    在这里插入图片描述

    上图绘制了i-exp的结果,它几乎与指数函数相同。发现这两个函数之间的最大差距只有1.9 × 10−3。考虑到单位区间的8位量化所引入的量化误差为1/256 = 3.9 × 10−3,因此,i-exp的近似误差相对可以忽略不计,可以纳入量化误差中。


    3.3 Integer-only LayerNorm

    LayerNorm在transformer中经常使用,它涉及到一些非线性操作,比如除法、平方根。此操作用于跨通道维度规范化输入激活。规范化过程描述为:
    在这里插入图片描述
    其中,μ和σ是输入在通道维度上的均值和标准差。这里的一个微妙的挑战是,输入统计数据(例如,µ和σ)在NLP任务中变化很快,这些值需要在运行时动态计算。计算µ很简单,计算σ需要平方根函数

    简单地说量化LayerNorm函数难点就是动态计算方差。

    本文方法:牛顿迭代法

    • 每一步迭代只需要一个整型除法,整型加法,一个bit移位,就可以得到近似值。

    牛顿迭代法,这块讲的比较简单,其实是取得泰勒展开式的前两项求方程根。

    在这里插入图片描述

    • 直接在整数域上计算方差和均值,然后进行LayerNorm运算。

    4. 实验

    基于RoBERTa模型实现I-BERT,将原始RoBERTa模型中的所有浮点运算替换为本文的纯整型运算。其中,使用INT8精度来执行MatMul和Embedding,所有的MatMul操作都以INT8精度执行,并累计到INT32精度。此外,嵌入层保持在INT8精度。

    实验环境

    • TensorRT 7.2.1
    • Google Cloud Platform virtual machine with a single Tesla T4 GPU
    • CUDA 11.1
    • cuDNN 8.0

    4.1 准确性实验

    数据集:GELU
    baseline:FP32模型

    在这里插入图片描述
    实验结果:I-BERT 始终达到可比或略高于基线的准确性

    • RoBERTa-Base: I-BERT在所有情况下都实现了更高的精度(RTE精度提升高达1.4),除了MNLI-m, QQP和STS-B任务(精度下降高达0.3)
    • RoBERTa-Large:结果类似,其中I-BERT匹配或优于所有下游任务的基线精度。
    • 平均而言,对于RoBERTa-Base/Large, I-BERT分别优于基线0.3/0.5。

    4.2 延迟实验

    在这里插入图片描述
    实验结果:与FP32模型相比,在支持高效整数计算的专用硬件上部署I-BERT可以实现显著的加速。

    • I-BERT的INT8推理平均比BERT-Base和BERT-Large的纯FP32推理分别快3.08×和3.56×,最高可达到4.00×加速。

    另外,通过Nvidia的插件融合和加速Transformer架构中的关键操作,可能实现进一步的加速,可以期待比TensorRT提供的api快2倍。

    4.3 消融实验

    使用GELU、h-GELU和 i-GELU进行GELU计算模型精度
    在这里插入图片描述
    实验结果

    • i-GELU比GELU有精度较小提升,在上述所有任务的精度都比h-GELU高
    • h-GELU近似代替GELU会导致除MRPC外所有下游任务的精度下降(最高2.2%精度下降)

    为什么i-GELU比GELU更好?还没有合理解释

    5. REFERENCE

    I-BERT推荐读者读(姚明et al ., 2020)以了解更详细的quantization-aware微调integer-only量化的方法。

    参考资料

  • 相关阅读:
    安洵杯2022 Web Writeup
    大型互联网企业Java后端技术面试题总结(含答案)
    【EMQX】Java物联网开发“尚方宝剑” - - 课程目录
    Vue2项目引入element ui的表格第一行有输入框要禁用
    仙人指路,引而不发,Go lang1.18入门精炼教程,由白丁入鸿儒,Golang中New和Make函数的使用背景和区别EP16
    1、python开发环境搭建与基础语法
    线程池与CompletableFuture
    【QML】报错 DelegateModel :: index out range xx xx
    【老生谈算法】matlab实现霍夫变换算法源码——霍夫变换算法
    NOSQL Redis 数据持久化 RDB、AOF(二) 恢复
  • 原文地址:https://blog.csdn.net/qq_43800119/article/details/126030984