完全硬件指南:教你 DIY 一套自己的深度学习机器
编者按:在各大技术公司纷纷开源框架的背景下,人工智能日益成为普通开发者也能折腾的东西。当然,要想自己也能玩玩人工智能,你需要一套合适的硬件。如何才能搭建一套合适的人工智能,尤其是当今最火的深度学习的硬件呢?为了帮助大家避免一些硬件配置的坑,深度学习的资深玩家Tim Dettmers将自己的经验教训总结成了这篇深度学习的 完全硬件指南,供各位玩家参考。
深度学习是一项非常耗算力的工作,所以你得有一个带很多内核的CPU,对吧?或者买高速CPU也许是浪费?在开发深度学习系统的时候,你能够做的最糟糕的事情之一就是在不必要的硬件上浪费钱。以下我将一步步地引导你了解搭建一套廉价的高性能系统所需的硬件。
这些年来,我总共搭建了7台不同的深度学习工作站。虽然进行了精心的研究和论证,但我在选择硬件部件方面还是犯了不少错误。在本篇指南中,我希望分享一下我在这些年学到的经验,以便你不再犯我犯过的那些错误。
本文将按照错误的严重程度来排序。这意味着通常最浪费钱的错误排在前面。
GPU图形处理器
本文假设你使用GPU来做深度学习。如果你正在为深度学习搭建或者升级系统的话,省掉GPU是不明智的做法。GPU是深度学习应用的核心——它对处理速度的改进实在是太大了,容不得无视它的存在。
我之前在GPU推荐的博文中已经详细讨论过GPU的选择,挑选GPU大概是你做深度学习系统最关键的选择了。在选择GPU时你可能会犯额错误主要有3个:(1)糟糕的性价比,(2)内存不足,(3)冷却不好。
要想有好的性价比,我一般建议用RTX 2070或者 RTX 2080 Ti。如果你用这些板卡你得用16位的型号。否则的话,去eBay淘GTX 1070、GTX 1080、GTX 1070 Ti是不错的选择,这些GPU你可以用于32位(但不是16位)。
选择GPU的时候要当心内存需求。在内存相同的情况系,与GTX板卡相比,可以跑16位的RTX板卡能训练的模型规模可以是前者的2倍。而且此类RTX板卡还有内存优势,选择RTX板卡并学习如何有效地使用16位模型能带你走很远的路。一般而言,对内存的需求大概是这样的:
-
追求最高水准的研究:>=11 GB
-
探索有趣架构的研究:>=8 GB
-
任何其他研究:8 GB
-
Kaggle竞赛:4 – 8 GB
-
初创企业:8 GB(不过要根据特定应用领域情况来确定模型规模)
-
公司: 8GB用于原型开发, >=11 GB用于训练
冷却是要留意的另一个问题,尤其是如果你买多块RTX板卡的话。如果你想把GPU插在相互挨在一起的PCIe槽的话,你的确保自己的GPU有一块风力强劲的风扇。否则的话你可能就要遇到温度问题,然后你的GPU就会变慢(约30%)并且死得更快。
排成一排的嫌疑犯
RAM
你认得出哪个硬件部件要对性能糟糕负责任吗?或者也许是CPU的错?RAM的主要错误是买时钟频率太高的RAM。第二个错误是买的RAM不足,没法获得流畅的原型体验。
所需的RAM时钟频率
RAM时钟频率是内存公司推销的噱头,引诱你买“更快”的RAM其实得到的性能好处寥寥。最好的解释可以看看Linus Tech Tips的视频《RAM速度真的重要吗?》
此外,重要的一点是要知道RAM速度对于更快的CPU RAM->GPU RAM传输来说并不相干。这是因为(1)如果你用的是固定内存,你的小批量(mini-batches)数据会在不需要CPU参与的情况下传输给GPU,以及(2)如果你不用固定内存,那么用高频内存和低频内存的性能差别大概在0-3%之间——所以还是把你的钱花在其他地方吧!
RAM大小
RAM大小并不影响深度学习的性能。然而,它有可能妨碍你舒服地执行你的GPU代码(不需要交换到硬盘去)。为了舒服地使用GPU,你应该要有足够的RAM。这意味着你至少应该有匹配最大GPU的RAM容量。比方说,如果你有一块代24GB内存的Titan RTX,那你至少应该有24 GB的RAM。然而,如果你的GPU不止一块的话,你不需要有更多的RAM。
“RAM匹配最大的GPU内存”这条策略的问题是,如果你处理的是大型数据集的话,你可能仍然会RAM不足。这里的最佳策略是匹配你的GPU,如果你觉得自己的RAM不足的话就多买点。
另一项策略则受心理影响:心理学告诉我们,专注是一种会随着时间流逝而减少的资源。RAM是你可以预留注意力资源给更困难的编程问题的少数硬件之一。如果你有更多RAM的话,就不需要花费大量时间去绕开RAM瓶颈,而是把你的注意力集中在更紧迫的事情上。RAM多的话你就可以避开那些瓶颈,节省时间并提高更迫切问题的生产力。尤其是在Kaggle竞赛上。我发现额外的RAM对于特征工程非常有用。所以如果你有钱并且要做大量的预处理的话,则额外的RAM也许是个好的选择。所以如果采取这项策略的话,你会想马上要更多的廉价RAM而不是等到后面。
CPU
大家犯的主要错误是把太多的注意力放在了CPU的PCIe通道上。你不应该太过关注PCIe通道。相反,只需要看看你的CPU和主板组合是否支持你想要跑的GPU数量即可。第二个最常见的错误是CPU过于强大。
CPU与PCIe(串行总线)
对于PCIe通道大家都疯了!然而,事实上它对深度学习性能几乎毫无影响。如果你有一个GPU,只有在需要迅速将你的数据从CPU RAM传输到GPU RAM时才用到PCIe通道。但是,一批32张的ImageNet图像(32x225x225x3)以及32位模型用16通道需要1.1毫秒,8通道需要2.3毫秒,4通道需要4.5毫秒。这些都是理论数字,实际上你经常会看到PCIe速度要慢一半——但是这仍然是非常快了!PCIe的时延通常是纳秒级的,所以时延可以忽略不计。
那么小批量的32张ImageNet图像和RestNet-152模型的时间窗口是这样的:
-
前向与反向过程:216毫秒
-
16通道PCIe CPU->GPU传输:约2毫秒(1.1毫秒理论值)
-
8通道PCIe CPU->GPU传输:约5毫秒(2.3毫秒理论值)
-
4通道PCIe CPU->GPU传输:约9毫秒(4.5毫秒理论值)
也就是说,从4通道增加到16通道性能提升只有3.2%左右。然而,如果你用的是PyTorch的数据加载器+固定内存的话,性能提升为0%。所以如果你用单GPU的话就不要浪费钱到PCUe通道上了!
当你选择CPU PCIe通道以及主板PCIe通道时,确保你选择的组合支持你想要数量的GPU。如果你买的主板支持2GPU,并且你最终想要两块GPU的话,确保你买的CPU支持2块GPU,但未必需要看PCIe通道的情况。
PCIe通道与多GPU并行
如果你采用数据并行机制利用多个GPU来训练网络的话,PCIe通道重要吗?我曾经在ICLR2016上发表过一篇文章谈这个问题,可以告诉你的是,如果你有96个GPU,那PCIe就真的很重要。然而,如果捏GPU数量在4个及以下的话,那通道就没太大关系。如果你用23个GPU做并行化,我根本就不在意通道的事情。GPU的情况下,我会确保每GPU可得到PCIe通道的支持(总计就是32通道)。既然根据经验法则几乎没人会跑超过4GPU的系统:所以就不要为了争取更多PCIe通道数/GPU多花钱了——因为花了也是白花!
所需CPU内核数
要想对CPU做出明智选择我们首先需要理解CPU以及CPU与深度学习的关系。CPU对深度学习有何贡献呢?当你在GPU上跑深度学习网络时CPU几乎不做什么计算。基本上它(1)发起GPU功能调用,(2)执行CPU功能。
目前为止CPU最有用的应用是数据处理。有两种不同的常见数据处理策略,它们各有不同的CPU需求。
第一种策略是在训练时进行预处理:
循环:
加载小批量数据
预处理小批量数据
训练小批量数据
第二种策略是在进行任何训练前预处理:
-
处理数据
-
循环:
1、加载预处理小批量数据
2、训练小批量数据
对于第一种策略,带多核的好的CPU可显著提升性能。对于第二种策略,你就不需要好的CPU了。对于第一种策略,我建议每GPU最少配置4线程——通常是每GPU 2内核。对此我没有做过严格的硬件测试,但你应该得到每额外内核/GPU 0-5%的性能提升。
对于第二种策略,我建议每GPU最小配置2线程——通常就是每GPU一个内核。如果你采用的是第二种策略并且内核数很多的话在性能方面你不会看到太明显的提升。
所需的时钟频率
大家一想到高速CPU往往首先想到的是时钟频率。4GHz要比3.5GHz好对吧?在比较相同架构(比如英特尔Ivy Bridge)的处理器这个结论一般是对的,但是架构不同的就不好比了。此外,这个也未必都是最好的性能评测指标。
深度学习的情况下CPU完成的计算其实是很少的:一般就是这里增加几个变量,那里计算一下布尔表达式,对GPU或者在程序内进行一些函数调用——这些都要靠CPU的内核时钟频率。
虽说这些理由似乎通情达理,但事实上我在跑深度学习程序时CPU利用率却达到了100%,问题出在哪里呢?我试着对CPU核心时钟频率做了一些降频处理来一探究竟。
MNIST与ImageNet数据集的CPU降频:性能用不同CPU核心时钟频率跑200次MNIST或者50次ImageNet所需时间来衡量,以最快时钟频率所得结果作为每块CPU的基线。比较结果:从GTX 680升到GTX Titan大概有+15%的性能提升;GTX Titan升级到GTX 980又有+20%的提升;对于任何GPU来说GPU超频可带来约+5%的性能提升。
注意,这些实验都是在过时的硬件上进行的,不过,这些结果对于相同的CPU/GPU应该还是一样的。
硬盘/SSD
硬盘通常不是深度学习的瓶颈。不过,如果你干蠢事的话它就会伤害到你:如果你有时候需要从硬盘读取数据(阻塞等待)的话,则一个100MB/s的硬盘会让你付出代价——大小为32的小批量ImageNet数据集就要185毫秒!然而,如果你在使用前采取异步获取数据的话(比如torch vision加载器),尽管这个小批量的加载时间还是185毫秒,但是并不会影响性能,因为大多数ImageNet的深度神经网络计算时间都是200毫秒左右,也就是说上一批计算完时下一次的预加载已经完成了。
不过,出于舒心和生产力的考虑我建议用SSD:这样程序启动和响应会更快,对大文件的预处理也要快一点。如果你买的是NVMe SSD,那么相对于一般SSD体验还会更加流畅。
因此理想的配置是用一块大但慢的硬盘来装数据集,用SSD来改善舒适度和生产力。
电源
一般来说,你当然希望电源可以适应所以将来要用的GPU。GPU的能效通常会逐步变高:所以尽管其他的部件可能需要替换,但电源可以用很久,一次买个好电源是不错的投资。
电源功率要买多大呢?你可以把CPU、GPU所需功率加起来再考虑10%的其他部件开销并作为用电高峰的缓冲。比方说,如果你有4个GPU,每个是250瓦TDP,以及一个150瓦TDP的CPU的话,则对电源的最小需求为4×250 + 150 + 100 = 1250瓦。我通常会再加10%以确保万无一失,这样的话需求就是1375瓦。取整就是1400瓦的电源。
还有重要的一点要注意,有时候即便电源功率足够,但可能它额8针或6针接线不够。确保电源的接线数量足以连上你所有的GPU!
还有一点就是要买高功效的电源——尤其是如果你要跑很多GPU并且跑很久的话。
满功率(1000-1500瓦)跑4GPU的系统来训练卷积神经网络2周需要消耗300-500kWh,德国的电费是20分/kWh,所以大概就是600-100欧元。如果这个价格是针对100%能效的话,用80%能效比电源训练这样一个网络还要额外多18-26欧元!单GPU的就少很多,但道理是一样的——多花点钱到高能效电源上面是有道理的。
没完没了地跑几个GPU会显著增加你的碳排放。如果你想做个负责任的人的话,可以考虑采用碳平衡方案,比如纽约大学的Machine Learning for Language Group (ML2)——实现简单、廉价,应该成为深度学习研究人员的标准。
CPU与GPU制冷
制冷很重要,而且会成为降低性能的重大瓶颈,其影响甚至比糟糕的硬件选择还要大。标准的散热器或者一体式水冷解决方案对你的CPU来说也许就OK了,但是GPU需要特别考虑。
风冷GPU
对于单GPU,或者虽然有多个GPU但间距足够的话(3-4 GPU插槽装2个GPU),风冷安全可靠。不过,这也是你在对3-4个GPU进行冷却可能会犯的最大错误之一,这种情况下你需要仔细考虑你的选项。
跑算法的时候,现代GPU会提高速度——以及能耗——到极限,但只要GPU达到温度阈值(一般是80°),GPU就会降速一面突破温度阈值。这既保证了最佳性能同时又保证了GPU不会过热。
然而,风扇速度典型的预编程调度安排对于深度学习来说设计得都很糟糕,所以这种温度阈值在启动深度学习程序几秒钟之内就达到了。其结果是性能下降(0-10%),如果是多GPU热量相互影响的话会更加显著(10-25%)。
由于英伟达的GPU首先是游戏GPU,所以是针对Windows优化的。用Windows几个点击就能改变风扇转速的调度,但是Linux就没那么简单了,鉴于大多数深度学习库都是针对Linux编写的,这会成为问题。
Linux下的唯一选项是给你的Xorg服务器(Ubuntu)加一个“coolbits”的配置。这个办法对单GPU很有效,但如果你有多个GPU而且有些是无头(headless)的话,比如没有连显示器的话,你就得模拟一个显示器,而这是很麻烦的。我尝试过很久,后来用一张live boot CD弄了几个小时才恢复我的图形设置——我一直都不能让无头GPU正确工作。
如果你用风冷跑3-4个GPU的话,要考虑的最重要的一点是要留意风扇设计。鼓风式设计是将空气从机箱后背排出,让新鲜的更凉快的空气进入GPU。非鼓风式风扇则是吸收GPU附近的空气来冷却GPU。不过,如果你有几个GPU挨着的话,周围就没有冷空气可言了,带非鼓风式风扇的GPU就会越来越热,直到它们自己降速来冷却温度。在3-4GPU的配置下要不惜一切代价避免非鼓风式风扇。
多GPU的水冷
制冷还有个选项,那就是水冷,这个办法更贵,也更讲究技巧。如果你只有单GPU或者双GPU有一定间距的话我不推荐用水冷。不过,水冷可以保证4GPU配置下最强悍的GPU保持凉爽,这是风冷不可能做到的。水冷的另一个优势是静音,如果你的GPU环境是有人工作的话这是个加分项。水冷成本大概是每GPU100美元左右,还有一些额外的预付成本(大概50美元)。水冷还需要费点功夫去组装计算机,但是网上有很多详细指南,所以只需要多几个小时就行。维护不应该那么复杂或者费力。
大机箱制冷?
为了我的深度学习集群,我买来了大机箱,因为GPU区配置了额外的风扇,但我发现这基本上没什么用:大概就降了2-5°,不值得那么大的投资,而且机箱又笨重。最重要的是对GPU直接制冷的解决方案——不要想为了GPU制冷能力而选择昂贵的机箱。买便宜的,机箱应该装得下GPU,仅此而已!
关于制冷的结论
所以说到底很简单:对于单GPU来说风冷是最好额。对于多GPU来说,你应该采用鼓风机式的风冷并且接受一点点的性能下降(10-15%),或者多花点钱搞水冷,性能不会受损,但这个配置起来要难点。在特定情况下风冷、水冷都是合理的选择。不过出于简单性的考虑一般推荐风冷——跑多GPU的话买鼓风式散热的GPU。如果你想用水冷,那就试试GPU一体式水冷解决方案。
主板
你的主板应该有足够的PCIe端口来支持你想跑得到GPU数量(通常限制在4个GPU以内,即便你的PCIe插槽不止);记住,大多数GPU都要占2个PCIe插槽,所以你想用多GPU的话买的主板PCIe插槽间距要足够。确保你的主板不仅有PCIe插槽,也要支持你想跑的GPU设置。如果你上newegg搜索你选的主板然后看看规范页的PCIe板块的话通常会找到信息的。
计算机机箱
当你选择机箱时,应该要确保它支持标准长度的GPU。大多数机箱都支持标准长度GPU,不过如果你买的是小机箱的话你应该保持警惕。要看看它的尺寸和规范;你还可以试试Google图像搜索一下那个型号,看看能否在结果中找到带GPU的图片。
如果你用定制的水冷系统,确保你的机箱又足够空间留给冷却水箱。尤其是如果你用水冷来给GPU散热的话。每个GPU的冷却水箱都需要一些空间——确保你的配置能放得进去。
显示器
我一开始也觉得写显示器是很蠢的,但其实有没有显示器大不一样,其重要性足以需要写一写。
我在3个显示器上面花的钱也许是我最划算的一笔投资了。在使用多显示器时我的生产力提高了很多,如果我只有一个显示器的话我会觉得像残废了一样的。如果你不能以高效的方式操作的话,深度学习系统快又有何用呢?
我做深度学习时的典型布局:左:文字工作,Google搜索,gmail,stackoverflow;中:编码;右:输出窗口, R文件夹,系统监控,GPU监控,待办事宜,其他小应用。
搭建PC的一些建议
很多人害怕自己组装计算机。硬件部件很贵,你又不想做错事情。但其实是很简单的,因为组件相互之间并没有捆绑关系。主板手册通常对如何组装一切都有详细的说明,网上也有大量的指导和步骤演示,就算你没有经验也能完成整个过程。
组装计算机的好处是,装过一次之后你就了解了组装计算机需要了解的一切,因为所有的计算机组装原理都是一样的——所以组装一台计算机会成为一项你可以不断运用的生活技能。所以没理由退缩!
结论/摘要
GPU:RTX 2070 或者RTX 2080 Ti。淘二手的 GTX 1070、 GTX 1080、 GTX 1070 Ti以及GTX 1080 Ti也不错!
CPU:视处理数据方式而定,每GPU 1-2核。> 2GHz;CPU应该支持你想跑的GPU数量。PCIe通道不影响。
内存:
—时钟频率不影响——买最便宜的RAM。
—至少买跟最大的GPU RAM匹配的CPU RAM。
—只有在需要的适合才多买RAM。
—更多的RAM可能有用,如果你频繁操作大数据集的话。
硬盘/SSD:
—硬盘用于数据(>= 3TB)
—要想舒适或处理小数据集用SSD
电源:
—累计GPU+CPU的功耗。然后总数乘以110%作为功耗需求。
如果用多GPU的话用高功效电源。
确保你的电源有足够的PCIe连接器(6+8针)
冷却:
—CPU:用标准CPU散热器或者一体式水冷解决方案
—GPU:的
—用风冷
—用“鼓风式”风扇的GPU,如果你买多个GPU的话
—在你的Xorg配置文件里面设置coolbit标志来控制风扇速度
主板:
—根据未来GPU需要尽可能多地配置PCIe插槽(一个GPU占2个插槽;每小题最多4GPU)
显示器:
—额外的显示器也许能让你比额外的GPU更有效率。
原文链接: http://timdettmers.com/2018/12/16/deep-learning-hardware-guide/
编译组出品。编辑:郝鹏程。