深度学习是计算密集型的,搭建硬件环境很重要。因此您需要具有多个内核的快速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 1070 Ti和GTX 1080 Ti才是好的选择,您可以使用这些具有32位(但不是16位)的GPU。
选择GPU时要留意内存的要求。 RTX卡可以以16位运行,可以训练相比GTX卡使用相同内存大两倍的型号。因此,RTX卡具有内存优势,并且选择RTX卡并学习如何有效地使用16位模型将带您走很长的路。通常,对内存的要求大致如下:
- 正在寻找最先进分数的研究:> = 11 GB
- 正在寻找有趣架构的研究:> = 8 GB
- 其他研究:8 GB
- Kaggle:4 - 8 GB
- 初创公司:8 GB(但检查特定应用领域的型号尺寸)
- 企业项目:8 GB用于原型设计,> = 11 GB用于训练
需要注意的另一个问题是,如果您购买多个RTX卡,则需要冷却系统。如果您想将GPU固定在彼此相邻的PCIe插槽中,您应该确保使用鼓风机式风扇获得GPU。否则,您可能会遇到温度问题,您的GPU会变得更慢(大约30%)并且更快死亡。
怀疑阵容您能否识别出因性能不佳而出现故障的硬件部分?其中一个GPU?或者也许这毕竟是CPU的错
内存
RAM的主要错误是购买时钟频率过高的RAM。第二个错误是购买不够的RAM以获得平滑的原型制作体验。
所需的RAM时钟速率
RAM时钟速率是市场营销的一种情况,RAM公司会引诱你购买“更快”的RAM,实际上几乎没有产生性能提升。
此外,重要的是要知道RAM速度与快速CPU RAM-> GPU RAM传输几乎无关。这是因为(1)如果您使用固定内存,您的迷你批次将转移到GPU而不涉及CPU,以及(2)如果您不使用固定内存,快速与慢速RAM的性能提升是关于0-3% - 把钱花在别的地方!
RAM大小
RAM大小不会影响深度学习性能。但是,它可能会阻碍您轻松执行GPU代码(无需交换到磁盘)。你应该有足够的内存来舒适地使用你的GPU。这意味着您应该至少拥有与最大GPU匹配的RAM量。例如,如果你有一个24 GB内存的Titan RTX,你应该至少有24 GB的RAM。但是,如果您有更多的GPU,则不一定需要更多RAM。
这种“在RAM中匹配最大GPU内存”策略的问题在于,如果处理大型数据集,您可能仍然无法使用RAM。这里最好的策略是匹配你的GPU,如果你觉得你没有足够的RAM,只需购买更多。
一种不同的策略受到心理学的影响:心理学告诉我们,注意力是一种随着时间推移而耗尽的资源。 RAM是为数不多的硬件之一,可以让您节省集中资源,解决更困难的编程问题。如果你有更多的RAM,你可以将注意力集中在更紧迫的问题上,而不是花费大量时间来环绕RAM瓶颈。有了大量的RAM,您可以避免这些瓶颈,节省时间并提高生产率,解决更紧迫的问题。特别是在Kaggle比赛中,我发现额外的RAM对于特征工程非常有用。因此,如果您有钱并进行大量预处理,那么额外的RAM可能是一个不错的选择。因此,使用此策略,您希望现在拥有更多、更便宜的RAM而不是以后。
中央处理器
人们犯的主要错误是人们过分关注CPU的PCIe通道。您不应该太在意PCIe通道。相反,只需查看您的CPU和主板组合是否支持您要运行的GPU数量。第二个最常见的错误是获得一个太强大的CPU。
CPU和PCI-Express
人们对PCIe通道位数极为痴迷!然而,事实是它对深度学习表现几乎没有影响。如果您只有一个GPU,则只需要PCIe通道即可快速将数据从CPU RAM传输到GPU RAM。然而,ImageNet批次的32个图像(32x225x225x3)和32位需要1.1毫秒,16个通道,2.3毫秒,8个通道,4.5毫秒,4个通道。这些是理论数字,实际上你经常会看到PCIe的速度是它的两倍 - 但这仍然是闪电般快速的! PCIe通道通常具有纳秒范围内的延迟,因此可以忽略延迟。
下面是用ResNet-152进行ImageNet32位图像迷你批次传输测试的实际结果与理论数据的对比:
- 前向和后向传递总用时:216毫秒(ms)
- 16个PCIe通道CPU-> GPU传输:大约2 ms(理论上为1.1 ms)
- 8个PCIe通道CPU-> GPU传输:大约5毫秒(2.3毫秒)
- 4个PCIe通道CPU-> GPU传输:大约9毫秒(4.5毫秒)
因此,从4到16个PCIe通道将使性能提升约3.2%。但是,如果你使用带有固定内存的PyTorch数据加载器,你可以获得0%的性能。因此,如果您使用单个GPU,请不要在PCIe通道上浪费资金!
选择CPU PCIe通道和主板PCIe通道时,请确保选择支持所需GPU数量的组合。如果您购买支持2个GPU的主板,并且您希望最终拥有2个GPU,请确保购买支持2个GPU的CPU,但不一定要查看PCIe通道。
PCIe通道和多GPU并行
如果您在具有数据并行性的多个GPU上训练网络,PCIe通道是否重要?我已经在ICLR2016上发表了一篇论文,我可以告诉你,如果你有96个GPU,那么PCIe通道非常重要。但是,如果你有4个或更少的GPU,这并不重要。如果您在2-3个GPU之间并行化,我根本不关心PCIe通道。有了4个GPU,我确保每个GPU可以获得8个PCIe通道的支持(总共32个PCIe通道)。因为几乎没有人运行超过4个GPU的系统作为经验法则:不要花费额外的钱来获得每GPU更多的PCIe通道 - 这没关系!
CPU核心数量很重要
为了能够为CPU做出明智的选择,我们首先需要了解CPU以及它与深度学习的关系。 CPU为深度学习做了什么?当您在GPU上运行深度网络时,CPU几乎不会进行任何计算。主要是它(1)启动GPU函数调用,(2)执行CPU函数。
到目前为止,CPU最有用的应用程序是数据预处理。有两种不同的通用数据处理策略,它们具有不同的CPU需求。
第一个策略是在训练时进行预处理:
循环:
- 加载小批量
- 预处理小批量
- 小批量训练
第二种策略是在训练之前进行预处理:
- 预处理数据
- 循环:1.加载预处理的小批量
2.小批量训练
对于第一种策略,具有多个内核的良好CPU可以显著提高性能。对于第二种策略,您不需要非常好的CPU。对于第一个策略,我建议每个GPU至少有4个线程 - 通常每个GPU有两个核心。我没有对此进行过硬测试,但每增加一个核心/ GPU,你应该获得大约0-5%的额外性能。
对于第二种策略,我建议每个GPU至少有2个线程 - 通常是每个GPU一个核心。如果您使用第二个策略,那么当您拥有更多内核时,您将不会看到性能的显著提升。
虽然这种推理似乎很明智,但是当我运行深度学习程序时,CPU有100%的使用率,那么这里的问题是什么?我做了一些CPU核心速率的低频实验来找出答案。
MNIST和ImageNet上的CPU降频:可以看出,不同主频CPU在内核大幅降频后对整个系统的性能影响不大。作为比较:从GTX 580升级到GTX Titan的性能约为+ 20%;从GTX Titan到GTX 980另外+ 30%的性能; GPU超频可为任何GPU带来约+ 5%的性能
请注意,这些实验是在过时的硬件上进行的,但是,对于现代CPU / GPU,这些结果应该仍然相同。
硬盘/ SSD
硬盘通常不是深度学习的瓶颈。但是,如果你做了愚蠢的事情依然会对你造成伤害:如果你在需要时从磁盘读取数据(阻塞等待),那么一个100 MB / s的硬盘驱动器将花费大约185毫秒的时间用于32的ImageNet迷你批次!但是,如果您在使用数据之前异步获取数据(例如Torch视觉加载器),那么您将在185毫秒内加载小批量,而ImageNet上大多数深度神经网络的计算时间约为200毫秒。因此,在当前仍处于计算状态时加载下一个小批量,您将不会面临任何性能损失。
但是,我推荐使用SSD来提高舒适度和工作效率:程序启动和响应速度更快,使用大文件进行预处理要快得多。如果您购买NVMe SSD,与普通SSD相比,您将获得更加平滑的体验。
因此,理想的设置是为数据集和SSD配备容量性能稍差的机械硬盘驱动器,以兼顾生产力和成本。
电源装置(PSU)
通常,您需要一个足以容纳所有未来GPU的PSU。 GPU随着时间的推移通常会变得更加节能;因此,虽然需要更换其他组件,但PSU应该持续很长时间,因此良好的PSU是一项很好的投资。
您可以通过将CPU和GPU的功耗与其他组件的额外10%瓦特相加来计算所需的功率,并作为功率峰值的缓冲器。例如,如果您有4个GPU,每个250瓦TDP和一个150瓦TDP的CPU,那么您将需要一个最小为4×250 + 150 + 100 = 1250瓦的PSU。我通常会添加另外10%,以确保一切正常,在这种情况下将导致总共1375瓦特。在这种情况下,我想要获得一个1400瓦的PSU。
需要注意的一个重要部分是,即使PSU具有所需的功率,它也可能没有足够的PCIe 8针或6针连接器。确保PSU上有足够的连接器以支持所有GPU!
另一个重要的事情是购买具有高功率效率等级的PSU - 特别是如果你运行许多GPU并将运行它们更长的时间。
以全功率(1000-1500瓦)运行4 GPU系统来训练卷积网两周将达到300-500千瓦时,在德国 - 相当高的电力成本为每千瓦时20美分 - 将达到60- 100欧元(66-111美元)。如果这个价格是100%的效率,那么用80%的电源进行这样的网络训练会使成本增加18-26欧元 。对于单个GPU而言,这个问题要少得多,但重点仍然存在——在高效电源上投入更多资金是有道理的。
全天候使用几个GPU将大大增加您的碳足迹,并将使运输(主要是飞机)和其他有助于您的足迹的因素蒙上阴影。如果你想要负责,请考虑像NYU机器学习语言组(ML2)那样实现碳中性 - 它很容易做到,价格便宜,应该成为深度学习研究人员的标准。
CPU和GPU冷却
冷却很重要,它可能是一个重要的瓶颈,与糟糕的硬件选择相比,它会降低性能。对于CPU来说,使用标准散热器或一体化(AIO)水冷却解决方案应该没问题,但是对于GPU来说,需要特别注意。
风冷GPU
对于单个GPU,空气冷却是安全可靠的,或者如果您有多个GPU之间有空间(在3-4 GPU情况下为2个GPU)。但是,当您尝试冷却3-4个GPU时,可能会出现最大的错误之一,在这种情况下您需要仔细考虑您的选项。
现代GPU在运行算法时会将速度以及功耗提高到最大值,但一旦GPU达到温度障碍 - 通常为80°C - GPU将降低速度,以便温度阈值为没有违反。这样可以在保证GPU不过热的情况下获得最好的性能。
然而,对于深度学习程序而言,典型的预编程风扇速度调度设计非常糟糕,因此在开始深度学习程序之后几秒内就达到了这个温度阈值。结果是性能下降(0-10%),这对于GPU相互加热的多个GPU(10-25%)而言可能很重要。
由于NVIDIA GPU首先是一个游戏GPU,因此它们针对Windows进行了优化。您可以在Windows中点击几下就更改粉丝计划,但在Linux中不是这样,并且因为大多数深度学习库都是针对Linux编写的,所以这是一个问题。
Linux下唯一的选择是用于设置Xorg服务器(Ubuntu)的配置,您可以在其中设置“coolbits”选项。这对于单个GPU非常有效,但是如果你有多个GPU,其中一些是无头的,即它们没有附加监视器,你必须模拟一个非常复杂的监视器。我尝试了很长时间,并且使用实时启动CD来恢复我的图形设置让我很沮丧 - 我无法让它在无头GPU上正常运行。
如果在空气冷却下运行3-4个GPU,最重要的考虑因素是注意风扇设计。 “鼓风机”风扇设计将空气推出到机箱背面,以便将新鲜、凉爽的空气推入GPU。非鼓风机风扇在GPU的虚拟性中吸入空气并冷却GPU。但是,如果你有多个GPU彼此相邻,那么周围就没有冷空气了,带有非鼓风机风扇的GPU会越来越多地加热,直到它们自己降低温度以达到更低的温度。不惜一切代价避免在3-4个GPU设置中的非鼓风机风扇。
用于多个GPU的水冷GPU
另一种更昂贵且更加工艺的选择是使用水冷却。如果你有一个GPU,或者你的两个GPU之间有空隙(3-4 GPU板中有2个GPU),我不推荐使用水冷。然而,水冷却确保即使最强劲的GPU在4 GPU设置下也能保持凉爽,这在用空气冷却时是不可能的。水冷却的另一个优点是它可以运行很安静,如果你在其他人工作的区域运行多个GPU,这是一个很大的优势。水冷却每个GPU需要花费大约100美元和一些额外的前期成本(大约50美元)。水冷还需要一些额外的工作来组装你的计算机,但有很多详细的指南,它应该只需要几个小时的时间。维护不应该那么复杂或费力。
为了更好的冷却效果购买大机箱?
我为我的深度学习集群购买了大型塔式机箱,但我发现这在很大程度上是无关紧要的:大约2-5°C的下降,却导致空间占用和成本上的飙升,不值得投资。最重要的部分是直接在GPU上的冷却解决方案 - 而不是为GPU冷却功能选择昂贵的外壳。
结论冷却
所以最后很简单:对于1 GPU,空气冷却是最好的。对于多个GPU,您应该获得鼓风式空气冷却并接受微小的性能损失(10-15%),或者您需要额外支付水冷却,这也更难以正确设置并且您没有性能损失。在某些情况下,空气和水冷却都是合理的选择。然而,我会建议空气冷却以简化操作 - 如果您运行多个GPU,请使用鼓风机式GPU。如果您想用水冷却,请尝试为GPU找到一体化(AIO)水冷却解决方案。
主板
您的主板应该有足够的PCIe端口来支持您要运行的GPU数量(通常限制为4个GPU,即使您有更多的PCIe插槽);请记住,大多数GPU的宽度都是两个PCIe插槽,因此如果您打算使用多个GPU,请购买PCIe插槽之间有足够空间的主板。确保您的主板不仅具有PCIe插槽,而且实际上支持您要运行的GPU设置。如果您在newegg上搜索您选择的主板并查看规格页面上的PCIe部分,通常可以找到相关信息。
电脑机箱
选择外壳时,应确保它支持位于主板顶部的全长GPU。大多数情况下都支持全长GPU,但是如果你购买一个小盒子,你应该怀疑。检查其尺寸和规格;你也可以尝试谷歌图像搜索该模型,看看你是否找到了带有GPU的图片。
如果您使用自定义水冷却,请确保您的外壳有足够的空间放置散热器。如果您为GPU使用水冷却尤其如此。每个GPU的散热器都需要一些空间 - 确保您的设置实际上适合GPU。
显示器
显示器貌似不应该出现在深度学习硬件的推荐列表里,但出乎很多人的意料,显示器对生产力的影响极为巨大。
我在3台27英寸显示器上花的钱可能是我用过的最好的钱。使用多台显示器时,生产力会大幅提升。如果我必须使用一台显示器,工作几乎不能进行。如果您无法以有效的方式操作它,不要在这件事上做出改变。那么快速深度学习系统有什么用呢?
我的深度学习典型显示器布局:左:论文,谷歌搜索,gmail,stackoverflow;中:代码;右:输出窗口,R,文件夹,系统监视器,GPU监视器,待办事项列表和其他小型应用程序。
关于构建PC的一些话
许多人害怕构建,因为硬件组件很昂贵,你不想做错事。但它非常简单,因为不属于一起的组件不能组合在一起。主板手册通常非常具体描述如何组装所有内容,并且有大量的指南和分步视频,如果您没有经验,它们将指导您完成整个过程。
构建计算机的好处在于,您知道在执行计算机时有关构建计算机的所有信息,因为所有计算机都以相同的方式构建。
结论/ TL; DR
- GPU :RTX 2070或RTX 2080 Ti。来自eBay的GTX 1070,GTX 1080,GTX 1070 Ti和GTX 1080 Ti也不
- CPU :每GPU 1-2个核心,具体取决于您预处理数据的方式。 > 2GHz; CPU应该支持您要运行的GPU数量。 PCIe通道并不重要。
- RAM :
- – 时钟频率无关紧要 – 购买最便宜的RAM。
- – 购买至少与最大GPU的RAM相匹配的CPU RAM。
- – 仅在需要时购买更多RAM。
- – 如果您经常使用大型数据集,则可以使用更多RAM。
- 硬盘/ SSD :
- – 用于数据的硬盘驱动器(> = 3TB)
- – 使用SSD来获得舒适性并预处理小型数据集。
- PSU :
- – 加上GPU + CPU的瓦数。然后将所需瓦数的总和乘以110%。
- – 如果您使用多个GPU,请获得高效率。
- – 确保PSU有足够的PCIe连接器(6 + 8针)
- 散热 :
- – CPU:获得标准CPU散热器或一体化(AIO)水冷解决方案
- – GPU:
- – 使用空气冷却
- – 如果您购买多个GPU,则使用“鼓风式”风扇获取GPU
- – 在您的Xorg中设置coolbits标志配置控制风扇速度
- 主板 :
- – 为您的(未来)GPU准备尽可能多的PCIe插槽(一个GPU需要两个插槽;每个系统最多4个GPU)
- 监视器 :
- – 额外的监视器可能会比增加GPU更高效。
本文来源于ITPUB博客