【转载】我在深度学习上用GPU的经验

  • 3 replies
  • 4501 views
*

sisiy

  • *****
  • 163
    • 查看个人资料
【转载】我在深度学习上用GPU的经验
« 于: 十月 01, 2014, 10:24:27 pm »
为什么我用一个GPU?    我已经使用GPU将近2年,对我来说,一次又一次地惊异于速度的提升。相较于CPU,20倍的加速是小儿科了,而对于一些大的问题,可以达到50倍的提速。有了GPU,你可以尝试新的想法、算法并实验,速度要比平常快很多,你可以马上得到结果:可行或者不可行。这是非常重要,尤其当你对于新问题上开展深度学习的工作,你可以快速获得实际经验。如果没有快速的反馈,你就会在一个错误的地方浪费很多时间。这样在深度学习上会面临挫折感。     有了GPU后,我快速学会如何将深度学习应用到一系列Kaggle竞赛中,在  Partly Sunny with a Chance of Hashtags Kaggle 竞赛中我获得了第二名,这个竞赛是给定tweet来预测天气等级。在比赛中,我用了一个相当大的两层深度神经网络,利用线性整流单元和dropout用于正则化。这个deep net勉强适用于我的6GB GPU显存。更多的细节可以参考  here.
我需要多GPU么?    由于看到GPU给深度学习带来的好处,我深陷于搭建我的多GPU系统。我建了一个小型的GPU集群,用InfiniBand 40Gbit/s 连接。我很期待是否这样可以获得多GPU的高性能。  你可以看到:我用了3个Geforce Titan和一个infiniband 卡。这样的配备会有利于深度学习么?
(往下继续....)



*

sisiy

  • *****
  • 163
    • 查看个人资料
(无标题)
« 回复 #1 于: 十月 01, 2014, 11:21:07 pm »
       我很快发现,在多GPU上不仅很难有效地并行神经网络,而且对于密集神经网络加速表现平庸。使用数据并行的时候,小的神经网络可以有效地并行化,但是大的神经网络,比如我在Partly Sunny竞赛中用到的几乎没有任何加速。
      但是,使用模式并行,我能训练更大的神经网络,并且有近30亿的连接。但为了利用这些连接,一个需要远远大于通常使用的数据集。我发现了一些用途,当我训练整个维基百科语料库的语言模型的时候——但仅此而已。
       从另一方面,多GPU的优势是你可以在每个GPU上分别运行多个算法或者实验,这是非常有帮助的,如果你的目的是为了尽可能快地获得深度学习的经验。你虽然没有得到加速,但你可以通过使用不同算法或者参数立刻得到性能的信息。
       如果你只是偶尔使用深度学习,或者你用相当小的数据集(不如说是小于10-15GB)和密集神经网络,那么多GPU可能不适合你。不过,当您很多地使用卷积神经网络,那么多GPU可能仍然是有意义的。            
       [size=10.5pt]Alex Krizhevsky[/size][size=10.5pt] [/size][size=10.5pt]发布了他新的[/size][size=10.5pt] [/size][size=10.5pt]updated kernels[/size][size=10.5pt] 可以对多达四个GPU上运行的卷积神经网络。卷积神经网络[/size][size=10.5pt]——不像[/size][size=10.5pt]密集的神经网络[/size][size=10.5pt]——[/size][size=10.5pt]可以非常有效地在多个GPU来运行,因为其使用的weight sharing[/size][size=10.5pt]可以让[/size][size=10.5pt]数据并行效率非常高。最重要的是,亚历克斯Krizhevsky的实现利用模型[/size][size=10.5pt]并行,针对[/size][size=10.5pt]网络的密集连接最终层。[/size]
[size=10.5pt]    [/size][size=10.5pt]不过,如果你想为自己编写类似的网络程序,你需要清醒地认识在多[/size][size=10.5pt]GPU上编写高效的卷积kernel,这是非常困难的,需要具备丰富的GPU编程技能。[/size]    所以,总体来说,我们可以说,一个GPU应该几乎可以胜任几乎所有的任务,而多GPU对于一些非常特殊的场景是有利的 。
所以我应该需要怎样的GPU?(往下继续....)

[size=10.5pt]
[/size]




*

sisiy

  • *****
  • 163
    • 查看个人资料
(无标题)
« 回复 #2 于: 十月 02, 2014, 12:16:10 am »
所需显存大小
       人们经常问我,是否大内存的GPU是最适合自己的,因为可以用它们运行最大的神经网络。我原来也是这么想的,于是我买了我的GPU:GTX Titan ,有6GB显存。当我参加Partly Sunny with a Chance of Hashtags Kaggle竞赛的时候,我也觉得这是一个不错的选择,因为刚好适合我的GPU显存。但是后来我发现,我的神经网络的执行没有高效地使用到显存,或者说其实更少的内存已经足够了。

    如果你想知道你的GPU显存可以放入多大的一个神经网络,那么你减去400 MB的缓冲区,然后GPU显存除以2为动量矩阵,然后乘以1024*1024来获得字节数,最后除以4得到配合该存储器浮点数的数量。对于GTX泰坦,就是(6144-400)*1024*1024/(4*2)=752,877,568参数。在Kaggle比赛中 用了9000*4000*4000*32网络,这只是512,128,000个参数(动量矩阵)。因此,这个网络都可以放到一个只有1536MB显存的GPU。作为比较,Alex Krizhevsky的卷积神经网络用于 ImageNet competition的,有60,000,000个参数(动量矩阵)。   因此底线是如果你只是在一些Kaggle数据集上使用神经网络,建立一些普通的模型,那么你不需要太担心显存的问题(只要大于1536MB就可以)

(无标题)
« 回复 #3 于: 十月 08, 2014, 09:19:15 am »
你想表达什么意思?