您的位置:首页 > 其它

Which GPU(s) to Get for Deep Learning(译文)

2015-10-24 20:47 405 查看
当我们在DL中运用GPU进行运算时,它所能带来的速度上的提升一次又一次的使我们感到震惊:其运算速度一般比CPU快10倍,而在更复杂的问题上会快20倍。利用GPU你能更快地去实践新的想法、算法和实验,并且能及时得到反馈,知道哪些方法有作用,哪些只是徒劳。如果你真的想深入DL的学习,拥有自己的GPU是很有必要的。但你到底该选择哪种GPU呢?本文将给出一些具体的建议。

在开始学习DL时,拥有一个高速的GPU是很重要的,因为这种在实际经验中的既得技巧是培养你专业技能的关键,在此基础上你才能将这些技巧应用到新的问题上。反之,若没有及时的反馈,想从错误中吸取教训将是一个更漫长的过程,而且也会让你倍感挫折。

有人可能会想,既然单个GPU能加速DL,那么多个GPU构成的集群是不是会有更好的效果呢?但我发现,在多个GPU上并行构建神经网络并没有想象中的那样高效,而且对于密集型的神经网络而言,速度提升并不令人满意。小一点的网络利用数据并行效率会更高,但更大的网络结构却并非如此。

不过,模型并行使得我可以训练内部连接超过30亿的大网络,但想要充分挖掘这种网络的潜在学习能力,我们需要非常大的数据集,而这只在大型公司里才可能有。

另一方面,多个GPU使得你可以在每个GPU上运行不同的算法或者进行不同的实验,虽然速度没得到提升,但却可以一次性的对不同算法或参数所拥有的性能进行考察。这是获得DL训练经验的一个十分有用的方法,对于那些想要从多角度认识新算法的研究者而言也是一大福音。

CNN和密集神经网络的不同在于,卷积神经网络中存在权重共享,所以数据共享机制使得它在多GPU并行运行环境中十分高效。在此基础上,alex等人还在其网络最后的密集连接层中运用了模型并行机制,从而进一步加快了网络学习速度。

当然,应该注意的是在多GPU网络中进行高效的编程要比在一个单独的GPU进行简单网络的编程花费更多的时间。

综上所述,一个GPU就能满足大多数任务的需求,而多个GPU只对某些特殊任务才有效益可言。

NVIDIA的标准库使得在CUDA中开发DL库变得十分容易,但AMD的OpenCL却没有这么多强大的标准库。现今AMD还没有很好的DL库,所以NIVDIA是我们的不二之选。即使以后可能会出现可用于DL的OpenCL库,但我仍然会选择NVIDIA,因为针对CUDA产生了很多的有关GPU计算和GPGPU的社区,这样你能更方便的得到开源的解决方案和实质性的建议。

人们经常会问:我是不是需要购买内存最大的GPU,这样我就能训练最大的网络模型。但事实并非如此,有些时候模型的实现并不是受限于GPU,而是你的程序。尽管标准的DL库都是很高效的,但这些库是用来提高速度的,而不是提高内存运用效率的。

下边的公式可用于计算简单网络所需的内存大小:



不过,对于CNN情况就完全不同了。卷积实现有两种方式,一是利用傅里叶变换,一是直接在图像上进行卷积计算。卷积运算在傅里叶频域可用简单的表示为矩阵相乘。所以可以针对输入和每个核都进行快速傅里叶变换,然后将他们相乘得到特征图,即卷积层的输出。在反向传播阶段,利用傅里叶逆变换得到标准域里的梯度,从而更新参数。理想情况下,我们将这些傅里叶变换运算都放在内存进行,从而节省内存分配的时间开销。

直接在图像上进行卷积运算的方法会给图像中的重叠部分重新分配内存,以便内存的连续访问,这意味所有内存的地址都是紧密相连的,没有跳动的指针,这也使得内存访问更快。你可以把这种操作想象成将一个在卷及网络中立体核展开成一条直线,一个单独的矢量。缓慢的内存访问可能是降低算法性能最甚的,而内存的预提取和分配使得卷积运算变得更快。在CUDA编程中,这种卷积运算方法得到更深入的发展,但对输入的预提取可能是提高内存使用率的主要原因。

卷积网络中关乎内存使用的另一问题就是因为其存在权重共享机制,从而使得权重矩阵很小。

基于对CNN结构和实现的了解,我们就可以知道内存的真正需求了。一般情况下,若有足够的内存,那么给定问题,你是可以构建任意复杂的网络模型的,但是你可能很快就会碰到过拟合问题,此时更大的网络模型并不比简单的模型要好。

所以我们需要基于自己所拥有的数据资源的大小来确定网络的大小,从而决定到底需要多大内存的GPU。

举个例子,在kaggle的一个比赛中,我一开始觉得既然拥有4个GPU组成的系统,一定会很占优势,我就可以在很短的时间里训练非常大的卷积网络了,而受制于硬件条件,其他人就没法完成大模型的训练。然而,受制于比赛中非常小的数据集,我发现即使在一个GPU中训练较小的网络都会发生过拟合而且训练过程很快就完成了,因此多个GPU并没有实现加速,内存大的优势也没发挥出来。

在ImageNet比赛中,有1000个类别,超过250*250幅彩色图片,数据集大小超过250G。虽然3G内存稍显不足,但alex所用的内存也没超过3G。在ImageNet比赛中,6G内存是足以完成一个完整模型的训练的,当然若你运用更大的内存,可能会得到稍微好点的性能,但性能的提高所得到的收益和你所需要的资源相比,确实不值一提。

我认为DL领域的下一个突破点就是如何在单个GPU上尝试新的算法来实现性能的提高,而不是GPU集群和算法的简单变形的结合。所以你不必担心内存不够,一个更快的GPU或者多个更小内存的GPU所能达到的性能通常比内存大的单个GPU的性能更好。

现今还没有比ImageNet更大的数据集了,所以6G内存对于大多数研究者而言是足够的,如果你想要入手一个3G或者4G内存的GPU,但不确定是否合适,一个好方法就是拿你的数据集大小和ImageNet比较一下,这样就能大致知道所需内存大小了。

总之,我认为内存的作用被高估了,虽然非常大的内存能带来速度上的提升,但提升是非常有限的。同时,GPU集群也是一个好的选择,但较于性能提升,其带来的额外开销更大。一个12G的GPU在未来的3到6年足够使用,而6G的对于现在正合适,4G的也行,但在某些问题上可能会有所限制,而3G的可用于大多数在小数据集上测试新模型和新算法的研究之中。

运算性能经常用每秒浮点运算速度(FLOPS)来衡量。这一标准经常见于描述GPU计算能力的广告中,而且它也是衡量超级计算机能否进入前500强的标准。然而,这一衡量标准存在误导,因为这种性能衡量并不是基于实际问题的。

实践证明,最实用的衡量标准是GPU的带宽(GB/s),它衡量的是每秒有多少内存可供读写,这是因为几乎所有的诸如点积、求和、求余等数学运算都是带宽受限的,而是不是受限于FLOPS。



另外一个重要的考虑因素就是麦克斯韦和费米构架(麦克斯韦900系列和费米400,500系列)比开普勒构架(600和700系列)稍微快一些。所以GTX580比GTX600要快,新出来的麦克斯韦构架的GPU比开普勒型快很多,若你资金充足,那么买麦克斯韦型的吧。要是你买不起GTX Tian X或者GTX980,4G内存的GTX 960或者GTX680也是可用之选。要是你倾向于训练密集型的或者RNN等模型时,GTX970会是非常明智的选择。但如果你经常用到的模型是CNN ,那么GTX970就不合适了。上边我也推荐了GTX580,但因为cuDNN库的更新使得卷积运算速度更快了,而且GTX580太老了无法和cuDNN兼容,所以不再推荐使用它。而且可以期待的是会有更多的库被整合到cuDNN中。

这里给出几款GPU在DL任务重性能的比较:

GTX Tian X=GTX 980 Ti=0.66GTX 980=0.6GTX 970=0.5GTX Tian

GTX Tian X=0.35 GTX 680=0.35 AWS GPU instance=0.33GTX 960

700系列已经过时了,但6G的GTX Tian仍然是可用之选。GTX970也行,但和GTX580相比,仍然略有逊色。

GTX970是一个特例,因为若它的内存使用超过3.5G,其性能会降低,所以在训练大型卷积网络时可能会遇到麻烦。这种问题被新闻媒体过分炒作了,其实只要内存使用量没超过3.75G,它仍然比GTX960快。

为了解决内存问题,若你能对自己的软件程序进行扩展,使得它可以在内存使用超过3.5G时及时给予反馈,那么GTX970就是一款成本很低且内存为3.5G的非常完美的GPU了。而且你能在ebay上买到非常便宜的GTX970,因为很多并不知道如何控制这款GPU内存使用的游戏玩家会以低价卖出。很多人会觉得推荐GTX970是难以理解的,但如果你手头稍紧,它是一个不错的选择。而且诸如GTX580这样便宜的GPU也存在一些问题,因为它相对而言也有些过时,现在cuDNN中很多重要的库它都不支持,不过诸如cuda-convnet1和deepnet等库仍可以用,只是 torch7就没法用了,如果你基本不用CNN,GTX580是个不错的选择。

如果你不想被上述问题所累,那就选择稍微实惠点的4G的GTX960或者GTX 680。

要是你缺少专用机器,那么亚马逊的web服务器是个不错的选择,而且也可用来运行多种小型实验。但要注意的是它很难在单独的DL构架上利用多个GPU集群,因为AWS采用特殊的GPU来支持可视化,而这种可视化会削减GPU之间的带宽。当然还是有些方法可用来补救,但却不能完全避免这一问题。而且很多算法在GPU集群式的AWS上比在单个GPU上的运行速度慢。不过这不是关键,在这里提出来只是想告诉大家不要想着在AWS上利用并行计算,这只是徒劳。

AWS的亮点在于它的按时租用:即你可以租用几个小时来运行你的程序,跑完后就可以关闭它,只需要1.5$你就能租用4个小时,在这4个小时里你差不多可以在MNIST上同时完成4个实验,而且在2个小时内可以相继完成160个实验,在相同的时间里你也能在CIFAR-10和CIFAR-100上运行完整的8-12个实验。

想在AWS上运行ImageNet数据集是很困难的,因为它只提供了4G的内存,当然,这4G足以用来运行一些模型,但想要运行的更新,更成功的模型就需要更大的RAM了。而且ImageNet数据集很大,这需要你租用额外的空间来存放。AWS用起来很简单,但可能需要几个小时后的熟悉后你才能适应它的运作机制。

综上,你应该在所需内存,速度带宽以及价格的基础上选择GPU。如果资金充足,那么购置GTX Titan X或者GTX 980;GTX 960和GTX 689 是稍微便宜点的选择;如果你能容忍GTX 580或者GTX970所存在的问题,那么3GB的也是不错的选择;要是你既想要大内存又实惠点的,那就选择6GB的GTX Titan ;要是资金很紧,那么AWS提供的在线服务是首选。

综上所述:

最好的GPU:GTX Titan X

成本低但较贵的:GTX Titan X,GTX980,GTX980 Ti

成本低但有些问题的:3GB的GTX580,GTX970

最便宜的且没什么问题的:4GB的GTX960或者GTX680

如果数据集大于250GB,考虑GTX Titan,GTX980 Ti或者GTX Titan X;要是钱不够那就买3GB的GTX680;要是几乎没资金,那就租用AWS的在线服务;要是想完成kaggle比赛,建议用GTX980,或者4GB的GTX960;作为研究者,则至少要配置GTX Titan X ;

要是你想深度学习DL但才刚刚起步,可以先试试GTX680,GTX980,GTX970。

原文链接:

http://timdettmers.com/2014/08/14/which-gpu-for-deep-learning/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: