百度开源新一代深度学习硬件测试工具:覆盖Titan Xp到iPhone7

今天,百度研究院开源了新一代 DeepBench,一款深度学习基准测试工具,这次升级加入了推理测量等功能。

1. 介绍

2016 年 9 月,百度推出了第一版 DeepBench,它是一个开源基准测试工具,用于测试训练深度学习神经网络的基本性能指标,可兼容不同硬件平台上的神经网络库。

DeepBench GitHub 地址:https://github.com/baidu-research/DeepBench

DeepBench 的主要目的是测试深度学习系统在不同硬件平台上的运行效果,它使用神经网络库来测试硬件系统的表现,而非深度学习框架或模型训练时间。下图展示了百度 DeepBench 如何应用于不同深度学习系统。


百度表示,构建 DeepBench 的最大目标是测试:「哪一种硬件在训练深度神经网络时具有最佳性能?」通过测试深度学习任务的运行速度,DeepBench 可以帮助开发人员选择最优的硬件配置。此外,DeepBench 也是向硬件供应商提供交流机会的平台。

DeepBench 包含五个深度学习训练基础模块:矩阵乘法、卷积、循环运算(vanilla 和「LSTM」)以及它们的简化版。在实验中,百度研究人员测试了所有方法的正向和反向运算,并专注于单精度浮点运算的训练性能。你可以在 DeepBench 的博客中获得更多信息:https://svail.github.io/DeepBench/

自上次发布以来,百度已经接到了来自业界和学界的大量反馈信息。这次,DeepBench 的测试结果中加入了三种新的英伟达 GPU:TitanXp、1080Ti 和 P100。由于广受欢迎,DeepBench 正在成为深度学习和新硬件开发的标准之一。

深度学习是一个发展很快的领域,大量新的应用正在不断出现。在测试内容中,新的 DeepBench 加入了推理的测试功能。

2. 推理

对于在 DeepBench 中加入核推理测试的呼声一直很高,这是一个非常具有挑战性的问题,因为大多数深度学习应用都具有其特殊性。为了收集用于基准测试的核,百度研究人员调查了公司内部使用的多种不同应用,选择了其中最热门的几种。此外,新版本中也包含了业内常用的深度学习模型性核如深度残差网络(Resnet)[5]。

深度学习推理也为深度学习模型带来了一些约束。例如,在实际应用场景下,语音识别必须是实时的,它对延迟的要求很高。正如在 Deep Speech2[2] 中所提到的,双向循环模型不适用于实时交互的语音识别应用。因此,百度研究人员使用了前向循环模型。DeepBench 中的推理核均来自已经部署,并在延迟和吞吐量上满足应用要求的模型。

这些推理核在测试中会进行与训练集相同的一系列操作,如矩阵乘法、卷积和循环操作。此外还有一些不同之处,下文将对此进行讨论。

2.1 部署平台

深度学习的大规模应用,如图像搜索、机器翻译和语音识别通常都会部署在数据中心里。用户从客户端向应用发出请求,深度学习模型在服务器中负责处理。远端服务器通常是含有多个处理器的强大计算机,足以运行非常复杂的深度神经网络模型。这种方法的缺点也显而易见:由于网络带宽等问题的限制,数据传输过程中的延迟难以避免——用户在使用服务时必须连接网络。为了解决这些问题,近年来出现了一些可以部署在移动设备中的模型 [1,11,12]。然而这些模型需要适应移动和可穿戴设备的计算能力、能耗和内存。

在 DeepBench 上,从服务器到终端设备平台的基准都已包含在内。除了上述新显卡的支持外,DeepBench 还支持三种 ARM 系统:Raspberry Pi3、iPhone6 和 iPhone7,所有人都可以使用这些基准测试并将结果添加到存储库中。

2.2 缩小批量

为了缩小延迟,大多数联网应用的请求在传递到数据中心后并不会被分割成多线程。这样做有两个缺点:单独的处理请求使得操作带宽随处理器需要加载网络的权重受到限制,这使得处理器难以有效地利用自身高速缓存;另外,可用来分类一个请求的并行度是有限的,这使得我们难以利用 SIMD 或多核并行运算。在这种情况下,RNN 难以部署,因为 RNN 依赖于矩阵向量乘法,而它难以并行计算。

为了解决这些问题,百度构建了批处理调度程序 Batch Dispatch[2],它在执行前向传播之前会将用户请求封装为不同批次。这样,我们就可以通过调整批尺寸来优化效率,改善延迟问题。批尺寸越大,用户等待的时间就越多。这对批数量造成了限制。

在实践中,批尺寸 4 或 5 对于数据中心部署的效率较高,而在移动设备部署中,批尺寸被限制为 1。

2.3 推理精度

深度神经网络使用单精度 32 比特浮点数进行训练。在 3.2 节中将有对训练精度的详细讨论。推理精度要求明显低于训练要求。与浮点模型相比,有几种不同的模型可以部署 8 位表示用于推理,而它们几乎没有精度损失 [4,9,15]。因此,对于推理核,我们分别指定 8 位和 32 位乘法和累加的最小精度。并非所有硬件平台都支持这些最低精度要求。我们将接受任何具有精度支持大于最小指定精度的平台的结果。所有结果将包括用于基准测试的精度。

为了使用 ARM 处理器的 8 位输入进行基准矩阵乘法,DeepBench 使用 Gemmlowp 库,来自 ARM Compute Library 的卷积核用于卷积基准测试。ARM Compute 库仅支持单精度卷积,低精度卷积支持会随后提供。ARM Compute 库对 RNN 没有任何支持。因此,DeepBench 不包括 ARM 设备的 RNN 结果。

对于服务器部署,DeepBench 使用 CudNN 和 cuBLAS 库。对于英伟达 GPU 而言,RNN kerenel 仅支持单精度,结果报告同样给出。有关不同处理器支持哪些操作的更多详细信息,请参见第 4 节。

2.4 稀疏核

稀疏神经网络是大多数权重为零的神经网络。这些零权重对神经网络的预测没有贡献,但它减少了对于内存和计算性能的需求,从而使深度学习模型能够部署在移动设备上。RNN 的推理性能主要由硬件的内存带宽支配,因为大多数工作是在每个时间步长中进行参数读取。稀疏计算会带来准确性的惩罚,但如果调整得当,稀疏数据需求也能满足使用。


在数据中心里使用的服务器级处理器可以快速推理以服务于单个用户,但是在数据中心中,性能/花费比是最重要的。允许模型评估更快的诸如稀疏技术等方法可以让每块 GPU 为更多用户提供服务,从而提高能耗比。

过去几年来,稀疏神经网络已经过了很大的发展 [4,13]。在 DeepBench 中,稀疏矩阵向量和稀疏矩阵乘法核已被包含在内。百度研究人员了在实验中了解到,90-95% 稀疏的神经网络可以达到很好的性能。尽管目前的稀疏矩阵乘法应用使用了更高的稀疏(99% 或更高)。通过包含稀疏核,研究人员希望刺激硬件供应商和软件开发人员构建新库,为 90-95%的稀疏提供更好的性能。

DeepBench 使用 Eigen 库来对 ARM 设备上的稀疏操作进行基准测试,对于 GPU 的测试则使用了英伟达的 cuSparse 库。

2.5 延迟讨论

很多推理性应用有着实时延迟的要求。比如,语音界面要求语音识别模型在无延迟的情况下可以恢复一个结果,从而可以被用户捕捉到。DeepBench 核可以被当做一个起点来使用,从而来测量独立操作下的最佳延迟情况。然而,在聚焦于基础操作而不是完整应用的情况下,测量全部系统的延迟是超出 DeepBench 此版本的范围的。例如,一个在移动设备上运行的完整应用可能需要修改系统启动时的功率状态。又比如,一个完整的服务器应用程序可能有一个重要的延迟部件,它是由用户和服务器间的网络连接来决定的。我们可能需要用未来版本的 DeepBench 来解决操作延迟的问题。

3. 训练更新

在此更新版本中,也包括对训练核(kernel) 的更新,把百度新应用的核包括在内。此外,我们还看到了在已有应用上的大量新研究。下文中我们将讨论两个主要的训练升级。

3.1 GRU 支持

在首版 DeepBench 中,我们纳入了 Vanilla、LSTM [6] 循环神经网络的核函数。而另一个比较常用的循环架构师是 GRU(门控循环单元)[3]。近期的一项综合研究显示,带有合适初始化门的 GRU 架构表现可媲美于 LSTM[10]。GRU 相比于 LSTM 有更少的参数,在训练与推理上比 LSTM 更高效。

多种深度学习模型使用 GRU 作为循环单元,因此我们在新版 DeepBench 训练与推理负载中加入了 GRU 核。GRU 相比 LSTM 单元有非常类似的表现特性。类似于 Vanilla RNN 和 LSTM,GRU 有可能通过对比多个层优化其表现。GRU 固有的非线性对 Reset 门和 Update 门而言应该是 S 型的。输出门的非线形应该是一个 Relu 函数。

3.2 低精度训练

虽然训练深度学习模型时,大部分研究员都是用单个精度浮点数计算所有 kernel。但学术研究演示了减少在有限数据集上训练的多个不同模型的精度训练工作 [7、8、14]。根据以往经验,我们发现 16 位的半精度浮点数足够在大型数据集上训练大型的深度学习模型。使用半精度浮点数训练,能够让硬件更好的利用计算能力。此外,权重也只需要整个模型存储的一半。

有了此版更新,我们规格化了训练中用到的所有运算的加与乘的精度。其中,乘与加的最小精度分别设定为了 16 位和 32 位。目前,没有硬件支持 16 位相乘 和 32 位相加。我们将能够接受任何满足这一最小精度需求的硬件平台的结果。所有的结果都会包含该基准使用的精度。

4. 支持 Ops & 精度

在此部分,我们记录了对不同处理器所有精度上各种运算的支持。我们尽可能挑选了接近最小需求精度的精度值,其中精度需求如下所示。然而,某些情况下我们需要衡量更高精度运算的基准。下表强调了每个处理器的运算基准。

  • 训练时的最小精度:16 位乘积,32 位的相加
  • 推理时的最小精度:8 位乘积,32 位相加

4.1 训练

单精度结果可用于 6 种英伟达 GPU 以及英特尔的 Xeon Phi 处理器。这些处理器都不支持 16 位相乘与 32 位相加。作为替代,我们衡量了英伟达 Psuedo FP 16 模型的基准,该硬件的输入/输出是 16 位,但仍旧是单精度计算。下面的硬件处理器支持单精度训练。

4.2 服务器部署

在英伟达处理器上,GEMM 和卷积基准运行的是 8 位相乘与 32 位相加。然而,该精度模式下英伟达 GPU 不支持所有的输入大小。输入大小要为 4 倍才能运行这一精度模型。


4.3 设备部署

下表描述了在不同处理器、ops、精度上设备推理的核结果。我们没 RNN 的结果,因为没有支持 RNN 的 ARM 库。ARM 计算库不支持 iPhone。


5. 结论

在这一部分中,我们将记载一些操作的性能。这些都是随机挑选的,因为我们只是为了演示一些应用的性能。下面的结果仅包括针对特定操作和参数的快速处理器以及它的运算时间和每秒浮点计算。

全部的结果可在以下获得:https://github.com/baidu-research/DeepBench

5.1 训练结果

在第一版 DeepBench 中,我们展示了训练 GEMM、Convolution、vanilla RNN 和 LSTM 的结果。下一部分为一些样本 GRU kernel 提供了试验结果。在 5.1.2 中,我们记载了 psuedo 半精度 GEMM 核。

5.1.1 GRU 结果

循环 op kernel 只在英伟达硬件上运行。



5.1.2 16 点位 GEMM 表现

在下表中,输入和输出是 16 位,但仍使用 32 位计算。

对 GEMM 核函数而言,M、N 和 K 表示矩阵大小。两个矩阵的大小分别为 M x K、K x N。

5.2 推理服务器结果

下面几部分将提供在服务器平台上为推理核而执行的 GEMM、Convolution 和 Recurrent 操作结果。这些结果很快可以在英特尔平台上获得。

5.2.1 GEMM 结果


5.2.2 稀疏 GEMM 结果

5.2.3 卷积结果



5.2.4 RNN 结果


5.3 推断设备结果

5.3.1 GEMM 结果


5.3.2 稀疏 GEMM 结果


5.3.3 卷积结果 


入门百度工程开源DeepBench
1
返回顶部