一、引言
深度学习变革了许多计算机视觉和自然语言处理(NLP)领域内的任务,它为越来越多的消费者和工业产品提供更强大的智能,并潜在地影响了人们在日常经验和工业实践上的标准流程。从理论上来说,深度学习和其他基于统计机器学习方法的自动化系统十分类似,它们都可以采用两个过程描述。首先,深度神经网络(DNN)模型明确地指向为问题领域和可用数据而训练,通常训练会在 GPU 或高性能 CPU 集群上花费大约十多小时到几周的时间。然后它才能部署到产品环境中,并持续输入数据流且产生实时推理,而产生的输出会直接作为端结果或继续馈送到下游系统中。无论哪种方式,具有严格延迟要求的应用都需要进行轻量且快速的深度学习推理(如自动驾驶汽车或搜索引擎),通常每个样本数据需要在几十毫秒内响应。因此,相对于学术上关注于更快地训练,产业上往往更关注于更快地推理,推动更快的加速成为了很多硬件和软件解决方案的焦点和核心。
深度学习系统另外一个重要的方面就是需要处理输入和输出数据随时间的分布变化。像任何统计机器学习模型一样,深度神经网络的有效性极其依赖于假设输入和输出数据的分布并不会随时间地变化而产生明显的改变,从而最初学习到的复杂模型和模式可以在以后继续使用。然而,这类假设在现实中是很少成立的,特别是在信息安全等领域,快节奏潜在数据生成机制的变化属于常态(在信息安全案例中,攻击和防御参与双方都在不断调整策略而尽力胜过对手,因此它们都在挖掘对手的潜在漏洞)。因此随着使用深度学习能解决更多以前无法解决的问题,深度神经网络的持续性训练问题和如何在不损害产品质量前提下训练,就受到了机器学习服务提供商(Machine-Learning-as-a-Service /MLaaS)和大量应用程序架构师的关注。
在本报告中,我们将介绍深度神经网络推理加速和产品场景下的持续性训练近期的一些技术、趋势和研究。我们报告的目标并不是钻研几个具体的技术,而是对解决这两个问题的硬件和软件解决方案进行调查和概览。我们希望提供给读者继续研究的出发点,并希望能激发更多不同专业的人才参与到我们的讨论和知识的交流中。
二、推理加速
1. 推理加速-硬件
DNN 训练和推理都是计算密集型过程,只不过方式完全不一样。训练需要很高的吞吐量,因此也通常在 GPU 上完成,因为 DNN 模型的训练通常会涉及大量的并行计算和简单的控制流与功耗效率。而将训练分为数百个输入数据为一批也很常见(如计算机视觉任务中的图像、NLP 任务中的语句序列和语音识别任务中的语谱图等),因此将每个批量作为一个单位执行前向传播和反向传播,这样可以通过多个 GPU 存储器分摊加载神经网络权重的成本。
对于推理来说,最重要的性能目标就是延迟。为了最小化网络的端到端响应时间,推理相比于训练通常需要更小的批量大小,因为依赖于推理的自动化服务需要实时响应。例如整个 Google Autosuggest 流程的延迟需要控制在 200 毫秒之内,其中就包括了前端、负载平衡(load balancing)、询问理解和由 DNN 驱动的自动完成建议,同时还需要完整的搜索堆栈遍历来显示用户实际搜索的结果。自动驾驶汽车之类的任务会要求更严格的时间延迟限制,因为当用户安全受到威胁时,DNN 作为在车内嵌入芯片运行的一个组件,需要在极短的时间内做出正确的响应。
模型的训练主要用的是 GPU,但推理硬件市场有若干选择。
2. GPU
英伟达以它的先进 Pascal 架构 Tesla P4、 P40 和 P100 GPU 加速器为特色,其吞吐量峰值比单个 CPU 服务器要高 33 倍,并且同一时间内可以降低最大达 31 倍的延迟。该性能对比来源于一个英伟达的研究,该研究比较了 AlexNet、GoogleNet、ResNet-152 和 VGG-19 在单块 CPU 服务器(单个 Intel Xeon E5-2690 v4 @ 2.6GHz)和 GPU 服务器(same CPU with 1XP100 PCIe)上的性能。
为了帮助开发者充分利用它的硬件,英伟达 cuDNN 库为 GPU 提供了一系列的推理优化。在小批量下,cuDNN 改善了卷积算法不能并行化足够的线程以充分利用 GPU 的问题。传统的算法如预计算的隐式 GEMM(一般矩阵-矩阵乘法)最优化为大规模输出矩阵,而它的默认并行化策略并不能启用足够的线程块,因此批量大小在输出矩阵的一个维度中是一个乘法因子。最新版本的 cuDNN 通过分裂出额外的维度而改进了该算法,这也就减少了每一个线程块的计算总量,并允许启用更多的线程块来提升 GPU 使用率和性能。
另外一个主要的改进就是降低精确度的浮点运算操作。近年来,研究者发现使用更低精度的浮点运算表征(FP16)储存层级激励值,而更高的表征(FP32)进行计算并不会损失分类精度。即使期间的性能提升会有带宽限制,但也能在运行 DNN 时减少整体的内存占用要求。cuDNN 为卷积算法引进了 FP16,相对于等价的 FP32 实现了两倍的性能提升。
3. Intel Processor Graphics
随着在云端或通过云端训练 AI 系统持续性地增长,工业界正目睹着推理阶段从高端专业服务器转移到边缘计算当中。这就趋向于在终端设备中本地执行机器学习和深度学习而不是单单依赖于 MLaaS,这种趋势由减少网络带宽瓶颈上的延迟而驱动,以及需要维持超过 99.999% 的服务健康在线时间,和可以向外扩展终端设备而不是增加服务器来平摊成本,同时这也将解决首当其冲的隐私和合规问题。由这一波智能应用、自动驾驶汽车、自动化制造业和移动平台上的虚拟助手所驱动,Intel Processor Graphics 已经装备到了其硬件产品阵列中来解决各类 AI 工作负载,包括 Intel HD Graphics、Intel Iris Graphics 和 Intel Iris Pro Graphics 等。
他们旨在设计能在推理加速和编程灵活性上达到均衡的架构,并且该均衡作为 Intel SOC 的组件从广泛使用的 PC 到服务器嵌入设备中。通过灵活的指令集架构,我们可以使用丰富的数据表征,如 16FP、32FP、16Int、32Int 和快速 SIMD 乘积-累和运算(fast SIMD multiply-accumulate operations)。这些设备提供高效的内存块载入以优化卷积和一般矩阵-矩阵乘法,这些对边缘设备上快速和高能效的推理都是极其重要的。
为了更好地利用硬件资源进行推理,英特尔的深度学习部署工具包在已训练的 DNN 模型上执行静态、编译时间分析以优化在各端点的执行。模型优化器尝试融合水平的和垂直的层级并对冗余网络进行剪枝和层级权重量化,然后将精简量化的模型输入到推理引擎中,引擎会进一步强调以降低占用来为目标硬件优化推理。
正因为端点目标设备和工具包实现了去耦(decoupling),它能优化运行在不同硬件单元的推理,包括 CPU、GPU 和 FPGA。对于 CPU 推理加速,它使用英特尔的 MKL-DNN 插件。而对于 GPU,其利用了 clDNN,即一个为计算机视觉计算构建的 OpenCL 核优化库。对于 FPGA 来说,它是与英特尔深度学习推理加速器结合,并由 Intel Arria 10 FPGA 支持的 PCIe 插件卡,其可以优化流行的 CNN 拓扑结构,包括 AlexNet、GoogleNet、CaffeNet、LeNet、VGG-16 和 SqueezeNet。
4. FPGA
通常来说,由于其灵活的硬件配置,在同样的功率耗能下 FPGA 通常能够提供比 GPU 更好的性能,特别是对于如卷积和池化(pooling)等滑动窗口(sliding-window)的计算。这使得它们对于企业级用户特别有吸引力,因为企业级用户最终更关心降低大规模应用的成本以及其为特定应用定制推理架构(inference architecture)的能力。传统上,FPGA 的峰值浮点运算性能不如 GPU,因此 FPGA 侧重于发展有关 DNN 推理的技术。最新的基于英特尔 14 纳米技术开发的 Intel Stratix 10 FPGA 具有超过 5000 个浮点单元,并集成了高带宽存储的超过 28MB 的片内 RAM,可与 Nvidia Titan X Pascal GPU 相媲美(报告显示,对于精度 FP32,Stratix 10 峰值速度为 9.2 TFLOP,而 Pascal Titan X 为 11 TFLOP)。
DNN 的两个研究趋势正推动着采用 FPGA 取代 GPU:即更低精确度的数据类型和稀疏性。研究者已经证明了 2-bit 三元的和 1-bit 二元的 DNN 精度有所提升,并提出了通过剪枝、ReLU 和三元树等技术将神经元和权重稀疏性推高到 90%。这些技术加在一起提升 DNN 算法的效率高出密集 FP32 架构一个数量级,前提是有合适的硬件实现能够高效地跳过零的计算。单片和大型并行化 GPU 架构在这些不规则的并行模式和自定义数据类型下并不符合标准,而为极端定制能力而设计的 FPGA 显得更加耀眼。英特尔最近一个团队表明 Stratix FPGA 相比于 itan X GPU 在更低精度 6Int GEMM 有 3 倍的 TOP/s 和 4 倍的 GOP/s 每瓦特性能提升,1-bit GEMM 达到了 2 到 10 倍提升,85%-sparse GEMM 达到了 4 倍的提升。
5. TPU
除了为 DNN 推理进行广泛目的的硬件重塑和重编程(如 CPU、GPU 和 FPGA)之外,研究者和实业家还专注于 ASIC(Application Specific Integrated Circuits),他们相信专用芯片能为特定的计算工作负载类型带来最好的性能,谷歌去年发布的 TPU 就是这样的一个案例。该芯片驱动了谷歌大量的实时服务,包括搜索、街景视图、翻译、照片和自动驾驶汽车等。TPU 通常要比 GPU 或 CPU 推理快 15 倍到 30 倍,并且每瓦特的成本还很低。TPU 优秀的推理性能源自四个主要的设计优化:Int8 量化、DNN-inference-specific CISC 指令集、大型并行化矩阵处理器和最低确定性设计。
量化(Quantization)极大地降低了最重要推理计算(矩阵乘法)的硬件占用和能耗。移动端和嵌入式系统的部署同样也得益于内存占用的减少,据谷歌报告其在一般模型(如 Inception)要减少 4 倍多。一块 TPU 包含 60000 Int8 乘法器,几乎是在普通 GPU FP32 乘法器的 25 倍。
TPU 的 CISC 指令集关注于直接表征和优化主要的 DNN 推理数学运算,即矩阵乘法和激活函数。指令集包括优化的 CISC 指令以从内存读取数据块和权值块,同时还优化了矩阵乘法或数据和权重的卷积以累和中间结果,应用硬连接的激活函数和将结果写入内存。可配置的、可编程的三个硬件单元:矩阵乘法器单元、标准缓存和激活单元驱动了这些特殊设计的指令高效执行。矩阵乘法器单元是一个大规模并行矩阵处理器,它能在单个时钟周期内进行成百上千次矩阵运算(乘法和加法)。通过为许多不同的运算重用输入(数据块和权重块)而不储存它们到累加寄存器中,这样就只需要 24MB 地 SRAM 标准缓存。在大规模矩阵乘法中,所有的中间结果不需要 DRAM 访问就能在 64K ALU 中通行,因此也就大大降低了能耗和极大地提升了吞吐量。
这些 ASIC 优化能令 TPU 在保证严格的延迟保证时还有近乎芯片峰值的吞吐量。谷歌报告说在一般 MLP 架构每个预测 7ms 的延迟情况下,TPU 的吞吐量要比 CPU 和 GPU 高 15 倍到 30 倍,而对于一般的 CNN 架构,TPU 相对于 CPU 实现峰值达 70 倍的性能加速。
三、推理加速——算法
算法上,降低推理延迟和 DRAM 占用空间的一种有潜力的方法是模型压缩。压缩的模型能够简单的适配到片上 SRAM 缓存上,而不是 DRAM 存储上,这样就能在移动平台或无人驾驶汽车上装备复杂的 DNN 应用。在这些应用场景中,存储大小、推理速度和网络带宽都有极大的限制。
众所周知,在大部分前沿的 DNN 架构中,全连接层会被过参数化。许多研究专注在全连接层的压缩,要么是使用哈希函数随机地桶分化(bucketizing)连接权重,要么是通过矢量量化压缩。Network-in-Network 提出用全局平均池化取代全连接层,然后在顶部加上一个额外的线性层进行更好的迁移学习能力。
在 CPU、台式机 GPU 和移动 GPU 基准上,Deep Compression 产生了 30 倍到 50 倍更紧凑的 AlexNet 和 VGG-16 模型,分层(layerwise) 速度加快了 3 到 4 倍,能效提升了 3 到 7 倍,而且在 ImageNet 准确率上也没有损失。这种方法是通过一个三阶段的压缩组合完成的:神经网络剪枝、训练量化和 Huffman 编码。
剪枝去掉了权重比低于某个阈值的网络连接,然后 DNN 在调整剩余的稀疏连接的权重时就会受约束。稀疏架构的位置索引,在卷积层中是 8 比特编码、在全连接层中是 5 比特编码,都用 CSR 或 CSC 的格式存储。剪枝平均对 AlexNet 和 VGG-16 降低 10 倍的参数量。
为了进一步减少编码每个权重的比特量,Deep Compression 利用 一种装箱技术(binning technique)共享权重。对一个带有 M 输入神经元和 M 输出神经元的层而言,M x M 权重被量化到 M 个箱(bins)中,每个箱中的所有权重共享同样的值,因此每个权重只有一个索引到需要存储的共享权重表格中。在反向传播过程中,梯度已类似的方式分组,装箱到 M 个桶中,然后统一更新共享的权重矩心。通过权重共享进行量化有效地降低了需要存储的权重,精调共享的权重降低了需要更新的运算的数量。对一个剪枝过的 AlexNet 而言,卷积层被量化到 8 比特的、全连接层到 5 比特,大小被进一步压缩了 3 倍。
在剪枝和量化之后,Huffman 编码可以利用权重分布(表示为稀疏矩阵指数)极为偏倚的事实,通常将一小部分峰值彼此挤在一起。Huffman 编码平均对 AlexNet 和 VGG -16 压缩了 20%-30%。
尤其是在移动平台实时运行有极大延迟、能量限制的应用时,Deep Compression 基准测试基本没有分批(批大小=1)。没有权重共享的全连接层通常控制着模型的大小,贡献了超过 90% 的存储需求。它们是从 Deep Compression 受益最多的。Deep Compression 对全连接层权重的大小有超过 95% 的修剪,使得完整训练的 DNN 可被装载到无人驾驶汽车内嵌处理器的 SRAM 中,因此可以低能耗地提供片上存储推理。一种相关的硬件架构 Efficient Inference Engine 也提出了在深度压缩模型上完成推理的方法。把压缩过的 DNN 装载进 SRAM 为 EIE 节省了 120 倍的能量,还有稀疏性、权重供学习和跳过零函数,峰值为 102 GOPS/s 时要比 GPU 有 15 倍更快的速度。
作者 Yanchen 毕业于普林斯顿大学机器学习方向,现就职于微软Redmond总部,从事大规模分布式机器学习和企业级AI研发工作。
【本文是51CTO专栏机构“机器之心”的原创文章,微信公众号“机器之心( id: almosthuman2014)”】