看了这篇才明白为什么GPUasco电磁阀选型样本要挑M60

中国领先的IT技术网站
51CTO旗下网站
如何为你的深度学习任务挑选最合适的GPU?
深度学习是一个计算密集型领域,而 GPU 的选择将从根本上决定你的深度学习实验。那么,如何选择一个适合你的 GPU 呢?这正是本篇博文探讨的问题,帮助你做出正确选择。
作者:微胖
黄小天 译来源:| 16:00
深度学习是一个计算密集型领域,而 GPU 的选择将从根本上决定你的深度学习实验。没有
GPU,一个实验也许花费数月才能完成,或者实验运行一天却只关闭了被选择的参数;而一个良好稳定的 GPU
可让你在深度学习网络中快速迭代,在数天、数小时、数分钟内完成实验,而不是数月、数天、数小时。所以,购买 GPU 时正确的选择很关键。那么,如何选择一个适合你的
GPU 呢?这正是本篇博文探讨的问题,帮助你做出正确选择。
对于深度学习初学者来说,拥有一个快速 GPU
非常重要,因为它可以使你迅速获得有助于构建专业知识的实践经验,这些专业知识可以帮助你将深度学习应用到新问题上。没有这种迅速反馈,从错误中汲取经验将会花费太多时间,在继续深度学习过程中也会感到受挫和沮丧。在
GPU 的帮助下,我很快就学会了如何在一系列 Kaggle 竞赛中应用深度学习,并且在 Partly Sunny with a Chance of
Hashtags Kaggle 竞赛上获得了第二名,竞赛内容是通过一个给定推文预测气象评分。比赛中,我使用了一个相当大的两层深度神经网络(带有两个修正线性单元和
dropout,用于正则化),差点就没办法把这个深度网络塞进我的 6G GPU 内存。
应该使用多个 GPU 吗?
在 GPU 的帮助下,深度学习可以完成很多事情,这让我感到兴奋。我投身到多 GPU 的领域之中,用 InfiniBand 40Gbit/s 互连组装了小型
GPU 集群。我疯狂地想要知道多个 GPU 能否获得更好的结果。我很快发现,不仅很难在多个 GPU
上并行神经网络。而且对普通的密集神经网络来说,加速效果也很一般。小型神经网络可以并行并且有效地利用数据并行性,但对于大一点的神经网络来说,例如我在 Partly
Sunny with a Chance of Hashtags Kaggle 比赛中使用的,几乎没有加速效果。
随后,我进一步试验,对比 32 位方法,我开发了带有模型并行性的新型 8 位压缩技术,该技术能更有效地并行处理密集或全连接神经网络层。
然而,我也发现,并行化也会让人沮丧得发狂。针对一系列问题,我天真地优化了并行算法,结果发现:考虑到你投入的精力,即使使用优化过的自定义代码,多个 GPU
上的并行注意的效果也并不好。你需要非常留意你的硬件及其与深度学习算法交互的方式,这样你一开始就能衡量你是否可以受益于并行化。
我的计算机主机设置:你可以看到 3 个 GXT Titan 和一个 InfiniBand 卡。对于深度学习来说,这是一个好的设置吗?
自那时起,GPU 的并行性支持越来越普遍,但距离全面可用和有效还差的很远。目前,在 GPU 和计算机中实现有效算法的唯一深度学习库是
CNTK,它使用微软的 1 比特量子化(有效)和 block momentum(很有效)的特殊并行化算法。通过 CNTK 和一个包含 96 块 GPU
的聚类,你可以拥有一个大约 90x-95x 的新线性速度。Pytorch
也许是跨机器支持有效并行化的库,但是,库目前还不存在。如果你想要在一台机器上做并行,那么,CNTK、Torch 和 Pytorch
是你的主要选择,这些库具备良好的加速(3.6x-3.8x),并在一台包含 4 至 8 块 GPU
的机器之中预定义了并行化算法。也有其他支持并行化的库,但它们不是慢(比如 2x-3x 的 TensorFlow)就是难于用于多 GPU
(Theano),或者兼而有之。
如果你重视并行,我建议你使用 Pytorch 或 CNTK。
使用多 GPU 而无并行
使用多 GPU 的另外一个好处是:即使没有并行算法,你也可以分别在每个 GPU
上运行多个算法或实验。速度没有变快,但是你能一次性通过使用不同算法或参数得到更多关于性能信息。如果你的主要目标是尽快获得深度学习经验,这是非常有用的,而且对于想同时尝试新算法不同版本的研究人员来说,这也非常有用。
如果你想要学习深度学习,这也具有心理上的重要性。执行任务的间隔以及得到反馈信息的时间越短,大脑越能将相关记忆片段整合成连贯画面。如果你在小数据集上使用独立的
训练两个卷积网络,你就能更快地知道什么对于性能优良来说是重要的;你将更容易地检测到交叉验证误差中的模式并正确地解释它们。你也会发现暗示需要添加、移除或调整哪些参数与层的模式。
所以总体而言,几乎对于所有任务来说,一个 GPU 已经足够了,但是加速深度学习模型,多个 GPU 会变得越来越重要。如果你想快速学习深度学习,多个廉价的
GPU 也很好。我个人宁愿使用多个小的 GPU,而不是一个大的 GPU,即使是出于研究实验的没目的。
那么,我该选择哪类加速器呢?英伟达 GPU、AMD GUP 还是英特尔的 Xeon Phi?
英伟达的标准库使得在 CUDA 中建立第一个深度学习库很容易,但没有适合 AMD 的 OpenCL 那样强大的标准库。目前还没有适合 AMD
显卡的深度学习库&&所以,只能选择英伟达了。即使未来一些 OpenCL 库可用,我仍会坚持使用英伟达:因为对于 CUDA 来说,GPU 计算或者 GPGPU
社区是很大的,对于 OpenCL 来说,则相对较小。因此,在 CUDA 社区,有现成的好的开源解决方案和为编程提供可靠建议。
此外,英伟达现在为深度学习赌上一切,即使深度学习还只是处于婴儿期。押注获得了回报。尽管现在其他公司也往深度学习投入了钱和精力,但由于开始的晚,目前依然很落后。目前,除了
NVIDIA-CUDA,其他任何用于深度学习的软硬结合的选择都会让你受挫。
至于英特尔的 Xeon Phi,广告宣称你能够使用标准 C 代码,还能将代码轻松转换成加速过的 Xeon Phi
代码。听起来很有趣,因为你可能认为可以依靠庞大的 C 代码资源。但事实上,其只支持非常一小部分 C 代码,因此,这一功能并不真正有用,大部分 C
运行起来会很慢。
我曾研究过 500 多个 Xeon Phi 集群,遭遇了无止尽的挫折。我不能运行我的单元测试(unit test),因为 Xeon Phi 的
MKL(数学核心函数库)并不兼容 NumPy;我不得不重写大部分代码,因为英特尔 Xeon Phi 编译器无法让模板做出适当约简。例如,switch
语句,我不得不改变我的 C 接口,因为英特尔 Xeon Phi 编译器不支持 C++ 11
的一些特性。这一切迫使你在没有单元测试的情况下来执行代码的重构,实在让人沮丧。这花了很长时间。真是地狱啊。
随后,执行我的代码时,一切都运行得很慢。是有 bug(?)或者仅仅是线程调度器(thread
scheduler)里的问题?如果作为运行基础的向量大小连续变化,哪个问题会影响性能表现?比如,如果你有大小不同的全连接层,或者 dropout 层,Xeon
Phi 会比 CPU 还慢。我在一个独立的矩阵乘法(matrix-matrix
multiplication)实例中复制了这一行为,并把它发给了英特尔,但从没收到回信。所以,如果你想做深度学习,远离 Xeon Phi!
给定预算下的最快 GPU
你的第一个问题也许是:用于深度学习的快速 GPU 性能的最重要特征是什么?是 cuda 内核、时钟速度还是 RAM 的大小?
以上都不是。最重要的特征是内存带宽。
简言之,GPU 通过牺牲内存访问时间(延迟)而优化了内存带宽; 而 CPU 的设计恰恰相反。如果只占用了少量内存,例如几个数相乘(3*6*9),CPU
可以做快速计算,但是,对于像矩阵相乘(A*B*C)这样占用大量内存的操作,CPU 运行很慢。由于其内存带宽,GPU 擅长处理占用大量内存的问题。当然 GPU 和
CPU 之间还存在其他更复杂的差异。
如果你想购买一个快速 GPU,第一等重要的就是看看它的带宽。
根据内存带宽评估 GPU
随着时间的推移,比较 CPU 以及 GPU 的带宽。为什么 GPU 计算速度会比 CPU 快?主要原因之一就是带宽。
带宽可直接在一个架构内进行比较,例如, 比较 Pascal 显卡 GTX 1080 与 GTX 1070
的性能;也可通过只查看其内存带宽而直接比较。例如,GTX GB/s) 大约比 GTX
GB/s) 快 25%。然而,
在多个架构之间,例如 Pascal 对于 Maxwell 就像 GTX 1080 对于 GTX Titan X
一样,不能进行直接比较,因为加工过程不同的架构使用了不同的给定内存带宽。这一切看起来有点狡猾,但是,只看总带宽就可对 GPU
的大致速度有一个很好的全局了解。在给定预算的情况下选择一块最快的 GPU,你可以使用这一维基百科页面(List of Nvidia graphics
processing units),查看 GB/s 中的带宽;对于更新的显卡(900 和 1000
系列)来说,列表中的价格相当精确,但是,老旧的显卡相比于列举的价格会便宜很多,尤其是在 eBay 上购买这些显卡时。例如,一个普通的 GTX Titan X 在
eBay 上的价格大约是 550 美元。
然而,另一个需要考虑的重要因素是,并非所有架构都与 cuDNN 兼容。由于几乎所有的深度学习库都使用 cuDNN 做卷积运算,这就限制了对于 Kepler
GPU 或更好 GPU 的选择,即 GTX 600 系列或以上版本。最主要的是 Kepler GPU 通常会很慢。因此这意味着你应该选择 900 或 1000
系列 GPU 来获得好的性能。
为了大致搞清楚深度学习任务中的显卡性能比较情况,我创建了一个简单的 GPU 等价表。如何阅读它呢?例如,GTX 980 的速度相当于 0.35 个
Titan X Pascal,或是 Titan X Pascal 的速度几乎三倍快于 GTX 980。
请注意我没有所有这些显卡,也没有在所有这些显卡上跑过深度学习基准。这些对比源于显卡规格以及计算基准(有些加密货币挖掘任务需要比肩深度学习的计算能力)的比较。因此只是粗略的比较。真实数字会有点区别,但是一般说来,误差会是最小的,显卡的排序也没问题。
也请注意,没有充分利用 GPU 的小型网络会让更大 GPU 看起来不那么帅。比如,一个 GTX 1080 Ti 上的小型 LSTM(128
个隐藏单元;batch 大小大于 64)不会比在 GTX 1070 上运行速度明显快很多。为了实现表格中的性能差异,你需要运行更大的网络,比如 带有 1024
个隐藏单元(而且 batch 大小大于 64)的 LSTM。当选择适合自己的 GPU 时,记住这一点很重要。
粗略的比较用于大型深度学习网络 的 GPU 性能。
总的来说,我会推荐 GTX 1080 Ti 或者 GTX 1070。它们都是优秀的显卡,如果你有钱买得起 GTX 1080 Ti 那么就入手吧。GTX
1070 更加便宜点,但是仍然比普通的 GTX Titan X (Maxwell) 要快一些。较之 GTX 980 Ti,这两者都是更佳选择,考虑到增加的 11
G 以及 8G 的内存(而不是 6G)。
8G 的内存看起来有点小,但是对于许多任务来说,绰绰有余。比如,Kaggle
比赛,很多图像数据集、深度风格以及自然语言理解任务上,你遇到的麻烦会少很多。
GTX 1060 是最好的入门 GPU,如果你是首次尝试深度学习或者有时想要使用它来参加 Kaggle 比赛。我不会推荐 GTX 1060 带有 3G
内存的变体产品,既然其他 6G 内存产品的能力已经十分有限了。不过,对于很多应用来说,6G 内存足够了。GTX 1060 要比普通版本的 Titan X
慢一些,但是,在性能和价格方面(eBay 上)都可比肩 GTX980。
如果要说物有所值呢,10 系列设计真的很赞。GTX 1060、GTX 1070 和 GTX 1080 Ti 上都很出色。GTX 1060
适合初学者,GTX 1070 是某些产业和研究部门以及创业公司的好选择,GTX 1080 Ti 通杀高端选择。
一般说来,我不会推荐英伟达 Titan X (Pascal),就其性能而言,价格死贵了。继续使用 GTX 1080 Ti 吧。不过,英伟达 Titan X
(Pascal) 在计算机视觉研究人员当中,还是有它的地位的,这些研究人员通常要研究大型数据集或者视频集。在这些领域里,每 1G 内存都不会浪费,英伟达
Titan X 比 GTX 1080 Ti 多 1G 的内存也会带来更多的处理优势。不过,就物有所值而言,这里推荐 eBay 上的 GTX Titan
X(Maxwell)&&有点慢,不过 12G 的内存哦。
不过,绝大多数研究人员使用 GTX 1080 Ti 就可以了。对于绝大多数研究和应用来说,额外 1G 内存其实是不必要的。
我个人会使用多个 GTX 1070
进行研究。我宁可多跑几个测试,哪怕速度比仅跑一个测试(这样速度会快些)慢一些。在自然语言处理任务中,内存限制并不像计算机视觉研究中那么明显。因此,GTX
1070 就够用了。我的研究任务以及运行实验的方式决定了最适合我的选择就是 GTX 1070。
当你挑选自己的 GPU 时,也应该如法炮制,进行甄选。考虑你的任务以及运行实验的方式,然后找个满足所有这些需求的 GPU。
现在,对于那些手头很紧又要买 GPU 的人来说,选择更少了。AWS 的 GPU 实例很贵而且现在也慢,不再是一个好的选择,如果你的预算很少的话。我不推荐
GTX 970,因为速度慢还死贵,即使在 eBay 上入二手(150 刀),而且还有存储及显卡启动问题。相反,多弄点钱买一个 GTX
1060,速度会快得多,存储也更大,还没有这方面的问题。如果你只是买不起 GTX 1060,我推荐 4GB RAM 的 GTX 1050 Ti。4GB
会有限,但是你可以玩转深度学习了,如果你调一下模型,就能获得良好的性能。GTX 1050 适合绝大多数 kaggle
竞赛,尽管可能会在一些比赛中限制你的竞争力。
亚马逊网络服务(AWS)中的 GPU 实例
在这篇博文的前一个版本中,我推荐了 AWS GPU 的现货实例,但现在我不会再推荐它了。目前 AWS 上的 GPU 相当慢(一个 GTX 1080
的速度是 AWS GPU 的 4 倍)并且其价格在过去的几个月里急剧上升。现在看起来购买自己的 GPU 又似乎更为明智了。
运用这篇文章里的所有信息,你应该能通过平衡内存大小的需要、带宽速度 GB/s 以及 GPU 的价格来找到合适的 GPU
了,这些推理在未来许多年中都会是可靠的。但是,现在我所推荐的是 GTX 1080 Ti 或 GTX
1070,只要价格可以接受就行;如果你刚开始涉足深度学习或者手头紧,那么 GTX 1060 或许适合你。如果你的钱不多,就买 GTX 1050 Ti
吧;如果你是一位计算机视觉研究人员,或许该入手 Titan X Pascal(或者就用现有的 GTX Titan Xs)。
总结性建议
总的说来最好的 GPU:Titan X Pascal 以及 GTX 1080 Ti
有成本效益但价格高的:GTX 1080 Ti, GTX 1070
有成本效益而且便宜:GTX 1060
用来处理大于 250G 数据集:常规 GTX Titan X 或者 Titan X Pascal
我钱不多:GTX 1060
我几乎没钱:GTX 1050 Ti
我参加 Kaggle 比赛: 用于任何常规比赛,GTX 1060 , 如果是深度学习比赛,GTX 1080Ti
我是一名有竞争力的计算机视觉研究人员: Titan X Pascal 或常规 GTX Titan X
我是一名研究人员:GTX 1080 Ti. 有些情况下,比如自然语言处理任务,GTX 1070 或许是可靠的选择&&看一下你当前模型的存储要求。
想建立一个 GPU
集群:这真的很复杂,你可以从这里得到一些思路://how-to-build-and-use-a-multi-gpu-system-for-deep-learning/
我刚开始进行深度学习,并且我是认真的:开始用 GTX 1060。根据你下一步的情况(创业?Kaggle 比赛?研究还是应用深度学习)卖掉你的 GTX
1060 然后买更适合使用目的的。
原文地址://which-gpu-for-deep-learning/
【本文是51CTO专栏机构机器之心的原创译文,微信公众号&机器之心( id: almosthuman2014)&】
【编辑推荐】
【责任编辑: TEL:(010)】
大家都在看猜你喜欢
头条热点头条热点头条
24H热文一周话题本月最赞
讲师:0人学习过
讲师:0人学习过
讲师:0人学习过
精选博文论坛热帖下载排行
本书采用“如何解决问题”的方式阐述Ruby编程,涵盖了以下内容:Ruby术语和基本原理;数字、字符串等低级数据类型的操作;正则表达式;国际...
订阅51CTO邮刊—为你的深度学习任务挑选最合适GPU
我的图书馆
—为你的深度学习任务挑选最合适GPU
查看原图拥有一个快速的 GPU 对深度学习的初学者来说是非常重要的,因为它可以使你迅速获得有助于构建专业知识的实践经验。本文为你的深度学习任务挑选最合适GPU,提供从性能到价格的全方位指南本文作者 Tim Dettmers 是瑞士卢加诺大学信息学硕士,热衷于开发自己的 GPU 集群和算法来加速深度学习。本文的最早版本发布于 2014 年 8 月,之后随着相关技术的发展和硬件的更新,Dettmers 也在不断对本文进行修正,截至目前已经进行了 5 次较大的更新。机器之心今天呈现的这篇是其 2016 年 6 月 25 日的最新更新:「重新编辑了多 GPU 部分;因为不再有重大作用,去掉了简单的神经网络内存部分;扩展了卷积内存部分;对 AWS 部分进行了删节,因为不再有实效;增加了我对 Xeon Phi 的看法;更新了 GTX 1000 系列。」而除了 GPU 之外,深度学习还需要其它一些硬件基础,详情可参阅机器之心之前的文章《深度 | 史上最全面的深度学习硬件指南》。当你在深度学习中使用 GPU 时,你会一次又一次地为它带来的速度提升而感到惊叹:在一般问题中能获得相对于 CPU 快 5 倍的速度提升,在一些更大的问题中还能获得相对快 10 倍的速度提升。在 GPU 的帮助下,你可以更快地试验新的想法、算法和实验,并迅速得到反馈——哪些是可行的、哪些是不可行的。如果你对深度学习是认真的,那么你一定要使用 GPU。但是,你应该选择哪一种呢?在这篇博客中我将指导你选择一款最适合你的 GPU。拥有一个快速的 GPU 对深度学习的初学者来说是非常重要的,因为它可以使你迅速获得有助于构建专业知识的实践经验,这些专业知识可以帮助你将深度学习应用到新问题上。没有这种迅速的反馈,从错误中汲取经验将会花费太多时间,会使人在继续深度学习的过程中感到受挫和沮丧。在 GPU 的帮助下,我很快就学会了如何在一系列 Kaggle 竞赛中应用深度学习,并且在 Partly Sunny with a Chance of Hashtags Kaggle 竞赛上获得了第二名,竞赛内容是通过一个给定的 Twitter 预测气象等级。比赛中,我使用了一个相当大的带有修正线性单元(rectified linear units)和 dropout 的两层深度神经网络进行正则化(regularization),而且勉强才能塞进我的6GB GPU 内存里。应该使用多个 GPU 吗?在 GPU 的帮助下,深度学习可以完成很多事情,这让我感到兴奋。我投入了到多 GPU 的领域之中,用 InfiniBand 40Gbit/s 的互连组装了小型 GPU 集群。我非常激动地想了解多个 GPU 能否获得更好的结果。我很快就发现,在多个 GPU 上,不仅神经网络难以进行有效的并行化,对普通的密集神经网络加速效果也很一般。小型神经网络可以并行并且有效地利用数据并行性,但对于大一点的神经网络,例如我在 Partly Sunny with a Chance of Hashtags Kaggle比赛中使用的,就几乎没有加速效果。随后,我进一步试验,对比 32 位的方法,我开发了带有模型并行性的新型的 8 位压缩技术,该技术能更有效地并行处理密集或全连接的神经网络层。然而,并行化失败了。我天真地为一系列问题对并行算法进行了优化,但只发现即使有优化过的自定义代码,它的效果也并不好——考虑到你所付出的努力。你需要非常了解你的硬件及其与深度学习算法交互的方式,这样你一开始就能衡量你是否可以受益于并行化。查看原图我的电脑主机配置:你可以看到三个 GXT Titan 和一个 InfiniBand 卡。对于深度学习来说,这是一个好的配置吗?然而,在并行化上还有一些不那么专业的问题。例如,卷积层很容易并行化和很好地扩展。很多框架也支持这种并行性;对大多数框架来说(比如 TensorFlow、Caffe、Theano 和 Torch),如果你使用 4 个 GPU,通常会加速约 2.5-3 倍;而对于优化过的研究代码,大约会有 3.6-3.8 倍的加速。微软的 CNTK 拥有最好的并行化性能,其与研究代码相近。CNTK 有一个缺点:它目前非常难使用,因为其使用了配置文件(config files),而非库 API。目前我在微软研究院做实习生,我将致力于 CNTK,我可以告诉您,API 与并行性能都将会获得显著的提升。这些变化使得在多 GPU 和多计算机下的并行化可以达到使普通用户能很容易受益于不同类型深度学习模型的快速训练的程度,无论是卷积网络、循环网络、还是全连接网络。使用多 GPU 的另外一个好处是你可以分别在每个 GPU 上运行多个算法或实验。其速度没有变快,但你能一次性通过使用不同的算法或参数得到更多性能信息。如果你的主要目标是尽快获得深度学习经验,这是非常有用的,而且它对想同时测试新算法的不同版本的研究者也非常有用。如果你想要学习深度学习,这对你的心理是很重要的。执行任务的间隔以及得到反馈信息的时间越短,大脑越能将相关的记忆片段整合成连贯的画面。如果你在小数据集上使用独立的 GPU 训练两个卷积网络,你就能更快地知道什么对于性能优良来说是重要的;你将更容易地检测到在交叉验证误差的模式,并正确地解释它们——即对于哪些你需要调整的模式,你需要添加、移除或调整哪些参数与层。所以总的来说,一个 GPU 对所有任务来说就已经足够了,但多个 GPU 对于加速你的深度学习模型来说越来越重要。如果你想快速学习深度学习,多个廉价的 GPU 也很好。应该使用哪种加速器呢?NVIDIA、AMD、或 Xeon Phi?NVIDIA 的标准库使得在 CUDA 中建立第一个深度学习库很容易,但没有适合 AMD的 OpenCL 的那样强大的标准库。目前还没有适合 AMD 显卡的深度学习库——所以只能选择 NVIDIA 了。即使未来一些 OpenCL 库可用,我仍会坚持使用 NVIDIA:因为对于 CUDA 来说,GPU 计算或者 GPGPU 社区是很大的,而对于 OpenCL 来说则较小。因此,在 CUDA 社区,好的开源解决方案和为编程提供可靠的建议是现成的。此外,NVIDIA 公司现在对深度学习抱有很大信心。他们押注深度学习在未来十年会发展壮大,但你在 AMD 公司身上就看不到这样的信心。至于 Xeon Phi,其广告宣称你能够使用标准的 C 代码,并可将代码轻松转换成加速过的 Xeon Phi 代码。该功能听起来很有趣,因为你可能认为你可以依靠庞大的 C 代码资源。然而,事实上,其只支持非常小部分的 C 代码,因此该功能并不真正有用,大部分的 C 运行起来是很缓慢的。我曾研究过超过 500 个 Xeon Phi 的集群,遭遇了无止尽的挫折。我不能运行我的单元测试(unit test),因为 Xeon Phi的 MKL(数学核心函数库)并不兼容 NumPy;我不得不重写大部分代码,因为英特尔 Xeon Phi 编译器无法让模板做出适当约简。例如,switch 语句,我不得不改变我的 C 接口,因为英特尔编译器不支持 C++ 11的一些特性。这一切导致了在没有单元测试的情况下来执行代码的重构。它花了很长时间。这真是地狱啊。随后当我的代码被执行时,一切都运行得很慢。如果你的操作的张量(tensor)的尺寸连续变化,线程调度器(thread scheduler)中的漏洞或问题会削弱性能。例如,如果你有不同大小的全连接层或 dropout 层,Xeon Phi 会比 CPU 还慢。所以,如果你想做深度学习,远离 Xeon Phi!了解卷积神经网络的基本内存需求当你在选择合适的 GPU 时,你得知道自己使用深度学习所要解决的问题需要多大的内存。因此接下来的两段文字会探讨卷积神经网络的内存消耗,让你可以确保自己的 GPU 有足够满足需要的内存,但又不会太多,这样能节省点钱。卷积神经网络的内存需求非常不同于简单的神经网络。你可能会认为前者的参数更少因此需要更少内存。如果只是保存网络文件,这没什么不对,但要想训练它的话情况就不同了。每个卷积层的激活(activation)和误差(error)相较于简单的神经网络来说都是巨大的,而正是它们占用了内存的主要部分。将激活和误差的大小加起来,我们就可以确定出大概的内存需求。然而要确定网络中哪种状态下激活和误差的尺寸大小是很难的。一般来说,前几层网络会占用很多内存,所以主要内存需求就来源于你的输入数据大小,因此可以率先考虑你的输入数据。通常 ImageNet 使用的输入维度(input dimensions)是224×224×3,即 224×224 像素的 3 色信道图片。要在 ImageNet 上得到当下最先进的结果至少需要 12GB 内存,而在一个 112×112×3 维的类似数据集上我们可能只需 4-6 GB 内存。另一方面,对于一个输入尺寸为 25×75×75×3 的视频数据集来说,12GB 内存可能远给不了你想要的好效果。然而另一个重要方面就是数据集中的样本数量。比如你只取了 ImageNet 数据集图像中 10% 的样本,然后你的模型很快就会过拟合(只是没有足够多的样本来很好地训练),因此你那个消耗远远更少内存的小网络将足以与卷积网的性能媲美,所以 4GB 左右或更少的内存对于这项任务来说都绰绰有余。这就意味着图像越少,反过来所需内存就越少。标签的分类数量也是同样的道理。如果你从 ImageNet 数据集中只选取了 2 个分类来建立模型,那么相较于拥有 1000 个分类的模型,它将消耗更少的内存。这就是这样:如果你有更少的需要彼此区分的分类,那么过拟合就会出现得快得多,或者换句话说,相比于区分 1000 个分类,区分 2 个分类所需的参数要少得多。有关这些准则的一个实际例子是 Kaggle 的浮游生物检测比赛。起初我认为,用自己的 4 GPU 系统来参加比赛可能会有巨大优势。我以为自己或许能够在很短时间内训练出一个庞大的卷积网络——还有一点就是别人都缺少这样的硬件。然而由于数据集过小(50×50 像素,双色信道,40 万张训练图像;大约 100 个分类),我很快意识到即使对于一个大小刚好够放入一个训练很快的小 GPU 的小网络来说,过拟合也是一个问题。所以多个 GPU 并没有多少速度方面的优势,而大 GPU 内存更没有任何优势可言。因此对于这种任务,一个4-6 GB 内存的小 GPU 就足以达到很好的效果。虽然此例中我的内存是足够的,但你最终会遇到内存不足的情况。然而你并不需要为这个问题而买一个新 GPU,可能只需使用一个简单的内存减小技术(memory reduction technique)。内存减小技术及其效果一种方法是使用更大步态(strides )的卷积核(convolutional kernels),也就是不对每个像素都应用批形式的(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 位,你就可以轻松减半内存消耗且不会降低分类性能。将它运用在 P100 Tesla 卡中,这甚至能给你带来巨大的提速。那么将这些内存减小技术应用在实际数据中会怎样?如果我们采用 128 大小的批,3 色通道的 250×250 像素图片(250×250×3)做为输入,3×3 卷积核增长步长为32,64,96…,则我们将有大致如下、仅包含误差及激活的内存占用情况:92MB→1906MB→3720MB-&5444MB-&…此时内存将很快被挤爆。如果现在我们使用 16 位而非 32 位的数据类型,上面的数字就可降为一半;64 大小的批同理。同时使用 64 大小的批及 16 位的数据类型将使内存占用减为原先的四分之一。然而我们仍然会需要大量内存来训练一个更多层的深度网络。如果我们为第一层数据加 2 个步态则会带来哪些改变——后面跟着一个 2×2 的最大池化( max pooling)?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 非常适合深度学习?」链接:/Why-are-GPUs-well-suited-to-deep-learning/answer/Tim-Dettmers-1查看原图CPU 和 GPU 随时间变化的带宽比较:带宽是 GPU 比 CPU 的计算速度更快的主要原因之一。带宽可直接在同一架构内进行比较,例如直接查看两张 Pascal 卡(如 GTX 1080 与 GTX 1070 )的内存带宽来比较其性能。然而不同架构之间不能直接比较,像是 Pascal 的 GTX 1080 与 Maxwell 的 GTX Titan X,因为各自给定的内存带宽架构是非常不同的。这使得一切都有点棘手,但总的说来带宽能给你一个有关 GPU 大致运行速度的良好概述。要确定一个给定预算下的最快 GPU 类型,可以使用这篇维基百科中的内容(http://en.wikipedia.org/wiki/List_of_Nvidia_graphics_processing_units#GeForce_700_Series),看一下它的带宽是多少 GB/s;其中列出的较新款显卡价格是相当准确的(900 和 1000 系列),但是旧款卡价格明显低于列表中的价格——尤其当你通过 eBay 网购时。比如一张正版 GTX Titan 在 eBay 上卖 $350 左右、 GTX 970 卖 $210。然而另一个需要考虑的因素是,并非所有架构都与 cuDNN 兼容。由于几乎所有的深度学习库都使用 cuDNN 做卷积运算,这就限制了对于 Kepler &GPU 或更好 GPU 的选择,即 GTX 600 系列或以上版本。另外 Kepler &GPU 通常会很慢。因此这就意味着你应该选择 900 或 1000 系列 GPU 来获得更好的性能。为了粗略估计出深度学习任务中的显卡性能比较,我创建了一个简单的GPU等价表。如何阅读它呢?例如 GTX 980 的速度相当于 0.45 个 GTX 1080,或是 GTX 1080 的速度是 GTX 980 的两倍以上。GTX 1080 = 0.8 GTX 1070 = 0.66 GTX Titan X = 0.66 GTX 980 Ti = 0.45 GTX 980GTX 1080 = 0.4 GTX 970 = 0.33 GTX Titan = 0.2 AWS GPU instance (g2.2 and g2.8) = 0.2 GTX 960通常我会推荐 GTX 1080 或 GTX 1070。二者都很卓越,如果你能承受 GTX 1080 的价格当然更好。GTX 1070 更便宜些且速度仍比 GTX Titan X 快。然而这两个卡的问题是它们的8GB内存。这个内存容量对于大多数任务来说是相当充足的,比如 Kaggle 竞赛、大多数的数据集、深度且自然的语言理解任务。但是对研究人员而言,尤其是 ImageNet 的研究者,在处理拥有庞大背景资料的视频数据或自然语言理解任务时,选择 12GB 内存的 GTX Titan X 会更好——这里内存就尤为重要。如果你缺钱的话就没有任何办法了。亚马逊网页服务上的 GPU 实例是相当昂贵且龟速的,没钱就买不到好东西。你可以到 eBay 上以 $210 买一个过得去的 GTX 970,但也有一些与此相关的内存问题(见下文)。另一个选择是从 eBay 购买正版 GTX Titan;不过 $350 也已经相当贵了。GTX 680 和 GTX 960 也是较为便宜的选择,它们通常在 $200 以下,但是相较于其他更成熟的 GPU 则是相当慢。廉价而困扰GTX 970 是一个你需要留意的特例,其架构较为怪异,内存使用超过 3.5GB 时性能可能会被削弱,因此对于大的卷积神经网络的训练就很麻烦。这个问题在新闻报道中已经相当戏剧化地变多了起来,但事实证明整个问题对于深度学习来说并不像原始基准表现的那样戏剧化:如果不超过 3.75GB,它仍然比 GTX 960 要快。不管怎样 GTX 970 是一款用来学习深度学习的优秀 GPU。它还适合于大多数未涉及太多数据的 Kaggle 数据集。如果你不想要所有这些麻烦,那么就去 eBay 购买一个不会造成麻烦的正版 GTX Titan 或者一个便宜的 4GB GTX 960。亚马逊网络服务(AWS)中的 GPU 实例在这篇博文的前一个版本中,我推荐了 AWS GPU 的现货实例,但现在我不会再推荐它了。目前 AWS 上的 GPU 相当慢(一个 GTX 1080 的速度是 AWS GPU 的五倍)并且其价格在过去的几个月里急剧上升。现在看起来购买自己的 GPU 又似乎更为明智了。总结运用这篇文章里的所有信息,你应该能通过平衡内存大小的需要、带宽速度GB/s以及 GPU 的价格来找到合适的 GPU 了,这些推理在未来许多年中都会是可靠的。但现在我所推荐的是 GTX 1080 或 GTX 1070,只要价格可以接受就行;而如果你是一位研究人员,或许会想要一个 GTX TITAN X。如果你缺少硬件投资资金并且可以接受一定的内存限制,那么 GTX 970 对于中等大小及以下的数据集来说就是个可靠的选择。如果想减少麻烦,一个eBay 上的正版 GTX Titan 将是极好的。GTX 680 和 GTX 960 最便宜,同时也是最慢的GPU。如果你真的很缺钱,目前尚没有其他好的选项。总结性建议总的说来最好的 GPU:GTX 1080 和 GTX Titan X有成本效益但价格高的:eBay 上的 GTX Titan X , GTX 1070有成本效益但麻烦多的:GTX 970(有内存问题)最便宜的卡片而且没有麻烦:eBay 上正规的 GTX Titan我的数据集大于 250GB:GTX Titan我钱不多:eBay上的 GTX 680 4GB & 或者 GTX 960 4GB我几乎没钱:尚待解决;深度学习是为壕准备的我参加 Kaggle 比赛:GTX 1070 或者 GTX 970我是一名研究人员:至少需要一个 GTX TITAN X 和 1-4 GTX 1080 来做原型我想建立一个 GPU 集群:这真的很复杂,你可以从这里得到一些思路://how-to-build-and-use-a-multi-gpu-system-for-deep-learning/我刚开始进行深度学习,并且我是认真的:以 eBay 上的 GTX 970 开始对小数据集上的深度学习有个大致感受;如果你想参加 Kaggle 比赛或进行正规深度学习,就把 GTX 970 卖了并升级到 GTX 1080 ;如果你想做研究的话,就升级为 GTX Titan X。
TA的推荐TA的最新馆藏[转]&[转]&
喜欢该文的人也喜欢}

我要回帖

更多关于 asco电磁阀选型样本 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信