如何选择深度学习的GPU

深度学习是一个具有强烈计算要求的领域,GPU的选择将从根本上决定您的深度学习体验。

需要多个GPU吗?

多GPU能够对深度学习有什么影响,我非常感兴趣,于是通过组装具有40Gbit/s的小型GPU集群,然后应用于多GPU训练,激动的看到多个GPU可以获得更好的结果。
但是很快发现,在多个GPU上高效地并行化神经网络不仅非常困难,而且对于密集型神经网络,其加速率也非常低。使用数据并行性可以相当有效地并行化小型神经网络,但是像我在“Hashtags Kaggle”竞赛中使用的大型神经网络几乎没有得到加速。
我深入分析了深度学习中的并行化,开发了一种技术,用于将96个GPU系统的GPU集群的加速从23x提高到50x,并在ICLR 2016发表了我的研究。在我的分析中,我还发现卷积和递归网络相当容易并行化,特别是您只使用一台计算机或4个GPU的时候。因此,尽管现代工具没有高度优化并行性,但仍然可以获得良好的加速。
与三年前相比,在最流行的框架中使用并行化技术的用户体验现在也相当不错。虽然他们的算法相当原生,不易扩展到GPU集群,但是它们提供了高达4 GPU的良好性能。对于卷积神经网络,在2/3/4GPU,可以预期得到1.9x/2.8x/3.5x的加速;对于循环网络,序列长度是最重要的参数,对于常见的NLP问题,可以预期与卷积网络类似的或稍微差一些的加速。全连接网络对于数据并行性通常具有较差的性能,需要更高级的算法来加速网络的这些部分。
所以今天使用多个GPU可以使训练更加方便,因为速度提高了,如果你有钱的话,使用多个GPU是很有意义的。

使用没有并行的多个GPU

使用多GPU的另一个优点是,即使不并行化算法,也可以在每个GPU上分别运行多个算法或实验。即使没有加速,但是你可以通过使用不同的算法或者参数来获得更多的训练性能信息。如果你的主要目标是尽快获得深度学习经验,这对于那些想同时尝试多种新算法的研究人员来说非常有用。
这是心理上重要的,如果你想学习深度学习。执行任务和接收任务的反馈越短,大脑就越能够将该任务的记忆片段整合成一个连贯的经验记忆。如果使用小数据集分别在两个GPU上训练卷积神经网络,您将更快地了解执行是否良好;您将更容易地检测交叉验证模式中的错误并正确地解释它们。您将能够检测到错误模式,这些将提示你添加、移除或调整哪些参数或层。
我个人认为用这种方式使用多GPU会更有用,因为你可以很快地找到一个好的配置。一旦你发现了一系列的参数或架构,你就可以在多个GPU之间使用并行性来训练最终的网络。
因此,可以说一个GPU应该足以完成几乎任何任务,但是多GPU对于加速您的深度学习模型变得越来越重要。
如果你想快速学习深度学习,多个便宜的GPU组成集群也是非常好的。即使是我自己的研究,我也是拥有相当多的小GPU集群而不是一个大的GPU。

NVIDIA: 深度学习领域领导者

在NVIDIA vs AMD vs Intel vs Google vs Amazon比较中NVIDIA无疑是领导者。
NVIDIA的标准库,使其在CUDA建立第一个深度学习库很容易,而AMD OpenCL没有这种强大的标准库。这种早期的优势与Nvidia强大的社区支持相结合,迅速增加了CUDA社区的规模。这意味着,如果你使用NVIDIA GPU出错时,非常容易找到支持,你将会找到自己程序的CUDA支持和建议。你会发现,大部分的深度学习库为NVIDIA GPU提供了最好的支持。这是一个NVIDIA GPU非常强的点。
另一方面,NVIDIA现在有一个政策,在数据中心的CUDA只允许使用Tesla GPU和不是GTX或RTX卡。目前还不清楚什么是“数据中心”,但这意味着组织和大学往往出于规避法律问题被迫购买昂贵且成本低效的Tesla GPU。然而,Tesla GPU并没有真正优于GTX和RTX卡,但成本缺高达其10倍。
Nvidia可以这样做,且没有任何大的阻力,充分显示了其庞大的垄断力。他们可以为所欲为,我们不得不接受这样的条款。如果你选择在社区和支持方面有更大优势的NVIDIA GPU,你也需要接受这些,无疑这样又助长了他们的气焰。

AMD: 强大但缺乏支持

HIP和ROCm通过使用一个通用编程语言统一了NVIDIA和AMD GPU。这个语言在编译成GPU二进制之前,先编译成了一个中间GPU语言。如果将我们所有的GPU代码应用HIP ,这将是一个重大的里程碑。但这很难,因为tensorflow和pytorch的底层库很难转换。TensorFlow已经对AMD的GPU提供了支持,它所有主要的网络都可以运行在AMD的GPU上。但如果你想实现新的网络,其中的一些细节是不清楚的,这将阻止你的实现。ROCM社区也不太大,因此很难快速解决问题。AMD这边似乎也没有多少钱可以提供给深度学习发展。
然而,AMD GPU相比NVIDIA GPU显示强劲的性能,下一代AMD GPU的Vega 20框架将具有张量计算单元核心,提供更强大的计算能力。
总的来说,如果只是希望GPU可以顺利运行的普通深度学习用户,我还是不建议使用AMD GPU。具有丰富经验的用户,通过支持AMDGPU和ROCm/HIP开发人员,将遇到更少的问题。他们为打击NVIDIA的垄断地位作出了贡献,因为这将极大地有利于每个人的长期利益。如果您是GPU开发人员,并且希望对GPU计算做出重要贡献,那么AMD GPU可能是长期产生良好影响的最佳方式。对于其他人来说,NVIDIA GPU可能是更保险的选择。

Intel: 正在努力

我对英特尔的Xeon Phis的个人经历一直很失望,我并不认为他们是NVIDIA或AMD卡的真正竞争对手,因此我将简短地说:如果您决定使用Xeon Phi,请注意,您可能会遇到支持不力的计算问题,这会导致代码部分比CPU更慢,而且很难编写优化的代码,没有完全支持C++ 11的特性,一些重要的GPU设计模式不支持编译器,与依赖BLA例程(NUMPY和SCIPY)的其他库之间的兼容性差,可能还会遇到很多其他的挫折。
我真的很期待英特尔神经网络处理器(NNP),因为它的规格在GPU开发者手中极其强大,并且它允许新的算法来重新定义神经网络是如何使用的,但是它被无休止地延迟了,还有谣言说,大部分开发人员跳槽了。NNP计划为Q3/Q4 2019。如果您想等那么久,请记住,好的硬件不是从AMD和英特尔自己的Xeon Phi看到的一切。它可以很好地进入2020,直到NNP以成熟的方式使用。

Google: 按需处理更便宜

谷歌的TPU发展成为一个非常成熟的基于云的产品,非常节省成本。使用TPU更有意义的最简单方法就是把它看成是打包在一起的多个GPU。如果看一下启用张量核心的V100与TPUv2的性能度量,我们就会发现两个系统在ResNet50的性能上几乎相同。然而,谷歌TPU更具成本效益。
因此TPU是一种基于成本的云计算解决方案吗?是的,也不是,在纸上,为了经常使用,它更具成本效益。然而,如果您使用 fastai team和fastai library的最佳实践和指导方针,那么您可以以较低的价格实现更快的收敛——至少对于用于对象识别的卷积网络是这样。
使用相同的软件,TPU可能更加节省成本,但这里也存在问题:(1)TPU不能用于fastai library(即PyTorch);(2)TPU算法主要依赖于内部Google团队;(3)没有统一的高级库来执行良好的TensorFlow支持。
这三点都击中了TPU,因为它需要单独的软件来跟上深度学习算法系列的新增内容。我确信谷歌车队已经完成了打包工作,但目前还不清楚对某些型号的支持有多好。例如,官方存储库只有一个NLP模型,其余的是计算机视觉模型。所有模型都使用卷积,没有一个是递归神经网络。与一个现在相当旧的报告从二月,TPUV2不收敛当LSTMs被使用。如果问题已经解决了,我找不到一个来源,但是随着时间的流逝,软件支持很可能快速改进,并且成本将进一步降低,使得TPU成为一个有吸引力的选择。然而,目前,TPU似乎最适合用于计算机视觉,并作为其他计算资源的补充,而不是主要的深度学习资源。

Amazon: 可靠但昂贵。

自从这篇博客文章的第一次更新以来,很多新的GPU被添加到AWS中。然而,价格仍然有点高。如果突然需要额外的计算,例如,当所有GPU都在使用时,就像在研究论文截止日期之前一样,AWS GPU实例可以是非常有用的解决方案。
然而,如果它应该具有成本效益,那么应该确保只运行几个网络,并且能够非常肯定地知道为训练运行选择的参数接近最优。否则,成本会大大增加,一个专门的GPU可能会更有用。即使一个快速的AWS GPU是诱人的,但手头的GTX 1070将能够提供良好的计算性能,并且一两年内不再需要费用。
因此AWS GPU实例是非常有用的,但是它们需要明智地使用,并且要谨慎,以节省成本。有关云计算的更多讨论,请参阅下面的部分。

是什么让一个GPU比另一个GPU更快?

您的第一个问题可能是,对于深度学习来说,GPU性能更快的最重要指标是:CUDA核心数?时钟频率?内存大小?
虽然一个很好的简化建议就是“注意内存带宽”,但我不再建议这么做了。这是因为GPU硬件和软件经过多年的发展,使得GPU上的带宽不再是其性能的重要指标。在消费级GPU中引入Tensor核心进一步复杂化了这个问题。现在,带宽、FLOPS和Tensor核心的组合才是GPU性能的最重要指标
要加深理解,做出明智的选择,需要了解一下硬件的哪些部分使GPU对于两个最重要的张量运算(矩阵乘法和卷积)更快。
矩阵乘法的一种简单而有效的衡量方法是带宽约束。也就是说,如果要使用LSTM和其他执行大量矩阵乘法的循环网络,那么内存带宽是GPU最重要的特性。
类似地,卷积是通过计算速度来约束的。因此,在GPU上的TFLOP是RESNET和其他卷积架构性能的最佳指标。
Tensor 核直接矩阵运算。它们是非常简单的专用计算单元,可以加速计算,但不能加快存储带宽,因此对于卷积网络,可以看到最大的好处是,卷积网络使用Tensor 核的速度提升30%到100%。
而Tensor核不仅使计算速度更快,他们还能够使用16位数字的计算。对于矩阵乘法来说,这也是一个很大的优势,因为如果数字是16位而不是32位,那么在相同的存储带宽下,可以传输矩阵中两倍的数字。这种数字的存储器大小减少对于在L1高速缓存中存储更多的数字尤其重要,这进一步提高了速度,矩阵乘法中的矩阵越大。一般情况下,人们希望使用张量核加速LSTM提升约20%到60%。
请注意,这种加速不是来自张量核本身,而是来自它们做16位计算的能力。AMD GPU上的16位算法将与具有张量核的NVIDIA卡上的矩阵乘法算法一样快。
张量核的一个大问题是它们需要16位浮点输入数据,这可能会碰到一些软件支持问题,因为网络通常使用32位值。如果没有16位输入,张量核将是无用的。然而,我认为,这些问题将很快得到解决,因为张量核心功能强大,无法保持不使用,并且现在它们可用于消费级GPU,我们将看到越来越多的人使用它们。注意,随着16位深度学习的引入,由于参数加倍,实际上GPU的内存也会加倍。
因此,总的来说,最好的经验法则是:如果使用RNN,请查看带宽;如果使用卷积,请查看FLOPS;如果负担得起,请获取张量核心(除非必须,否则不要购买Tesla卡)

图2:GPU和TPU的原生性能数据,越高越好。RTX 2080 Ti大约是GTX 1080 Ti的两倍:0.75比0.4。

性价比分析

GPU的性价比可能是选择GPU的最重要标准。我做了一个新的性能效率分析,其中包括内存带宽、TFLOP和张量核。我查看了eBay和亚马逊的价格,并对它们进行了50:50的加权,然后查看了LSTM、CNN以及有无张量核心的性能指标。我获取这些性能数字,并通过归一化的几何平均值将它们加权在一起,以获得平均性能评级,然后使用该评级计算性能/成本数字。这就是结果:

图3:这是内存带宽(RNN)、TFLOP(ConvNets)和张量核心的标准化性能/成本数值,越高越好。RTX 2080的成本比Tesla V100高约5倍。
请注意,RTX 2080和RTX 2080 Ti的编号可能有一点误差,因为不存在硬性能数值。我根据这个硬件下的矩阵乘法和卷积的顶线模型以及来自V100和Titan V的张量核心基准来估计性能。请注意,RTX 2070可以轻松击败其他两个RTX卡的成本效率,但我没有数据来支持这一点。
当RTX 2080和RTX 2080 TI发布时,我将在下个月更新这些性能和价格。到那时,应该有足够的信息关于这些卡的深度学习性能,并且关于RTX 2070的进一步信息应该可用来作出准确的估计。
从初步数据,我们看到RTX 2080比RTX 2080 TI更具性价比。RTX 2080 Ti的张量核心和带宽增加了大约40%,价格提高了50%,但是这并没有将性能提高40%。对于LSTM和其他RNN,从GTX 10系列到RTX 20系列的性能增益主要是进行16位浮点计算的能力,而不是张量核本身。卷积理论上应与张量核成线性关系,但我们从性能数看不到这一点。这表明,卷积架构中不能用张量核辅助的其他部分对总体计算要求作出了重大贡献。因此,RTX 2080更具成本效益,因为它具有比GTX 10系列提供更好的性能(GDDR6+张量核心)所需的所有特性,同时还比RTX 2080 Ti便宜。
此外,请注意,这种分析存在一些问题,并且需要仔细解释这些数据:(1)如果您购买性价比高但速度较慢的卡,那么在某些时候,您的计算机可能不再有空间容纳更多的GPU,从而浪费资源。因此,这张图表偏向昂贵的GPU。为了克服这种偏差,还应该评估原始性能图表2。(2)此性能/成本图也假设只要有可能,就使用16位计算和张量核。这意味着32位计算RTX卡具有非常差的性能/成本比。(3)有传言说RTX系列20卡的大量库存由于数字货币的急剧下降而被推迟。因此,流行的挖矿GPU,如GTX 1080和GTX 1070,可能在价格上快速下降,并且它们的性能/成本比率可能快速提高,使得RTX 20系列在性能/成本方面不太有利。另一方面,大量的RTX系列20卡将保持他们的价格稳定和竞争力。很难预测结果会怎样。(4)如前所述,RTX卡不存在硬性、无偏的性能数值,因此所有这些数字都必须严格遵守。
所以你可以看到做出正确的选择是不容易的。但是,如果你对所有这些问题持平衡的观点,那么下面的建议是合理的。

通用GPU推荐

目前,我将推荐两种不同的主要策略:(1)购买RTX并保存2年多;(2)找一个便宜的GTX 1080/1070/1060或GTX 1080 Ti/GTX 1070 Ti,因为人们会把他们的二手卡放在eBay上出售,并持有GPU一段时间,直到更好的卡被释放。RTX TITAN发布在2019 Q1/Q2,然后销售和升级。
我们已经等待GPU升级相当一段时间了,对于许多人来说,第一种策略可能最适合现在获得良好的性能。虽然RTX 2080的成本效益更高,但RTX 2080 Ti提供更多的内存,这可能是计算机视觉研究人员和其他内存密集型应用的决定性因素。两张牌都是明智的解决方案。主要问题是:在RTX 2080 TI上需要额外的内存吗?记住,这个卡通常使用16位模式,这实际上是可用内存的两倍。如果不需要额外的内存,可以使用RTX 2080。
有些人想要更大的升级,等待RTX TITAN。这也可能是一个不错的选择,因为GTX 10系列卡可能会下跌的价格。我不会推荐任何具体的GPU在这里,因为价格太不稳定-只要抓住任何便宜的,现在相对于过去的几个星期。请注意,GTX 1060有时可能缺乏某些型号所需的内存和速度,所以如果您找到便宜的GTX 1060,首先考虑速度和6GB内存是否真正满足您的需要。否则,便宜的GTX 1070、GTX 1070 Ti、GTX 1080和GTX 1080 TI都是很好的选择。
对于初创公司,Kaggle的参赛者,以及那些想深入学习的人,我绝对会推荐便宜的GTX系列10卡。对于所有这些应用领域,GTX 1060可以是一个非常有性价比的入门解决方案,可以让您开始。
对于那些学习如何快速进行深度学习的人来说,多个GTX 1060可能是完美的,一旦你的技能很好,你可以在2019年升级到RTX Titan,并保持GPU几年。
如果你缺钱,我推荐GTX 1050 TI,内存4 GB,或者你能负担得起GTX 1060。注意,GTX 1050 Ti的优点是,您不需要来自PSU的额外的PCIe电源连接器,因此您可能能够将其插入到现有计算机中,从而无需PSU升级即可开始深入学习,从而节省了额外的资金。
如果你缺钱,但是你知道12GB的内存对你很重要,那么eBay的GTX Titan X(Pascal)也是一个很好的选择。
然而,大多数研究人员都可以用GTX 1080 Ti工作的很好。大多数研究和大多数应用程序不需要一个额外的GB内存,它比GTX TITAN X(Pascal)快。
我个人将购买一个RTX 2080 TI,因为升级我的GTX Titan X(Maxwell框架)早就过时了。我需要更多的内存来进行研究,所以RTX 2080不是我的选择。我还将开发自定义张量核心算法,对我而言只能使用RTX 2080 TI。所以RTX 2080 Ti是我的最佳选择,但这并不意味着它是最好的选择。
当你选择GPU时,你应该以类似的方式推理。想想你在什么任务上工作(内存需求)以及你如何运行你的实验(几个快速的,或者多个慢的,或者原型,然后扩展到云),也考虑未来(未来的GPU RTX 2070或者RTX Titan对我感兴趣吗?便宜的GTX 10系列卡对我有意思吗?)然后尝试找到一个符合这些要求的GPU。

云上的深度学习

在谷歌云上的AWS和TPU上的GPU实例都是深入学习的可行选择。虽然TPU有点便宜,但它缺乏AWS GPU的多功能性和灵活性。TPU可能是训练对象识别流水线的首选武器。对于其他工作负载,AWS GPU是一个更保险的做法——云实例的好处是可以随时在GPU和TPUs之间切换,甚至同时使用两者。
但是,注意这里的成本收益:如果你学会了使用AWS实例流畅的工作流程,你就失去了在个人GPU上工作的时间,而且你也没有获得使用TPU的技能。如果你使用个人GPU,你就没有能力通过云扩展到更多的GPU/TPU。如果你使用TPU,你会被TensorFlow所困扰,切换到AWS并不简单。学习流畅的云工作流是昂贵的,如果你为TPU或AWS GPU做出选择,你应该权衡这个成本。
另一个问题是关于何时使用云服务。如果你尝试学习深度学习,或者你需要原型,那么个人GPU可能是最好的选择,因为云实例是昂贵的。然而,一旦你找到了一个很好的深度网络配置,并且你只想用一个与云实例并行的数据来训练一个模型是一个坚实的方法。这意味着一个小的GPU将足以用于原型,并且人们可以依靠云计算的能力来扩展到更大的实验。
如果您缺钱,云计算实例也许也是一个很好的解决方案,但是问题是,当您只需要少量的原型时,您只能每小时购买大量的计算。在这种情况下,人们可能希望在CPU上进行原型化,然后在GPU/TPU实例上进行快速训练运行。这不是最好的工作流程,因为在CPU上进行原型测试可能是非常痛苦的,但这是一个成本收益最佳的解决方案。

结论

有了这个博客文章中的信息,你应该能够知道哪一个GPU适合你。一般来说,我认为有两种主要的策略是有意义的:第一,使用RTX 20系列GPU进行快速升级,第二,使用便宜的GTX 10系列GPU并在RTX Titan可用时进行升级。如果性能不太重要,或者只是不需要性能,例如Kaggle、初创公司、原型,或者学习深度学习,那么您也可以从廉价的GTX 10系列GPU中受益匪浅。如果你使用GTX 10系列要注意GPU的内存大小是否满足你的要求。

建议

性能最佳的GPU:RTX 2080 Ti
性价比高的高端GPU:RTX 2080,GTX 1080
性价比高的低端GPU:GTX 1070,GTX 1070 TI,GTX 1060
我使用的数据集> 250GB:RTX 2080 TI或RTX 2080
我有一点钱:GTX 1060(6GB)
我几乎没有钱:GTX 1050 TI(4GB)或CPU(原型)+AWS/TPU(培训)
我做Kaggle:GTX 1060(6GB)用于原型,AWS进行最终训练;使用FASTAI库(PyTorch)
我是一个有竞争力的计算机视觉研究者:GTX 2080 TI;2019升级到RTX TITAN
我是一个研究者:RTX 2080 TI或GTX 10XX-RTX TITAN——检查当前模型的内存需求
我想构建一个GPU集群:这真的很复杂,你可以在这里得到一些想法
我开始深度学习,我对此很深入:从GTX 1060(6GB)或便宜的GTX 1070或GTX 1070 Ti开始,如果你能找到的话。根据你接下来选择的领域(创业、Kaggle、研究、应用深度学习)卖出你的GPU并买一些更合适的东西
我想尝试深度学习,但我并不深入:GTX 1050 TI(4或2GB)

转自:http://timdettmers.com/2018/08/21/which-gpu-for-deep-learning/