原标题 | A Full Hardware Guide to Deep Learning 作者 | Tim Dettmers 译者 | linlh、呀啦呼(Tufts University)、Ryan222(重庆邮电大学) 注:本文的相关链接请访问文末【阅读原文】
深度学习是非常消耗计算资源的,毫无疑问这就需要多核高速的CPU。但买一个更快的CPU有没有必要?在构建深度学习系统时,最糟糕的事情之一就是把钱浪费在不必要的硬件上。本文中我将一步一步教你如何使用低价的硬件构建一个高性能的系统。
这些年来,我总共搭建了7个不同的深度学习工作站,尽管经过了仔细的研究和推理,我在选择硬件时也犯了很多错误。在这篇文章中,我将分享我这些年的经验,帮助你避免同样的错误。
这篇博客的顺序是按照我犯错的严重程度编排的,所以我首先提到的是那些使人浪费最多钱的错误。
GPU
假设你将用GPU来进行深度学习或者你正在构建或者升级用于深度学习的系统,那么抛开GPU是不合理的。GPU是深度学习应用的心脏——训练过程速度的提升是非常的大的,不容忽视。
我在GPU推荐博客中对如何选择GPU讲的非常详细,如何选择GPU在深度学习系统中相当关键。在选择GPU时,你可能会犯这三个错误:(1)性价比不高,(2)内存不够大,(3)散热差。
性价比方面,我通常推荐 RTX 2070或者 RTX 2080 Ti。使用这些显卡的时候,你应该使用16位的模型,除此以外,eBay 的 GTX 1070, GTX 1080 和 GTX 1080 Ti 是非常好的选择,选择他们时,可以使用32位的模型,但不能是16位的模型。
在选择GPU时,要十分留意你的内存需求。在消耗同样内存的情况下,相比GTX,能跑16位模型的RTX能够训练2倍大小的模型。正是因为RTX有着内存优势,选择RTX、学习高效地使用16位模型,能够带给你更好的的使用体验。通常,对内存的要求大致如下:
在你买了多块RTX显卡时,需要留意散热问题。如果你想将 GPU 固定在彼此相邻的 PCIe 插槽中,应该确保使用带有鼓风机式风扇的 GPU。否则,您可能会遇到温度问题,并且您的 GPU 速度会变慢(约30%)并且损耗得更快。
找茬时间到!
你能否识别出因性能不佳而出现故障的硬件部分?是其中一个GPU?或者也许这是CPU的错?
RAM
购买内存最大的错误就是买了主频太高的内存。第二个错误是没有购买足够大的内存,导致在原型构建上出问题。
需要的主频
主频是内存公司引诱你购买“更快”的内存的一种营销手段,实际上几乎没有产生任何性能的提升。这个关于RAM的视频很详细地解释了内存在Linux上的技术窍门:内存速度真的重要吗?
此外,重要的是要知道内存速度与快速CPU RAM-> GPU RAM传输几乎无关。这是因为(1)如果你使用固定内存(pinned memory),那么你的mini-batch会直接传输到GPU中而不需要CPU的干预,(2)如果你不使用固定内存的话,快的和慢的内存获得的性能差别只有0-3%——把你的钱花到别处去!
内存大小
内存大小不会影响到深度学习的性能。但是,它可能会阻碍你轻松执行GPU代码(无需交换到磁盘)。你应该有足够的内存来愉快地配合GPU工作。这意味你至少应该有匹配GPU的内存大小。比如说,如果你有一张24GB显存的Titan RTX,那你至少应该有24GB的内存。但是,如果你有多块GPU的话,你不需要更多的内存。
“在内存上匹配最大的GPU显存”策略在于,如果你在处理大数据集时,你可能够还是会内存不足。最好的方式是和你的GPU匹配,如果你觉得内存不够,再买更大的内存。
另外一个不同的策略受心理学的影响:心理学告诉我们,专注是一种随着时间推移而耗尽的资源。内存是为数不多的硬件之一,可以让您浪费专注的精力,从而聚焦在解决更困难的编程问题。如果你有更多的内存,你可以将注意力集中在更紧迫的事情上,而不是困扰在内存瓶颈上浪费了大量时间。有了大量内存你就可以避开这些瓶颈,为更为紧急的问题节约时间,提升效率。特别在Kaggle比赛中,我发现有着额外的内存对于特征工程是非常有帮助的。如果资金足够,并且好做大量的预处理工作,那么增加额外的内存是一个非常好的选择。按照这个策略,现在就要考虑购买更多、实惠的内存,而不是后面再考虑。
CPU
人们常犯的最大错误是花太多的时间纠结CPU的PCIe通道数。其实,你并不需要太在意CPU的PCIe通道数。取而代之的是,应该注重你的CPU和主板的组合是否能够支撑起想要运行的GPU数量。第二个最常见错误是购买功能过于强大的CPU。
CPU和PCI-Express(新一代总线接口)
很多人痴迷于PCIe的通道数。然而,事情的真相是PCIe(的通道数)几乎不会影响深度学习的表现。如果你只有一个单一的GPU,PCIe通道唯一的作用是能够快速地将数据从你的CPU 内存中转换到GPU 内存中。但是,一个具有32张图片的ImageNet数据集批次(数据集的shape为32*225*225*3)和32位模型,在16通道PCIe上训练需要1.1毫秒,在8通道上需要2.3毫秒,在4通道上需要4.5毫秒。这些仅仅是理论上的数值,而在实际中你常常会发现PCIe会比理论速度慢上两倍——但是它仍然像闪电一样快。PCIe 通道的延时通常在纳秒范围内,因此其延时问题可以被忽视。
综上考虑后,我们提出了使用152层残差网络训练一个具有32张图片的小批量ImageNet数据集所需的时间,如下所示:
因此将4通道的PCIe换成16通道的PCIe将给你的训练表现带来大概3.2%的提升。然而,如果你的pyTorch数据下载器含有CUDA页锁定内存,那么(改变PCIe的通道)其实给你的训练表现带来的提升是0%。所以如果你仅使用1个GPU,那么不要把你的钱浪费在PCIe上!
当你在选择CPU的PCIe通道和主板PCIe通道时,(一定要)明确所选的CPU和主板组合能够支持期望的GPU数量。如果你买了一个支持2个GPU的主板,并且你最终确实需要用到2个GPU,那么就需要确认你购买的CPU能够支持2个GPU,而没有必要纠结PCIe的通道数。
PCIe通道数和多GPU并行
如果你在多GPU上并行的训练数据时,PCIe的通道数是重要的吗?针对这个问题我在2016年的ICLR会议中发表了一篇论文,而且我可以告诉你如果你有96个GPU那么PCIe的通道数确实非常重要。然而如果你只有4个或者更少的GPU,那么PCIe通道数的影响不大。如果在两到三个GPU上训练,我完全不会关心PCIe的通道数。当我使用四个GPU训练时,我才会确保每个GPU都能够得到8条PCIe通道的支持(总共32条PCIe通道)。由于几乎没有人会在超过4个GPU上面运行一个系统,那么记住一个经验准则:不要为了在每个GPU中得到更多的PCIe花额外的钱——这没有必要!
所需的 CPU 核数
为了能够在CPU上作出明确的选择,我们首先需要了解CPU以及它和深度学习间的关系。CPU为深度学习做了什么?当你在一个GPU上运行你的深度网络时,CPU仅进行很简单的运算。它主要主要(1)启动GPU函数调用,(2)执行CPU函数。
目前,CPU最大的应用是数据预处理。常用的两种数据预处理策略有着不同的CPU需求。
一种策略是在训练过程中进行预处理:
循环以下(三个)步骤:
1. 导入小批量数据
2. 预处理小批量数据
3. 训练小批量数据
第二种预处理策略是在训练之前进行预处理操作:
1. 导入数据
2. 循环以下(两个)步骤: 1. 导入小批量数据 2. 训练小批量数据
对于第一种策略,一个多核CPU可以明显地加强训练表现。对于第二种策略,你不需要一个很好的CPU。对第一种训练策略,我建议每个GPU至少有4个线程——通常每个GPU有两个核心。我没有对此进行严格的测试,但是每增加一个核心/GPU应该有0-5%的额外性能提升。
对于第二种策略,我建议每个GPU最少有2个线程——通常每个GPU有一个核心。如果你使用第二种策略,那么更多的内核并不会给你带来明显的性能提升。
所需的 CPU 主频(时钟频率)
当人们考虑(购买)快速的CPU时,他们通常首先查看时钟频率。4GHz的CPU比3.5GHz的好,是吗?这对于比较具有相同结构的处理器来说通常是正确的,例如“Ivy Bridge微架构”,但是对于不同架构的处理器来说这并不好比较。此外,CPU主频并不总是衡量性能的最佳方法。
在深度学习中CPU仅仅做一些微不足道的计算:增加一些参数,评估布尔表达式,在GPU或程序内进行函数调用——这些都取决于CPU核心的时钟频率。
虽然这些理由看似合理,但是当我运行深度学习程序时却发现CPU使用率为100%,那么这是为什么呢?为了找寻答案,我做了一些CPU降频实验。
在MNIST和ImageNet数据集上的GPU降频实验:不同CPU时钟频率的性能以训练200个epoch的MNIST数据集和50个epoch的ImageNet数据集所花费的时间来衡量, 其中最大的时钟频率作为每个CPU的基线。作为比较:从GTX 680升级到GTX Titan的性能提升约为 15%; 从GTX Titan到GTX 980又提升20%的性能; GPU超频可为任何GPU带来5%的性能提升。
值得注意的是,这些实验是在落后过时的硬件设备上进行的,然而,对于现代的CPU/GPU它的结果仍然不变。
硬盘/SSD
一般来说硬盘不是深度学习的瓶颈。但也别整这种蠢事儿:当你从一个100MB/s的硬盘读取mini-batch为32的ImageNet时候,需要185毫秒。你可以在数据使用前异步加载数据(比如说torch vision loader),因为加载数据需要185毫秒而ImageNet上运行的大多数DNN需要200毫秒来计算。我们完全可以提前加载下一个mini-batch来避免性能损失。
从生产效率来说,我推荐SSD,因为程序启动反应更快,大文件的预处理速度也更快。另外,NVMe SSD会带给你更好的使用体验。
电源(PSU)
你得确保你的电源能够满足所有预留GPU的功率需求。一般来说,GPU能耗会越来越低,所以不用更换电源,买个好的电源是个值当的买卖。
在计算需要的功率时,你最好加上所有CPU和GPU功耗的10%作为功率峰值的缓冲。举个例子,你有四个250瓦的GPU和一个150瓦的CPU,那我们需要一个最少4×250 + 150 + 100 = 1250瓦的电源。一般我会加上至少10%来确保一切正常,那么在这种情况下一共需要1375瓦。最后我会买一个1400瓦的电源。
你得注意有些电源即使达到了要求的功率,但是没有足够的8针或者6针PCIe插槽接口。你得多多注意这点。
另外请尽量购买高功率功效的电源——特别是你运行多个GPU且长时间运行。
满负载运行一个4GPU系统(1000-1500瓦)来训练卷积神经网络两周会消耗300-500千瓦时。德国每千瓦时的价格是20分,所以会用60-100欧(66-111美金)。刚刚我们假设的电源效率是100%,如果使用的是效率是80%的电源,还要额外消耗18-26欧。使用单颗GPU的话,会少很多。但是不影响重点:值得在高效电源上多花点儿钱。
全天候的使用一些GPU会显著的增加你的碳排放足迹,甚至这比你的交通(譬如飞机)和其他因素还要多。如果你想要负责的话,可以用纽约大学机器学习语言组(ML2)- 很容易办到,也很便宜,可以作为深度学习研究院的标准。
CPU 和 GPU 的冷却系统
冷却非常重要,是整个系统中一个重要的瓶颈。相比较于糟糕的硬件选择,它更容易降低性能。对于CPU,你可以使用标准散热器或者一体化(AIO)水冷解决方案。但是对于GPU,你需要特别注意。
风冷 GPUs
如果你有多颗GPU并且他们中间有足够的空间(在3-4颗GPU的位置放置2颗GPU),风冷是安全可靠的。当你想去冷却3-4颗GPU的时候,可能会犯一个巨大的错误。这时候你需要认证考虑在这个案例中的选择。
运行一个算法的时候,现代GPU会提高他们的速度以及功耗,直至最大值。一旦GPU达到温度临界值(通常为80°C),GPU就会降低运算速度防止达到温度阙值。这样可以在保持GPU过热的同时实现最佳性能。
对于深度学习程序而言,典型的风扇速度预编程时间表设计得很糟糕。启动一个深度学习程序后几秒钟就会达到温度阙值,结果就是性能会下降0-10%。多个GPU之间相互加热,性能会下降的更明显(10%-25%)。
因为 NVIDIA GPU 在大部分情况下是作为游戏 GPU,它们对windows进行了优化。在Windows中点一点鼠标就能改变风扇计划的方式在Linux中行不通。可是大多数深度学习库都是针对Linux编写。
如果你有一台Xorg服务器(Ubuntu),唯一的选项是用“coolbits”来设置温度。对于单个GPU来说,这种方法非常奏效。当有多个GPU的时候,其中一些没有监视器,模拟出监视器来监测他们是很艰难晦涩的工作。我曾经花过很长的时间尝试使用实时启动CD来恢复我的图形设置,但是从没有在无监视器GPU上成功运行过。
在风冷系统下运行3-4颗GPU需要尤其重视风扇设计。“鼓风机式”风扇设计让冷风进入GPU,然后从机箱背部吹出热风。“非鼓风机式”风扇吸入GPU附近的空气来冷却它。但是如果是多颗GPU,那么它们的周围就没有冷空气,使用“非鼓风机式”风扇的GPU会越来越热,最终通过降低性能来降温。我们应该不惜一切代价来必变在3-4颗GPU的环境中使用“非鼓风机式”风扇。
多GPU使用的水冷系统
另一种更棒更昂贵的方式是使用水冷系统。如果你只有一颗GPU或者两颗GPU之间有足够的空间(比如在3-4颗GPU的主板上有两颗GPU),我不建议使用水冷系统。在4GPU配置中,水冷保证即使最强劲的GPU也能保持低温,而这在风冷中是不可能实现的。水冷的另一个优点是运行很安静,这对于在公共区域运行多GPU来说是一个巨大的优势。每颗GPU需要100美金的成本安装水冷,另外需要一些额外的前期成本(大约50美金)。组装有水冷的计算机也会需要一些额外工作,但是不用担心,会有详细的指南来指导你安装,仅仅需要你多付出几个小时。维护工作也没有那么的复杂费力。
一个冷却的案例
大型的塔式服务器在GPU位置有额外的风扇,所以我为深度学习集群购买了他们。然后我发现太不划算了,只下降了2-5°C却要付出大量的投资。最重要的部分是直接在GPU上安装冷却系统,完全没必要为冷却系统买贵不啦叽的壳子。
冷却的总结
对于一个GPU来说,风冷足够了。如果你有多个GPU, 你可以在接受性能损失(10% - 15%)的情况下使用“鼓风式”风冷系统,或者花更多的钱购置水冷系统,虽然难以设置但是它可以保证没有性能损失。对于不同的场景,我们可以因地制宜选择风冷或者水冷。我建议使用风冷就好--使用“鼓风式”GPU。如果你想使用水冷, 请使用一体化水冷(AIO)方案。
主板
你的主板上应该有足够的PCIe端口来支持你需要运行的GPU数量(即使你有更多的PCIe 插槽,但是一般限制最多4颗GPU);另外,铭记大部分GPU都会占据两个PCIe卡槽的宽度,所以如果想使用多颗GPU,请确保购买的主板有足够的预留空间。主板不仅需要有足够的PCIe插槽位置,而且需要支持你购买的GPU。在新蛋上你可以查看到对应主板的信息和PCIe情况。
电脑机箱
麻烦买个能放下全尺寸长度GPU的机箱。大部分的机箱都没问题,不过还是查看尺寸规格来确保没有买了个小号的;或者你可以尝试在google image里面搜索这款儿,然后看有没有有GPU在里面的图片。
另外如果使用定制化水冷系统,得确保你的机箱有足够空间来放置散热器。因为每个GPU的散热器都需要单独的空间。
显示器
刚开始吧我觉得写一些关于显示器的心得很蠢,但是它们各不相同,所以我还是整点话吧。
花在我的3台27寸显示器上的钱是我最值当的投资了。当使用多显示器的时候,生产力提升很多。只有一台显示器的话,我会感觉完全干不了活。在这事儿上别妥协,如果干活不开森,深度学习系统再快有啥意思咧?
我一般这么搁我的显示器:左边看论文,搜搜google,收收邮件,瞅瞅stackoverflow;中间就用来写代码;右边放一些杂七八啦的玩意儿,比如输出界面辣,文件夹辣,系统、GPU监视器辣,待办事项辣。
一些后话
因为硬件很贵,很多人怕犯错,一提到DIY计算机就怵得慌。其实特简单这事儿,因为不匹配的零件也组装不到一起对不对?主板手册啊,指南啊以及网络视频啊也会教小白的你如何组装这些玩意儿。
自己组装计算机的好处是,你整了一次就啥都全明白了,这辈子也忘不掉。计算机么,都大差不差,别怂!
GPU:来自eBay的RTX 2070 、RTX 2080 Ti、 GTX 1070 、GTX 1080, 和 GTX 1080 Ti 是非常好的选择。
CPU:每个GPU分配1-2个两个核心,这取决于你是怎么处理数据的。频率 > 2GHz。CPU应该要能够支持你要运行的GPU数量。PCIE通道并不重要。
RAM:
- 时钟频率不重要 - 买最便宜的内存
- 最少要购买和你最大的GPU显存大小的内存
- 只有在需要的时候购买更多的内存
- 如果你经常处理大数据集的话更多的内存是非常有帮助的
硬盘/SSD:
- 存放数据的硬盘(>=3GB)
- 使用SSD可以快速处理小数据集
电源
- 把GPU和CPU需要的功率瓦数加起来,然后乘以总数的110%得到需要的功率瓦数
- 如果使用多个GPU,要选择高效率的电源。
- 确保电源有足够的PCIE接口(6+8引脚)
散热
- CPU:使用标准的CPU散热或者是一体式的水冷解决方案
- GPU:风扇散热
- 如果购买多个GPU的话使用“鼓风式”的风扇
- 在Xorg配置中设置coolbits标志以控制风扇速度
主板
- 为(未来的)GPU预留尽可能多的PCIe插槽(一个GPU需要两个插槽;每个系统最多4个GPU)
显示器
- 一个额外的显示器比一个额外的GPU更能提高你的效率
本文编辑:Pita
英语原文:https://timdettmers.com/2018/12/16/deep-learning-hardware-guide/