在刚刚过去的十年中,以 NVIDIA® GPU 为首,GPU 的运用有力助推了深度学习的大潮。对包含数千乃至数百万数据样本的大量数据以及复杂的网络架构进行处理时,GPU 可以显著缩短训练模型的处理时间。若非得益于此,当今的众多深度学习解决方案都无法实现。
GPU 的确很出色,但 GPU 究竟是什么呢?
GPU 即图形处理单元 (Graphics Processing Units),顾名思义,它的设计初衷是用来处理图形。GPU 可以并行执行多个计算,因此非常擅长处理大量简单任务,比如像素操作等。
不同于包含四个或八个强劲内核的 CPU,GPU 往往包含数百个并行工作的较小内核。每个 GPU 内核都可以执行一些简单的计算,但内核本身算不上十分智能。GPU 强大的计算能力来自暴力破解,即动用全部内核执行卷积、ReLU 和池化等深度学习计算。
造成这种情况的原因显而易见:若输入数据量较小且不需要网络执行太多计算(使用较少的网络层),就无法体现出 GPU 在并行和加速方面的优势。
我建议您最好能借用一个 GPU 或注册一些基于云的 GPU 资源,然后测量一下训练时间的差异。相比“预期”或“预测”优势,实际测量结果或许更有说服力!
我想从这个问题中挑出两个词:“需要”和“快速”。“需要”意味着必要性,这个问题只能由您自己来回答。您是否受命于上级,需要在非常有限的时间内将某个神经网络投入生产?如果是,则答案是肯定的——当然需要!如果没有快速 GPU,您的训练能否开展?倒也未必不能。可见,这还是取决于您。
那么,您是否需要“快速”的 GPU 呢?正如上一个问题,这同样取决于您的实际需求,但我们在此忽略技术细节,只是假设您有一定的时间压力,从而将此问题转化为“我如何确定我需要什么样的 GPU?”
和一般的计算机硬件一样,GPU 也会更新换代,因此您会希望训练模型所用的 GPU 与同行当前所用的保持一致。与上一个问题类似,以下因素可能会导致结果有所不同:
连笔记本电脑都有 GPU,但这并不意味着它能够应对深度学习的计算需求。
前不久,我的耐心上限遭遇挑战。我尝试运行一个深度学习模型,但速度极慢。我碰到了一位开发者朋友,觉得可以向他请教问题所在。我们逐一排查了网络的复杂度(基于 ResNet-Inception)、图像的数量(数十万)和类的个数(约 2000 类)。但我们还是不明白为什么几个小时都没法跑完训练。
随后我们把目光投向硬件。我提到我用的是 2014 年版的 Tesla K40,他毫不客气地笑出了声。太尴尬了,感觉有被冒犯到。不过,尽情嘲讽完我的硬件之后,他慷慨分享了自己的 Titan X。处理速度毫无悬念地提高了,而我们的友谊也重归于好。这个故事告诉我们,硬件发展日新月异,与你分享 Titan X 的朋友才是真朋友。
原始模型(50 类):12.6 小时,加速:66.7%
小模型(8 类):90 分钟,加速:83.16%
原始模型(50 类):2.7 小时,加速:67.8%
小模型(8 类):26 分钟 29 秒,加速:80%
注:两次测试均启用了训练图,以便监控和截图。类的个数并非造成差异的关键,关键在于类的个数越少,所用的输入样本量越小。要想让训练时间真正发生变化,您所能做的就是改变每个类中的数据量。
5120
4608
2944
硬件过时就会降价,虽然刚才还在吐槽我的 Tesla K40,但它毕竟只要 500 美元。如果您的资金并不充裕,就不要跟风最新顶配。每一年,GPU 制造商都在不断推出更新、更快的 GPU,于是,老型号吸引力随之减退,也不再那么昂贵。实际上,不妨看一下 RTX 2080。作为一块不错的 GPU,它只需不到 1000 美元。
放心,您还有其他选择。
首先:可以使用云资源。
其次:针对 CPU 进行优化
您可以运行多核 CPU 训练。您仍可以将多个 CPU 内核当成一个低效的 GPU 使用,总好过什么都没。
迁移学习比从头开始训练花费的时间要少。您可以利用从先前训练中学习到的特征,重点关注网络中的后期特征,从而了解新数据集的独特特征。
最后:借用 GPU,然后使用 CPU 进行测试
假设您已经成功地训练了网络,使用 CPU 就能很好地进行推断。与 GPU 相比,速度差异更为可控,而且我们还改进了这些网络基于 CPU 的推断性能。