在CPU和GPU之间进行选择以训练神经网络


29

我已经看到了有关GPU“开销”的讨论,对于“小型”网络,在CPU(或CPU网络)上进行训练实际上可能比GPU更快。

什么是“小”?

例如,具有100个隐藏单元的单层MLP是否会“很小”?

对于循环架构,我们对“小”的定义会改变吗?

在决定在CPU或GPU上进行训练时,还应该考虑其他标准吗?

编辑1:

我刚刚找到了一篇博客文章(可能已过时?它是从2014年开始的):

“ ...大多数网卡仅适用于已向CPU注册的内存,因此两个节点之间的GPU到GPU的传输将是这样的:GPU 1到CPU 1到网卡1到网卡2到CPU 2到GPU2。这意味着,如果选择一个速度较慢的网卡,则在一台计算机上可能无法实现加速;即使使用快速网卡,如果群集很大,相比时,甚至连GPU都无法获得加速。对CPU而言,因为GPU的工作速度太快,以至于网卡无法跟上它们的步伐。

这就是为什么许多大公司(例如Google和Microsoft)使用CPU而不是GPU群集来训练其大型神经网络的原因。”

因此,根据本文的观点,使用CPU可能更快。还是这样吗?

编辑2:是的,该博客文章可能非常过时,因为:

现在看来,节点内的GPU是通过PCIe总线连接的,因此通信速度约为6GiB / s。(例如:https : //www.youtube.com/watch?v=el1iSlP1uOs,大约需要35分钟)。发言者暗示这比从GPU1到CPU再到GPU2快。这意味着网卡不再是瓶颈。


那个人和他的博客文章带来了很多好处。我不明白他所有的理由。但是,Google,Facebook,Twitter和学术界所有领先的深度学习小组主要在GPU上运行其代码的事实表明,这是一个好主意。尽管有偏见:nvidia.com/content/events/geoInt2015/LBrown_DL.pdf
JahKnows

Answers:


28

与其他一些答案不同,我强烈建议不要在没有任何思考的情况下始终在GPU上进行培训。这是通过在图像和文本上使用深度学习方法来驱动的,其中数据非常丰富(例如,很多像素=很多变量),并且该模型同样具有数百万个参数。对于其他域,情况可能并非如此。

什么是“小”?例如,具有100个隐藏单元的单层MLP是否会“很小”?

是的,按照现代标准,这绝对是很小的。除非您有一个非常适合训练的GPU(例如NVIDIA 1080或NVIDIA Titan),否则发现您的CPU速度更快我不会感到惊讶。

请注意,神经网络的复杂性还取决于输入要素的数量,而不仅仅是隐藏层中单位的数量。如果您的隐藏层有100个单位,并且数据集中的每个观测值都有4个输入要素,则您的网络很小(〜400个参数)。如果每个观测值都具有某些医学/生物技术环境中的1M输入功能,那么就参数数量而言,您的网络相当庞大。对于我的其余答案,我假设您的输入功能很少。观察。

我发现比较CPU和GPU性能的一个很好的例子是当我使用强化学习训练扑克机器人时。为了进行强化学习,您通常不希望神经网络中有那么多层,而我们发现我们只需要几层就没有参数。此外,输入功能的数量非常少。最初,我使用GPU(NVIDIA Titan)进行培训,但是由于强化学习需要大量迭代,因此花费了很长时间。幸运的是,我发现在CPU上进行的训练使训练速度提高了10倍!这只是说CPU有时可以更好地进行训练。

在决定在CPU或GPU上进行训练时,还应该考虑其他标准吗?

重要的是要注意,在GPU上,您总是希望通过增加批处理量来填充整个GPU内存,而在CPU上却不是这种情况。在CPU上,批量大小的增加将增加时间pr。批量。因此,如果批处理量很大(例如,由于信号非常嘈杂)对您很重要,那么使用GPU可能会有所帮助。我在实践中还没有经历过,通常首选小批量。


谢谢@pir!您有什么具体的参考资料可以让我阅读更多吗?
StatsSorceress's

您可以轻松地找到要比较的VGG等参数的数量,并发现您的网络相比而言很小。
pir

3
我没有在小型网络上看到很多CPU / GPU的比较,因为那不是大公司和研究实验室感兴趣的
。– pir

@StatsSorceress如果您想自己进行测试,为什么不只是设置一个简单的Keras MLP并在GPU与CPU之间测试性能呢?另外,请参阅我更新的答案wrt。网络的规模。
pir

5

CPU是分支机构的经理,他可以做所有事情,但是除了委派任务外,他在其他方面并不擅长。但是,GPU是隐藏在您计算机中的专门数学家。如果您要进行大量数学运算,则应使用GPU。总是。

如果您正在使用任何流行的编程语言(例如python或MATLAB)进行机器学习,它就是一种单行代码,可以告诉您的计算机您希望这些操作在GPU上运行。

您还应该确保使用计算机的所有核心。这意味着利用并行计算。特别是对于可以独立完成操作的神经网络,这将极大地提高您的速度。


4
我发现有时在GPU之间来回传输数据的开销完全抵消了并行性带来的速度提高。使用GPU并非总是一个好主意。
阿德里安·凯斯特

1
这取决于模型的复杂性。如果您正在训练一个简单的K-NN,则可能不值得。但是,如果您要训练需要逆矩阵或需要大量结果矩阵运算的神经网络的任何模型,那么选择GPU总是一个好主意。
JahKnows

1
@AdrianKeister我同意。那就是我想在我的答案中得到的。对于OP提到的网络,这可能是瓶颈。
pir

1
使用我的机器在GPU上隐藏100个单位的速度更快。我需要非常少量的隐藏单元才能使CPU更快。而且,我总是倾向于分批进行训练。在这种情况下,我怀疑考虑足够密集的数据时,CPU是否会成为瓶颈。
JahKnows

3

我将首先引用类似问题的一些引号:

在矩阵运算方面,您无需三思而后行,总会选择GPU。资源

GPU中的并行架构非常适合矢量和矩阵运算。 资源

因此,如果您通读这些问题,将会发现无论情况如何,它们都建议使用GPU。它将始终提供一些改进。

您可能已经读过“小型”网络应使用CPU进行训练的原因,是因为仅针对小型网络实施GPU训练可能比仅使用CPU进行训练要花费更多时间-这并不意味着GPU会变慢。

100个隐藏的单位网络有点小,相对于那里的大型深层网络,我将其称为小型网络。循环架构(大多数情况下)具有比前馈网络更多的突触,因此100隐藏单元RNN比100隐藏单元FFN“更大”。


如果您拥有一个带有100个单位的单个隐藏层的MLP,由于权重共享,它具有与100个隐藏单位的标准RNN相同数量的参数吗?它具有更多的“突触”-更多的“激活”-但参数数量相同,对吗?
StatsSorceress

我不熟悉“体重分享”一词。它具有相同数量的激活,但是连接更多,因此参数更多...
Thomas W

权重共享意味着从RNN中的一个隐藏层到下一个隐藏层的权重矩阵是相同的;它是相同的“ U”矩阵,跨时间复制。同样,从输入到隐藏层的权重在时间上相同。
StatsSorceress '17

@StatsSorceress我对使用矩阵不熟悉。是的,从隐藏层到下一层的权重矩阵是相同的。但是,总共会有更多的连接(因为一层也可以连接到PREVIOUS层)。我不知道我怎么能解释,但RNN总会有更多的参数,因为有更多的层..
托马斯W¯¯

是的,我知道实际上有更多的参数,但是其中许多参数取相同的值,这意味着MLP和RNN中具有相同输入维数和相同隐藏维数的参数的有效数量将是相同。
StatsSorceress '17
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.