
如果你正在为深度学习选择显卡,那么这篇文章正是你需要的。
这篇文章是Tim Dettmers 大佬写的,原文为英文,这里翻译了一下
原文链接:https://timdettmers.com/2023/01/30/which-gpu-for-deep-learning/
深度学习买哪款GPU好?
深度学习是一个对计算需求极高的领域,而你的GPU选择将直接决定你的深度学习体验。那么,如果你想购买一款新的GPU,应该关注哪些特性呢?GPU内存、核心数量、Tensor Core、缓存?如何做出性价比高的选择?这篇博文将深入探讨这些问题,纠正常见的误解,帮助你直观地理解如何看待GPU,并提供实用建议,帮助你做出最适合自己的选择。
这篇博文旨在为你提供不同层次的GPU知识,以及关于NVIDIA最新Ampere系列GPU的相关信息。你可以选择以下几种阅读方式:
(1) 如果你对GPU的工作原理、GPU相比CPU的性能优势,以及NVIDIA RTX 40 Ampere系列的独特之处并不感兴趣,可以直接跳到“六、GPU原始性能排名”部分。这些性价比数据是本文的核心,周围内容则解释了影响GPU性能的具体因素。
(2) 如果你希望深入了解GPU的工作原理、缓存机制和Tensor Core的作用,建议从头到尾阅读这篇文章。当然,你可以根据自己的理解程度跳过某些章节。
目录
一、概述
二、GPU是如何工作的?
三、深度学习处理中最重要的GPU规格
1、Tensor Cores
1.1、没有Tensor Cores的矩阵乘法
1.2、有Tensor Cores的矩阵乘法
1.3、有Tensor Cores和异步复制(RTX 30/RTX 40)以及TMA(H100)的矩阵乘法
2、内存带宽
3、L2缓存 / 共享内存 / L1缓存 / 寄存器
四、估算Ada / Hopper深度学习性能
1、实际Ada / Hopper速度估算
2、估算中的潜在偏差
五、RTX 40和RTX 30系列的优势与问题
1、稀疏网络训练
2、低精度计算
3、风扇设计与GPU温度问题
4、3槽设计与功率问题
5、功率限制:解决功率问题的优雅方案?
6、RTX 4090和电源连接器熔化:如何防止问题
7、H100和RTX 40系列GPU中的8位浮点支持
六、GPU原始性能排名
七、GPU深度学习每美元性能
八、GPU推荐
1、是等待未来的GPU进行升级更好?GPU的未来
九、问答与误解
1、我需要PCIe 4.0或PCIe 5.0吗?
2、我需要8x/16x PCIe通道吗?
3、如果每个RTX 4090或3090占用3个PCIe槽,如何安装4个RTX 4090或3090?
4、如何为4个RTX 3090或4个RTX 3080降温?
5、我可以使用不同GPU类型的多GPU组合吗?
6、什么是NVLink,它有用吗?
7、我没有足够的钱,即使是你推荐的最便宜的GPU也不行。该怎么办?
8、GPU的碳足迹是多少?如何在不污染环境的情况下使用GPU?
9、我需要什么来在两台机器上并行化任务?
10、稀疏矩阵乘法特性适用于一般的稀疏矩阵吗?
11、我需要Intel CPU来支持多GPU设置吗?
12、计算机机箱设计对散热有影响吗?
13、AMD GPU + ROCm是否会赶上NVIDIA GPU + CUDA?
14、什么时候使用云计算比使用专用GPU台式机/服务器更好?
这篇博文的结构如下:首先,我将解释是什么使得GPU运行速度更快。我会讨论CPU与GPU的区别、Tensor Cores、内存带宽、GPU的内存层次结构以及这些因素如何与深度学习性能相关联。这些解释可能有助于你更直观地了解选择GPU时需要关注的要点。我还会讨论NVIDIA RTX 40 Ampere系列GPU的独特特点,这些特性在购买GPU时值得考虑。接下来,我会针对不同场景提出GPU推荐。之后是一个常见问题解答部分,回答我在Twitter讨论中收到的常见问题;在这一部分,我还会澄清一些常见误解,并讨论一些杂项问题,例如云计算与台式机、散热、AMD与NVIDIA的对比等。
如果你经常使用GPU,了解它们是如何工作的非常有用。这些知识将帮助你理解GPU在何种情况下表现快或慢。反过来,你可能能更好地理解为什么一开始需要GPU,以及未来其他硬件选项如何可能与之竞争。如果你只想要有用的性能数据和论据来帮助你决定购买哪款GPU,可以跳过这一部分。
正如许多人所说,GPU之所以这么快,是因为它们在矩阵乘法和卷积方面非常高效,但没有人真正解释为什么会这样。其真正的原因是内存带宽,而不一定是并行性。
首先,你必须理解,CPU是针对延迟进行优化的,而GPU则是针对带宽进行优化的。你可以把它想象成,CPU就像一辆法拉利,而GPU则像一辆大卡车。两者的任务都是从一个随机的位置A取货,并将货物运输到另一个随机位置B。CPU(法拉利)可以快速地从RAM中获取一些内存(包裹),而GPU(大卡车)获取这些内存会慢一些(延迟更高)。然而,CPU(法拉利)需要多次往返才能完成任务(位置A → 拿起2个包裹 → 位置B ... 重复),而GPU一次可以取走更多的内存(位置A → 拿起100个包裹 → 位置B ... 重复)。
换句话说,CPU擅长快速获取少量内存,而GPU擅长一次获取大量内存。最好的CPU带宽大约是50GB/s,而最好的GPU带宽则达到了750GB/s。因此,计算操作需要的内存越多,GPU相对于CPU的优势就越明显。但GPU依然有延迟问题,这可能会影响其性能。大卡车可能每次能装载大量包裹,但问题是你得等很久,直到下一批包裹送到。如果不解决这个问题,即便是处理大量数据时,GPU也会非常慢。那么,如何解决这个问题呢?
如果你要求大卡车多次往返取包裹,你总是会等待很长时间,直到卡车完成下一次运输——卡车本身就是慢。但如果你使用一队法拉利和大卡车(线程并行性),并且你有一个大任务,涉及大量包裹(大块内存,比如矩阵),那么你可能会稍微等一下第一辆卡车,但之后你就完全不会有等待时间了——卸载包裹需要很多时间,所以所有的卡车都会在卸货地点B排队,这样你总是可以直接访问你的包裹(内存)。这就有效地隐藏了延迟,使得GPU能够提供高带宽,并通过线程并行性隐藏了延迟——所以对于大块内存来说,GPU提供了最佳的内存带宽,同时几乎没有因为延迟带来的负面影响。这是GPU在深度学习中比CPU更快的第二个原因。顺便说一下,你也能看到为什么更多的线程对CPU没有意义:一队法拉利在任何情况下都没有实际的优势。
但GPU的优势不仅仅止于此。这是从主内存(RAM)到芯片本地内存(L1缓存和寄存器)的第一步。这第二步对性能的影响不那么关键,但仍然增加了GPU的优势。所有执行的计算都发生在寄存器中,寄存器直接连接到执行单元(CPU是核心,GPU是流处理器)。通常,L1缓存和寄存器内存非常接近执行单元,并且你希望这些内存保持较小,以便快速访问。距离执行单元越远,内存访问速度就会急剧降低,因此访问距离越大,速度就越慢。如果你将内存做得越来越大,那么访问内存的速度就会变慢(一般来说,在小商店里找到你想要的商品比在大商店里找到同样的商品要快,即使你知道商品的位置)。因此,寄存器的大小是有限的——我们在这里已经达到了物理学的极限,每个纳米都很重要,所以我们希望寄存器保持较小。
GPU的优势在于它可以为每个处理单元(流处理器或SM)配备一小堆寄存器,而它的处理单元数量很多。因此,我们可以拥有大量寄存器内存,这些内存非常小,因此非常快。这导致GPU寄存器的总大小比CPU大超过30倍,并且速度是CPU的两倍,这意味着最多可以有14MB的寄存器内存,操作速度达到惊人的80TB/s。相比之下,CPU的L1缓存大约只能达到5TB/s,且大小大约为1MB;CPU的寄存器通常只有64-128KB,速度在10-20TB/s之间。当然,这个数字比较有些缺陷,因为寄存器的工作方式与GPU寄存器有所不同(有点像苹果和橙子的比较),但这里大小的差异比速度的差异更为关键,并且确实有差别。
顺便提一下,在GPU中实现完全的寄存器利用率似乎起初比较困难,因为寄存器是最小的计算单元,需要手动调优才能获得良好的性能。然而,NVIDIA开发了有用的编译器工具,可以指示你每个流处理器使用了多少寄存器。当你调试GPU代码时,很容易调整以使用合适数量的寄存器和L1缓存,从而获得更快的性能。
最终,这意味着你可以将大量数据存储在GPU的L1缓存和寄存器块中,以重用卷积和矩阵乘法的矩阵块。例如,最佳的矩阵乘法算法使用2个64x32到96x64的矩阵块存储在L1缓存中,以及每个线程块(1个线程块最多1024个线程)使用16x16到32x32的寄存器块存储输出和求和。如果你有一个100MB的矩阵,你可以将其拆分成适合存放在缓存和寄存器中的较小矩阵,然后使用三个矩阵块进行矩阵乘法,速度可以达到10-80TB/s——这可是非常快的!这就是GPU比CPU更快的第三个原因,也是GPU如此适合深度学习的原因。
请记住,较慢的内存总是会成为性能瓶颈。如果95%的内存操作发生在寄存器(80TB/s)中,而5%发生在主存(0.75TB/s)中,那么你仍然会花费大部分时间在主存的访问上(大约是6倍的时间)。
因此,按重要性排序:(1)高带宽的主存,(2)通过线程并行性隐藏内存访问延迟,(3)大而快速的寄存器和L1缓存,且易于编程,是使GPU如此适合深度学习的关键组件。
这是一个高层次的解释,能够很好地说明为什么GPU在深度学习中比CPU更优。如果我们深入细节,就能理解是什么使得某款GPU比另一款更好。
本节将帮助你建立一个更直观的理解,了解如何评估深度学习性能。这样的理解将帮助你自行评估未来的GPU。本节按各个组件的重要性进行排序。Tensor Cores最为重要,其次是GPU的内存带宽、缓存层次结构,最后才是GPU的FLOPS性能。
Tensor Cores 是执行非常高效矩阵乘法的小核心。由于深度神经网络中最昂贵的部分是矩阵乘法,因此 Tensor Cores 非常有用。实际上,它们的计算能力如此强大,以至于我不推荐没有 Tensor Cores 的 GPU。
理解它们是如何工作的,有助于你认识到这些专门用于矩阵乘法的计算单元的重要性。在这里,我将通过一个简单的 A*B=C 矩阵乘法示例来展示,所有矩阵的大小为 32×32,在有和没有 Tensor Cores 的情况下,计算模式会是什么样。这是一个简化的例子,并不是高性能矩阵乘法内核的确切写法,但它涵盖了所有基本概念。一个 CUDA 程序员会将这个作为一个初步“草稿”,然后通过双缓冲、寄存器优化、占用率优化、指令级并行性等概念一步步优化,这些我暂时不讨论。
要完全理解这个例子,你需要了解“周期”的概念。如果一个处理器的运行频率是 1GHz,它每秒可以执行 10^9 个周期。每个周期代表一个计算机会。然而,大多数操作的执行时间超过一个周期。因此,我们本质上有一个队列,接下来的操作需要等待前一个操作完成,这也被称为操作的延迟。
以下是一些操作的重要延迟周期时间。这些时间可能会随 GPU 代数的变化而变化。以下数据是针对 Ampere 架构 GPU 的,它们的缓存相对较慢:
全局内存访问(最大 80GB):约 380 个周期
L2 缓存:约 200 个周期
L1 缓存或共享内存访问(每个流式多处理器最多 128KB):约 34 个周期
融合乘加操作,a*b+c(FFMA):4 个周期
Tensor Core 矩阵乘法:1 个周期
每个操作总是由一组 32 个线程执行。这组线程被称为一个 warp。warps 通常以同步模式操作——一个 warp 内的线程必须等待彼此。GPU 上的所有内存操作都是针对 warps 优化的。例如,从全局内存加载数据时,数据的粒度是 32*4 字节,恰好是 32 个浮点数,每个线程对应一个浮点数。我们可以在一个流式多处理器(SM)中有最多 32 个 warp = 1024 个线程,SM 是 GPU 中相当于 CPU 核心的部分。一个 SM 的资源在所有活动的 warp 之间共享。这意味着,有时候我们希望运行更少的 warps,以便为每个 warp 提供更多的寄存器/共享内存/Tensor Core 资源。
对于以下的两个例子,我们假设拥有相同的计算资源。在这个 32×32 矩阵乘法的小例子中,我们使用了 8 个 SM(大约是 RTX 3090 的 10%),每个 SM 有 8 个 warp。
为了理解周期延迟如何与 SM 中的线程数和共享内存等资源一起发挥作用,我们现在来看一下矩阵乘法的例子。虽然以下例子大致遵循了有和没有 Tensor Cores 的矩阵乘法计算步骤顺序,但请注意,这些只是非常简化的例子。实际的矩阵乘法案例涉及更大的共享内存块和稍有不同的计算模式。
1.1、没有Tensor Cores的矩阵乘法
如果我们想进行一个 AB=C 的矩阵乘法,其中每个矩阵的大小为 32×32,那么我们希望将反复访问的内存加载到共享内存中,因为共享内存的延迟大约是全局内存的五倍(200 个周期 vs 34 个周期)。共享内存中的内存块通常被称为内存块或“块”。通过使用 232 个 warp 并行地将两个 32×32 的浮点数加载到共享内存块中。我们有 8 个 SM,每个 SM 有 8 个 warp,所以由于并行化,我们只需要做一次全局到共享内存的顺序加载,耗时 200 个周期。
为了进行矩阵乘法,我们现在需要从共享内存 A 和共享内存 B 中加载一个包含 32 个数字的向量,并执行融合乘加(FFMA)操作。然后将输出存储到寄存器 C 中。我们将工作分配给每个 SM 计算 8 个点积(32×32),以计算 C 的 8 个输出。为什么是 8(在旧的算法中是 4)是一个非常技术性的问题。这意味着我们有 8 次共享内存访问,每次花费 34 个周期,并且有 8 次 FFMA 操作(32 个并行),每次花费 4 个周期。总的来说,成本为:
200 个周期(全局内存)+ 834 个周期(共享内存)+ 84 个周期(FFMA)= 504 个周期
接下来,我们来看一下使用 Tensor Cores 的周期成本。
1.2、有Tensor Cores的矩阵乘法
使用 Tensor Cores,我们可以在一个周期内执行 4×4 的矩阵乘法。为了实现这一点,我们首先需要将内存加载到 Tensor Core 中。与上述情况类似,我们需要从全局内存读取(200 个周期)并存储到共享内存中。要进行 32×32 的矩阵乘法,我们需要执行 8×8=64 次 Tensor Core 操作。每个 SM 有 8 个 Tensor Cores,所以在 8 个 SM 中,我们有 64 个 Tensor Cores——正好是我们需要的数量!我们可以通过一次内存传输(34 个周期)将数据从共享内存传输到 Tensor Cores,然后执行这 64 次并行的 Tensor Core 操作(1 个周期)。这意味着,在这个例子中,使用 Tensor Cores 进行矩阵乘法的总成本是:
200 个周期(全局内存)+ 34 个周期(共享内存)+ 1 个周期(Tensor Core)=235个周期。
因此,通过 Tensor Cores,我们将矩阵乘法的成本显著从 504 个周期降低到 235 个周期。在这个简化的例子中,Tensor Cores 降低了共享内存访问和 FFMA 操作的成本。
这个例子是简化的,通常每个线程需要计算要读取和写入哪些内存,因为你将数据从全局内存传输到共享内存。随着新一代 Hopper(H100)架构的推出,我们还引入了 Tensor Memory Accelerator(TMA),它在硬件中计算这些索引,从而帮助每个线程专注于更多的计算,而不是计算索引。
1.3、有Tensor Cores和异步复制(RTX 30/RTX 40)以及TMA(H100)的矩阵乘法
RTX 30 系列 Ampere 和 RTX 40 系列 Ada GPU 还支持在全局内存和共享内存之间执行异步传输。H100 Hopper GPU 更进一步,引入了 Tensor Memory Accelerator(TMA)单元。TMA 单元将异步复制和读写索引计算结合起来——因此,每个线程不再需要计算下一个要读取的元素,而是可以专注于进行更多的矩阵乘法计算。具体工作流程如下:
TMA 单元从全局内存将数据加载到共享内存中(200 个周期)。一旦数据到达,TMA 单元会异步地从全局内存加载下一个数据块。在这个过程中,线程从共享内存加载数据并通过 Tensor Core 执行矩阵乘法。一旦线程完成,它们将等待 TMA 单元完成下一次数据传输,然后继续进行下一轮操作。
因此,由于异步的特性,TMA 单元执行的第二次全局内存读取会在线程处理当前共享内存块时同时进行。这意味着,第二次读取的时间只需要 200 - 34 - 1 = 165 个周期。
由于我们进行多次读取,只有第一次内存访问会较慢,而所有其他内存访问都会与 TMA 单元部分重叠。因此,平均来看,我们减少了 35 个周期的时间。
165个周期(等待异步复制完成)+34个周期(共享内存)+1个周期(Tensor Core)=200个周期。
这使得矩阵乘法的速度再提升了 15%。
从这些例子中可以清楚地看出,内存带宽为什么对配备 Tensor Core 的 GPU 如此重要。由于全局内存是矩阵乘法中最大的一项周期成本,若能减少全局内存的延迟,我们甚至可以拥有更快的 GPU。我们可以通过增加内存的时钟频率(每秒更多的周期,但也会产生更多的热量和更高的能量需求)或者增加每次传输的元素数量(总线宽度)来实现这一点。
从上一节我们了解到,Tensor Cores 非常快。实际上,它们的速度之快,以至于大部分时间处于空闲状态,因为它们在等待全局内存的数据。例如,在进行 GPT-3 规模的训练时,使用的是巨大的矩阵——矩阵越大,Tensor Cores 的性能越好——我们观察到 Tensor Core 的 TFLOPS 利用率约为 45% 到 65%,这意味着即使对于大型神经网络,Tensor Cores 大约 50% 的时间处于空闲状态。
这意味着,在比较两款配备 Tensor Cores 的 GPU 时,其中一个最好的性能指标就是它们的内存带宽。例如,A100 GPU 的内存带宽为 1,555 GB/s,而 V100 的内存带宽为 900 GB/s。因此,A100 相对于 V100 的基本加速比是 1555/900 = 1.73x。
由于向 Tensor Cores 传输内存是性能的限制因素,我们需要寻找其他能加速内存传输到 Tensor Cores 的 GPU 属性。L2 缓存、共享内存、L1 缓存以及使用的寄存器数量都密切相关。为了理解内存层级如何加速内存传输,有助于了解在 GPU 上是如何进行矩阵乘法运算的。
在执行矩阵乘法时,我们利用 GPU 的内存层级结构,从较慢的全局内存,到更快的 L2 内存,再到快速的本地共享内存,最后到闪电般快速的寄存器。然而,内存越快,其大小通常越小。
逻辑上,L2 和 L1 内存是相似的,但 L2 缓存较大,因此从 L2 缓存中获取一个缓存行所需的物理距离更大。你可以将 L1 和 L2 缓存视为组织良好的仓库,其中你知道物品的位置,但要去那里,较大的仓库平均需要的时间要长得多。这就是 L1 和 L2 缓存之间的本质区别:大 = 慢,小 = 快。
对于矩阵乘法,我们可以利用这种层级结构,将大矩阵乘法分解为越来越小、速度越来越快的内存块,以执行非常快速的矩阵乘法。为此,我们需要将大的矩阵乘法分割成较小的子矩阵乘法。这些小块被称为内存块,或简称为块(tiles)。
我们在本地共享内存中执行矩阵乘法,因为它速度快且靠近流处理器(SM)——相当于 CPU 核心。使用 Tensor Cores,我们更进一步:我们将每个内存块加载到 Tensor Cores 中,而 Tensor Cores 直接通过寄存器寻址。L2 缓存中的矩阵内存块比全局 GPU 内存(GPU RAM)快 3-5 倍,共享内存比全局 GPU 内存快大约 7-10 倍,而 Tensor Cores 的寄存器比全局 GPU 内存快大约 200 倍。
拥有更大的内存块意味着我们可以重用更多内存。实际上,你可以将 TPU 视为每个 Tensor Core 具有非常非常大的内存块。因此,TPU 在每次从全局内存传输数据时可以重用更多内存,这使得它们在矩阵乘法上比 GPU 更高效。
每个内存块的大小由每个流处理器(SM)可用的内存和整个 SM 集群的 L2 缓存大小决定。以下是不同架构的共享内存大小:
Volta (Titan V): 128 KB 共享内存 / 6 MB L2
Turing (RTX 20 系列): 96 KB 共享内存 / 5.5 MB L2
Ampere (RTX 30 系列): 128 KB 共享内存 / 6 MB L2
Ada (RTX 40 系列): 128 KB 共享内存 / 72 MB L2
我们可以看到,Ada 架构的 L2 缓存更大,允许更大的内存块大小,从而减少对全局内存的访问。例如,在训练 BERT 大型模型时,任何矩阵乘法的输入矩阵和权重矩阵都可以整齐地放入 Ada 的 L2 缓存中(但其他架构则不行)。因此,数据只需从全局内存加载一次,然后就可以通过 L2 缓存访问,从而使得矩阵乘法在 Ada 架构上快约 1.5 - 2.0 倍。对于更大的模型,在训练过程中的加速较小,但在某些特定的“甜点”模型上可能会使得训练速度大大提高。在推理过程中,当批处理大小超过 8 时,较大的 L2 缓存也能带来巨大的性能提升。
本节适合那些想深入了解我如何推导 Ampere GPU 性能估算的技术细节的人。如果你不关心这些技术细节,可以跳过本节。
假设我们对 Hopper、Ada、Ampere、Turing 或 Volta 等 GPU 架构的某个 GPU 有一个性能估算。将这些结果外推到同一架构/系列的其他 GPU 是非常容易的。幸运的是,NVIDIA 已经对 A100、V100 和 H100 在计算机视觉和自然语言理解任务中的性能进行了基准测试。不幸的是,NVIDIA 确保这些数据不可直接比较,因为它们在尽可能的情况下使用了不同的批量大小和 GPU 数量,以偏向 H100 GPU 的结果。因此,从某种意义上说,这些基准数据既有一定的真实价值,又有一定的市场营销成分。一般来说,你可以认为使用更大的批量大小是合理的,因为 H100/A100 GPU 拥有更多的内存。然而,要比较 GPU 架构,我们应该使用相同的批量大小来评估不偏不倚的内存性能。
为了得到不偏不倚的估算,我们可以通过两种方式来调整数据中心 GPU 的结果:(1)考虑批量大小的差异,(2)考虑使用 1 个 GPU 与 8 个 GPU 之间的差异。幸运的是,我们可以从 NVIDIA 提供的数据中找到这两个偏差的估算。
将批量大小加倍会使图像每秒的吞吐量(对于卷积神经网络 CNNs)增加 13.6%。我在我的 RTX Titan 上对变压器(transformer)模型做了相同的基准测试,结果也很惊讶地得到了相同的结果:13.5%——这似乎是一个稳健的估算。
当我们将网络并行化到越来越多的 GPU 时,由于某些网络开销,我们会损失一些性能。A100 8x GPU 系统的网络性能(NVLink 3.0)优于 V100 8x GPU 系统(NVLink 2.0),这也是一个混淆因素。通过直接查看 NVIDIA 提供的数据,我们可以发现,对于 CNNs,8x A100 系统的开销比 8x V100 系统低 5%。这意味着,如果从 1x A100 升级到 8x A100 可以带来 7.00 倍的加速,那么从 1x V100 升级到 8x V100 只能带来 6.67 倍的加速。对于变压器模型,这一数字为 7%。
使用这些数据,我们可以根据 NVIDIA 提供的直接数据估算几个具体深度学习架构的加速比。Tesla A100 相比 Tesla V100 提供以下加速:
SE-ResNeXt101: 1.43x
Masked-R-CNN: 1.47x
Transformer(12层,机器翻译,WMT14 英德):1.70x
因此,这些数字比计算机视觉的理论估算值稍低。这可能是由于较小的张量维度、矩阵乘法准备操作(如 img2col 或快速傅里叶变换 FFT)的开销,或者是一些无法充分利用 GPU 的操作(例如,最终层通常较小)。这也可能是特定架构(如分组卷积)的伪影。
对于变压器模型,实际的估算值非常接近理论估算值。这可能是因为大矩阵的算法相对简单。接下来,我将使用这些实际估算来计算 GPU 的成本效率。
以上的估算是针对 H100、A100 和 V100 GPU 的。过去,NVIDIA 在“游戏”RTX GPU 中悄悄引入了未宣布的性能降级:(1)Tensor Core 利用率下降,(2)为了散热使用游戏级风扇,(3)禁用了 GPU 之间的点对点传输。与完整的 Hopper H100 相比,RTX 40 系列可能也存在未宣布的性能降级。
目前,已发现 Ampere GPU 存在其中一种降级情况:Tensor Core 性能下降,导致 RTX 30 系列 GPU 在深度学习应用中不如 Quadro 显卡。这一做法在 RTX 20 系列中也曾出现过,所以并不新鲜,但这次甚至影响到了 Titan 级显卡 RTX 3090。RTX Titan 并没有启用性能降级。
目前,尚未发现 Ada 系列 GPU 存在性能降级的情况。
新的 NVIDIA Ampere RTX 30 系列相比 NVIDIA Turing RTX 20 系列具有额外的优势,如稀疏网络训练和推理。其他特性,比如新的数据类型,更多的是作为一种便捷的功能,因为它们提供的性能提升与 Turing 系列相同,但无需额外的编程工作。
Ada RTX 40 系列进一步改进了技术,例如 8 位浮动(FP8)张量核心。RTX 40 系列也存在与 RTX 30 系列类似的功率和温度问题。RTX 40 系列的电源连接器线融化问题可以通过正确连接电源线轻松避免。
Ampere 允许以稠密速度进行细粒度结构化自动稀疏矩阵乘法。它是如何实现的呢?假设有一个权重矩阵,并将其切割成 4 个元素的小块。现在假设这 4 个元素中的 2 个是零。图 1 展示了这可能是什么样子的。

图 1:Ampere GPU 中稀疏矩阵乘法功能支持的结构。
当你将这个稀疏权重矩阵与一些密集输入进行相乘时,Ampere 中的稀疏矩阵张量核心功能会自动将稀疏矩阵压缩为一个密集表示,其大小是原来的一半,如图 2 所示。在完成压缩后,密集压缩的矩阵块会被送入张量核心进行矩阵乘法运算,计算的矩阵大小是通常的两倍。这实际上实现了 2 倍的加速,因为矩阵乘法过程中来自共享内存的带宽需求减少了一半。

图 2:稀疏矩阵在进行矩阵乘法之前被压缩为密集表示。
我在我的研究中进行过稀疏网络训练,并且写过一篇关于稀疏训练的博客文章。我的工作受到过一种批评,认为‘你减少了网络所需的FLOPS,但并没有带来加速,因为GPU无法进行快速的稀疏矩阵乘法。’然而,随着Tensor Cores加入稀疏矩阵乘法特性,我的算法,或者其他稀疏训练算法,现在实际上能在训练过程中提供最高2倍的加速。

图3:我开发的稀疏训练算法包含三个阶段:
(1)确定每一层的重要性;
(2)去除最小的、不重要的权重;
(3)根据每一层的重要性增长新的权重。
虽然这个功能仍然处于实验阶段,稀疏网络训练尚未成为主流,但如果你的GPU支持这个功能,意味着你已经为稀疏训练的未来做好了准备。
在我的研究中,我之前已经展示过,新数据类型可以在低精度反向传播过程中提高稳定性。

图4:我开发的低精度深度学习8位数据类型。
深度学习训练从高度专业化的数据类型中受益。我的动态树数据类型使用一个动态位来指示二分树的起始位置,该树量化了范围[0, 0.9],而所有前面的位则用于指数部分。这使得能够动态表示既大又小的数字,同时保持较高的精度。
目前,如果你想在使用16位浮点数(FP16)时保持反向传播的稳定性,主要的问题是普通的FP16数据类型仅支持范围为[-65,504, 65,504]的数字。如果你的梯度超出了这个范围,梯度就会爆炸成NaN值。为了防止这种情况,在FP16训练过程中我们通常会进行损失缩放,即在反向传播之前将损失乘以一个小数值,从而防止梯度爆炸。
BrainFloat 16格式(BF16)使用更多的位数来表示指数,因此可能的数值范围与FP32相同:[-3×10^38, 3×10^38]。虽然BF16的精度较低,即有效数字较少,但对于学习来说,梯度的精度并不那么重要。因此,BF16的作用是你不再需要进行任何损失缩放,也不需要担心梯度会迅速爆炸。因此,我们应该看到,使用BF16格式时,训练的稳定性会有所提高,尽管会有轻微的精度损失。
这对你意味着:使用BF16精度时,训练可能比使用FP16精度时更加稳定,同时提供相同的加速效果。使用32位TensorFloat(TF32)精度时,你可以接近FP32的稳定性,同时获得接近FP16的加速效果。好处是,要使用这些数据类型,你只需要将FP32替换为TF32,将FP16替换为BF16——不需要修改代码!
总的来说,这些新的数据类型可以被看作是“懒惰的数据类型”,因为通过一些额外的编程工作(适当的损失缩放、初始化、归一化、使用Apex等),你本可以使用旧的数据类型获得所有的好处。因此,这些数据类型并不提供加速,而是提高了低精度训练的易用性。
虽然RTX 30系列的新风扇设计在散热方面表现非常好,但非创始版GPU的不同风扇设计可能会存在更大的问题。如果你的GPU温度超过80°C,它会自动降速以防止过热,从而降低计算速度和功耗。特别是当多个GPU被并排堆放时,过热问题可能更为严重。解决这个问题的一种方法是使用PCIe延长线为GPU之间创造空间。
使用PCIe延长线分隔GPU对于散热非常有效,华盛顿大学的其他博士生和我就使用这种设置取得了很好的效果。虽然这种方法不太美观,但它能够有效保持GPU的冷却!我们已经运行了4年,期间没有遇到任何问题。如果你的PCIe插槽空间不足,也可以帮助解决这个问题。例如,如果你在台式机机箱中找到足够的空间,可能可以购买标准的3插槽宽度RTX 4090,并使用PCIe延长线将其分开放置在机箱内。这样,你可能会通过一个简单的解决方案解决4x RTX 4090的空间和散热问题。

图5:使用PCIe延长线的4个GPU。
看起来有点乱,但对于散热非常有效。我使用这个设备已经4年了,尽管RTX 2080 Ti创始版GPU存在问题,但散热效果非常好。
RTX 3090和RTX 4090是3个插槽的GPU,因此在使用NVIDIA默认风扇设计的情况下,无法在4个GPU的设置中使用它们。这在某种程度上是可以理解的,因为它们的TDP超过350W,在一个多GPU的2个插槽环境中很难有效散热。RTX 3080的TDP稍微好一点,320W,但要冷却4个RTX 3080的设置同样也非常困难。
另外,4个350W = 1400W或4个450W = 1800W的系统也很难为4个RTX 3090或4个RTX 4090提供足够的电力。1600W的电源单元(PSU)是常见的,但如果只给CPU和主板提供200W的功率,可能会显得过于紧张。组件的最大功率仅在完全负载时才会使用,而在深度学习中,CPU通常只会处于较低的负载状态。因此,1600W的电源对于4个RTX 3080的配置应该足够,但对于4个RTX 3090的配置,最好选择更高功率的电源(+1700W)。一些我的粉丝通过使用加密货币矿机的电源单元获得了很好的效果——可以查看评论区获得更多相关信息。否则需要注意,并非所有插座都支持超过1600W的电源,尤其是在美国。因此,美国市场上目前很少有超过1600W的标准桌面电源。如果你选择使用服务器或加密货币矿机电源单元,要注意其外形尺寸——确保它能够适配你的机箱。
你可以为GPU设置功率限制。因此,你可以通过编程将RTX 3090的功率限制设置为300W,而不是标准的350W。在一个4个GPU的系统中,这样可以节省200W,这可能刚好足够使得4个RTX 3090的系统可以使用1600W的电源单元(PSU)。此外,这也有助于保持GPU的冷却。因此,设置功率限制可以同时解决4个RTX 3080或4个RTX 3090系统的两个主要问题:冷却和功率。
对于4个GPU的配置,你仍然需要有效的风冷GPU(标准设计可能就足够了),但这样可以解决电源问题。

图6:降低功率限制有轻微的冷却效果。
将RTX 2080 Ti的功率限制降低50-60W,可以稍微降低温度,并使风扇运行得更加安静。
你可能会问,“这样会不会让GPU变慢?”是的,确实会慢一些,但问题是慢了多少。我在图5所示的4x RTX 2080 Ti系统下,对不同功率限制进行了基准测试。我测试了在推理过程中,500个小批量BERT Large的处理时间(不包括softmax层)。我选择BERT Large推理,因为根据我的经验,这是最能给GPU带来压力的深度学习模型。因此,我预计功率限制对这个模型的影响会最大。所以,这里报告的减速大概接近你能期望的最大减速。结果如图7所示。

图7:在RTX 2080 Ti上对给定功率限制的测量减速。
测量数据为BERT Large在推理过程中500个小批量的平均处理时间(不包括softmax层)。
正如我们所看到的,设置功率限制并不会严重影响性能。将功率限制降低50W——这对于处理4x RTX 3090已经足够——性能仅下降了7%。
有一种误解认为RTX 4090的电源线会因为弯曲而融化。然而,经过调查发现,只有0.1%的用户遇到过这个问题,而且问题是由于用户操作不当导致的。
因此,如果你按照以下安装说明操作,使用RTX 4090显卡是完全安全的:
如果使用的是旧电缆或旧显卡,请确保接触点没有灰尘或杂物。
使用电源连接器时,将其插入插座,直到听到咔嚓声——这是最重要的一步。
通过左右摇动电源线测试插接是否稳固,电缆应该不会移动。
目视检查插座和电缆的接触点,确保电缆与插座之间没有间隙。
8位浮点数(FP8)的支持对RTX 40系列和H100 GPU来说是一个巨大的优势。使用8位输入,它使得矩阵乘法的数据加载速度提高了两倍,同时可以在缓存中存储更多的矩阵元素,而在Ada和Hopper架构中,缓存非常大。现在,通过FP8张量核心,RTX 4090的计算能力达到了0.66 PFLOPS——这个计算性能超过了2007年全球最快超级计算机的总性能。4个RTX 4090搭配FP8计算能力,可以媲美2010年全球最快的超级计算机(深度学习技术直到2009年才开始取得进展)。
使用8位精度的主要问题是,变换器模型在这么少的位数下可能变得非常不稳定,导致训练过程中崩溃或推理时产生无意义的结果。
主要结论是:使用8位而不是16位确实会导致不稳定,但如果保持一些维度的高精度,一切就能正常运行。

以下是我关于8位矩阵乘法在大语言模型(LLMs)中的应用的主要成果。我们可以看到,最好的8位基准方法未能提供良好的零-shot性能。我开发的方法,LLM.int8(),可以执行Int8矩阵乘法,且与16位基准方法的结果相同。
但既然RTX 30系列、A100和Ampere架构的GPU已经支持Int8,为什么RTX 40系列的FP8是另一个重要的升级呢?FP8数据类型比Int8更加稳定,而且它在像层归一化(layer norm)或非线性函数等操作中使用起来更加方便,而这些操作用整数数据类型做起来较为困难。这将使得在训练和推理过程中使用FP8变得非常直观和简单。我认为,几个月后,FP8训练和推理将变得相对常见。
如果你想了解更多关于浮点数(Float)与整数(Integer)数据类型的优势。我们可以看到,按位比较,FP4数据类型比Int4数据类型保留了更多的信息,从而在四个任务上的平均LLM零-shot准确性得到了提高。

对于不同数据类型的Pythia大语言模型,4位推理扩展法则。我们可以看到,按位比较,4位浮点数(float)数据类型在零-shot准确性上优于Int4数据类型。
下面是所有GPU的原始相对性能图表。我们可以看到,H100 GPU在8位性能上与那些为16位性能优化的旧卡之间存在巨大的差距。

下面展示的是GPU的原始相对变换器性能。例如,RTX 4090在8位推理中的性能约为H100 SMX的0.33倍。换句话说,H100 SMX在8位推理时比RTX 4090快三倍。
在这个数据中,我没有为旧GPU建模8位计算。原因是,Ada/Hopper GPU在8位推理和训练方面表现得更为有效,因为它们支持8位浮动数据类型(FP8)和张量内存加速器(TMA),TMA省去了计算读写索引的开销,这对8位矩阵乘法特别有帮助。Ada/Hopper还支持FP8,这使得8位训练特别有效。
我没有为8位训练建模数据,因为要建模这些,我需要了解Hopper/Ada GPU的L1和L2缓存的延迟,而这些信息未知且我没有相关GPU的访问权限。在Hopper/Ada上,如果缓存速度如传闻所说,8位训练性能可能是16位训练性能的3-4倍。
但即便有了新的FP8张量核心,仍然存在一些难以在建模GPU性能时考虑到的额外问题。例如,FP8张量核心不支持转置矩阵乘法,这意味着反向传播要么需要在乘法前进行单独的转置,要么必须在内存中保存两套权重——一套转置权重和一套非转置权重。我在我的LLM.int8()项目中实验时使用了两套权重,这显著降低了整体加速效果。我认为通过使用正确的算法/软件,可以取得更好的结果,但这也表明,缺少像转置矩阵乘法这样的功能会影响性能。
对于旧GPU,Int8推理性能接近于16位推理性能,尤其是在模型参数少于13B的情况下。对于具有175B参数或更多的较大模型,Int8性能才更为相关。
下面是按8位推理性能排序的所有GPU的每美元性能图表。如何使用此图表找到适合您的GPU,步骤如下:
确定您需要的GPU内存量(粗略的经验法则:图像生成至少需要12GB内存;使用变换器模型至少需要24GB内存)。
虽然8位推理和训练仍处于实验阶段,但在6个月内将成为标准。期间,您可能需要进行一些额外的复杂编码来使用8位。您能接受吗?如果不能,请选择16位性能。
根据步骤(2)确定的指标,找到内存容量满足需求并具有最高相对性能/美元的GPU。
我们可以看到,RTX 4070 Ti在8位和16位推理方面最具性价比,而RTX 3080在16位训练方面仍然是性价比最高的。虽然这些GPU性价比高,但它们不一定适合推荐使用,因为它们的内存不足以满足许多用例的需求。然而,它们可能是开始深度学习之旅的理想选择。这些GPU对于Kaggle竞赛也非常适合,因为在Kaggle竞赛中,往往可以依赖较小的模型。由于在Kaggle竞赛中,工作方法比模型规模更重要,因此许多这些较小的GPU非常适合Kaggle竞赛。
对于学术研究和创业公司服务器来说,最好的GPU似乎是A6000 Ada GPU(不要与A6000 Turing混淆)。H100 SXM GPU也非常具性价比,具有高内存和强大的性能。如果我为公司/学术实验室搭建一个小型集群,我会选择66-80%的A6000 GPU和20-33%的H100 SXM GPU。如果能以较好的价格买到L40 GPU,我也会选择L40而不是A6000,因此您可以随时咨询这些报价。

如下图所示的是按每美元相对性能计算的GPU性能,经过按桌面电脑的成本以及每个GPU的平均亚马逊和eBay价格归一化。此外,还加入了为期5年的电力拥有成本,电价为每千瓦时0.175美元,GPU使用率为15%。RTX 4090的电力成本大约为每年100美元。如何阅读和解释此图:拥有RTX 4070 Ti显卡的桌面电脑,在5年内的8位推理性能每美元大约是RTX 3090 GPU的两倍。
我创建了一个推荐流程图,您可以在下方看到。虽然这个图表可以帮助您解决80%的情况,但它可能不适合您,因为某些选项可能太贵。在这种情况下,您可以参考上面的基准测试,选择性价比最高且仍然具备足够GPU内存的显卡,适合您的使用场景。您可以通过在vast.ai或Lambda Cloud上运行您的问题一段时间来估算所需的GPU内存,这样您就能了解具体需要什么样的GPU。如果您只是偶尔需要GPU(比如每隔几天用几个小时),并且不需要下载和处理大量数据集来开始工作,那么vast.ai或Lambda Cloud也可能是不错的选择。然而,如果您需要长时间每天高负载使用GPU(例如每天12小时),云GPU通常不是一个好的选择。您可以参考下面“什么时候云GPU优于独立GPU桌面/服务器?”部分中的示例来判断云GPU是否适合您。

Ada/Hopper GPU推荐图表。通过回答“是/否”问题来找到最适合您的GPU。虽然这个图表适用于大约80%的情况,但您可能会选择到价格过高的GPU。如果是这样,请参考上面的性价比图表来做出选择。
要了解跳过这一代GPU,直接购买下一代GPU是否划算,首先需要探讨未来的GPU改进将会如何发展。
过去,通过缩小晶体管的尺寸来提高处理器的速度是一种常见的做法,但这一方法现在接近尾声。例如,虽然缩小SRAM的尺寸提高了其速度(更短的距离,访问内存更快),但现在这种效果已经不再明显。当前SRAM的改进已经不再提高性能,甚至可能带来负面影响。虽然像Tensor Cores这样的逻辑单元可以变得更小,但这不一定意味着GPU会更快,因为矩阵乘法的主要瓶颈在于如何将内存送入Tensor Cores,而这一过程由SRAM和GPU内存的速度及大小决定。GPU内存的速度仍然在提升,如果我们将内存模块堆叠成高带宽模块(如HBM3+),它们在速度上会有所提高,但由于制造成本过高,这类内存仍不适合消费者应用。目前提升GPU原始速度的主要方式是通过增加功率和冷却系统,这在RTX 30系列和RTX 40系列中已可见端倪,但这种方式持续下去的空间已经不大。
AMD CPU采用的Chiplet架构是另一个有前景的解决方案。AMD通过开发CPU芯片小单元(Chiplets)击败了英特尔。Chiplets是小型的芯片,通过高速片上网络连接在一起。可以把它们理解为两个物理上非常接近的GPU,几乎可以视作一个更大的GPU。Chiplets的制造成本较低,但将它们组合成一个大芯片的难度更大,因此需要更多的专业知识和高速的芯片间连接。AMD在Chiplet设计上有很多经验,未来的AMD GPU将采用Chiplet设计,而NVIDIA目前并没有公开的类似计划。这可能意味着,下一代AMD GPU在性价比方面可能会比NVIDIA GPU更具优势。
然而,目前GPU性能的主要提升依然来自于专用逻辑。例如,Ampere架构(RTX 30/A100/RTX 40)的异步复制硬件单元,及其扩展功能——Tensor Memory Accelerator(TMA),都通过专用硬件减少了将数据从慢速全局内存复制到快速共享内存(缓存)的开销,从而提高了每个线程的计算效率。TMA还通过自动计算读写索引来减少开销,这在8位计算中尤为重要,因为8位计算的元素数量是16位计算的两倍。因此,专用硬件逻辑可以进一步加速矩阵乘法。
低精度位宽是未来几年的另一条可行路线。预计在接下来的几个月内,8位推理和训练将得到广泛应用,明年4位推理也会得到普及。目前,4位训练技术尚未成熟,但研究进展良好,我预计在1到2年内,我们将能够训练出具有竞争力预测性能的高性能FP4大型语言模型(LLM)。
目前,要将训练精度降低到2位似乎几乎不可能,但相比于进一步缩小晶体管,这个问题要容易得多。因此,硬件的进步在很大程度上取决于软件和算法,它们能够让硬件的专用功能得到充分利用。
我们可能能够在算法和硬件的结合上取得持续进展,直到2032年,但之后GPU性能提升可能会到达瓶颈(类似于智能手机的发展)。2032年之后,性能提升的浪潮可能来自于更好的网络算法和大规模硬件应用。届时,消费级GPU是否仍然具有意义尚不确定。也许你需要RTX 9090才能运行“超级超稳定Diffusion Ultra Plus 9000 Extra”或“OpenChatGPT 5.0”,但也有可能某个公司会提供一个高质量的API,价格比RTX 9090的电力成本还低,这时你可能更倾向于使用笔记本和API来进行图像生成等任务。
总体而言,我认为投资一款支持8位的GPU将在接下来的9年内是非常稳健的投资。4位和2位的改进可能会很小,而像Sort Cores这样的其他特性,只有在稀疏矩阵乘法能够得到很好利用的情况下才会变得有意义。未来2到3年,我们可能会看到其他方面的进展,这些进展将在4年后的下一代GPU中实现,但如果我们继续依赖矩阵乘法,GPU的发展空间已经接近极限。这也使得对新GPU的投资能保持较长的生命周期。
通常情况下,答案是否定的。如果你拥有一个GPU集群,PCIe 5.0或4.0会非常有用。如果你有一台8个GPU的机器,它也可以发挥作用,但对于其他情况,它并不会带来太多好处。它能够提高并行化性能,并稍微加速数据传输,但在大多数应用中,数据传输并不是瓶颈。在计算机视觉领域,数据传输管道中,瓶颈通常出现在数据存储上,而不是从CPU到GPU的PCIe传输。因此,对于大多数人来说,没有真正的理由去选择PCIe 5.0或4.0配置。对于4个GPU的设置,所能带来的好处可能仅仅是1-7%的并行化提升。
与PCIe 4.0一样——通常情况下,答案是否定的。PCIe通道用于并行化和快速数据传输,但这通常不是瓶颈。使用4条通道操作GPU是可以的,特别是当你只有2个GPU时。对于一个4个GPU的设置,我更倾向于每个GPU使用8条通道,但如果使用4条通道,可能会让性能降低大约5-10%,前提是你在所有4个GPU上进行并行化。
你需要选择一个双槽版的GPU,或者你可以尝试使用PCIe扩展器来将它们分开。除了空间问题,你还应该立刻考虑冷却和合适的电源供应(PSU)。
PCIe扩展器也许能解决空间和冷却问题,但你需要确保机箱内有足够的空间来分散GPU。同时,确保你的PCIe扩展器足够长!
参见上一节。
是的,您可以!但您不能在不同类型的GPU之间高效并行化,因为通常会以最慢GPU的速度运行(数据并行和完全分片并行)。因此,不同的GPU可以正常工作,但在这些GPU之间的并行化将会效率低下,因为最快的GPU需要等待最慢的GPU在同步点(通常是梯度更新)之前赶上。
通常情况下,NVLink 并没有太大用处。NVLink 是一种高速的 GPU 互联技术。如果你有一个包含 128 张以上 GPU 的集群,它会很有用。否则,相较于标准 PCIe 数据传输,几乎没有任何优势。
绝对可以购买二手GPU。你可以先购买一款小而便宜的GPU用于原型设计和测试,然后将完整的实验部署到云端,如vast.ai或Lambda Cloud。如果你仅偶尔在大模型上进行训练、微调或推理,而大部分时间用于小模型的原型开发,这样做可以节省很多成本。
我开发了一个碳足迹计算器,用于计算学术界的碳排放(包括参加会议的航班碳排放和GPU运行时间)。这个计算器也可以用来计算纯GPU的碳足迹。你会发现,GPU的碳排放远远高于国际航班。因此,如果你不希望有天文数字般的碳足迹,你应该确保使用绿色能源。如果我们所在地区的电力供应商不提供绿色能源,最好的方法是购买碳补偿。许多人对碳补偿存有怀疑:它们有效吗?是骗局吗?
我认为怀疑在这种情况下只会带来负面影响,因为不采取任何行动比冒险被骗的可能性更有害。如果你担心骗局,最好的方法是投资于多个碳补偿项目,以分散风险。
大约十年前,我参与过一个产生碳补偿的项目。该项目通过燃烧中国矿区泄漏的甲烷来生成碳补偿。联合国官员对整个过程进行了跟踪,要求提供清晰的数字数据并进行现场实地检查。在这种情况下,生成的碳补偿是非常可靠的。我相信,许多其他项目也有类似的质量标准。
如果你想确保安全,至少应该配置+50Gbit/s的网络卡,以便在跨机器并行化时获得加速。我建议至少使用EDR Infiniband配置,即网络卡带宽至少为50 Gbit/s。两张EDR卡和电缆在eBay上的价格大约为500美元。
在某些情况下,你可能能够使用10 Gbit/s以太网,但这通常仅适用于特殊网络(某些卷积网络)或特定算法(如Microsoft DeepSpeed)。
似乎不是这样。由于稀疏矩阵的粒度需要每4个元素有2个零值元素,因此稀疏矩阵需要具有相当的结构性。可能可以稍微调整算法,将4个值池化为2个值的压缩表示,但这也意味着,使用Ampere GPU进行精确的任意稀疏矩阵乘法是不可能的。
我不推荐使用Intel CPUs,除非你在Kaggle竞赛中大量使用CPU(进行大量线性代数计算)。即使是Kaggle竞赛,AMD CPU也依然表现很好。总的来说,AMD CPU比Intel CPU在深度学习中更便宜且性能更好。对于4x GPU系统,我首选的CPU是Threadripper。在我们大学,我们用Threadripper构建了几十台系统,表现都非常好——没有任何问题。对于8x GPU系统,我通常会选择供应商有经验的CPU。在8x系统中,CPU和PCIe/系统的可靠性比单纯的性能或性价比更为重要。
不。如果GPU之间至少有一些空隙,通常冷却是足够的。机箱设计能让温度降低1-3°C,GPU之间的空间则可以提升10-30°C。关键是,如果GPU之间有空隙,冷却设计不那么重要。如果没有空隙,你就需要合适的冷却设计(例如吹风扇),或者其他解决方案(水冷,PCIe延长线),但无论如何,机箱设计和机箱风扇不再是关键因素。
在接下来的1-2年内不太可能。这个问题是三重的:Tensor Cores、软件和社区。
AMD GPU在纯硬件方面表现优秀:很棒的FP16性能,优秀的内存带宽。然而,它们缺乏Tensor Cores或等效硬件,这使得与NVIDIA GPU相比,它们在深度学习方面的表现较差。打包的低精度数学运算不够用。没有这些硬件特性,AMD GPU将永远无法与NVIDIA竞争。有传言称,2020年计划推出一些数据中心卡,配有类似Tensor Core的硬件,但自那时以来没有新的数据。仅仅拥有类似Tensor Core的硬件也意味着,很少有人能够负担得起这些AMD GPU,这将为NVIDIA提供竞争优势。
假设未来AMD引入了类似Tensor Core的硬件特性。那么许多人可能会说:“但是没有软件能支持AMD GPU!我该怎么用它们呢?”这大多是误解。通过ROCm,AMD的软件已经有了很大进展,PyTorch的支持也非常好。虽然我没有看到许多关于AMD GPU和PyTorch的使用经验报告,但所有软件特性已经集成在一起。看起来,如果你选择任何网络,使用AMD GPU应该没问题。因此,AMD在这方面已经取得了很大的进展,这个问题或多或少已经解决。
然而,即使软件问题和缺乏Tensor Cores的情况得到解决,AMD仍然面临一个问题:缺乏社区。如果你遇到NVIDIA GPU的问题,你可以Google一下,找到解决方案。这建立了对NVIDIA GPU的强大信任。你拥有使得使用NVIDIA GPU变得简单的基础设施(任何深度学习框架都可以工作,任何科学问题都能得到良好支持)。你还有很多小窍门和技巧,使得使用NVIDIA GPU非常轻松(例如,apex)。你可以在每个角落找到关于NVIDIA GPU的专家,而我认识的AMD GPU专家要少得多。
在社区方面,AMD有点像Julia和Python的对比。Julia具有很大的潜力,很多人会说,它是科学计算中更优的编程语言,且这一观点是有道理的。然而,与Python相比,Julia的使用率很低。这是因为Python社区非常强大。Numpy、SciPy、Pandas是强大的软件包,许多人都围绕这些工具聚集。这与NVIDIA和AMD的问题非常相似。
因此,AMD可能要等到引入类似Tensor Core的硬件(1到1.5年?)并且围绕ROCm建立起强大的社区(2年左右)后,才可能赶上。AMD在特定子群体(如加密货币挖矿、数据中心)中会始终抢占一部分市场份额,但在深度学习领域,NVIDIA至少在未来几年内仍可能保持其垄断地位。
经验法则:如果你预计将进行超过一年的深度学习,购买一台桌面GPU会更便宜。否则,云实例更为合适,除非你具备丰富的云计算技能,并且希望能够随时扩展或缩减GPU数量以获得更大的灵活性。
以下段落中的数字会有所变化,但它们提供了一个帮助你理解大致成本的情境。你可以使用类似的计算方法来判断云GPU是否是适合你的最佳方案。
在何时云GPU比桌面GPU更贵,主要取决于你所使用的云服务,因此最好自己做一些数学计算。下面,我将以AWS V100的spot实例为例进行计算,并将其与一台配备RTX 3090的桌面(性能相近)进行对比。配备RTX 3090的桌面成本为2200美元(2-GPU裸机+RTX 3090)。另外,假设你在美国,电力费用为每千瓦时0.12美元。与此相比,AWS按需实例的价格为每小时2.14美元。
在15%的利用率下,桌面GPU每年消耗:
(350 W (GPU) + 100 W (CPU)) * 0.15 (利用率) * 24小时 * 365天 = 591千瓦时/年
所以每年591千瓦时的电力消耗,额外费用为71美元。
对于15%利用率的桌面与云实例之间的盈亏平衡点(即每天使用云实例的时间为15%),大约是300天(桌面:2311美元 vs AWS按需实例:2270美元):
$2.14/小时 * 0.15 (利用率) * 24小时 * 300天 = $2,311
因此,如果你预计在300天后仍然运行深度学习模型,购买桌面GPU要比使用AWS按需实例更为划算。
你可以对任何云服务进行类似的计算,以帮助你决定选择云服务还是桌面GPU。
常见的利用率如下:
博士生个人桌面:< 15%
博士生Slurm GPU集群:> 35%
公司范围内Slurm研究集群:> 60%
一般来说,对于那些思考前沿想法比开发实际产品更重要的职业,利用率较低。一些领域(如可解释性研究)具有较低的利用率,而其他领域(如机器翻译、语言建模)则有更高的利用率。总体而言,个人机器的利用率通常被高估。通常,大多数个人系统的利用率介于5%到10%之间。这也是为什么我强烈建议研究团队和公司使用Slurm GPU集群,而不是单独的桌面GPU机器。