这一系列文章将探讨一个主题,解释相关背景知识,并就我们从 MathWorks 社区收集的一些问题进行解答。

本文的主题是使用 GPU 进行深度学习。我将概括介绍这一主题,然后探讨以下三个问题:

  1. 人们常说 GPU 可以“加快训练”,但究竟可以加快多少?
  2. 我是否必须购买(真正)快速的 GPU,才能在 MATLAB 中训练神经网络?
  3. 如果不使用 GPU 进行深度学习,我还可以有哪些选择?

在刚刚过去的十年中,以 NVIDIA® GPU 为首,GPU 的运用有力助推了深度学习的大潮。对包含数千乃至数百万数据样本的大量数据以及复杂的网络架构进行处理时,GPU 可以显著缩短训练模型的处理时间。若非得益于此,当今的众多深度学习解决方案都无法实现。

GPU 的确很出色,但 GPU 究竟是什么呢?

GPU 即图形处理单元 (Graphics Processing Units),顾名思义,它的设计初衷是用来处理图形。GPU 可以并行执行多个计算,因此非常擅长处理大量简单任务,比如像素操作等。

GPU 的主要使用场合是图像分类,但其快速计算也适用于信号数据处理。在很多情况下,“图像”都是采用数据预处理方法基于信号生成的,这些方法将信号转换为其三维时频表示(详见使用 MATLAB 实现信号处理深度学习)。这些图像随后即用于深度学习训练,训练时会直接从时频图(图像)而不是原始信号中学习特征。为了进一步提速,我们还可以使用 GPU Coder 创建 CUDA 代码,以在 NVIDIA GPU 上直接运行。

不同于包含四个或八个强劲内核的 CPU,GPU 往往包含数百个并行工作的较小内核。每个 GPU 内核都可以执行一些简单的计算,但内核本身算不上十分智能。GPU 强大的计算能力来自暴力破解,即动用全部内核执行卷积、ReLU 和池化等深度学习计算。

如果您想了解更多信息,请参见 MATLAB 如何支持 GPU 计算,但接下来是我们的问答环节!

视频长度为 4:44

1. 我看到各种有关 GPU 可以加快深度学习训练的宣传,细节却语焉不详。如果无法确保真正实现提速,我并不想浪费时间来考虑购置 GPU。那么,我应该对提速效果抱有何种程度的合理预期?

实话实说,这真的取决于实际情况。具体能实现多大提速,部分取决于以下因素:

  • 输入数据量足够大:数据集越复杂,GPU 对训练的提速效果越明显
  • 网络结构的复杂程度:执行的卷积和计算越多,所需的时间就越长
  • 硬件:最初的配置和之后的发展

GPU 未能加快训练的情形较为罕见,但在某些情况下,使用 GPU 可能有杀鸡用牛刀之嫌,例如处理一维输入数据、向量数据或少量输入数据。以分类示例这个简单的深度学习为例,该示例使用小尺寸 (28x28px) 的图像,并且只有几层网络。使用 CPU 训练该数据集只需几分钟即可完成,这种情况下,GPU 根本发挥不出多大的作用。

我建议您最好能借用一个 GPU 或注册一些基于云的 GPU 资源,然后测量一下训练时间的差异。相比“预期”或“预测”优势,实际测量结果或许更有说服力!

最后一点,和 CPU 一样,GPU 总是一代比一代更快。查看 NVIDIA 性能数据。

造成这种情况的原因显而易见:若输入数据量较小且不需要网络执行太多计算(使用较少的网络层),就无法体现出 GPU 在并行和加速方面的优势。

我建议您最好能借用一个 GPU 或注册一些基于云的 GPU 资源,然后测量一下训练时间的差异。相比“预期”或“预测”优势,实际测量结果或许更有说服力!

最后一点,和 CPU 一样,GPU 总是一代比一代更快。查看 NVIDIA 性能数据。


2. 我是 MATLAB 用户,想要训练神经网络。是否需要购买快速的 GPU?

我想从这个问题中挑出两个词:“需要”和“快速”。“需要”意味着必要性,这个问题只能由您自己来回答。您是否受命于上级,需要在非常有限的时间内将某个神经网络投入生产?如果是,则答案是肯定的——当然需要!如果没有快速 GPU,您的训练能否开展?倒也未必不能。可见,这还是取决于您。

那么,您是否需要“快速”的 GPU 呢?正如上一个问题,这同样取决于您的实际需求,但我们在此忽略技术细节,只是假设您有一定的时间压力,从而将此问题转化为“我如何确定我需要什么样的 GPU?”

和一般的计算机硬件一样,GPU 也会更新换代,因此您会希望训练模型所用的 GPU 与同行当前所用的保持一致。与上一个问题类似,以下因素可能会导致结果有所不同:

  • 您有多少数据?
  • 有多少训练类?
  • 是什么样的网络结构?

连笔记本电脑都有 GPU,但这并不意味着它能够应对深度学习的计算需求。

前不久,我的耐心上限遭遇挑战。我尝试运行一个深度学习模型,但速度极慢。我碰到了一位开发者朋友,觉得可以向他请教问题所在。我们逐一排查了网络的复杂度(基于 ResNet-Inception)、图像的数量(数十万)和类的个数(约 2000 类)。但我们还是不明白为什么几个小时都没法跑完训练。

随后我们把目光投向硬件。我提到我用的是 2014 年版的 Tesla K40,他毫不客气地笑出了声。太尴尬了,感觉有被冒犯到。不过,尽情嘲讽完我的硬件之后,他慷慨分享了自己的 Titan X。处理速度毫无悬念地提高了,而我们的友谊也重归于好。这个故事告诉我们,硬件发展日新月异,与你分享 Titan X 的朋友才是真朋友。

这里还有一个更为详实的案例:我的同事 Heather Gorr (@HeatherGorr) 运行了文档中的这个视频分类示例,她使用相同的数据和网络,但采用不同的硬件配置,最终的处理时间差异明显。这里详细介绍了整个过程。

Windows 笔记本电脑,配备 GPU

NVIDIA Quadro M2200

原始模型(50 类):12.6 小时,加速:66.7%

小模型(8 类):90 分钟,加速:83.16%

Linux 台式机,配备 GPU

NVIDIA TITAN XP

原始模型(50 类):2.7 小时,加速:67.8%

小模型(8 类):26 分钟 29 秒,加速:80%

注:两次测试均启用了训练图,以便监控和截图。类的个数并非造成差异的关键,关键在于类的个数越少,所用的输入样本量越小。要想让训练时间真正发生变化,您所能做的就是改变每个类中的数据量。

下表是我整理的一些土豪级和平民级 GPU,包含部分标准参数:

  Quadro GV100 Titan RTX GeForce RTX 2080
CUDA 并行处理内核 5120 4608 2944
GPU 内存 32 GB HBM2 24 GB GB G5X 8GB GDDR6
内存带宽 870 GB/s 672 GB/s 448 GB/s
价格 8,999 美元 2,499 美元 799 美元

注:价格截至 2020 年 4 月 2 日,之后可能变动。

硬件过时就会降价,虽然刚才还在吐槽我的 Tesla K40,但它毕竟只要 500 美元。如果您的资金并不充裕,就不要跟风最新顶配。每一年,GPU 制造商都在不断推出更新、更快的 GPU,于是,老型号吸引力随之减退,也不再那么昂贵。实际上,不妨看一下 RTX 2080。作为一块不错的 GPU,它只需不到 1000 美元。


3. 我没有 GPU 可用。我该怎么办?

放心,您还有其他选择。

首先:可以使用云资源。

例如,使用 NVIDIA GPU Cloud (NGC) 和云实例,您可以在云端取用 4 个、8 个甚至更多 GPU 以并行运行多个迭代,还可以在多个 GPU 之间分布训练。这应该有助于加快处理速度,而且,云上的 GPU 不会像买来的一样随着时间推移而过时。云≠免费,因此即便前期成本相对较小,也仍需付费。

其次:针对 CPU 进行优化

您可以运行多核 CPU 训练。您仍可以将多个 CPU 内核当成一个低效的 GPU 使用,总好过什么都没。

除此之外,您还可以更换算法。您可以不做训练,而是通过网络执行“激活”。Gabriel Ha 在这个视频中介绍了如何在 MATLAB 中使用神经网络进行特征提取,其中谈到了这种方法。您还可以跟随这个示例了解如何执行激活。

迁移学习比从头开始训练花费的时间要少。您可以利用从先前训练中学习到的特征,重点关注网络中的后期特征,从而了解新数据集的独特特征。

最后:借用 GPU,然后使用 CPU 进行测试

假设您已经成功地训练了网络,使用 CPU 就能很好地进行推断。与 GPU 相比,速度差异更为可控,而且我们还改进了这些网络基于 CPU 的推断性能。

视频长度为 3:54