前言:
现时朋友们对“python中的nan”大概比较看重,小伙伴们都需要学习一些“python中的nan”的相关文章。那么小编在网络上网罗了一些关于“python中的nan””的相关资讯,希望姐妹们能喜欢,咱们一起来学习一下吧!深度学习是一个计算要求非常高的领域,你对 GPU 的选择将从根本上决定你的深度学习体验。但是,如果你想购买一块新 GPU,主要看哪些特性呢?GPU 内存、内核、张量核?如何做出有成本效益的选择?这篇文章将深入研究这些问题,消除常见的误解,让你对如何考虑 GPU 有一个直观的理解,并提供建议,帮助你做出正确的选择。
前排提醒:本文字数约为 15000,阅读时间较长,可收藏后慢慢阅读。
嫌长不看,先放结论
总体最好的 GPU:RTX 3080 和 RTX 3090。
(个人)避免使用的 GPU:任何 Tesla 卡;任何 Quadro 卡;任何 Founders Edition 卡;Titan RTX、Titan V、Titan XP。
颇具成本效益而价格高昂:RTX 3080。
颇具成本效益而价格较便宜:RTX 3070、RTX 2060 Super。
我钱不多:购买二手卡,RTX 2070(400)、RTX2060(400)、RTX2060(300)、GTX 1070(220)、GTX1070Ti(220)、GTX1070Ti(230)、GTX 1650 Super(190)、GTX980Ti(6GB190)、GTX980Ti(6GB150)。
我几乎没钱:有许多创业公司在推广他们的云:使用免费的云积分,并在不同公司的账户之间来回切换,直到能买得起一块 GPU。
我做 Kaggle:RTX 3070。
我是一名有竞争力的计算机视觉、预训练或机器翻译研究人员:4x RTX 3090。务必要等到有了良好的冷却和足够的电力后(我将更新这篇博文)
我是一名 NLP 研究人员:如果你不从事机器翻译、语言建模或任何类型的预训练工作,那么 RTX 3080 就足够了而且颇具成本效益。
我刚开始接触深入学习,而且我很认真:从一块 RTX 3070 开始。如果你在 6 到 9 个月后仍然很认真,卖掉你的 RTX 3070,并购买 4x RTX 3080。根据你下一步选择的领域(初创公司、Kaggle、研究、深度学习应用),卖掉你的 GPU,三年后再买更合适的(下一代 RTX 40s GPU)。
我想尝试深度学习,但没当真:RTX 2060 Super 就很好,但可能需要使用新电源。如果你的主板有一个 PCIe x16 插槽,并且有一个大约 300W 的电源,那么 GTX 1050 Ti 是一个很好的选择,因为它不需要任何其他计算机组件就可以在你的台式计算机上工作了。
用于模型并行化的、少于 128 个 GPU 的 GPU 集群:如果你可以为你的集群购买 RTX GPU:66% 的 8x RTX 3080 和 33% 的 8x RTX 3090(要确保能有效地冷却)。如果解决不了 RTX 3090 的冷却问题,那么可以购买 33% 的 RTX 6000 GPU 或 8x Tesla A100。如果不能购买 RTX GPU,那么我可能会选择 8x A100 Supermicro 节点或 8x RTX 6000 节点。
用于模型并行化的、128 个 GPU 的 GPU 集群:考虑下 8x Tesla A100 设置。如果你使用超过 512 个 GPU,那么你应该考虑配置一个 DGX A100 SuperPOD 系统,以匹配你的规模。
正文开始
这篇博文旨在让你对 GPU 和 NVIDIA 的 Ampere 系列 GPU 有不同层次的了解。
(1)如果你对 GPU 如何工作、什么让 GPU 速度更快、NVIDIA RTX 30 Ampere 系列 GPU 有什么独特之处等问题的细节不感兴趣,那么你可以跳到性能及每美元性能图表和建议部分。这些是这篇文章的核心和最有价值的内容。
(2)如果你关心具体的问题,我在这篇博文最后一部分回答了最常见的问题,以消除一些误解。
(3)如果你想深入了解 GPU 和张量核是如何工作的,最好是从头到尾阅读这篇文章。根据你对相关主题的了解,你可以跳过一两个小节。
我会在每个主要部分的开头加上一小段总结,希望可以帮助你决定是否要阅读这个部分。
概 述
这篇文章的结构如下。
首先,我将解释是什么使 GPU 速度更快。我将讨论 CPU 与 GPU、张量核、内存带宽、GPU 存储层次以及它们与深度学习性能的关系。对于 GPU 可以提供什么,这些解释可能会帮助你得到一个更直观的认识。
然后,我将对 GPU 的性能进行理论估计,并将其与 NVIDIA 的一些市场基准进行比较,以获得可靠的、无偏差的性能数据。我将讨论新的 NVIDIA RTX 30 Ampere 系列 GPU 的独特特性,如果你购买 GPU,这些特性是值得考虑的。
在此基础上,我提出了 1-2、4、8 GPU 设置和 GPU 集群的 GPU 建议。之后是问答部分,我回答了 Twitter 上常见的问题;在这一节中,我还将讨论一些常见的误解和其他一些五花八门的问题,比如云与桌面对比、冷却方式、AMD 与 NVIDIA 对比等。
GPU 如何工作?
如果你经常使用 GPU,那么了解它们如何工作是很有用的。这些知识有助于你理解为什么 GPU 在某些情况下速度慢而在其他情况下速度快。然后,你可以更好地理解为什么你首先需要一个 GPU,以及其他未来的硬件选项可能会如何竞争。如果你只是想要有用的性能数值和参数,以帮助你决定购买哪个 GPU,那么你可以跳过这一节。对于 GPU 如何工作的问题,最好的高阶解释是我在 Quora 上的回答:
“为什么 GPU 适合深度学习”:
这是一个高阶解释,很好地说明了为什么 GPU 比 CPU 更适合深度学习。如果我们关注细节,就能理解是什么让一个 GPU 比另一个更好。
与处理速度相关的最重要的 GPU 参数
本节可以帮助你更直观地理解如何考虑深度学习的性能。这种理解可以帮助你评估未来的 GPU。
张量核
要点:
张量核将乘法和加法运算所需的 cycle 减少为 1/16——在我举的例子中,对于一个 32×32 的矩阵,从 128 个 cycle 减少到 8 个 cycle。张量核减少了反复共享内存访问的次数,从而节省了额外的内存访问 cycle。张量核速度如此之快,计算不再是瓶颈。唯一的瓶颈是如何将数据传输到张量核中。
现在 GPU 已经足够便宜,几乎每个人都能负担得起一个有张量核的 GPU。这就是为什么我只推荐具有张量核的 GPU。了解它们是如何工作的,有助于理解这些专门用于矩阵乘法的计算单元的重要性。这里我将向你展示一个简单的例子:A*B=C 矩阵乘法,其中,所有矩阵的大小都是 32×32,我们将分别看下,计算模式在有和没有张量核时是什么样的。
要完全理解这一点,就必须理解 cycle 的概念。如果一个处理器以 1GHz 的速度运行,它每秒可以完成 10^9 个 cycle。每个 cycle 都代表一次计算机会。然而,大多数时候,操作所花费的时间会超过一个 cycle。因此,它创建了一个管道,用于启动一个操作,它需要等待前一个操作完成所需的 cycle 数。这也称为操作延迟。
下面是一些重要操作的延迟:
全局内存访问(最高 48GB):~200 cycle共享内存访问(每个串流多处理器最高达 164KB):~20 cycle融合乘加(FFMA):4 cycle张量核矩阵乘法:1 cycle
此外,你应该知道 GPU 上的最小线程单元是一个包含 32 个线程的包——这被称为 warp。通常,warp 以同步模式运行——warp 内的线程必须彼此等待。GPU 上的所有内存操作都针对 warp 进行了优化。例如,从全局内存中加载的粒度为 32*4 字节,恰好有 32 个浮点数,恰好每个线程一个浮点数。在串流多处理器(SM,相当于一个 CPU 内核)中,我们最多可以有 32 个 warp=1024 个线程。SM 的资源被分配给所有活动的 warp。所以,有时我们想要运行较少的 warp,这样每个 warp 就有更多的寄存器 / 共享内存 / 张量核资源。
对于下面的两个例子,我们假设计算资源相同。对于这个 32×32 矩阵乘法的小例子,我们使用 8 个 SM(约为 RTX 3090 的 10%),每个 SM 8 个 warp。
矩阵乘法(无张量核)
如果我们想做一个 A*B=C 的矩阵乘法,其中每个矩阵的大小是 32×32,那么我们会希望将反复访问的内存加载到共享内存中,因为它的延迟大约是前者的 1/10(200cycle vs 20 cycle)。通常,共享内存中的内存块被称为 memory tile 或只是 tile。使用 2*32 warp,可以并行地将两个 32 *32 浮点数矩阵加载到共享内存块中。我们有 8 个 SM,每个 SM 有 8 个 warp,因此,得益于并行化,我们只需要执行一次从全局内存到共享内存的顺序加载,这需要 200 个 cycle。
为了进行矩阵乘法,我们现在需要从共享内存 A 和共享内存 B 加载一个包含 32 个数值的向量,并执行一个融合乘加(FFMA)。然后将输出存储在寄存器 C 中。我们将工作划分为这样一种方式,即每个 SM 做 8x 点积(32×32)来计算 C 的 8 个输出。为什么这恰好是 8(在旧算法中是 4)有很强的技术性。这一点,我建议你阅读 Scott Gray 关于矩阵乘法的博文来理解。这意味着,我们有 8 次共享内存访问,每次 20 个 cycle,8 次 FFMA 操作,每次 4 个 cycle。因此,总开销是:
200 cycle(全局内存)+ 8*20 cycle(共享内存)+ 8*4 cycle(FFMA)= 392 cycle
下面让我们看下使用张量核时需要多少开销。
矩阵乘法(有张量核)
利用张量核,我们可以在一个 cycle 内执行 4×4 矩阵乘法。要做到这一点,我们首先需要把内存读到张量核中。与上面类似,我们需要从全局内存(200 cycle)读取数据并存储在共享内存中。要做一个 32×32 矩阵乘法,我们需要执行 8×8=64 次张量核运算。一个 SM 有 8 个张量核,因此,我们总共有 64 个张量核——这正是我们需要的数量!我们可以通过 1 次内存传输(20 cycle)将数据从共享内存传输到张量核,然后进行 64 次并行张量核操作(1 cycle)。这意味着,在这种情况下,张量核矩阵乘法的总开销为:
200 cycle(全局内存)+ 20 cycle(共享内存)+ 1 cycle(Tensor Core)= 221 cycle
因此,我们通过张量核将矩阵乘法的开销从 392 个 cycle 大幅降低到 221 个 cycle。在这种情况下,张量核降低了共享内存访问和 FFMA 操作的成本。
在这个例子中,有和没有张量核都大致遵循相同的计算步骤,请注意,这是一个非常简化的例子。在实际情况下,矩阵乘法涉及到更大的共享内存块,计算模式也稍微不同。
不过我相信,通过这个例子,我就很清楚为什么内存带宽对于配备张量核的 GPU 来说如此重要。在使用张量核进行矩阵乘法时,全局内存是 cycle 开销中最重要的部分,如果可以降低全局内存延迟,我们甚至可以拥有速度更快的 GPU。要做到这一点,我们可以通过增加内存的时钟频率(增加每秒 cycle 数,但也会增加发热和电量消耗)或增加每次可以转移的元素数量(总线宽度)。
内存带宽
从上一节我们已经看到,张量核非常快。事实上,它们大部分时间都是空闲的,因为需要等待数据从全局内存读到共享内存。例如,在 BERT 大型训练中,它使用非常大的矩阵——对于张量核来说,越大越好——我们的 Tensor Core TFLOPS 利用率大约为 30%,也就是说,70% 的时间张量核都是空闲的。
这意味着,当比较两个具有张量核的 GPU 时,GPU 性能的最佳指标之一就是它们的内存带宽。例如,A100 GPU 的内存带宽为 1555 GB/s,而 V100 的是 900 GB/s。因此,基本可以估计 A100 的速度是 V100 的 1555/900 = 1.73 倍。
共享内存 / L1 缓存大小 / 寄存器
由于内存传输到张量核是性能的限制因素,所以我们正在寻找其他可以提升内存到张量核传输速度的 GPU 属性。这和共享内存、L1 缓存以及使用的寄存器数量有关。理解存储层次结构如何带来更快的内存传输,有助于理解矩阵乘法在 GPU 上如何执行。
为了执行矩阵乘法,我们利用了 GPU 的存储层次结构,从慢的全局内存到快的本地共享内存,再到快如闪电的寄存器。然而,越快的存储越小。因此,我们需要将矩阵分割成更小的矩阵,并在本地共享内存中通过这些更小的块执行矩阵乘法,它们速度快,并且接近于串流多处理器(SM)——相当于 CPU 内核。对于张量核,我们更进一步:我们取每个块并将其中的一部分装入张量核中。共享内存中的矩阵 memory tile 比 GPU 全局内存快大约 10-50 倍,而张量核的寄存器比 GPU 全局内存快 200 倍。
拥有更大的 tile 意味着我们可以重用更多的内存。我在博文 TPU vs GPU 中详细探讨了这个问题。实际上,你可以将 TPU 看作是每个张量核都有非常非常大的 tile。因此,TPU 在每次从全局内存传输数据时都可以重用更多的内存,这使得它们在矩阵乘法计算方面比 GPU 更有效率。
每个块的大小是由每个串流多处理器(SM,相当于 GPU 上的一个“CPU 内核”)的内存大小决定的。在以下架构中,我们有以下共享内存大小:
Volta:96kb 共享内存 / 32 kb L1Turing:64kb 共享内存 / 32 kb L1Ampere:164kb 共享内存 / 32 kb L1
我们看到,Ampere 的共享内存更大,块大小就更大,这减少了全局内存访问延迟。因此,Ampere 可以更好地利用 GPU 存储的总体内存带宽。这将提高大约 2-5% 的性能。对于大型矩阵,性能的提升尤其明显。
Ampere 张量核的另一个优点是它们在线程之间共享更多的数据。这减少了寄存器的使用。寄存器被限制为每个串流多处理器(SM)64k 或每个线程 255。比较 Volta 和 Ampere 张量核,Ampere 张量核使用 1/3 的寄存器,允许更多张量核在共享内存的每个块上活动。换句话说,我们可以用相同数量的寄存器支撑 3 倍的张量核。然而,由于带宽仍然是瓶颈,所以实际的 TFLOPS 与理论的 TFLOPS 相比,只会有微小的提高。新的张量核提高了大约 1-3% 的性能。
总的来说,我们可以看到,Ampere 的架构经过优化,它使用改进后的存储层次结构(从全局内存到共享内存块,再到张量核寄存器),使可用内存带宽更加有效。
评估 Ampere 的深度学习性能
要点:
根据内存带宽和 Ampere GPU 改进的存储层次估计,理论上,其速度提升 1.78 倍到 1.87 倍。NVIDIA 提供了 TeslaA100 和 V100 GPU 的准确基准测试数据。这些出于营销目的数据存在偏差,但是可以建立这些数据的去偏模型。去偏基准测试数据显示,Tesla A100 在 NLP 方面比 V100 快 1.70 倍,在计算机视觉方面比 V100 快 1.45 倍。
如果你想了解我如何评估 Ampere GPU 性能的更多技术细节,那么本节就是为你准备的。如果你不关心这些技术方面,则可以跳过此部分。
Ampere 速度的理论估计
综上所述,我们认为,两种配备张量核的 GPU 架构之间的差异主要在于内存带宽。使用张量核的其他好处包括更多的共享内存 /L1 缓存和更好的寄存器。
如果我们将 TeslaA100GPU 带宽与 TeslaV100 GPU 带宽相比较,我们得到的速度提升为 1555/900 = 1.73 倍。此外,我希望从更大的共享内存中得到 2-5% 的加速,从改进的张量核中得到 1-3% 的加速。这使得速度提升在 1.78 倍和 1.87 倍之间。用类似的推理方法,你就可以估计 Ampere 系列其他 GPU 与 TeslaV100 相比的速度提升。
Ampere 速度的实际估计
假设我们有针对一种 GPU 架构的估计,如 Ampere、Turing 或 Volta,我们就可以很容易地将这些结果推到相同架构 / 系列的其他 GPU 上。幸运的是,NVIDIA 已经在广泛的计算机视觉和自然语言理解任务中对 A100 和 V100 进行了基准测试。遗憾的是,NVIDIA 使用了不同的批次大小和 GPU 数量,使得这些数值无法直接进行比较,从而得出有利于 A100 的结果。所以,在某种意义上,这些基准数据部分是真实的,部分是市场数据。一般来说,你可能会认为,更大的批次大小才公平,因为 A100 有更多的内存,但是为了比较 GPU 架构,我们应该评估批次大小相同时的无偏内存性能。
为了得到无偏估计,我们可以通过两种方式对 V100 和 A100 结果进行缩放:
(1)考虑批次大小差异,(2)考虑使用 1 个 GPU 和 8 个 GPU 的差异。幸运的是,我们能在 NVIDIA 提供的数据中找到对这两种偏差的估计。
批次大小增加一倍使吞吐量增加 13.6%(CNN,以每秒图像数为单位)。我在 RTX Titan 上针对同样的问题测试了 Transformer,惊奇地发现了同样的结果:13.5%——这似乎是一个可靠的估计。
当我们将网络在更多的 GPU 上并行化时,由于一些网络开销,我们会损失性能。与 V100 8x GPU 系统(NVLink 2.0)相比,A100 8x GPU 系统有更好的网络(NVLink 3.0)——这是另一个令人困惑的因素。直接查看 NVIDIA 的数据,我们可以发现,对于 CNN 来说,8x A100 系统比 8x V100 系统开销低 5%。这意味着,从 1x A100 到 8xA100 可以获得 7 倍的速度提升,而从 1x V100 到 8xA100 可以获得 6.67 倍。对于 Transformer 来说,这个数值是 7%。
使用这些数据,我们可以从 NVIDIA 提供的直接数据中估算其对于一些特定深度学习架构的速度提升。与 Tesla V100 相比,Tesla A100 可以提供以下速度提升:
SE-ResNeXt101:1.43 倍Masked-R-CNN:1.47 倍Transformer(12 层, 机器翻译, WMT14 en-de):1.70 倍
因此,对于计算机视觉来说,这些数值比理论估计要低一些。这可能是由于张量维数较小,准备矩阵乘法(如 img2col 或快速傅里叶变换(FFT))所需的操作开销,或者操作无法充分利用 GPU(最后的层通常相对较小)。它也可以是特定架构的工件(分组卷积)。
Transformer 实际估计值与理论估计值非常接近。这可能是因为大型矩阵的算法非常简单。我将使用这些实际的估计来计算 GPU 的成本效率。
估计中可能存在的偏差
上面是对 A100 和 V100 的对比估计。过去,NVIDIA“游戏”GPU RTX 出现了性能偷偷下降的问题:(1)降低张量核利用率,(2)风扇散热,(3)禁用对等 GPU 传输。与 Ampere A100 相比,RT 30 系列可能有未公布的性能下降。有了消息,我会更新这篇博文。
Ampere / RTX 30 系列的其他考虑因素
要点:
Ampere 可以用于稀疏网络训练,它最高可以将训练速度提高 2 倍。稀疏网络训练仍然很少使用,但将使 Ampere 可以经受住未来的考验。Ampere 有新的低精度数据类型,这使得使用低精度数值更容易,但不一定比以前的 GPU 更快。新的风扇设计非常棒,如果你的 GPU 之间有间隙的话,但不清楚如果多个 GPU 之间没有间隙,它们是否能有效冷却。RTX3090 的 3 插槽设计使得 4x GPU 构建成为问题。可能的解决方案是 2 插槽转换或使用 PCIe 扩展器。4x RTX 3090 需要的电量比目前市场上任何标准电源单元所能提供的电量都多。
与 NVIDIA Turing RTX 20 系列相比,新的 NVIDIA Ampere RTX30 系列具有额外的优点,如稀疏网络训练和推理。其他特性,比如新的数据类型,更多的是易用性特性,因为它们提供了和 Turing 一样的性能提升,但是不需要任何额外的编程。
稀疏网络训练
Ampere 可以以稠密矩阵的速度进行细粒度结构自动稀疏矩阵乘法。它的工作原理是,如果有一个矩阵,你把它分割成 4 个元素,现在,稀疏矩阵张量核特性允许这 4 个元素中的 2 个为零。这就带来了 2 倍的速度提升,因为矩阵乘法的带宽需求减半了。
我以前研究过稀疏网络训练。对于我的工作,有一种批评是“你减少了网络所需的FLOPS,但却没能带来速度的提升,因为GPU 不能做快速稀疏矩阵乘法。”那好吧,加上张量核的稀疏矩阵乘法特性,我的算法,或者其他的稀疏训练算法,现在在实际的训练中提供了2 倍的速度提升。
虽然这个特性还在实验阶段,训练稀疏网络还不是很普遍,但GPU 拥有这个特性意味着你已经为未来的稀疏训练做好了准备。
低精度计算
在我之前的工作中,我已经展示过,新数据类型可以提高低精度反向传播的稳定性。目前,如果你想要实现16 位浮点数(FP16)的稳定反向传播,主要问题是普通FP16 数据类型只支持[-65504,65504] 区间内的数值。如果梯度超出这个范围,就会变成NaN 值。为了防止在FP16 训练期间发生这种情况,我们通常会进行损失缩放,即在反向传播之前将损失乘以一个小数值,以防止这种梯度爆炸。
Brain Float 16 格式(BF16)使用更多的位作为指数,这样,其可能的数值范围与 FP32 相同:[-3*10^38,3*10^38]。BF16 的精度较低,但梯度精度对学习来说并不是那么重要。所以 BF16 所做的就是你不再需要做任何损失缩放或者担心梯度迅速膨胀。因此,我们可以看到使用 BF16 格式时训练稳定性的提高,只是精度稍有降低。
这意味着:使用 BF16 精度,训练可能比 FP16 精度更稳定,而提供了同等的速度提升。使用 TF32 精度,可以得到接近 FP32 的稳定性,接近 FP16 的速度提升。好的方面是,要使用这些数据类型,只需将 FP32 替换为 TF32,将 FP16 替换为 BF16——不需要修改代码!
不过,总的来说,这些新数据类型可以被视为懒惰数据类型,因为通过一些额外的编程工作(适当的损失缩放、初始化、归一化、使用 Apex),使用旧数据类型就可以获得所有这些好处。因此,这些数据类型并不提供速度提升,而是提高了低精度训练的易用性。
新的风扇设计 / 散热问题
RTX 30 系列新的风扇设计包括一个鼓风扇和一个推挽式风扇。设计很巧妙,如果你的 GPU 之间有间隙,也会非常有效。然而,如果你把 GPU 堆在一起,就不清楚它们表现如何了。鼓风扇将能够通过远离其他图形处理器的支架排气,但也没法说那多有效,因为鼓风扇的设计和以前不同。在一个 4 PCIe 插槽设置中,如果你想购买 1 到 2 个 GPU,那应该没问题。然而,如果你打算同时使用 3 到 4 个 RTX 30 GPU,那么我需要等散热性能报告出来,了解下是否需要不同的 GPU 冷却器、PCIe 扩展器或其他解决方案。到时候我会更新这篇博文。
为了克服散热问题,水冷在任何情况下都可以提供一个解决方案。许多厂商为 RTX 3080/RTX 3090 卡提供水冷模块,即使在 4x GPU 设置中也能保持低温。如果你想运行一个 4x GPU 设置,可以留心下一体化水冷却解决方案,因为在大多数桌面情况下散热器都很难分散开。
冷却问题的另一个解决方案是购买 PCIe 扩展器,并将 GPU 在机箱内分散开。这非常有效,华盛顿大学的其他博士生和我使用这个设置都非常成功。那看起来不漂亮,但它可以使你的 GPU 保持凉爽!即使你没有足够的空间来将 GPU 分散开,它还是可以帮到你。例如,如果你可以在一个台式电脑的机箱中找到空间,那么你或许就可以购买标准的 3 槽宽 RTX 3090,并在机箱中使用 PCIe 扩展器来把它们分散开。这样,你就可以通过一个简单的解决方案解决了 4x RTX 3090 设置中的空间问题和冷却问题。
3 插槽设计和电量问题
RTX 3090 是一个 3 插槽 GPU,所以你不能在 4x 设置中使用 NVIDIA 的默认风扇设计。这是合理的,因为它运行在 350W TDP 下,在多 GPU 2 插槽设置中很难降温。RTX 3080 运行在 320W TDP 下只稍好一点,而冷却一个 4x RTX 3080 设置也会非常困难。
在 4x RTX 3090 设置下为一个 4x350w = 1400W 系统供电也很困难。1600W 的供电单元(PSU)很容易获得,但只有 200W 是给 CPU 供电,主板用电可能太紧。只有在元件获得充分利用的情况下,才会达到最大电量,而在深度学习中,CPU 通常只处于弱负载状态。这样,一个 1600W 的 PSU 就可以很好地为一个 4x RTX 3080 构建供电,但是对于一个 4x RTX 3090 构建,最好是找一个高瓦数的 PSU(+1700W)。目前,在台式电脑市场上似乎没有一个 PSU 超过 1600W。服务器或加密货币挖矿 PSU 可能可以解决这个问题,但可能外形奇怪。
GPU 深度学习性能
下面的基准测试不仅包括 Tesla A100 和 Tesla V100 的基准测试,我还构建了一个适合这些数据的模型,以及基于 Titan V、Titan RTX、RTX 2080 Ti 和 RTX 2080 的四个不同的基准测试。[ 1 , 2 , 3 , 4 ]
除此之外,我还通过在基准数据的这些数据点之间进行插值扩展了 RTX 2070、RTX 2060 卡或是 Quadro RTX 6000&8000 卡。通常,在同一个架构中,GPU 的扩展与串流多处理器和带宽成线性关系,而我的架构模型就是以此为基础。
我只收集了混合精度 FP16 训练的基准数据,因为我相信,没有充分的理由使用 FP32 训练。
与 RTX 2080 Ti 相比,RTX 3090 将卷积网络的速度提高了 1.57 倍,将 Transformer 的速度提高了 1.5 倍,与此同时,定价也涨了 15%。因此,与 Turing RTX 20 系列相比,Ampere RTX 30 提供了一个非常实质性的改进。
GPU 深度学习的每美元性能
什么 GPU 能给你带来最好的回报?这取决于整个系统的成本。如果你有一个成本高昂的系统,那么投资更昂贵的 GPU 是有意义的。
这里有三个 PCIe 3.0 构建,我用它作为 2/4 GPU 系统的基础成本,然后再加上 GPU 成本。GPU 成本是 GPU 在亚马逊和 eBay 上成本的均值。对于新的 Ampere GPU,我使用了定价。结合上文给出的性能值,就可以得出这些 GPU 系统的每美元性能值。对于 8 GPU 系统,我使用 Supermicro barebone 作为基准成本——这是 RTX 服务器的行业标准。请注意,这些柱状图没有考虑内存需求。你应该首先考虑自己的内存需求,然后在图表中寻找最佳选项。关于内存,这里有一份大致的指南:
使用预训练的 Transformer;从头开始训练小型 Transformer:>= 11GB在研发 / 生产环境中训练大型 Transformer 或卷积网络:>= 24 GB开发神经网络原型(Transformer 或卷积网络):>= 10 GBKaggle 竞赛:>= 8 GB计算机视觉应用:>= 10GBGPU 推荐
我需要再次强调的第一件事是:在选择 GPU 的时候,你需要确保它有足够的内存来完成你想做的事情。选择 GPU 应该按下面的步骤来:
我想用 GPU 做什么:Kaggle 竞赛、学习深度学习、破解小项目(GAN 还是大型语言模型?)、计算机视觉 / 自然语言处理 / 其他领域研究,或者其他什么?我要做的事需要多大内存?使用上面的成本 / 性能图找出满足内存标准的、最适合你的 GPU。对于我选择的 GPU 有其他的注意事项吗?例如,如果是 RTX 3090,我能把它装进我的电脑吗?对于我选的 GPU,我的电源单元(PSU)功率是否足够?散热会是问题吗?或者我能以某种方式有效地冷却 GPU 吗?
其中一些细节需要你自我反省你想要什么,也许可以研究一下,对于你的兴趣领域,其他人使用多大内存的 GPU。我可以提供一些指导,但无法面面俱到。
我什么时候需要 >= 11 GB 的内存?
我之前提到过,如果你使用 Transformer,那么你至少应该有 11GB 的内存,如果你研究 Transformer,则内存 >= 24GB 更好。这是因为之前大多数经过预训练的模型都有相当高的内存要求,而且这些模型至少是使用拥有 11 GB 内存的 RTX 2080 Ti GPU 进行训练。因此,小于 11GB 可能会遇到难以或不可能运行某些模型的情况。
其他需要大量内存的领域包括医学成像、一些最先进的计算机视觉模型以及任何有超大图像的东西(GAN,样式转换)。
一般来说,如果你想建立一个模型并据此获得竞争优势,无论是研究、行业还是 Kaggle 竞赛,额外的内存可能会为你带来优势。
什么时候内存可以 <11 GB ?
RTX 3070 和 RTX3080 是非常强大的卡,但它们内存有点小。不过,对于许多任务,你不需要那么大的内存。
如果你想学习深度学习,那么 RTX 3070 就很完美。这是因为训练大多数架构的基本技能都可以通过将它们缩小一点或者使用小一点的输入图像来学习。如果我再次学习深度学习,我可能会使用一个 RTX 3070,如果有多余的钱,甚至会用多个。
RTX 3080 是目前为止最具成本效益的卡,因此是原型设计的理想选择。对于原型设计,你想要内存最大的,这仍然很便宜。这里所说的原型设计可以是在任何领域的原型设计:研究、Kaggle 竞赛、为创业公司出主意 / 设计模型、试验研究代码。对于所有这些应用程序,RTX 3080 都是最好的 GPU。
假设我将领导一个研究实验室 / 创业公司。我将把 66-80% 的预算投入到 RTX 3080 机器上,20-33% 用于配备了强大水冷装置的 RTX 3090 机器。我的想法是,RTX 3080 的成本效益更高,可以作为原型机,通过 slurm 集群设置来共享。因为原型设计应该以敏捷的方式完成,所以应该使用较小的模型和数据集。RTX 3080 非常适合这个场景。一旦学生 / 同事获得了一个很好的原型模型,他们就可以将原型转移到 RTX 3090 机器上,并将其扩展为更大的模型。
一般建议
总的来说,RTX 30 系列非常强大,我强烈推荐这些 GPU。如前一节所述,要注意内存,还要注意电源和冷却需求。如果你的 GPU 之间有一个 PCIe 插槽,则冷却将没有任何问题。否则,如果使用 RTX 30 卡,请准备好水冷装置、PCIe 扩展器或有效的鼓风扇卡(未来几周的数据将会说明,NVIDIA 的风扇设计是足够的)。
一般来说,我会推荐 RTX 3090 给任何买得起它的人。不仅是现在,未来 3-7 年它都将是一个非常有效的卡。因此,这是一项将保持强劲增长的好投资。HBM 内存三年内不太可能变便宜,所以下一个 GPU 只会比 RTX 3090 好 25% 左右。我们可能会在 5-7 年内看到廉价的 HBM 内存,在那之后,你肯定想要升级。
如果你有多个 RTX 3090,请确保你选择的解决方案可以提供有效的冷却和足够的电力。对于什么样的设置合适,我将随着可用数据的增加更新关于这个问题的博文。
对于没有强烈竞争需求的企业(研究公司、Kaggle 竞赛、竞争性初创公司),我推荐 RTX 3080。这是一个更经济的解决方案,并将确保大多数网络的训练都足够快。如果你使用了合适的内存技巧,并且不介意额外进行编程,那么现在有足够的技巧将一个 24GB 的神经网络适配到 10GB 的 GPU 上。因此,如果你接受一些不确定性和额外的编程,那么 RTX 3080 也可能是比 RTX 3090 更好的选择。
一般来说,对于学习深度学习和原型设计,RTX 3070 也是一种可靠的卡,它比 RTX 3080 便宜 200 美元。如果你负担不起 RTX3080,那么 RTX3070 是最好的选择。
如果你的预算有限,而 RTX 3070 又太贵,那么一个二手 RTX 2070 在易趣上大约要 260 美元。现在还不清楚是否会推出 RTX 3060,但如果你的预算有限,可能也值得再等一段时间。如果定价与 RTX 2060 和 GTX 1060 类似,那么预计其价格将在 250 美元到 300 美元之间,而且性能相当强劲。
GPU 集群建议
GPU 集群设计高度依赖于用途。对于一个 +1024 GPU 系统,网络最重要,但在这样的系统上,如果用户一次最多只使用 32 个 GPU,投资强大的网络基础设施就是浪费。在这里,我将使用类似原型推广的推理,如在 RTX 3080 和 RTX 3090 案例对比中所做的那样。
一般来说,因为 CUDA 许可协议,RTX 卡被禁止进入数据中心。然而,大学通常可以得到这个规则的豁免。与英伟达的人取得联系请求豁免权是值得的。如果你被允许使用 RTX 卡,那么我建议使用配备了 RTX 3080 或 RTX 3090 GPU 的标准 Supermicro 8 GPU 系统(如果可以保证有效冷却)。一组 8x A100 节点就可以确保在原型化之后有效地“推广”,特别是在不能保证 8x RTX 3090 服务器能够得到充分冷却的情况下。在这种情况下,我建议使用 A100 而不是 RTX 6000 / RTX 8000,因为 A100 非常划算,而且是面向未来的。
如果你想在一个 GPU 集群(+256 个 GPU)上训练非常大的网络,我推荐配备了 A100 GPU 的 NVIDIA DGX SuperPOD 系统。在 +256 GPU 的规模下,网络变得至关重要。如果你想扩展到超过 256 个 GPU,那么你将需要一个高度优化的系统,把标准解决方案攒在一起就不在有效了。
特别是在 +1024 GPU 的规模上,市场上唯一具有竞争力的解决方案是谷歌 TPU Pod 和 NVIDIA DGX SuperPod。在这个规模上,我更喜欢谷歌 TPU Pod,因为他们定制的网络基础设施似乎优于 NVIDIA DGX SuperPod 系统——尽管这两种系统非常接近。比起 TPU 系统,GPU 系统为深度学习模型和应用提供了更多的灵活性,而 TPU 系统支持更大的模型,并提供更好的伸缩性。所以两种系统都有各自的优点和缺点。
不要买这些 GPU
我不建议购买多个 RTX Founders Editions 或 RTX Titans,除非你有 PCIe 扩展器可以解决它们的冷却问题。它们运行时很容易过热,其性能将远远低于上文图表中的数值。4x RTX 2080 Ti Founders Editions GPU 将很快超过 90C,此时,其内核的时钟频率会降低,运行速度将比适当冷却的 RTX 2070 GPU 更慢。
我不建议购买 Tesla V100 或 A100,除非你是被迫购买的(禁止 RTX 数据中心策略的公司),或者你想在一个巨大的 GPU 集群上训练非常大的网络——这些 GPU 不是很划算。
如果你能买得起更好的卡,就不要购买 GTX 16 系列。这些卡没有张量核,因此,深度学习性能相对较差。相比 GTX 16 系列,我宁可选择二手的 RTX 2070 / RTX 2060 / RTX 2060 Super。如果你差钱,那 GTX 16 系列也算是个不错的选择。
什么情况下最好不要购买新的 GPU?
如果你已经拥有 RTX 2080 Tis 或更好的 GPU,升级到 RTX 3090 可能就没有意义。你的 GPU 已经很好了,使用新推出的高能耗 RTX 30 卡,你需要为 PSU 和冷却问题担忧,而性能的提升却微不足道——不值得。
我想要从 4x RTX 2080 Ti 升级到 4x RTX 3090 的唯一原因是,我在研究非常大的 Transformer 或其他高度依赖计算的网络训练。但是,如果内存是问题,在升级到 RTX 3090 之前,你可以首先考虑一些内存技巧,以便在 4x RTX 2080 Tis 上适配大模型。
如果你有一个或多个 RTX 2070 GPU,升级前要三思。这些都是很好的 GPU。如果你发现自己经常受限于 8GB 的内存,那么可以在 eBay 上转手出售这些 GPU 并获得 RTX 3090。这一推论也适用于许多其他 GPU:如果内存紧张,那么升级就是对的。
问 & 答 & 误解
要点:
PCIe 4.0 和 PCIe 通道在 2x GPU 设置中并不重要。对于 4x GPU 设置,它们也不是特别重要。RTX 3090 和 RTX 3080 的冷却会是个问题。使用水冷卡或 PCIe 扩展器。NVLink 没用,只对 GPU 集群有用。你可以在一台计算机中使用不同的 GPU 类型(如 GTX 1080 + RTX 2080 + RTX 3090),但你无法有效地将它们并行。在两台以上的机器上并行训练,你需要 Infiniband +50Gbit/s 的网络。AMD CPU 比 Intel CPU 便宜,而 Intel CPU 几乎没有任何优势。尽管做出了非常大的努力,但由于缺少社区和张量核,至少在 1-2 年内 AMD GPU+ ROCm 可能都无法与 NVIDIA 竞争。如果你使用 GPU 的时间不到一年,那么云 GPU 是有帮助的。除此之外,台式机是更便宜的解决方案。我需要 PCIe 4.0 吗?
一般来说,不需要。如果你有一个 GPU 集群,PCIe 4.0 很有用。如果你有一台 8x GPU 机器,也还可以,但除此之外,它就没有多大好处了。它可以帮助实现更好的并行化和更快的数据传输。数据传输在任何应用程序中都不是瓶颈。在计算机视觉中,在数据传输管道中,数据存储可能是瓶颈,而 PCIe 从 CPU 到 GPU 的传输则不是瓶颈。所以,对于大多数人来说,没有真正的理由去安装 PCIe 4.0。在 4 GPU 设置中,这样做的好处是,并行度可能会提高 1-7%。
我需要 8x/16x PCIe 通道吗?
和 PCIe 4.0 一样,一般来说,不需要。并行化和快速数据传输需要 PCIe 通道,但这几乎不会成为瓶颈。在 4x 通道上运行 GPU 就很好,特别是当你只有 2 个 GPU 的时候。对于 4 GPU 设置,我更希望每个 GPU 有 8 个通道,但如果你是在 4 个 GPU 上并行运行的话,那么 4 个通道可能只会降低 5-10% 的性能。
如果每个 RTX 3090 需要 3 个 PCIe 插槽,我该如何安装 4x RTX 3090?
你需要一个双插槽变体,或者你可以尝试使用 PCIe 扩展器布置它们。除了空间之外,你还需要考虑冷却问题和一个合适的 PSU。最易于管理的解决方案似乎是,4x RTX 3090 EVGA Hydro Copper 加一个定制的水冷循环。这可以使卡处于低温状态。EVGA 生产 Hydro Copper 版本的 GPU 已有多年,我认为你可以信任其水冷式 GPU 的质量。不过,可能还有其他更便宜的变体。
PCIe 扩展器也可以解决空间和冷却问题,但是你需要确保你的机箱中有足够的空间来布置 GPU。一定要确保你的 PCIe 扩展器足够长!
我该如何冷却 4x RTX 3090 或 4x RTX 3080?
请看上节。
我可以使用多个不同类型的 GPU 吗?
是的,你可以!但是不同类型的 GPU 无法有效地并行。我认为,一个 3x RTX 3070 加一个 RTX 3090 就够原型推广了。另一方面,在 4x RTX 3070 GPU 上并行会非常快,如果你能将模型放到这些 GPU 上的话。除此之外,我能想到的你希望这样做的唯一原因是,你希望继续使用旧 GPU。这没问题,但是在那些 GPU 上并行会比较低效,因为最快的 GPU 会等待最慢的 GPU 到达一个同步点(通常是梯度更新)。
NVLink 是什么,有用吗?
一般来说,NVLink 是没有用的。NVLink 是 GPU 之间的高速互连。如果你有一个有 +128 GPU 的 GPU 集群,它就有用了。否则,与标准 PCIe 传输相比,它几乎不会产生任何好处。
我钱不够,即使是你推荐的最便宜的 GPU。我能做什么?
当然是买二手 GPU。二手 RTX 2070(400 美元)和 RTX 2060(300 美元)都很棒。如果你负担不起,次佳选项是试着买一个二手的 GTX 1070(220 美元)或 GTX 1070 Ti(230 美元)。如果那还太贵,则可以使用 GTX 980 Ti (6GB 150 美元)或使用 GTX 1650 Super(190 美元)。如果这都太贵的话,最好是使用免费的 GPU 云服务。通常,这些服务会有时间限制,之后你就需要付费了。你可以轮流使用不同的服务和账户,直到你有钱购买自己的 GPU。
GPU 的碳排放量是多少?我如何使用 GPU 而又不污染环境?
我构建了一个碳计算器,供学者们计算自己的碳排放量(从航班到会议 + GPU 时间的碳排放)。该计算器也可以用来计算纯粹的GPU 碳排放量。你会发现,GPU 产生的碳比国际航班多得多。因此,你应该确保你有一个绿色能源,如果你不想有一个天文数字的碳排放量。如果我们这个地区没有电力供应商提供绿色能源,最好的办法就是购买碳抵消。许多人对碳抵消持怀疑态度。他们工作吗?他们是在诈骗吗?
我相信,在这种情况下,怀疑主义是有害的,因为什么都不做比冒着被骗的风险更有害。如果你担心被骗,只需投资一个抵消投资组合来最小化风险。
大约十年前,我参与了一个产生碳抵消的项目。联合国官员跟踪了整个过程,他们获得了干净的数字数据,并对项目现场进行了实地检查。在这种情况下产生的碳抵消是非常可靠的。我相信,其他许多项目也有类似的质量标准。
碳计算器:
在两台机器之间并行需要什么?
如果你想要跨机器并行,那么你将需要 +50Gbits/s 的网卡来提高速度。关于这个问题,我有一篇有点过时的博文。现在,我建议至少有一个EDR Infiniband 设置,这意味着网卡至少有50 GBit/s 的带宽。两张带线缆的EDR 卡在eBay 上大约卖500 美元。
稀疏矩阵乘法特性适用于一般的稀疏矩阵吗?
似乎并非如此。稀疏矩阵的粒度需要满足每4 个元素有2 个零值元素,也就是说,稀疏矩阵需要是高度结构化的。可以稍微调整下算法,这涉及到将4 个值组合成2 个值的压缩表示,但这也意味着Ampere GPU 不可能实现任意稀疏矩阵的精确乘法。
我需要Intel CPU 来支持多GPU 设置吗?
我不推荐Intel CPU,除非你在Kaggle 竞赛中大量使用了CPU(CPU 上的大量线性代数运算)。即使是在Kaggle 竞赛中,AMD CPU 仍然很好。在深度学习方面,AMD GPU 比Intel GPU 更便宜也更好。对于4x GPU 构建,我的首选CPU 是Threadripper。我们在大学里用Threadripper 构建了几十个系统,它们都工作得很好——还没有人抱怨。对于8x GPU 系统,我通常会选择供应商熟悉的CPU。在8x 系统中,CPU 和PCIe/ 系统可靠性比单纯的性能或成本效益更重要。
我应该等待RTX 3090 Ti 吗?
目前还不清楚是否会有RTX 3080 Ti / RTX 3090 Ti / RTX Ampere Titan。GTX XX90 的名称通常是留给双GPU 卡,所以NVIDIA 是偏离了这一趋势。从价格和性能来看,似乎RTX 3090 是一个取代RTX 3080 Ti 的名字。但是所有这些都是推测。如果你对这个问题感兴趣,我建议你对Rumor Mill 上的新闻跟踪一两个月,如果你什么都没有看到,就不太可能出现RTX 3080 Ti / RTX 3090 Ti / RTX Ampere Titan。
机箱设计对散热有影响吗?
没有。只要GPU 之间有一个小间隙,GPU 的冷却通常就没问题。机箱设计可以提供1 到3 摄氏度的好处,而GPU 之间的间隙将提供10 到30 摄氏度的改进。归根结底,如果GPU 之间有间隙,冷却就没问题。如果GPU 之间没有间隙,就需要合适的冷却器设计(鼓风扇)或其他解决方案(水冷、PCIe 扩展器),但无论哪种情况,机箱设计和机箱风扇都不很重要。
AMD GPUs + ROCm 能赶上 NVIDIA GPUs + CUDA 吗?
1-2 年内赶不上。这涉及三个方面的问题:张量核、软件和社区。
就纯硅而言,AMD GPU 很棒:优秀的 FP16 性能,优秀的内存带宽。然而,由于缺乏张量核或等效特性,其深度学习性能与 NVIDIA GPU 相比较差。封装的低精度数学函数不能解决这个问题。没有这个硬件特性,AMD GPU 将永远不会有竞争力。有传言称,AMD 计划在 2020 年推出某种具有张量核等效特性的数据中心卡,但此后就没有新的数据出现了。拥有张量核等效特性的数据中心卡意味着很少有人能够负担得起这样的AMD GPU,这将给NVIDIA 带来竞争优势。
假设AMD 在未来引入了类似于张量核的硬件特性。然后很多人会说,“但是没有软件针对AMD GPU!”我该怎么使用它们呢?这更多的是一种误解。AMD 软件ROCm 已经发展很长一段时间了,并且PyTorch 提供了优秀的支持。虽然我没有看到很多针对AMD GPU+ PyTorch 的经验报告,但所有的软件功能已整合。看起来,不管你选择什么网络,都可以很好地在AMD GPU 上运行。所以,在这方面,AMD 已经走过了一段很长的路,这个问题或多或少得到了解决。
然而,如果软件问题和缺少张量核的问题已得到了解决,AMD 还有一个问题:缺少社区。如果你使用NVIDIA GPU 遇到问题,你可以在谷歌查询这个问题并找到解决方案。这让人们对NVIDIA GPU 产生了很大的信任。你有基础设施,使使用NVIDIA GPU 变得很容易(任何深度学习框架都可以使用,任何科学问题都得到很好的支持)。你可以轻松地使用NVIDIA GPU(比如apex)。你很容易就可以找到NVIDIA GPU 和编程专家,而我认识的AMD GPU 专家就少得多。
在社区方面,AMD 和NVIDIA 的对比有点像Julia 和Python。Julia 有很大的潜力,很多人会说,它是科学计算的高级编程语言。然而,与Python 相比,Julia 很少被使用。这是因为Python 社区非常强大。Numpy、SciPy、Pandas 都是功能强大的软件包,有很多人在使用它们。这与NVIDIA vs AMD 的问题非常相似。
因此,在引入张量核等效特性(1/2 到1 年?)并围绕ROCm 建立一个强大的社区(2 年?)之前,AMD 很可能都无法赶上NVIDIA。AMD 总是会在特定的子领域(如加密货币挖掘、数据中心)抢夺一部分市场份额。不过,在深度学习领域,至少几年的时间内,NVIDIA 可能会保持其垄断地位。
什么时候使用云GPU?什么时候使用专用的GPU 台式机/ 服务器?
经验法则:如果你希望做深度学习超过一年,那就买一台GPU 台式机。否则,最好使用云实例。
最好自己算一下。例如,如果对比下配备了1x V100 的AWS V100 spot 实例和一个只有一块RTX 3090 的台式机(性能类似),那么对于台式机,我们要花2200 美元( 2-GPU Barebone + RTX 3090)。此外,假设你在美国,你需要额外支付每千瓦 / 时 0.12 美元的电费,而 AWS 实例是每小时 2.14 美元。
以每年 15% 的利用率来说,台式机每年消耗的电量为:
(350 Watt (GPU) + 100 Watt (CPU))*0.15 (utilization) * 24 hours * 365 days = 591 kW/h
即每年 591kW/h,需额外支付 71 美元。
在利用率为 15%(一天中 15% 的时间使用云实例)的情况下,台式机和云实例的盈亏平衡点大约是 300 天(2311 美元 vs 2270 美元):
2.14/h∗0.15(utilization)∗24hours∗300days=2.14/h∗0.15(utilization)∗24hours∗300days=2,311
因此,如果你希望在 300 天后继续运行深度学习模型,最好是购买一台台式机,而不是使用 AWS spot 实例。
对任何云服务,你都可以进行类似的计算,以决定是使用云服务还是台式机。
下面是常见的利用率:
博士生个人台式机:< 15%博士生 slurm GPU 集群:> 35%企业 slurm 研究集群:> 60%
一般来说,对于那些思考前沿想法比开发实用产品更重要的职业来说,利用率较低。有些领域的利用率很低(可解释性研究),而其他领域的利用率则高得多(机器翻译、语言建模)。一般来说,个人机器的利用率几乎总是被高估了。大多数个人系统的利用率通常在 5-10% 之间。这就是为什么我强烈推荐 slurm GPU 集群给研究小组和公司,而不是个人的桌面 GPU 机器。
关注我并转发此篇文章,私信我“领取资料”,即可免费获得InfoQ价值4999元迷你书,点击文末「了解更多」,即可移步InfoQ官网,获取最新资讯~
标签: #python中的nan