为你的深度学习任务挑选最合适gpu.docx

上传人:b****1 文档编号:2648242 上传时间:2023-05-04 格式:DOCX 页数:9 大小:24.37KB
下载 相关 举报
为你的深度学习任务挑选最合适gpu.docx_第1页
第1页 / 共9页
为你的深度学习任务挑选最合适gpu.docx_第2页
第2页 / 共9页
为你的深度学习任务挑选最合适gpu.docx_第3页
第3页 / 共9页
为你的深度学习任务挑选最合适gpu.docx_第4页
第4页 / 共9页
为你的深度学习任务挑选最合适gpu.docx_第5页
第5页 / 共9页
为你的深度学习任务挑选最合适gpu.docx_第6页
第6页 / 共9页
为你的深度学习任务挑选最合适gpu.docx_第7页
第7页 / 共9页
为你的深度学习任务挑选最合适gpu.docx_第8页
第8页 / 共9页
为你的深度学习任务挑选最合适gpu.docx_第9页
第9页 / 共9页
亲,该文档总共9页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

为你的深度学习任务挑选最合适gpu.docx

《为你的深度学习任务挑选最合适gpu.docx》由会员分享,可在线阅读,更多相关《为你的深度学习任务挑选最合适gpu.docx(9页珍藏版)》请在冰点文库上搜索。

为你的深度学习任务挑选最合适gpu.docx

为你的深度学习任务挑选最合适gpu

—为你的深度学习任务挑选最合适GPU

查看原图拥有一个快速的GPU对深度学习的初学者来说是非常重要的,因为它可以使你迅速获得有助于构建专业知识的实践经验。

本文为你的深度学习任务挑选最合适GPU,提供从性能到价格的全方位指南本文作者TimDettmers是瑞士卢加诺大学信息学硕士,热衷于开发自己的GPU集群和算法来加速深度学习。

本文的最早版本发布于2014年8月,之后随着相关技术的发展和硬件的更新,Dettmers也在不断对本文进行修正,截至目前已经进行了5次较大的更新。

机器之心今天呈现的这篇是其2016年6月25日的最新更新:

「重新编辑了多GPU部分;因为不再有重大作用,去掉了简单的神经网络内存部分;扩展了卷积内存部分;对AWS部分进行了删节,因为不再有实效;增加了我对XeonPhi的看法;更新了GTX1000系列。

」而除了GPU之外,深度学习还需要其它一些硬件基础,详情可参阅机器之心之前的文章《深度|史上最全面的深度学习硬件指南》。

当你在深度学习中使用GPU时,你会一次又一次地为它带来的速度提升而感到惊叹:

在一般问题中能获得相对于CPU快5倍的速度提升,在一些更大的问题中还能获得相对快10倍的速度提升。

在GPU的帮助下,你可以更快地试验新的想法、算法和实验,并迅速得到反馈——哪些是可行的、哪些是不可行的。

如果你对深度学习是认真的,那么你一定要使用GPU。

但是,你应该选择哪一种呢?

在这篇博客中我将指导你选择一款最适合你的GPU。

拥有一个快速的GPU对深度学习的初学者来说是非常重要的,因为它可以使你迅速获得有助于构建专业知识的实践经验,这些专业知识可以帮助你将深度学习应用到新问题上。

没有这种迅速的反馈,从错误中汲取经验将会花费太多时间,会使人在继续深度学习的过程中感到受挫和沮丧。

在GPU的帮助下,我很快就学会了如何在一系列Kaggle竞赛中应用深度学习,并且在PartlySunnywithaChanceofHashtagsKaggle竞赛上获得了第二名,竞赛内容是通过一个给定的Twitter预测气象等级。

比赛中,我使用了一个相当大的带有修正线性单元(rectifiedlinearunits)和dropout的两层深度神经网络进行正则化(regularization),而且勉强才能塞进我的6GBGPU内存里。

应该使用多个GPU吗?

在GPU的帮助下,深度学习可以完成很多事情,这让我感到兴奋。

我投入了到多GPU的领域之中,用InfiniBand40Gbit/s的互连组装了小型GPU集群。

我非常激动地想了解多个GPU能否获得更好的结果。

我很快就发现,在多个GPU上,不仅神经网络难以进行有效的并行化,对普通的密集神经网络加速效果也很一般。

小型神经网络可以并行并且有效地利用数据并行性,但对于大一点的神经网络,例如我在PartlySunnywithaChanceofHashtagsKaggle比赛中使用的,就几乎没有加速效果。

随后,我进一步试验,对比32位的方法,我开发了带有模型并行性的新型的8位压缩技术,该技术能更有效地并行处理密集或全连接的神经网络层。

然而,并行化失败了。

我天真地为一系列问题对并行算法进行了优化,但只发现即使有优化过的自定义代码,它的效果也并不好——考虑到你所付出的努力。

你需要非常了解你的硬件及其与深度学习算法交互的方式,这样你一开始就能衡量你是否可以受益于并行化。

查看原图我的电脑主机配置:

你可以看到三个GXTTitan和一个InfiniBand卡。

对于深度学习来说,这是一个好的配置吗?

然而,在并行化上还有一些不那么专业的问题。

例如,卷积层很容易并行化和很好地扩展。

很多框架也支持这种并行性;对大多数框架来说(比如TensorFlow、Caffe、Theano和Torch),如果你使用4个GPU,通常会加速约2.5-3倍;而对于优化过的研究代码,大约会有3.6-3.8倍的加速。

微软的CNTK拥有最好的并行化性能,其与研究代码相近。

CNTK有一个缺点:

它目前非常难使用,因为其使用了配置文件(configfiles),而非库API。

目前我在微软研究院做实习生,我将致力于CNTK,我可以告诉您,API与并行性能都将会获得显著的提升。

这些变化使得在多GPU和多计算机下的并行化可以达到使普通用户能很容易受益于不同类型深度学习模型的快速训练的程度,无论是卷积网络、循环网络、还是全连接网络。

使用多GPU的另外一个好处是你可以分别在每个GPU上运行多个算法或实验。

其速度没有变快,但你能一次性通过使用不同的算法或参数得到更多性能信息。

如果你的主要目标是尽快获得深度学习经验,这是非常有用的,而且它对想同时测试新算法的不同版本的研究者也非常有用。

如果你想要学习深度学习,这对你的心理是很重要的。

执行任务的间隔以及得到反馈信息的时间越短,大脑越能将相关的记忆片段整合成连贯的画面。

如果你在小数据集上使用独立的GPU训练两个卷积网络,你就能更快地知道什么对于性能优良来说是重要的;你将更容易地检测到在交叉验证误差的模式,并正确地解释它们——即对于哪些你需要调整的模式,你需要添加、移除或调整哪些参数与层。

所以总的来说,一个GPU对所有任务来说就已经足够了,但多个GPU对于加速你的深度学习模型来说越来越重要。

如果你想快速学习深度学习,多个廉价的GPU也很好。

应该使用哪种加速器呢?

NVIDIA、AMD、或XeonPhi?

NVIDIA的标准库使得在CUDA中建立第一个深度学习库很容易,但没有适合AMD的OpenCL的那样强大的标准库。

目前还没有适合AMD显卡的深度学习库——所以只能选择NVIDIA了。

即使未来一些OpenCL库可用,我仍会坚持使用NVIDIA:

因为对于CUDA来说,GPU计算或者GPGPU社区是很大的,而对于OpenCL来说则较小。

因此,在CUDA社区,好的开源解决方案和为编程提供可靠的建议是现成的。

此外,NVIDIA公司现在对深度学习抱有很大信心。

他们押注深度学习在未来十年会发展壮大,但你在AMD公司身上就看不到这样的信心。

至于XeonPhi,其广告宣称你能够使用标准的C代码,并可将代码轻松转换成加速过的XeonPhi代码。

该功能听起来很有趣,因为你可能认为你可以依靠庞大的C代码资源。

然而,事实上,其只支持非常小部分的C代码,因此该功能并不真正有用,大部分的C运行起来是很缓慢的。

我曾研究过超过500个XeonPhi的集群,遭遇了无止尽的挫折。

我不能运行我的单元测试(unittest),因为XeonPhi的MKL(数学核心函数库)并不兼容NumPy;我不得不重写大部分代码,因为英特尔XeonPhi编译器无法让模板做出适当约简。

例如,switch语句,我不得不改变我的C接口,因为英特尔编译器不支持C++11的一些特性。

这一切导致了在没有单元测试的情况下来执行代码的重构。

它花了很长时间。

这真是地狱啊。

随后当我的代码被执行时,一切都运行得很慢。

如果你的操作的张量(tensor)的尺寸连续变化,线程调度器(threadscheduler)中的漏洞或问题会削弱性能。

例如,如果你有不同大小的全连接层或dropout层,XeonPhi会比CPU还慢。

所以,如果你想做深度学习,远离XeonPhi!

了解卷积神经网络的基本内存需求当你在选择合适的GPU时,你得知道自己使用深度学习所要解决的问题需要多大的内存。

因此接下来的两段文字会探讨卷积神经网络的内存消耗,让你可以确保自己的GPU有足够满足需要的内存,但又不会太多,这样能节省点钱。

卷积神经网络的内存需求非常不同于简单的神经网络。

你可能会认为前者的参数更少因此需要更少内存。

如果只是保存网络文件,这没什么不对,但要想训练它的话情况就不同了。

每个卷积层的激活(activation)和误差(error)相较于简单的神经网络来说都是巨大的,而正是它们占用了内存的主要部分。

将激活和误差的大小加起来,我们就可以确定出大概的内存需求。

然而要确定网络中哪种状态下激活和误差的尺寸大小是很难的。

一般来说,前几层网络会占用很多内存,所以主要内存需求就来源于你的输入数据大小,因此可以率先考虑你的输入数据。

通常ImageNet使用的输入维度(inputdimensions)是224×224×3,即224×224像素的3色信道图片。

要在ImageNet上得到当下最先进的结果至少需要12GB内存,而在一个112×112×3维的类似数据集上我们可能只需4-6GB内存。

另一方面,对于一个输入尺寸为25×75×75×3的视频数据集来说,12GB内存可能远给不了你想要的好效果。

然而另一个重要方面就是数据集中的样本数量。

比如你只取了ImageNet数据集图像中10%的样本,然后你的模型很快就会过拟合(只是没有足够多的样本来很好地训练),因此你那个消耗远远更少内存的小网络将足以与卷积网的性能媲美,所以4GB左右或更少的内存对于这项任务来说都绰绰有余。

这就意味着图像越少,反过来所需内存就越少。

标签的分类数量也是同样的道理。

如果你从ImageNet数据集中只选取了2个分类来建立模型,那么相较于拥有1000个分类的模型,它将消耗更少的内存。

这就是这样:

如果你有更少的需要彼此区分的分类,那么过拟合就会出现得快得多,或者换句话说,相比于区分1000个分类,区分2个分类所需的参数要少得多。

有关这些准则的一个实际例子是Kaggle的浮游生物检测比赛。

起初我认为,用自己的4GPU系统来参加比赛可能会有巨大优势。

我以为自己或许能够在很短时间内训练出一个庞大的卷积网络——还有一点就是别人都缺少这样的硬件。

然而由于数据集过小(50×50像素,双色信道,40万张训练图像;大约100个分类),我很快意识到即使对于一个大小刚好够放入一个训练很快的小GPU的小网络来说,过拟合也是一个问题。

所以多个GPU并没有多少速度方面的优势,而大GPU内存更没有任何优势可言。

因此对于这种任务,一个4-6GB内存的小GPU就足以达到很好的效果。

虽然此例中我的内存是足够的,但你最终会遇到内存不足的情况。

然而你并不需要为这个问题而买一个新GPU,可能只需使用一个简单的内存减小技术(memoryreductiontechnique)。

内存减小技术及其效果一种方法是使用更大步态(strides)的卷积核(convolutionalkernels),也就是不对每个像素都应用批形式的(patch-wise)卷积,而是针对每2个或4个像素(即2或4个步态),这样就能产生较少的输出数据。

输入层通常使用这种方法,因为它消耗了大部分的内存。

另一种减少内存占用的诀窍是引入一个能够减少维度的1×1卷积核层。

例如96个1×1的卷积核能够使64×64×256大小的输入数据降为64×64×96。

还有一个显著的技术是池化(pooling)。

一个2×2的池化层将减少四层的数据量,从而大大减少了后续层的内存占用。

如果这些方法都不管用,你总是可以尝试减少mini-batch的大小。

mini-batch尺寸是一个非常重要的内存影响因素。

大小为64的批(batch)会比大小为128的批减少一半内存消耗。

然而训练时间可能也会更久,特别是在训练的最后阶段,为了得到准确的梯度,它显得更加重要。

大多数卷积运算也为大小为64或更大的mini-batch进行了优化,因而从32大小的批开始,训练速度会大大减小。

所以缩小mini-batch的大小到或者甚至低于32,只应作为最后的对策。

另一个经常被忽视的方法是改变卷积网络所使用的数据类型。

将32位换为16位,你就可以轻松减半内存消耗且不会降低分类性能。

将它运用在P100Tesla卡中,这甚至能给你带来巨大的提速。

那么将这些内存减小技术应用在实际数据中会怎样?

如果我们采用128大小的批,3色通道的250×250像素图片(250×250×3)做为输入,3×3卷积核增长步长为32,64,96…,则我们将有大致如下、仅包含误差及激活的内存占用情况:

92MB→1906MB→3720MB->5444MB->…此时内存将很快被挤爆。

如果现在我们使用16位而非32位的数据类型,上面的数字就可降为一半;64大小的批同理。

同时使用64大小的批及16位的数据类型将使内存占用减为原先的四分之一。

然而我们仍然会需要大量内存来训练一个更多层的深度网络。

如果我们为第一层数据加2个步态则会带来哪些改变——后面跟着一个2×2的最大池化(maxpooling)?

92MB(输入)->952MB(卷积)->238MB(池化)->240MB(卷积)->340MB(卷积)→….这看起来更易于管理。

在处理多达20至30层的网络时,我们仍然会遇到内存问题,而你只能应用另一个最大池化或其他技术。

例如32个1×1的卷积核可将最后一层数据大小从340MB降为仅仅113MB,因此我们能够轻松扩展更多层的网络而不会出现任何问题。

一旦你广泛使用了最大池化、跨越式(striding)和1×1卷积核,你将在这些层处理过程中扔掉非常多的信息,网络缺少数据来工作,以至于损害到模型的预测性能。

因此当这些技术能够非常有效地减小内存消耗时,你应当小心地使用它们。

随着时间的推移,你在训练卷积神经网络时会学到的一件事情就是,如何最佳混合这些技术来得到一个良好的结果,且不会遇到任何内存问题。

了解卷积神经网络的临时内存需求上文所解释的是卷积神经网络内存消耗的主要来源以及缓解内存问题的方法。

然而还有另一层不太重要且更难理解的内存消耗问题,但它也可能给出最佳的网络解决方案,或许能帮你确定深度学习任务的实际内存需求。

一般有三种类型的卷积实现方式。

一种方式是采用傅里叶变换,其他两种都是先重新调整内存计算来直接做数据计算。

这种调整要么发生在逐像素计算的类似批的结构中,要么发生于使用矩阵乘法计算卷积的矩阵结构中。

查看原图滥用符号的连续卷积定理:

输入函数表示一个图像或特征映射,减去x0可看做是创建宽度与x相关的图像批,然后再乘以核(*kernel)*。

最后的结果在傅里叶域中是连乘形式;这里表示一个傅立叶变换函数。

对于离散「维度」(x),我们运用累加而不是积分——不过思路都是相同的。

卷积的数学运算可以用傅里叶频域里一个简单的元素方式的矩阵乘法来描述。

因此可在输入以及每个卷积核上执行一个快速的傅立叶变换,并将这些元素形式的相乘以得到特征映射——卷积层的输出。

在向后传播的过程中,我们做一个快速的傅立叶逆变换来接收标准域中的梯度以更新权重。

理想情况下,我们将所有的傅立叶变换存储在内存中,从而节省每个过程中分配内存的时间。

这可能会增加很多额外内存,而这是为卷积网络的傅立叶方法所添加的内存块——保留所有这些内存只是为了让一切顺利进行。

这种方法显然是最快的卷积方法。

通过Winograd快速傅里叶变换,这种卷积技术在流行的3×3卷积核上运行飞快。

当然运用快速傅立叶变换方法的其他卷积核通常是最快。

然而这种方法会占用相当多的内存,不过这个领域的研究仍然很活跃,使用快速傅里叶变换的核在性能和内存上都非常高效,而核还在变得更好。

其他两种直接操作图像块的方法是为重叠的批重新分配内存来实现连续的内存访问。

缓慢的内存访问可能是对算法性能的最大伤害。

连续内存中的内存预取与校准能使卷积运算速度运行更快。

连续内存意味着所有内存地址都相比邻——没有「越级」索引——并且能实现更快的内存读取。

或者你可以安排矩阵内部的内存,然后使矩阵相乘以达到相同效果。

既然矩阵乘法已经被高度优化,这对一个运行良好的卷积运算来说也是一个很好的策略。

有关运用这种方法计算卷积的更多内容可参看CUDA代码,但是对输入或像素数据的预取是增加内存使用的主要原因。

由于一些条目被重复,矩阵乘法的变量使用了相对更多的内存,但这种方法在以批的方式计算卷积时往往比已过时的方法快一点。

我希望这部分内容给出了卷积神经网络中内存问题的相关思路。

现在我们来看看一些实际的建议。

给定预算下的最快GPU处理性能最常由每秒浮点运算来测量(FLOPS)。

这种测量标准往往被用在GPU计算的广告宣传中,它还确定了超级计算机领域的世界前500强名单。

然而这种测量方式是带有误导性的,因为它测量的处理性能,所针对的是不会出现在现实世界中的问题。

原来最重要的可实践性GPU性能测量是以GB/s为单位的内存带宽,它衡量了内存每秒可读取的数据大小。

内存带宽非常重要,因为几乎所有的数学运算,比如矩阵乘法、点积、求和等等,都有带宽限制,即受限于可从内存中提取多少数字,而非给定数字量的情况下可执行多少计算。

还有一些其他原因能够解释为什么GPU非常适合深度学习等许多计算任务;如果你想更深入地了解GPU,可以阅读我在Quora上面的回答:

「为什么GPU非常适合深度学习?

」链接:

和GPU随时间变化的带宽比较:

带宽是GPU比CPU的计算速度更快的主要原因之一。

带宽可直接在同一架构内进行比较,例如直接查看两张Pascal卡(如GTX1080与GTX1070)的内存带宽来比较其性能。

然而不同架构之间不能直接比较,像是Pascal的GTX1080与Maxwell的GTXTitanX,因为各自给定的内存带宽架构是非常不同的。

这使得一切都有点棘手,但总的说来带宽能给你一个有关GPU大致运行速度的良好概述。

要确定一个给定预算下的最快GPU类型,可以使用这篇维基百科中的内容(http:

//en.wikipedia.org/wiki/List_of_Nvidia_graphics_processing_units#GeForce_700_Series),看一下它的带宽是多少GB/s;其中列出的较新款显卡价格是相当准确的(900和1000系列),但是旧款卡价格明显低于列表中的价格——尤其当你通过eBay网购时。

比如一张正版GTXTitan在eBay上卖$350左右、GTX970卖$210。

然而另一个需要考虑的因素是,并非所有架构都与cuDNN兼容。

由于几乎所有的深度学习库都使用cuDNN做卷积运算,这就限制了对于KeplerGPU或更好GPU的选择,即GTX600系列或以上版本。

另外KeplerGPU通常会很慢。

因此这就意味着你应该选择900或1000系列GPU来获得更好的性能。

为了粗略估计出深度学习任务中的显卡性能比较,我创建了一个简单的GPU等价表。

如何阅读它呢?

例如GTX980的速度相当于0.45个GTX1080,或是GTX1080的速度是GTX980的两倍以上。

GTX1080=0.8GTX1070=0.66GTXTitanX=0.66GTX980Ti=0.45GTX980GTX1080=0.4GTX970=0.33GTXTitan=0.2AWSGPUinstance(g2.2andg2.8)=0.2GTX960通常我会推荐GTX1080或GTX1070。

二者都很卓越,如果你能承受GTX1080的价格当然更好。

GTX1070更便宜些且速度仍比GTXTitanX快。

然而这两个卡的问题是它们的8GB内存。

这个内存容量对于大多数任务来说是相当充足的,比如Kaggle竞赛、大多数的数据集、深度且自然的语言理解任务。

但是对研究人员而言,尤其是ImageNet的研究者,在处理拥有庞大背景资料的视频数据或自然语言理解任务时,选择12GB内存的GTXTitanX会更好——这里内存就尤为重要。

如果你缺钱的话就没有任何办法了。

亚马逊网页服务上的GPU实例是相当昂贵且龟速的,没钱就买不到好东西。

你可以到eBay上以$210买一个过得去的GTX970,但也有一些与此相关的内存问题(见下文)。

另一个选择是从eBay购买正版GTXTitan;不过$350也已经相当贵了。

GTX680和GTX960也是较为便宜的选择,它们通常在$200以下,但是相较于其他更成熟的GPU则是相当慢。

廉价而困扰GTX970是一个你需要留意的特例,其架构较为怪异,内存使用超过3.5GB时性能可能会被削弱,因此对于大的卷积神经网络的训练就很麻烦。

这个问题在新闻报道中已经相当戏剧化地变多了起来,但事实证明整个问题对于深度学习来说并不像原始基准表现的那样戏剧化:

如果不超过3.75GB,它仍然比GTX960要快。

不管怎样GTX970是一款用来学习深度学习的优秀GPU。

它还适合于大多数未涉及太多数据的Kaggle数据集。

如果你不想要所有这些麻烦,那么就去eBay购买一个不会造成麻烦的正版GTXTitan或者一个便宜的4GBGTX960。

亚马逊网络服务(AWS)中的GPU实例在这篇博文的前一个版本中,我推荐了AWSGPU的现货实例,但现在我不会再推荐它了。

目前AWS上的GPU相当慢(一个GTX1080的速度是AWSGPU的五倍)并且其价格在过去的几个月里急剧上升。

现在看起来购买自己的GPU又似乎更为明智了。

总结运用这篇文章里的所有信息,你应该能通过平衡内存大小的需要、带宽速度GB/s以及GPU的价格来找到合适的GPU了,这些推理在未来许多年中都会是可靠的。

但现在我所推荐的是GTX1080或GTX1070,只要价格可以接受就行;而如果你是一位研究人员,或许会想要一个GTXTITANX。

如果你缺少硬件投资资金并且可以接受一定的内存限制,那么GTX970对于中等大小及以下的数据集来说就是个可靠的选择。

如果想减少麻烦,一个eBay上的正版GTXTitan将是极好的。

GTX680和GTX960最便宜,同时也是最慢的GPU。

如果你真的很缺钱,目前尚没有其他好的选项。

总结性建议总的说来最好的GPU:

GTX1080和GTXTitanX有成本效益但价格高的:

eBay上的GTXTitanX,GTX1070有成本效益但麻烦多的:

GTX970(有内存问题)最便宜的卡片而且没有麻烦:

eBay上正规的GTXTitan我的数据集大于250GB:

GTXTitan我钱不多:

eBay上的GTX6804GB或者GTX9604GB我几乎没钱:

尚待解决;深度学习是为壕准备的我参加Kaggle比赛:

GTX1070或者GTX970我是一名研究人员:

至少需要一个GTXTITANX和1-4GTX1080来做原型我想建立一个GPU集群:

这真的很复杂,你可以从这里得到一些思路:

eBay上的GTX9

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 人文社科 > 法律资料

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2