机器学习硬件 EE290 2021 Quantization

139 阅读5分钟

课程介绍

本课程是由加州大学伯克利分校的 Sophia Shao 讲授,课程编号是 EE290 。本课程主要在硬件和机器学习之间搭建一个交互的桥梁,目的是构建一个加速机器学习应用的高效硬件。学生通过了解机器学习的关键特性,利用核心的硬件优化原则,以及学习前沿的工业界应用,以一种非常实际的方法来理解行业所面临的挑战。

课程内容

Quantization

本课程之所以愿意花时间讨论量化的原因之一在于一些初创公司的活动确实在行业中产生了相当深远的影响,它们推动了机器学习模型在边缘端设备的高效部署。因此,鉴于量化(Quantization) 已被证实是进行机器学习,尤其是在推理(Inference)阶段,是一种极为有效的方法,当前一些大公司在市场上积极收购能提供高效部署机器学习模型解决方案的小型初创公司。在这部分课程中,Shao 介绍了一些量化感知训练的内容。

在硬件领域,目前市面上存在多种不同版本的支持量化的硬件系统正在被构建和部署,因此出色的 DNN 加速硬件,例如 NVIDIA 公司的第三代 Tensor Core 架构推出的一项重要功能便是对多种数据精度类型进行加速处理。这里需要注意的是,在审视不同公司,尤其是硬件公司时,当他们提及自身硬件性能的时候,会频繁的提到一个重要的概念————"FLOPS",即每秒浮点运算次数,floating point operations per second。当这些硬件公司在提到"OPS",每秒操作数,operations per second,或者"FLOPS"时,务必留意他们讨论的具体数据精度类型是什么。构建一个机器学习算法包含数据集、成本函数、优化方法和模型,在本讲 Shao 将重点讨论数据表示。原因在于,当前许多硬件平台采用不同的数据精度类型和数据表示方式会显著的改变需要的计算量以及实际需要存储和移动的数据量。因此,了解量化的影响以及常用的低精度深度学习算法部署技术变得尤为重要。

Floating-Point Arithmetic

我们首先介绍浮点数表示法,进而探讨在深度学习中,尤其是推理(Inference)阶段更为常用的定点数表示法,fixed-point arithmetic。在浮点表示法领域,尤其是深度学习当中,大量的创新都集中在如何高效地存储尾数和指数上,所谓地尾数(也被称为有效数)和指数,如下图所示。

常见的浮点数表示格式:+1.xxx...xtwo×2yyy...ytwo+1.xxx...x_{two}\times2^{yyy...y_{two}}

fp_format.png

其中 S 表示 Sign,符号;Exponent 表示 y's,指数;Significand 表示 x's,有效值;如此 FP32 表达的数据范围在 2.0×10382.0\times10^{-38}2.0×10382.0\times10^{38} 之间。

这里在上图的基础上简单介绍一下 IEEE 754 Floating-Point Standard,当 FP32 浮点数以 IEEE 754 标准存入内存空间之后,需要还原参与计算时,需要经过该公式:(1)S×(1+Significand)×2(Exponent127)(-1)^S\times(1+Significand)\times2^{(Exponent-127)}。但是,随着深度学习领域飞速变化,FP32 有些过度配置了,我们更习惯讨论的是 16 位浮点数甚至更低的位数。

Fixed-Point Arithmetic

深度学习模型中用的更多的是定点数表示法,这里介绍的是斜率和偏置的表示法。这种表示法是在硬件中实际操作的是整数,公式很简单,"Slope and bias": y=s×x+zy=s\times x+z ,通过缩放可以表示更大或者更小的值,如下图所示。

fixed_point.png

Hardware Implications

在之前的应用中,低精度下支持的应用范围有限,这类硬件系统并未真正被引入主流,如 CPU 或 GPU 等。但有趣的是,深度学习算法具有很高的容错性,也就是说大幅降低精度,仍能执行所需的功能。这一特性催生了大批低精度硬件的引入,如之前讨论的 Tensor Core 以及 Google 和 Microsoft 为自身的软件栈提供的支持。同时还引入了数模混合信号电路设计,在该领域中,甚至可能采用更为激进的硬件设计。

关于定点数的乘法在硬件中的实现基本就是一系列的加法器的组合构建一个乘法器。关于浮点数表示的乘法会更复杂一点,这也是许多人从浮点表示转向定点表示的原因。设计更简单的硬件方面存在潜在的益处。在简化的情况下,通常能更高效地利用空间,同时也更节能。举个例子,如下图所示16b Add 的能耗要比 16b FP Add 的能耗低 8x16b FP Mult32b FP Mult 的能耗低将近 4x,这为量化提供了更强的动机,也是为什么嵌入式设备中更加偏爱 16b 浮点数原因之一。而且我们也能看到 16b FP Mult 的硬件面积比 32b FP Mult 的硬件面积降低大约 4.7x。因此我们有一个设计原则:数据位宽越短越好,整数运算比浮点数运算更加高效。

fp_compare.png

DNN Quantization

在 DNN Introduction 中,我们已经知道了深度学习的核心计算就是 MAC 计算,multiply and accumulate。如下图所示,我们拥有权重矩阵、输入激活矩阵,接下来通过乘法运算,乘积结果即为输出的激活矩阵。我们采用定点运算的目标在于,不再为 MAC 操作执行浮点运算,而是采用定点运算进行乘积累加。

mac.png

我们借鉴 "slop and bias" 思想中的 y=s×x+zy=s\times x+z,假设 "r" 是实数,"q" 是量化值,得到以下公式:

r=S(qZ)r=S(q-Z)

在这里,r:real floating-point value; q: quantized fixed-point value; S: scaling factor; Z: zero point (bias)。我们将上图中的池化函数,以定点数的形式改写如下:

scaling.png

这里需要注意的实际上就是如何确定这个缩放因子,这也是可以研究的创新点所在。

以上就是本节课的全部内容。论述完毕!