赞
踩
计算机用一组二进制数字或位表示实数值,通常为8、16、32或64位。
使用的位数越多,数值的范围和精度或表示就越高。模型的数值格式会影响其计算和统计性能。
使用更小的数字表示可以增加每个周期的操作数,并减少内存、内存带宽、网络带宽和功耗。
特别是,如果工作负载受到内存带宽的限制(被内存带宽限制),减少数值表示可以缓解这种瓶颈并提高计算性能。
如果它被计算限制(被可用的计算瓶颈限制),硬件设计者可以将更小的数字格式乘数打包到给定的模具区域,以提高计算性能。
然而,对于某些模型,使用较小的数值表示可能会导致较低的统计性能。
上图显示具有符号、指数和尾数位各自数目的各种数字格式。
指数位决定范围,尾数位决定精度。
例如,fp32和bf16有着相同的范围因子,但是fp32提供更高的精确度。
总共有四种主要技术用来降低模型的尺寸大小:
虽然大多数商业应用程序使用 fp32 用于训练和推理工作负载,但较低的数字格式正在迅速得到采用。具体来说,用于训练和推理以及工作负载子集的半精度浮点(fp16)和bfloat16(bf16),以及用于推理的int8,都带有用于MAC操作的32位累加。
使用带有fp32累加器的bf16或fp16乘法器对训练和推理的准确性没有影响,甚至没有损失。
使用带有int32累加器的int8 乘法器在某些推理工作负载的准确性方面有一些或最小的损失。
请注意,即使硬件不支持16-bit倍率的乘法器,以16-bit格式存储激活会减少几乎一半的内存和带宽消耗。
训练需要比推理更大的数值表示,特别是捕捉梯度和权重更新的动态范围。图6.1显示了两个独立训练时期的ResNet-110张量的对数基数绝对值的直方图,并说明了权重更新值的更大范围。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ukXR5f8L-1617797076607)(en-resource://database/11098:0)]
一个活跃的研究领域是开发能更好地用8位和4位来表示数值的数字表示法,并且在硅上实现起来很简单。使用更小的数字表示可以改善训练和推理,即使硬件不支持在更小表示上的每个周期更高的峰值操作,因为内存带宽节省加速了内存带宽限制层,这是常见的。
模型通常是过度参数化的,这有助于训练,并提供了减少训练后模型大小的机会。训练过的模型通常有几个小的权重。将它们强制为零可以带来计算优势,且对统计的影响最小甚至没有影响。这个过程被称为剪枝,结果是一个稀疏模型。有两种类型的模型稀疏性,在6.3节中讨论,结构化的和非结构化的。
稀疏模型的一个关键好处是改进了压缩。压缩减少了内存占用和内存带宽消耗,但代价是为了解压缩而进行一些额外的计算。这种额外解压缩的时间通常少于传输未压缩数据的额外时间;因此,压缩是有利的。
一个小模型可以被训练成一个大模型的输出。训练过的大模型(教师模型)的知识被提炼为小模型(学生模型)。这种方法被称为知识蒸馏。
在第6.1节中,我们回顾了生产中采用的各种16-位和8-位数字格式,以及其他有用的格式。在第6.2节中,我们将讨论从fp32到int8的量化模型的技术。在第6.3节,我们回顾修剪和压缩技术。在第6.4节中,我们将更详细地解释知识蒸馏。
最流行和被广泛采用的格式是用于训练和推理的fp32。该行业正朝着用于训练和推理以及工作量子集的fp16和bf16,用于推理的int8的方向发展。英伟达引入了不标准的fp19格式(有时记做bfloat19)用于矩阵乘法。该矩阵乘法结合了 bf16 的范围和 fp16 的精确度。英特尔和IBM探索了不标准的fp8格式。
上图显示了不同的数字格式,包括符号、指数和尾数位数。尾数也被称为有效数,不应该与在对数文献中用于指对数的小数部分的术语尾数混淆。
展望不同的硬件使用,可以在不同类型的开发阶段使用的数字格式如下:
DL库比如Tensorflow,PyTorch, MXNet,OpenVINO和TensorRT,支持 int8,fp16,bf16和fp32。
对于其他格式的采用,需要硬件和框架的支持。
表6.1显示了浮点数的范围、最小和最大正值,以及跨越各种数字格式的最大数字误差。
fp8-ibm指IBM引入并在下面讨论的一种8-位浮点格式。
u4, u8代表一种 4,8位的无符号整数,s{4,8,16,32}代表一种{4,8,16,32}位的有符号位整数,
并且
(
n
S
,
n
E
,
n
M
)
(n_S, n_E, n_M)
(nS,nE,nM) 分别为浮点格式中符号、指数、尾数的数量。
因此,(1,8,23)代表一种格式,它有一个符号位,8个指数位,以及23位尾数,这就是fp32格式。
指数位确定范围,尾数位确定精度。给定浮点表示法的最大数值误差是该浮点数乘以:
1
/
2
(
n
M
+
1
)
1/2^{(nM+1)}
1/2(nM+1)
或者是 整数表示的0.5倍。
用16位(特别是bf16或fp16)训练一个模型通常需要满足以下要求:
前三个要点也适用于16-位或8-位格式的推理。在这两种情况下,建议使用更大的数值格式积累,以避免数值溢出。
(符号:MAC源->MAC目标):{fp16,bf16}->fp32, int8->s32(有符号 int32)
该数值格式被Google引入为大脑浮点。
模型对加性噪声具有鲁棒性,事实上,如4.1节所讨论的,当以权重衰减正则化的形式训练模型时,通常的做法是添加噪声。
将尾数位数从fp32中的23位减少为bf16中的7位,能够解释为向模型中注入噪声。
bf16保持了与fp32一样的范围因子,对于支持渐变范围特别有用。
实验表明,使用相同迭代次数在bf16下训练和在fp32下训练的模型实际上具有相同的精度,且不改变任何超参数,也不缩放目标函数代价。
然而,可能有一些例外的模型,这些观察结果是无效的。
同样,当类的数量大于
2
n
M
2^{nM}
2nM 或 127, fp32应该在损失函数中使用。
此外,虽然softmax可以单独使用bf16,但多种实现结合了softmax函数和cost函数。这些实现应该使用fp32。
虽然bf16主要设计用于训练(大指数表示梯度),但它也用于推理,具有与fp32类似的计算收益。
Google TPU v2-4,Habana高迪AI处理器、Intel Xeon第3代可扩展处理器(代号Cooper Lake)、基于arm的Neoverse N2“Zeus”CPU、Nvidia A100 GPU都有bf16乘法器。
建立一个乘法器的模具成本,和使用该乘法器的功率成本都随着尾数位进行二次增长和随着指数位位数进行线性增加。
因此一个 bf16乘法器比一个fp16乘法器代价小。然而,区域成本继续迅速下降,因此这种差异不应该是DL硬件设计决策的主要因素。可用性和软件开发成本是更为关键的因素。
为了方便从只支持一种格式(fp16或bf16)的硬件转换, 我们建议设计19-位(1,8,10)浮点单元(FPU)来设计同时支持bf16和fp16格式的硬件。
类似地,我们建议使用9位(1,5,3)FPU同时支持(1,5,2)和(1,4,3)fp8格式。
根据IBM的说法,支持这两种格式只需要比只支持一种格式的大5%的单元。
使用int8可以提高计算性能,但代价是(1)额外的开发和(2)统计性能的损失。
在本节中,我们将解释量化方法和共享技术,它们可以减少统计性能方面的损失,并减少开发过程。
假设一个fp32,fp16,或者bf16格式训练的模型,一种把它量化为 int8 的简单技术可以如下:
对于每个权值张量,最大绝对值被映射到
±
127
\pm 127
±127。
对于激活张量,生产数据的一个代表性样本(称为校准数据集)用于收集激活统计信息,以找到激活值在样本中每个张量中的分布。量化因子为:
Q
a
,
w
=
127
m
a
x
(
a
b
s
(
T
a
,
w
)
)
Q_{a,w} = \frac{127}{max(abs(T_{a,w}))}
Qa,w=max(abs(Ta,w))127
其中,
T
a
,
w
T_{a,w}
Ta,w是一个张量,要么对应于权值w,要么对应于激活a(回想一下,对NN的输入可以被认为是0层的激活)。量化后的值为:
?
?
?
?
????
????
其中,
Φ
(
.
)
\Phi(.)
Φ(.)函数将数值四舍五入到最接近的整数。
以下技术可以提高int8推理的准确性。注意,即使使用这些技术,在某些应用中,fp32精度上的损失仍然是不可接受的。
训练过的模型通常有几个近似为零的权重。对它们进行剪枝,即在稀疏模型中强制所有小于某个小值 ϵ \epsilon ϵ 的权值为零。
选择一个好的 ϵ \epsilon ϵ 值需要实验。
修剪已经被用于减少模型的大小几十年了。一个有趣(但可能只是巧合)的附注是,修剪生物神经元对健康发育很重要.
虽然剪枝可以减少使用稀疏操作符的操作数量,但剪枝的主要好处是通过压缩和减轻内存带宽限制来减少内存占用。注意,第10.1节中讨论的AutoML可以用来学习紧凑的拓扑结构.
根据修剪的数量,进行一些修剪对统计性能的影响通常很小。在某些情况下,它可以提高性能,因为剪枝是一种正则化形式。在不影响统计性能的情况下精简模型的能力意味着模型被过度参数化了。一种假设是,过度参数化的模型需要更好地探索解空间并找到一个更平坦的最小值。在对模型进行训练之后,其中的许多参数就不再需要了。一个相关的假设是彩票:在一个大模型中存在一个小模型(彩票),这个小模型与较大型号的模型具有相同或更好的性能。
有两种类型的模型稀疏性:结构化和非结构化。结构化稀疏学习(SSL)修剪整个向量、数组或张量。SSL减少了参数和计算的总数;例如,通过去除卷积滤波器。各种SSL技术已经被开发出来[WWW+16;HGD + 17;ZTZ + 18;ZDH19;HZS + 19;LSZ + 19]。在cpu和gpu上,结构化稀疏性(不像非结构化稀疏性)可以减少操作的数量。
非结构稀疏性在不影响张量整体结构的情况下,对整个张量进行剪枝处理,如图6.2所示。非结构化稀疏剪枝模型可以在稀疏度大于90%时利用Nvidia cuSPARSE和Intel oneMKL库中的BLAS函数。然而,大多数稀疏模型的稀疏性不足,无法从这些库中的稀疏GEMM函数中明显受益。另外,谷歌、DeepMind和斯坦福开发的技术可以在Nvidia V100 gpu上实现1.2到2.1倍的加速和12.8倍的内存节省,而不牺牲适度稀疏Transformer 和MobileNet 模型的精度。
大多数生产硬件是为密集矩阵操作而设计的。支持稀疏操作数的硬件是有限的;LNPU设备就是一个例子
Nvidia A100 gpu支持细粒度结构稀疏性,具有2倍多的计算能力。
剪枝技术有:
对于功率受限的边缘设备,可能需要能量感知修剪;也就是说,修剪消耗能量最多的层。
修剪后的模型对对抗性攻击的鲁棒性较差。当输入到神经网络的信息被一丝不苟地修改,以至于人类无法检测到这种变化时,就会发生对抗性攻击,但模型会产生非常不同的输出。例如,该模型具有高置信度地预测,一辆巴士的不可感知的改变图像是一只鸵鸟。对抗训练模型压缩(ATMC)和防御量化是在修剪和确保对这些攻击的鲁棒性之间提供平衡的技术。
模型压缩减少了对内存和带宽的要求,但代价是需要一些额外的计算来解压缩。与减少带宽限制所节省的时间相比,进行这些额外计算的时间通常比较少。因此,压缩通常是有利的。注意,未压缩的非结构化稀疏模型和密集模型的内存占用是相同的,因为存储未压缩的零值需要与任何其他值相同的比特数。压缩算法,如Huffman编码,使用1比特来编码常见的值,如零值。另一种技术是将相似的值聚在一起,并将它们量化为几个比特,每组都有一个量化因子。
带有ReLU函数的模型具有稀疏的激活,并且这种稀疏性会随着模型中激活的深入而增长。在前向传播训练阶段,在存储稀疏激活之前对它们进行压缩(用于后向传播阶段),可以缓解带宽瓶颈。
知识蒸馏(KD)是一种模型压缩技术,建立在Bucila等人的工作基础上,正在迅速得到采用[HVD15;BCN06]。KD减少了特定任务的内存和计算需求,并且不需要解压缩步骤。KD与迁移学习有关。来自复杂模型(教师模型)的知识被提炼为更简单的模型(学生模型)。与教师模型相比,学生模型使用更小的数据集和更大的LR(学习率)进行训练。
经过训练的教师模型在学生的训练数据集上产生软化的概率输出。将学生模型训练成与教师的软化概率输出相似的输出,如图6.3所示。软化后的softmax,也称为softmax温度,首先将对数除以某个值T>1(称为温度),然后再将它们归一化。输出是一个软化的概率分布,可以更好地捕捉类的相似性。为了说明这一点,输入图像中数字7的软化输出应具有7的最高值,并且对于看起来像7的数字(如手写数字1和9)也应具有相对较高的值。训练学生模型以学习(1)使用softmax温度的软化输出和(2)使用常规softmax的单热真实值向量。softmax温度也为模型提供了正则化。
KD背后的启发是,教师模型需要一个更复杂的模型来学习不同班级之间的关系。单热真实向量不编码类相似性,并将每个类视为完全独立的。教师模型为学生模型提供了班级关系。因此,学生模型不需要从头开始学习它们,可以使用更简单的拓扑。
扩展这项工作是深度相互学习(DML)一个学生通过分享它们的softmax输出来协作学习和教导别人,和老师助理(TA)从大尺寸教师模型中提取知识到一个中型尺寸的TA模型,再提取到更小尺寸的学生模型。
在本章中,我们详细介绍了生产中使用的各种数字格式和研究人员正在探索的数字格式,以及减少模型内存占用的压缩技术。使用更小的数字表示可以增加每个周期的操作数,并减少内存、内存带宽、网络带宽和功耗。然而,它也可能导致较低的统计性能,特别是对于一些int8模型。我们讨论了量化技术的进展,以减轻这种精度损失,并发现基于hessian的分析作为一个有希望的路径,以确定哪些层是可量化的。跨数字格式的硬件支持是重要的硬件设计决策之一。我们建议训练处理器主要支持bf16和fp16,因为只支持一个种和一些fp32的成本较小,而且推理处理器为了训练格式的兼容性,主要支持fp16和bf16、int8和fp8以及一些fp32。在下一章中,我们将回顾计算机体系结构的基础知识,并讨论各种DL硬件设计。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。