ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

低数值精度推理和训练

2021-07-17 15:03:54  阅读:220  来源: 互联网

标签:16 英特尔 数值 量化 激活 32 推理 精度


低数值精度推理和训练
介绍
如今,大多数商业深度学习应用程序使用 32 位浮点精度 ( ) 来处理训练和推理工作负载。各种研究人员已经证明,深度学习训练和推理都可以以较低的数值精度进行,使用 16 位乘法器进行训练,使用 8 位乘法器进行推理,精度损失最小甚至没有。使用这些较低的数值精度(使用累积到 32 位的 16 位乘法器进行训练,以及使用累积到 32 位的 8 位乘法器进行推理)可能会成为明年的标准。
英特尔® 正积极致力于在英特尔® 至强® 处理器和其他产品中实现较低数值精度的推理和训练。较低的数值精度有两个主要好处。首先,许多操作都受内存带宽限制,降低精度将允许更好地使用缓存并减少带宽瓶颈。因此,可以更快地通过内存层次结构移动数据,以最大限度地利用计算资源。其次,硬件可以在较低的数值精度下实现更高的每秒运算 (OPS),因为这些乘法器需要更少的硅面积和功率。
在本文中,回顾了较低数值精度训练和推理的历史,并描述了英特尔® 如何为深度学习推理和训练实现较低数值精度。具体而言,描述了当前英特尔® 至强® 可扩展处理器中可用的指令以及未来英特尔® 至强® 可扩展处理器中可用的指令,这些处理器充当称为英特尔® 深度学习加速(英特尔® DL Boost)的嵌入式加速器。描述了如何量化模型权重和激活以及适用于深度神经网络的英特尔® 数学核心函数库(英特尔® MKL-DNN)。
https://github.com/oneapi-src/oneDNN
最后,描述了深度学习框架如何利用这些较低数值精度的函数并减少不同数值精度之间的转换开销。每个部分都可以独立于其他部分阅读。包括深学习培训与英特尔至强处理器的可扩展商业实例进行详细的论述,提出
https://software.intel.com/content/www/us/en/develop/articles/intel-processors-for-deep-learning-training.html
深度学习中低精度的简史
研究人员已经展示了使用 16 位乘法器进行深度学习训练,并使用 8 位乘法器或更少的数值精度进行推理,累积到更高的精度,并且各种模型的精度损失最小甚至没有损失。将激活和权重量化为 8 位,并将偏差和第一层输入保持在全精度 ( ),用于 CPU 上的语音识别任务。在前馈传播中训练了一个具有 -1、0 和 1 量化权重的简单网络,并使用 MNIST* 和 TIMIT* 数据集更新了反向传播中的高精度权重,性能损失可忽略不计。在 MNIST、CIFAR-10* 和 SVHN* 数据集上训练模型,使用较低的数值精度乘法器和高精度累加器,并更新高精度权重;提议将动态不动点(张量或高维数组具有一个共享指数)与随机舍入作为未来的工作。
将权重和激活编码为以 2 为底的对数表示(因为权重/激活具有非均匀分布);使用 5 位权重和 4 位激活对 CIFAR-10 进行了训练,从而最大限度地降低了性能下降。用二进制权重(第一层和最后一层除外)训练 AlexNet,并更新全精度权重,精度损失为 top-1 2.9%。根据实验,建议避免在全连接层和具有小通道或滤波器大小(例如,1x1 内核)的卷积层中进行二值化。
来自英特尔实验室,在卷积层中使用 4 位权重和 8 位激活训练 ResNet-101,同时以最高 1 2% 的精度损失进行全精度更新。使用 16 位浮点 ( ) 乘法器和全精度累加器进行训练,并更新了全精度权重,AlexNet*、VGG-D*、GoogLeNet*、ResNet-50*、Faster R 的精度损失可以忽略不计甚至没有损失-CNN*、Multibox SSD*、DeepSpeech2*、Sequence-to-Sequence*、bigLSTM* 和 DCGAN*(某些模型需要梯度缩放以匹配全精度结果)。
成功使用 8 位固定精度,1 个符号位,4 位整数部分和 3 位小数部分。使用了各种量化技术(见论文中的表 3),显示在降低的精度下损失最小或没有损失(除了第一层和最后一层保持全精度)。使用 16 位整数乘法器和 32 位累加器训练了 ResNet-50、GoogLeNet、VGG-16 和 AlexNet。描述了 Google 的 Tensorflow 处理单元 (TPU)* 原生支持用于训练工作负载的 bfloat16 数字格式,并将在未来的英特尔至强处理器和英特尔 Nervana 神经处理器中使用。
最常见的 16 位数字格式和 8 位数字格式分别是 16 位 IEEE 浮点数 ( fp16 )、bfloat16 ( bf16 )、16 位整数 ( int16 )、 8 位整数 ( int8 ) 和8 位 Microsoft* 浮点 ( ms-fp8 )。图 1 显示了其中一些格式之间的差异。
在这里插入图片描述

图 1. 各种数字格式表示。s 表示符号位。FP32 和 BF16 提供与 FP32 相同的动态范围,由于尾数较大,精度更高。
英特尔®至强®可扩展处理器采用英特尔® AVX-512 和英特尔® Deep Learning Boost,降低数值精度
英特尔至强可扩展处理器现在包括英特尔® Advance Vector Extension 512指令集。这些指令使较低的数值精度乘以较高的精度累加。将两个 8 位值相乘并将结果累加到 32 位需要 3 条指令,并且需要 8 位向量之一为unsigned int8 ( u8 ) 格式,另一个为singed int8 ( s8 ) 格式,累加为singed int32 ( s32) 格式。以 3 倍多指令或 33.33% 多计算为代价的 4 倍多输入。用于较低数值精度操作的减少的内存和更高的频率可以提供额外的性能增益。详见图 2。
在这里插入图片描述

图 2. 英特尔至强可扩展处理器内核通过 3 条指令实现 8 位乘法和 32 位累加:VPMADDUBSW υ8×s8→ s16 倍数、VPMADDWD broadcast1 s16 →s32和 VPADDD s32→s32将结果添加到累加器。这允许比fp32多 4 倍的输入,代价是多 3 倍的指令或 33.33% 的计算量和 1/4 的内存要求。减少的内存和更高的频率以及较低的数值精度使其更快。图片来源以色列 Hirsh。
一个潜在的问题是在使用 VPMADDUBSW 指令υ8×s8→s16 时可能发生的未定义溢出行为(见图 2)。当接近最大值时,这是一个问题。这可以通过将输入精度降低 1 位来缓解。另一种技术是将矩阵乘法分解为两个矩阵乘法:一个使用 8 位乘法和 16 位累加的小值(以防止溢出),另一个使用全精度的稀疏大值。
英特尔正在添加一组新的英特尔 AVX-512 指令,称为英特尔深度学习加速(英特尔 DL Boost),以进一步加速未来英特尔至强可扩展处理器的深度学习性能。第一套英特尔 DL Boost 技术称为 AVX512_VNNI(矢量神经网络指令)将与代号为 Cascade Lake 的英特尔至强可扩展处理器和其他未来微架构一起推出。AVX512_VNNI 包含一条 FMA 指令,用于 8 位乘法与 32 位累加u8×s8→s32 ,如图 3 所示。累加到 s32 消除了溢出的风险。理论峰值计算收益是4个的int8 在OPS FP32 OPS。实际上,由于内存带宽瓶颈,收益可能较低。
在这里插入图片描述

图 3. Intel DL Boost AVX512_VNNI VPDPBUSD 指令通过 1 条指令u8×s8→s32实现 8 位乘法和 32 位累加,提供比 fp32 OPS 高 4 倍 int8 OPS 的理论峰值计算增益。 图片来自 Israel Hirsh。
对这些 AVX512_VNNI 指令的编译器支持正在进行中。开发代码和编译器已经支持 AVX512_VNNI 指令。在2017年10月更新增加了对AVX512_VNNI指令的支持。
英特尔® MKL-DNN 库低数值精度原语
英特尔 MKL-DNN 库包含在各种模型中使用的流行深度学习函数或基元,例如内积、卷积、整流线性单元 (ReLU) 和批量归一化 (BN),以及操纵张量或高维数组。英特尔 MKL-DNN 针对采用英特尔 AVX-512、英特尔® AVX-2 和英特尔® Streaming SIMD Extensions 4.2(英特尔® SSE4.2)指令的英特尔处理器进行了优化。这些函数使用ƒp32用于训练和推理工作负载。
引入了新函数来支持卷积、ReLU、融合卷积加 ReLU 和池化层中具有 8 位精度的推理工作负载。用于长短期记忆 (LSTM)、其他融合运算和 8 位 Winograd 卷积的函数被指定为未来的工作。英特尔 MKL-DNN 使用 AVX512_VNNI 指令对 16 位乘法的支持被设计为指令可用时的未来工作。
由于以下原因,英特尔 MKL-DNN 没有以 8 位精度(仅使用fp32)实现的局部响应归一化 (LRN)、softmax 或批量归一化 (BN) 层。现代模型不使用 LRN,可以修改旧模型以使用批量归一化。softmax 函数和 BN 需要全精度,因为不能保持 8 位精度的精度。此外,不需要 BN 推理层后跟卷积,因为可以通过缩放权重值和修改偏差被其前一层吸收,如框架部分的启用较低的数值精度中所述。
英特尔 MKL-DNN 使用υ8格式的激活(或输入)值、s8格式的权重和s32格式的偏差来实现 8 位卷积运算(偏差可以保留在ƒp32中,们只占很小的百分比)的整体计算)。图 4 显示了将 8 位乘法器累积到s32的推理操作过程。
在这里插入图片描述

图 4. 数据层或第一个卷积层激活被量化为υ8作为下一个卷积层的输入。权重被量化为s8,偏差被格式化为s32并添加到s32卷积累加。框架根据下一层的参数选择卷积输出的格式为s8、υ8或s32。图片来源:Jong Gong。
具有非负值和权重的 8 位激活量化
英特尔 MKL-DNN 当前假设激活是非负的,这是在 ReLU 激活函数之后的情况。可将讨论如何用负值量化激活。英特尔 MKL-DNN 量化给定张量或张量中每个通道的值(选择取决于框架开发人员),如下所示。
R {a,w} = max⁡ (abs(Τ {a,w} ) ),其中 Τ {a,w}是对应于权重w或激活或模型输入a的张量。
Q a = 255 / R a是非负值激活的量化因子,Q w = 127 / R w是权重的量化因子。量化的激活、权重和偏差是:
在这里插入图片描述

其中函数 ||⋅|| 舍入到最接近的整数。虽然s8格式支持 -128,但最小的量化s8权重值使用是 -127。
使用8位乘法器和32位累加器的仿射变换得到
在这里插入图片描述

近似值是因为方程忽略了舍入运算,
在这里插入图片描述

是f32格式的仿射变换,D = 1 / Q a Q w是去量化因子。
在量化为υ8和s8格式时,零值映射到特定值而不进行任何舍入。鉴于零是最常见的值之一,拥有精确映射以减少量化误差和提高统计精度是有利的。
在英特尔至强可扩展处理器中,上述量化因子可以采用 fp32 格式。但是,某些架构不支持除法(例如 FPGA)并使用移位。对于这些架构,标量四舍五入到最接近的 2 的幂,缩放是通过位移完成的。统计准确性的降低是最小的(通常<1%)。
高效的 8 位乘法
在图 5 中,演示了如何有效地执行A × W的 8 位乘法。英特尔 MKL-DNN对激活张量使用NHWC数据布局,其中N是批量大小,H是高度,W是宽度,C是通道数,一个 ( O / 16 )Κ ( C / 4 )Τ16o4c权重张量的数据布局,其中O是核数或输出通道数,C是输入通道数,Κ是高度,而Τ是宽度。以灰色显示的张量A的前 32 位(4 个int8值)广播 16 次以填充 512 位寄存器。英特尔 MKL-DNN在量化权重后修改张量W的数据布局。张量W数据布局按 16 列的组重新排列为W’,每列具有 32 位(4 个 int8 值),从第 1 列中的前 4 个值开始,在内存中连续读取,占据第 32 位寄存器(红色),下一个 4x1 占用寄存器的下一个 32 位(橙色),依此类推(绿色)。第一个块下方的第二个、第三个和第四个块(黄色)以相同的模式重新排列。接下来是下一组块(蓝色)。在实践中,张量W通常在重新排列内存布局之前转置,以便在重新排列数据布局时访问 1x4 连续内存值而不是 4x1 分散值。修改此数据布局通常完成一次并存储以供所有推理迭代重复使用。
在这里插入图片描述

图 5. 有效使用int8乘法来计算乘积A×W需要对张量W进行数据布局转换,以便读取连续位。A的 32 位组广播 16 次以填充 512 位寄存器,然后乘以来自张量W’的 512 位组。
与第一寄存器INT8的值(拷贝16次),由64个乘以INT8的值(512位)W’和积累。A中接下来的 4 个值被广播 16 次到另一个寄存器,该寄存器与W’的接下来 64 个int8值相乘。这一直持续到读取A的第一行并累加结果。输出(在 8 位 FMA 的所有 3 条指令之后)是前 16 个输出值(在s32需要 512 位)。然后将A的第一行乘以W’的下一个值 产生接下来的 16 个输出值。
英特尔至强可扩展处理器具有多达 32 个寄存器。在具有两个 FMA 单元的处理器上以 512 位寄存器端口方案执行时,端口 0 FMA 的延迟为 4 个周期,而端口 5 FMA 的延迟为 6 个周期。用于int8深度学习工作负载的指令支持旁路,并且端口 0 和 5 的延迟均为 5 个周期。实际上,多行W’被加载到多个寄存器以隐藏这些延迟。
用于训练的 16 位函数
英特尔 MKL-DNN 使用 AVX512_VNNI 指令对 16 位乘法的支持被设计为指令可用时的未来工作。尽管如此,研究人员已经了通过利用 AVX512_4VNNI 指令(也称为 QVNNI,在某些英特尔® 至强® Phi™ 处理器上可用),特别是 AVX512_4VNNI VP4DPWSSD,使用 16 位乘法和 32 位累加的训练指令(类似于前面讨论的 AVX512_VNNI VPDPWSSD 指令)。
这些研究人员匹配FP32 RESNET-50的统计性能,GoogLeNet-V1,VGG-16和AlexNet具有相同的迭代次数为ƒp32模式不改变超参数。用S16来存储激活,权重和梯度,同时还保持的主副本ƒp32的权重为获得量化回权重更新S16在每次迭代后。们使用二次幂的量化因子,这有助于通过张量乘法管理量化/反量化因子。
在框架中启用较低的数值精度
流行的框架使用户能够定义模型,而无需自己编写所有函数定义。各种功能的实现细节可以对框架用户隐藏。这些实现由框架开发人员完成。本节解释了框架级别所需的修改,以实现较低的数值精度
在推理开始之前完成权重的量化。有效地量化激活需要预先计算量化因子。激活量化因子通常是预先计算的,通常对验证数据集进行采样以找到如上所述的范围。超出此范围的测试数据集中的值已饱和到该范围。对于负激活值,饱和前的范围可以放宽到 - 128R a’ / 127以使用s8 = -128值,其中R a’是这些激活的最大绝对值。然后将这些标量写入文件。
具有负值的激活或输入的 8 位量化
量化激活或具有负值的输入值可以在框架级别实现如下。Q a’ = 127 / Ra’是负值激活的量化因子。在S8量化格式是一个S8 = ||常见一个’ 一个ƒ32 || ∈ [-128, 127 ],其中函数 ||⋅|| 舍入到最接近的整数。但是,激活必须是υ8格式才能利用 AVX512_VNNI VPMADDUBSW 指令或 AVX512_VNNI VPDPBUSD 指令(两者都在使用英特尔至强可扩展处理器降低数值精度部分中进行了描述)。因此,所有值一s8移位Κ = 128为非负数:
在这里插入图片描述

其中1是全 1 的向量,偏置b ƒ32修改为
在这里插入图片描述

量化权重和修正偏差的方法与以前相同:
在这里插入图片描述

使用8位乘法器和32位的仿射变换积聚在结果
在这里插入图片描述

其中
在这里插入图片描述

其中D = 1 / Q a′ Q w是去量化因子。
当输入信号已经是υ8格式(例如 RGB 图像)但需要预处理步骤来减去均值信号时,可以使用上述等式 其中K是均值,一个υ8是输入信号(未预处理) ),且Q a′ = 1。
研究人员通常将第一个卷积层保留在ƒp32格式中,并在int8 中执行其他卷积层(有关示例,请参见深度学习中低精度简史部分)。观察到,使用这些量化技术可以在int8 中使用所有卷积层,而不会显着降低统计精度。
回顾一下,要使用具有负值的激活,激活被量化为s8格式,然后通过K=128 转换为υ8格式。唯一的额外变化是修改偏差: 在这里插入图片描述
对于卷积层,乘积W ƒ32 1被推广为等于W ƒ32沿所有维度的所有值的总和,除了与b ƒ32共享的维度。有关详细信息,请参阅附录 A。
融合量化
融合量化通过如下组合反量化和量化来提高性能,因此无需转换为fp32。第l+1层的激活为:
在这里插入图片描述

其中g(⋅)是一个非线性激活函数。假设 ReLU 激活函数,激活可以表示为υ8格式,
在这里插入图片描述

其中乘积Q a (l+1) D (l)能够以υ8格式计算下一层的量化激活,而无需计算ƒp32表示。
当g(⋅)是 ReLU 函数(如下面的等式)且Q ≥ 0 时,以下属性成立:
在这里插入图片描述

此属性对于具有跳过连接的模型很有用,例如 ResNet,其中跳过连接分支可能依赖于各种激活。例如,使用 ResNet-50 作者在 Caffe 的deploy.prototxt 中的命名法(见图 6),res2b_branch2a层(在下面的等式中缩写为2b2a)中的量化输入激活是
在这里插入图片描述

其中aυ8 (2b2a) ∈ [0,127 ](而不是 [0,255 ] )因为Qa (2b2a) D (2a1) x s32 (2a1) ∈ [ -128, 127 ]是s8格式,因为乘积在 ReLU 函数之前,并且Qa (2b2a) = 127 / R a (2b2a)是量化因子。按照这个过程,在附录 B 中表明激活a (2c2a) υ8取决于x s32 (2a1) , x s32 (2a2c) 和x s32(2b2c)。类似地,激活a υ8 (3ca) 取决于x s32 (2a1)、 x s32 (2a2c)、 x s32 (2b2c) 和x s32 (2c2c)。
在这里插入图片描述

图 6. ResNet-50 中第二组残差块(以及第三组中的第一个分支)的图,使用了 ResNet-50 作者在 Caffe 的命名法。用蓝色箭头标记的层依赖于 2 个或更多激活。图片来源:Barukh Ziv、Etay Meiri、Eden Segal。
批量标准化
不需要批量归一化 (BN)推理层,因为可以通过缩放权重值和修改偏差被其前一层吸收。这种技术仅适用于推理,并不是降低数值精度所独有的。可以在框架级别而不是英特尔 MKL-DNN 实现。BN 通常应用在仿射变换x = W a + b 之后和激活函数之前。BN 将x归一化为零均值和单位范数,然后将归一化的向量分别缩放和移动 γ 和 β,这也是在训练期间学习的参数。在训练迭代期间,x使用小批量统计进行归一化。为推论,平均È和方差V的X所使用的整个训练数据集或变体的统计数据,诸如运行平均值这些统计训练期间计算的预先计算。在推理过程中,BN 输出y为:
在这里插入图片描述

其中W′ = γ / V W和b′ = γ / V b + (β − γ E / V ) 1. 也就是说,在推理过程中,BN 层可以通过调整前面的卷积层或全连接层中的权重和偏差来代替。
构架
英特尔在启用了 8 位推理。英特尔的 DL、Apache* * 和 * 优化。所有这些 8 位优化目前仅限于 CNN 模型。RNN 模型和其它框架都已推出。
在 Intel Distribution of Caffe 中,model.prototxt 文件被修改为包含预先计算的标量,如图 7 所示。目前,Caffe 的 Intel 优化可以提供量化因子作为 2 的幂或常规ƒp32值,并且可以使用每个张量 1 个量化因子或每个通道 1 个量化因子。这些量化因子是使用英特尔 Caffe 发行版中内置的采样工具计算得出的。
在这里插入图片描述

图 7. 量化因子被添加到 model.prototxt 文件中。图片由 Haihao Shen 提供。
英特尔的深度学习是英特尔® 计算机视觉 SDK 的一部分。在 Linux* 和 Windows* 操作系统上可用,最初支持从 Caffe、MXNet* 和 TensorFlow* 框架训练的模型。推理引擎通过为各种硬件后端提供统一的 API 来促进深度学习解决方案的部署:采用英特尔 AVX-2 和英特尔 AVX-512 的英特尔至强处理器、英特尔凌动® 处理器、英特尔® 高清显卡和英特尔® Arria ® 10(英特尔® A10) 不同数值精度的离散卡,具体取决于硬件。从 2018 年第二季度开始,推理引擎将支持英特尔至强可扩展处理器上的 8 位推理。
TensorFlow 已经支持 8 位推理和各种量化。可以在训练或校准阶段动态计算比例或收集统计数据,然后分配量化因子。包含这些标量的 TensorFlow 图形被写入文件。具有相应标量的图在推理过程中被量化和运行。TensorFlow 支持两种量化方法。一种方法类似于英特尔 MKL-DNN,将最小值和最大值设置为加法倒数。另一个使用需要偏移加比例的最小值和最大值的任意值(英特尔 MKL-DNN 不支持)。有关更多详细信息,请参阅 Pete Warden 的,但该博客已过时,因为不包含在 TensorFlow 中进行量化的所有方法。
TensorFlow 的另一个是以较低的数值精度重新训练或微调。微调可以提高统计性能。给定一个在ƒp32训练的模型,在其权重被量化后,然后使用量化的权重对模型进行微调,并在每次训练迭代后重新量化权重。
TensorFlow Lite* 中采用的 Google 库。使用 υ8 乘法,其中ƒ32 = D × (υ8 − Κ),Κ是映射到ƒp32 = 0的υ8值,而D > 0是去量化因子。
Apache MXNet 分支目前不支持 8 位。但是,MXNet 主要贡献者之一的支持 8 位推理。在该分支中,有两种量化值的方法:一种是将最小值映射到 0,将最大值映射到 255(零不会映射到精确值);其中绝对值的最大值映射到 -127 或 127(注意零映射到零——类似于英特尔 MKL-DNN)。与所提出的方法的主要区别在于,此 MXNet 分支中的标量不是预先计算的。相反,们是在实际推理步骤中计算的,这降低了较低数值精度的好处。在该分支中,激活的标量是通过将来自输入的标量与来自权重的标量相乘来计算的:激活标量 = 输入标量 * 权标标量,其中输入 = 输入标量 * 量化输入;权重 = 权重标量 * 量化权重;激活 = 激活标量 * 量化激活;输入、权重、激活和标量采用ƒp32格式,量化输入和量化权重采用int8格式,量化激活采用int32格式)。虽然跟踪激活的最小值和最大值,但仅在遇到fp32层(例如,softmax)时才对这些值进行反量化。
TensorRT为类似于英特尔 MKL-DNN 的s8格式,并通过最小化量化分布和参考分布之间的 KL 散度来寻找更紧密的范围。
TPU 团队,使用int8乘法的TPU被用于各种模型,包括 LSTM 模型。软件堆栈来自 TensorFlow 图形的 API 调用转换为 TPU 指令。
Caffe2的文档目前对量化没有计划已经被透露,有“灵活的未来发展方向,如量化计算,”不过。
PyTorch 有一个quantize.py,提供各种量化选项,但没有讨论哪个更好。
Microsoft使用在英特尔® Stratix ® 10 FPGA上运行的自定义 8 位浮点格式 ( ms-fp8 ) 。这种格式、量化技术或框架实现的细节尚未公开。Project Brainwave* 支持 CNTK* 和 TensorFlow,并计划通过将在流行框架中训练的模型转换为基于图形的内部中间表示来支持许多其他模型。
模型和图形优化
模型优化可以进一步提高推理性能。例如,在 ResNet 中,可以将 stride 操作移到更早的层,而无需修改最终结果并减少操作次数,如图 8 所示。此修改适用于 8 位和 32 位。
在这里插入图片描述

图 8. 左侧块上显示的步长 2 可以在推理期间移动到较早的层,这减少了操作次数并且不会修改结果。由 Eden Segal 和 Etay Meiri 提供。
结论
较低的数值精度推理和训练可以提高计算性能,而统计精度的降低最小或不降低。英特尔正在为当前一代英特尔至强可扩展处理器的推理提供 8 位精度。英特尔还在支持编译器、英特尔 MKL-DNN 库和流行的深度学习框架的硬件和软件中启用 8 位精度进行推理和 16 位精度用于训练未来微架构的硬件和软件。
附录 A:有关负值激活或输入量化的详细信息
为了让读者相信这些相同的公式(参见 8 位激活或负值输入的量化部分)可以推广到卷积层,使用每个张量条目的索引并通过步骤来显示卷积输出。令W ƒ32 ∈ ℜ O×C×K×T是具有O核或输出通道、C输入通道、Κ高度和Τ宽度的权重张量。修正后的偏差可以表示为:
在这里插入图片描述

其中
在这里插入图片描述

和Ó我,C我,κ我,和τ我是谷粒或输出通道,输入通道,内核高度指数分别和内核宽度。卷积输出可以表示如下。假设批量大小酮(省略为简单起见批处理指数)时,激活已已经在零填充FP32格式(或等价地与填充Κ= 128在υ8格式),并且卷积是步幅一个。
在这里插入图片描述

附录 B – 使用跳过连接的融合量化的详细信息
是激活输入通过图6中的蓝色箭头标记的层如下,其中层res2b_branch2a缩写为2b2a在下面的方程与其它层类似的缩写。
在这里插入图片描述

  1. 原始计算可以计算为 AVX-512-frequency * number-of-cores * number-of-FMAs-per-core * 2-operations-per-FMA * SIMD-vector-length / number-of-bits -in-numeric-format / number-of-instructions。两个 512 位 FMA 单元位于端口 0 和 5,每个内核并行计算可用于英特尔至强铂金处理器、英特尔至强金牌处理器 6000 系列和 5122。其他英特尔至强可扩展处理器库存单元 (SKU) 的每个内核都有一个 FMA 单元,位于端口 0(有关详细信息,请参阅第 15 章)。ƒp32、int16和int8 FMA 分别需要 1、2 和 3 条指令,使用英特尔 AVX-512 指令。Intel Xeon Platinum 8180 每个插槽有 28 个内核,每个内核有 2 个 FMA。该ƒp32每个插槽的 OPS 约为 1.99-GHz-AVX-512 频率 * 28 核 * 每核 2-FMA-units-per-FMA * 2-OPS-per-FMA * 512-bits / 32-bits / 1-instruction = 3.570 ƒp32 上衣。每个插槽的int8 OPS 约为 2.17-GHz-AVX-512-frequency * 28-cores * 2-FMA-units-per-core * 2-OPS-per-FMA * 512-bits / 8-bits / 3-instruction = 5.185 int8 TOPS。可以找到多个 SKU 的 AVX-512 频率(这些对应于ƒp64操作——数值精度较低的频率更高,上面 fp32 和 int8 TOPS 计算中使用的频率是估计值)。运行高 OPS 工作负载时,AVX-512 最大睿频可能无法完全维持。
  2. 在实践中,如果这些υ8值是在 ReLU 激活函数之前的激活,则它们通常更接近其最小值而不是最大值。
  3. 英特尔至强铂金处理器、英特尔至强金牌处理器 6000 系列和 5122 提供每个内核并行计算的两个 512 位 FMA 单元。其他英特尔至强可扩展处理器 SKU 每个内核具有一个 FMA 单元。

参考链接:
https://software.intel.com/content/www/us/en/develop/articles/lower-numerical-precision-deep-learning-inference-and-training.html

标签:16,英特尔,数值,量化,激活,32,推理,精度
来源: https://blog.csdn.net/wujianing_110117/article/details/118856428

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有