深度学习是一个对计算要求很高的领域,您对GPU的选择将从根本上决定您的深度学习体验。但是,如果您想购买新的 GPU,哪些功能很重要?GPU RAM、核心、张量核心、缓存?如何做出性价比高的选择?
GPU 是如何工作的?
正如许多人所说,GPU 如此之快是因为它们对矩阵乘法和卷积非常有效,但没有人真正解释为什么会这样。真正的原因是内存带宽,而不一定是并行性。
首先,您必须了解 CPU 是延迟优化的,而 GPU 是带宽优化的。您可以将其想象成 CPU 是法拉利,GPU 是大卡车。两者的任务都是从随机位置 A 取包裹,并将这些包裹运送到另一个随机位置 B。CPU(法拉利)可以在您的 RAM 中快速获取一些内存(包裹),而 GPU(大卡车)速度较慢这样做(更高的延迟)。然而,CPU(法拉利)需要来回多次才能完成它的工作(位置 A $\rightarrow$ 拿起 2 个包裹 $\rightarrow$ 位置 B ... 重复)而 GPU 可以在一次(位置 A $\rightarrow$ 取 100 个包裹 $\rightarrow$ 位置 B ... 重复)。
因此,换句话说,CPU 擅长快速获取少量内存 (5 * 3 * 7),而 GPU 擅长获取大量内存(矩阵乘法:(A*B)*C)。最好的 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 比其他架构(如 Xeon Phis)更具优势,在 Xeon Phi 中,这种利用实现起来很复杂且调试起来很痛苦,最终使得 Xeon Phi 上的性能最大化变得困难。
最后,这意味着您可以在 GPU 上的 L1 缓存和寄存器文件中存储大量数据,以重用卷积和矩阵乘法块。例如,最好的矩阵乘法算法使用 2 个 64x32 到 96x64 数字的块用于 L1 缓存中的 2 个矩阵,以及一个 16x16 到 32x32 数字寄存器块用于每个线程块的输出和(1 个线程块 = 最多 1024 个线程;你有 8每个流处理器的线程块,整个 GPU 总共有 60 个流处理器)。如果您有一个 100MB 的矩阵,您可以将其拆分为更小的矩阵以适合您的缓存和寄存器,然后以 10-80TB/s 的速度与三个矩阵块进行矩阵乘法——这非常快!这是 GPU 比 CPU 快得多以及它们非常适合深度学习的第三个原因。
请记住,较慢的内存总是主导性能瓶颈。如果 95% 的内存移动发生在寄存器中 (80TB/s),5% 发生在主存中 (0.75TB/s),那么您仍然将大部分时间花在主存的内存访问上(大约是主存的六倍)很多)。
因此按重要性排序:(1) 高带宽主内存,(2) 在线程并行下隐藏内存访问延迟,以及 (3) 大而快的寄存器和易于编程的 L1 内存是使 GPU 非常适合于深度学习。
深度学习处理速度最重要的 GPU 规格
本节可以帮助您更直观地了解如何思考深度学习性能。这种理解将帮助您自己评估未来的 GPU。本节按每个组件的重要性排序。张量核心是最重要的,其次是 GPU 的内存带宽、缓存层次结构,然后才是 GPU 的 FLOPS。
张量核
张量核心是执行非常高效的矩阵乘法的微型核心。由于任何深度神经网络中最昂贵的部分是矩阵乘法,张量核心非常有用。很快,它们非常强大,我不推荐任何没有 Tensor Core 的 GPU。
了解它们的工作原理有助于理解这些专门用于矩阵乘法的计算单元的重要性。在这里,我将向您展示一个简单的 A*B=C 矩阵乘法示例,其中所有矩阵的大小均为 32×32,计算模式在使用和不使用 Tensor Cores 时是什么样子的。这是一个简化的示例,并不是编写高性能矩阵乘法内核的确切方式,但它具有所有基础知识。CUDA 程序员会把它作为第一个“草稿”,然后用双缓冲、寄存器优化、占用优化、指令级并行等概念逐步优化它,我不会在这一点上讨论.
要完全理解此示例,您必须了解循环的概念。如果处理器以 1GHz 运行,它每秒可以执行 10^9 个周期。每个循环代表一个计算机会。但是,大多数时候,操作需要的时间超过一个周期。因此,我们基本上有一个队列,下一个操作需要等待下一个操作完成。这也称为操作的延迟。
以下是一些重要的操作延迟周期时间。这些时间可以从 GPU 生成更改为 GPU 生成。这些数字适用于缓存相对较慢的Ampere GPU 。
全局内存访问(高达 80GB):~380 个周期
L2 缓存:~200 个周期
L1 缓存或共享内存访问(每个流式多处理器高达 128 kb):~34 个周期
融合乘法和加法,a*b+c (FFMA):4 个周期
Tensor Core矩阵乘法:1个周期
每个操作总是由一组 32 个线程执行。这个包被称为线程经。warp 通常以同步模式运行——warp 中的线程必须相互等待。GPU 上的所有内存操作都针对扭曲进行了优化。例如,从全局内存加载以 32*4 字节的粒度发生,正好是 32 个浮点数,一个 warp 中的每个线程正好一个浮点数。我们最多可以在一个流式多处理器 (SM) 中拥有 32 个 warps = 1024 个线程,相当于一个 CPU 核心的 GPU。SM 的资源在所有活跃的 warp 之间分配。这意味着有时我们希望运行更少的 warp,以便每个 warp 拥有更多的寄存器/共享内存/Tensor Core 资源。
对于以下两个示例,我们假设我们拥有相同的计算资源。对于这个 32×32 矩阵乘法的小例子,我们使用 8 个 SM(大约是 RTX 3090 的 10%)和每个 SM 8 个 warp。
要了解循环延迟如何与每个 SM 的线程和每个 SM 的共享内存等资源一起发挥作用,我们现在来看一下矩阵乘法的示例。虽然以下示例大致遵循了使用和不使用 Tensor Core 的矩阵乘法的计算步骤序列,但请注意,这些示例非常简化。矩阵乘法的真实案例涉及更大的共享内存块和略有不同的计算模式。
没有张量核的矩阵乘法
如果我们想要进行 A*B=C 矩阵乘法,其中每个矩阵的大小为 32×32,那么我们想要将我们重复访问的内存加载到共享内存中,因为它的延迟大约低五倍(200 周期对 34周期)。共享内存中的内存块通常称为内存块或简称为块。使用 2*32 warp 可以并行地将两个 32×32 的浮点数加载到共享内存块中。我们有 8 个 SM,每个 8 个 warp,因此由于并行化,我们只需要执行一次从全局到共享内存的顺序加载,这需要 200 个周期。
要进行矩阵乘法,我们现在需要从共享内存 A 和共享内存 B 加载一个包含 32 个数字的向量,并执行融合乘加 (FFMA)。然后将输出存储在寄存器 C 中。我们划分工作,使每个 SM 进行 8 次点积 (32×32) 来计算 C 的 8 个输出。为什么这恰好是 8(在旧算法中为 4)是非常技术性的。我推荐 Scott Gray 关于矩阵乘法的博客文章来理解这一点。这意味着我们有 8 次共享内存访问,每次访问花费 34 个周期和 8 个 FFMA 操作(并行 32 个),每个操作花费 4 个周期。总的来说,我们的成本是:
200个周期(全局内存)+ 8*34个周期(共享内存)+ 8*4个周期(FFMA)= 504个周期
让我们看看使用 Tensor Cores 的周期成本。
使用 Tensor Core 进行矩阵乘法
使用 Tensor Core,我们可以在一个周期内执行 4×4 矩阵乘法。为此,我们首先需要将内存放入 Tensor Core。与上面类似,我们需要从全局内存(200 个周期)中读取并存储在共享内存中。要进行 32×32 矩阵乘法,我们需要进行 8×8=64 个 Tensor Cores 运算。单个 SM 有 8 个 Tensor Core。因此,有了 8 个 SM,我们就有了 64 个 Tensor Core——这正是我们需要的数量!我们可以通过 1 次内存传输(34 个周期)将数据从共享内存传输到 Tensor Core,然后执行这 64 个并行 Tensor Core 操作(1 个周期)。这意味着 Tensor Cores 矩阵乘法的总成本,在这种情况下,是:
200 个周期(全局内存)+ 34 个周期(共享内存)+ 1 个周期(Tensor Core)= 235 个周期。
因此,我们通过张量核心将矩阵乘法成本从 504 个周期显着减少到 235 个周期。在这个简化的案例中,Tensor Cores 降低了共享内存访问和 FFMA 操作的成本。
这个例子被简化了,例如,通常每个线程都需要计算在你从全局内存向共享内存传输数据时要读写哪块内存。通过新的 Hooper (H100) 架构,我们还让张量内存加速器 (TMA) 在硬件中计算这些索引,从而帮助每个线程专注于更多的计算而不是计算索引。
使用 Tensor Core 和异步副本 (RTX 30/RTX 40) 和 TMA (H100) 进行矩阵乘法
RTX 30 Ampere 和 RTX 40 Ada 系列 GPU 还支持在全局内存和共享内存之间执行异步传输。H100 Hopper GPU 通过引入张量内存加速器 (TMA) 单元进一步扩展了这一点。TMA 单元将异步副本和索引计算结合起来同时进行读取和写入——因此每个线程不再需要计算下一个要读取的元素,每个线程可以专注于进行更多的矩阵乘法计算。这看起来如下。
TMA 单元从全局内存获取内存到共享内存(200 个周期)。一旦数据到达,TMA 单元就会从全局内存中异步获取下一个数据块。发生这种情况时,线程从共享内存加载数据并通过张量核心执行矩阵乘法。线程完成后,它们等待 TMA 单元完成下一个数据传输,然后重复该序列。
因此,由于异步性质,TMA 单元读取的第二个全局内存已经在线程处理当前共享内存块时进行。这意味着,第二次读取仅需 200 – 34 – 1 = 165 个周期。
由于我们进行了多次读取,只有第一个内存访问会变慢,所有其他内存访问将与 TMA 单元部分重叠。因此,平均而言,我们将时间减少了 35 个周期。
165 个周期(等待异步复制完成)+ 34 个周期(共享内存)+ 1 个周期(Tensor Core)= 200 个周期。
这又将矩阵乘法加速了 15%。
从这些示例中可以清楚地看出为什么下一个属性内存带宽对于配备 Tensor-Core 的 GPU 如此重要。由于全局内存是迄今为止使用 Tensor Core 进行矩阵乘法的最大周期成本,如果可以减少全局内存延迟,我们甚至可以拥有更快的 GPU。我们可以通过增加内存的时钟频率(每秒更多的周期,但也有更多的热量和更高的能量需求)或增加可以在任何时间传输的元素数量(总线宽度)来做到这一点。
内存带宽
从上一节中,我们已经看到 Tensor Core 非常快。如此之快,事实上,它们大部分时间都处于空闲状态,因为它们正在等待内存从全局内存到达。例如,在使用巨大矩阵的 GPT-3 规模训练期间——越大,对 Tensor Core 越好——我们的 Tensor Core TFLOPS 利用率约为 45-65%,这意味着即使对于大型神经网络也有大约 50%当时,Tensor Core 处于闲置状态。
这意味着当比较两个带有 Tensor Core 的 GPU 时,每个 GPU 性能的最佳指标之一是它们的内存带宽。例如,A100 GPU 的内存带宽为 1,555 GB/s,而 V100 为 900 GB/s。因此,A100 与 V100 的加速比基本估计为 1555/900 = 1.73 倍。
L2 缓存/共享内存/L1 缓存/寄存器
由于内存传输到 Tensor Core 是性能的限制因素,我们正在寻找其他 GPU 属性,以实现更快的内存传输到 Tensor Cores。二级缓存、共享内存、一级缓存和使用的寄存器数量都是相关的。要了解内存层次结构如何实现更快的内存传输,有助于了解如何在 GPU 上执行矩阵乘法。
为了执行矩阵乘法,我们利用了 GPU 的内存层次结构,从慢速全局内存到更快的 L2 内存,再到快速本地共享内存,再到快如闪电的寄存器。但是,内存越快,它就越小。
虽然从逻辑上讲,L2 和 L1 内存相同,但 L2 缓存更大,因此检索缓存行需要遍历的平均物理距离更大。您可以将 L1 和 L2 缓存视为有组织的仓库,您可以在其中检索项目。您知道物品在哪里,但是对于较大的仓库来说,去那里平均需要更长的时间。这就是L1和L2缓存的本质区别。大 = 慢,小 = 快。
对于矩阵乘法,我们可以使用这种层次结构分离成越来越小,因此越来越快的内存块来执行非常快速的矩阵乘法。为此,我们需要将大矩阵乘法分块为更小的子矩阵乘法。这些块称为内存块,或通常简称为块。
我们在快速且接近流式多处理器 (SM)(相当于 CPU 内核)的本地共享内存中对这些较小的图块执行矩阵乘法。对于 Tensor Cores,我们更进了一步:我们获取每个图块并将这些图块的一部分加载到 Tensor Core 中,这些 Tensor Core 由寄存器直接寻址。L2 缓存中的矩阵内存块比全局 GPU 内存(GPU RAM)快 3-5 倍,共享内存比全局 GPU 内存快约 7-10 倍,而 Tensor Cores 的寄存器比全局 GPU 内存快约 200 倍.
拥有更大的图块意味着我们可以重用更多的内存。事实上,您可以看到 TPU 的每个 Tensor Core 都有非常非常大的块。因此,TPU 可以在每次从全局内存传输时重用更多的内存,这使得它们在矩阵乘法方面比 GPU 更高效。
每个图块大小取决于每个流式多处理器 (SM) 有多少内存,以及所有 SM 有多少二级缓存。我们在以下架构上有以下共享内存大小:
Volta (Titan V):128kb 共享内存/6 MB L2
Turing(RTX 20s 系列):96 kb 共享内存/5.5 MB L2
Ampere(RTX 30s 系列):128 kb 共享内存/6 MB L2
Ada(RTX 40s 系列):128 kb 共享内存/72 MB L2
我们看到 Ada 有一个更大的 L2 缓存,允许更大的 tile 大小,这减少了全局内存访问。例如,对于 BERT large 在训练期间,任何矩阵乘法的输入和权重矩阵都可以很好地适合 Ada 的 L2 缓存(但不是其他 Us)。因此,数据只需从全局内存加载一次,然后数据可通过 L2 缓存使用,使 Ada 的这种架构的矩阵乘法速度提高约 1.5-2.0 倍。对于较大的模型,训练期间的加速比较低,但存在某些最佳点可能会使某些模型更快。推断,批处理大小大于 8 也可以从更大的 L2 缓存中获益匪浅。
估计 Ada / Hopper 深度学习性能
本节适用于那些想要了解我如何得出 Ampere GPU 性能估计的更多技术细节的人。如果您不关心这些技术方面,可以安全地跳过本节。
实用的 Ada / 料斗速度估计
假设我们对 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 提供的数据中找到对这两种偏差的估计。
将批量大小加倍可将图像/秒 (CNN) 的吞吐量提高 13.6%。我在我的 RTX Titan 上对变压器的相同问题进行了基准测试,结果令人惊讶地发现了完全相同的结果:13.5%——这似乎是一个可靠的估计。
随着我们在越来越多的 GPU 上并行化网络,我们会因为一些网络开销而损失性能。A100 8x GPU 系统具有比 V100 8x GPU 系统(NVLink 2.0)更好的网络(NVLink 3.0)——这是另一个混杂因素。直接看 NVIDIA 的数据,我们可以发现,对于 CNN,8x A100 的系统比 8x V100 的系统开销低 5%。这意味着如果从 1x A100 到 8x A100 给你加速,比如 7.00x,那么从 1x V100 到 8x V100 只给你 6.67x 的加速。对于变压器,这个数字是 7%。
使用这些数字,我们可以从 NVIDIA 提供的直接数据中估计一些特定深度学习架构的加速。与 Tesla V100 相比,Tesla A100 提供以下加速:
SE-ResNeXt101:1.43x
Masked-R-CNN:1.47x
Transformer(12 层,机器翻译,WMT14 en-de):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 没有启用性能降级。
RTX40 和 RTX 30 系列的优点和问题
与 NVIDIA Turing RTX 20 系列相比,新的 NVIDIA Ampere RTX 30 系列具有额外的优势,例如稀疏网络训练和推理。其他功能,如新数据类型,应该更多地被视为一种易于使用的功能,因为它们提供与图灵相同的性能提升,但不需要任何额外的编程。
Ada RTX 40 系列拥有更进一步的进步,例如 8 位浮点 (FP8) 张量核心。与 RTX 30 相比,RTX 40 系列也存在类似的功率和温度问题。通过正确连接电源线,可以轻松避免 RTX 40 中电源连接器电缆熔化的问题。
稀疏网络训练
Ampere 允许以密集的速度进行细粒度结构自动稀疏矩阵乘法。这是如何运作的?取一个权重矩阵并将其分成 4 个元素的片段。现在想象这 4 个中的 2 个元素为零。图 1 显示了它的外观。
当您将此稀疏权重矩阵与一些密集输入相乘时,Ampere 中的稀疏矩阵张量核心功能会自动将稀疏矩阵压缩为大小一半的密集表示,如图 2 所示。压缩后,密集压缩矩阵tile 被送入张量核心,该核心计算两倍于通常大小的矩阵乘法。这有效地产生了 2 倍的加速,因为从共享内存进行矩阵乘法期间的带宽要求减半。
虽然此功能仍处于实验阶段并且训练稀疏网络还不普遍,但在您的 GPU 上拥有此功能意味着您已为未来的稀疏训练做好准备。
低精度计算
之前已经证明新数据类型可以提高低精度反向传播过程中的稳定性。
目前,如果你想用 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)获得旧数据类型的所有好处。因此,这些数据类型不提供加速,而是提高低精度训练的易用性。
风扇设计和 GPU 温度问题
虽然 RTX 30 系列的新风扇设计在冷却 GPU 方面表现出色,但非创始人版 GPU 的不同风扇设计可能会出现更多问题。如果您的 GPU 升温超过 80C,它会自我调节并降低其计算速度/功率。如果将多个 GPU 彼此相邻堆叠,这种过热情况尤其可能发生。一个解决方案是使用 PCIe 扩展器在 GPU 之间创造空间。
使用 PCIe 扩展器扩展 GPU 对冷却非常有效,华盛顿大学的其他博士生和我使用这种设置取得了巨大成功。它看起来不漂亮,但可以让您的 GPU 保持凉爽!这已经运行了 4 年,没有任何问题。如果您没有足够的空间来容纳 PCIe 插槽中的所有 GPU,它也会有所帮助。例如,如果您能在台式机机箱内找到空间,则可以购买标准的 3 插槽宽度 RTX 4090 并在机箱内使用 PCIe 扩展器将它们展开。这样,您可以通过一个简单的解决方案同时解决 4x RTX 4090 设置的空间问题和散热问题。
3 插槽设计和电源问题
RTX 3090 和 RTX 4090 是 3 插槽 GPU,因此无法在采用 NVIDIA 默认风扇设计的 4x 设置中使用它。这是有道理的,因为它以超过 350W TDP 运行,并且在多 GPU 2 插槽设置中很难冷却。RTX 3080 仅在 320W TDP 时稍好一些,冷却 4x RTX 3080 设置也将非常困难。
在 4x RTX 3090 或 4x RTX 4090 机箱中也很难为 4x 350W = 1400W 或 4x 450W = 1800W 系统供电。1600W 的电源装置 (PSU) 很容易买到,但只有 200W 可以为CPU 和主板供电可能太紧了。组件的最大功率只有在组件被充分利用的情况下才会被使用,而在深度学习中,CPU 通常只是处于弱负载状态。因此,1600W PSU 可能与 4x RTX 3080 build 配合得很好,但对于 4x RTX 3090 build,最好寻找高瓦数 PSU (+1700W)。我的一些追随者在加密 PSU 方面取得了巨大成功——请查看评论部分以了解更多信息。否则,请务必注意并非所有插座都支持 1600W 以上的 PSU,尤其是在美国。这就是为什么在美国,目前市场上很少有 1600W 以上的标准台式机 PSU。如果您获得服务器或加密 PSU,请注意外形尺寸——确保它适合您的计算机机箱。
功率限制:解决功率问题的优雅解决方案?
可以在 GPU 上设置功率限制。因此,您将能够以编程方式将 RTX 3090 的功率限制设置为 300W,而不是其标准的 350W。在 4x GPU 系统中,节省了 200W,这可能刚好足以构建具有 1600W PSU 的 4x RTX 3090 系统。它还有助于使 GPU 保持凉爽。因此,设置功率限制可以同时解决 4x RTX 3080 或 4x RTX 3090 设置、冷却和功率的两个主要问题。对于 4x 设置,您仍然需要有效的鼓风机 GPU(标准设计可能足以满足此要求),但这解决了 PSU 问题。
您可能会问,“这不会降低 GPU 的速度吗?” 是的,确实如此,但问题是有多少。我在不同的功率限制下对图 5 所示的 4x RTX 2080 Ti 系统进行了基准测试以对此进行测试。我在推理期间对 BERT Large 的 500 个小批量的时间进行了基准测试(不包括 softmax 层)。我选择 BERT Large inference,因为根据我的经验,这是对 GPU 压力最大的深度学习模型。因此,我预计功率限制对该模型的影响最大。因此,此处报告的减速可能接近您可以预期的最大减速。结果如图 7 所示。
正如我们所见,设置功率限制不会严重影响性能。将功率限制为 50W——足以处理 4x RTX 3090——性能仅降低 7%。
RTX 4090s 和熔化电源连接器:如何预防问题
有一种误解认为 RTX 4090 电源线会因为弯曲而熔化。但是发现只有0.1%的用户有这个问题,而且是由于用户错误导致的问题。这里有一段视频显示主要问题是电缆未正确插入。
因此,如果您遵循以下安装说明,使用 RTX 4090 卡是绝对安全的:
如果您使用旧电缆或旧 GPU,请确保触点没有碎屑/灰尘。
使用电源连接器并将其插入插座,直到听到“咔嗒”声*——这是最重要的部分。
通过从左到右摆动电源线来测试是否合适。电缆不应移动。
目视检查与插座的接触情况,电缆与插座之间不应有间隙。
H100 和 RTX 40 系列 GPU 中的 8 位浮点数支持
支持 8 位浮点数 (FP8) 是 RTX 40 系列和 H100 GPU 的巨大优势。使用 8 位输入,它可以让您以两倍的速度加载矩阵乘法的数据,您可以在缓存中存储两倍的矩阵元素,这在 Ada 和 Hopper 架构中非常大,现在使用 FP8 张量核心,您可以获得 0.66 RTX 4090 的 PFLOPS 计算——这比 2007 年世界上最快的超级计算机的 FLOPS 还要多。具有 FP8 计算的 4x RTX 4090 可与 2010 年世界上更快的超级计算机相媲美(深度学习在 2009 年才开始发挥作用) .
使用 8 位精度的主要问题是,transformer 在训练过程中使用如此少的位会变得非常不稳定和崩溃,或者在推理过程中产生无意义。我写了一篇关于大型语言模型中出现不稳定性的论文,我还写了一篇更易于访问的博客文章。
主要的方法是:使用 8 位而不是 16 位会使事情变得非常不稳定,但如果你保持几个高精度的维度,一切都很好。
但是RTX 30 / A100 / Ampere 一代GPU 已经支持Int8,为什么RTX 40 中的FP8 又是一次大升级?FP8 数据类型比 Int8 数据类型稳定得多,并且很容易在层范数或非线性函数等函数中使用它,而这些函数很难用 Integer 数据类型来实现。这将使在训练和推理中使用它变得非常简单。我认为这将使 FP8 训练和推理在几个月内变得相对普遍。
您可以在下面看到本文中关于 Float 与 Integer 数据类型的一个相关主要结果。我们可以逐位看到,FP4 数据类型比 Int4 数据类型保留了更多信息,从而提高了 4 个任务的平均 LLM zeroshot 精度。
GPU 的原始性能排名
下面我们看到了所有 GPU 的原始相关性能图表。我们看到 H100 GPU 的 8 位性能与针对 16 位性能优化的旧卡存在巨大差距。
对于此数据,我没有为旧 GPU 建模 8 位计算。我这样做是因为 8 位推理和训练在 Ada/Hopper GPU 上更有效,因为 8 位浮点数据类型和张量内存加速器 (TMA) 节省了计算读/写索引的开销,这特别有用用于 8 位矩阵乘法。Ada/Hopper 也有 FP8 支持,这使得特别是 8 位训练更加有效。
我没有为 8 位训练建模数字,因为要建模我需要知道 Hopper/Ada GPU 上 L1 和 L2 缓存的延迟,它们是未知的,我无法访问此类 GPU。在 Hopper/Ada 上,8 位训练性能很可能是 16 位训练性能的 3-4 倍,如果缓存像传闻的那样快的话。
但即使使用新的 FP8 张量核心,在对 GPU 性能建模时也存在一些难以考虑的额外问题。例如,FP8 张量核心不支持转置矩阵乘法,这意味着反向传播需要在乘法之前进行单独的转置,或者需要在内存中保存两组权重——一组转置和非转置。当我在我的LLM.int8()项目中试验 Int8 训练时,我使用了两组权重,这显着降低了整体加速。我认为使用正确的算法/软件可以做得更好,但这表明缺少张量核心的转置矩阵乘法等功能会影响性能。
对于旧 GPU,Int8 推理性能接近 13B 参数以下模型的 16 位推理性能。旧 GPU 上的 Int8 性能仅在具有 175B 或更多参数的相对较大模型时才有意义。
GPU 深度学习性能
下面我们看到按 8 位推理性能排序的所有 GPU 每美元性能图表。如何使用图表为您找到合适的 GPU,如下所示:
确定您需要的 GPU 内存量(粗略的启发式:至少 12 GB 用于图像生成;至少 24 GB 用于处理变压器)
虽然 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 上有一笔好交易,我也会选择它们而不是 A6000,因此您可以随时询问这些 GPU 的报价。
显卡推荐
我有一个创建推荐流程图,您可以在下面看到(单击此处查看交互式应用程序来自南晓)。虽然此图表在 80% 的情况下都能为您提供帮助,但它可能不太适合您,因为这些选项可能太贵了。在这种情况下,请尝试查看上面的基准测试并选择最具成本效益的 GPU,该 GPU 仍具有足够的 GPU 内存供您的用例使用。您可以通过在 vast.ai 或 Lambda Cloud 中运行您的问题一段时间来估算所需的 GPU 内存,以便了解您需要什么。如果您只是偶尔需要一个 GPU(每隔几天持续几个小时)并且不需要下载和处理大型数据集即可开始,那么 vast.ai 或 Lambda Cloud 可能也能很好地工作。但是,如果您每天使用 GPU 数月且使用率很高(每天 12 小时),那么云 GPU 通常不是一个好的选择。您可以使用“何时使用云与专用 GPU 桌面/服务器更好?”中的示例。下面的部分来确定云 GPU 是否适合您。
等待未来的 GPU 升级是否更好?GPU 的未来。
要了解跳过这一代并购买下一代 GPU 是否有意义,有必要谈谈未来的改进会是什么样子。
过去可以通过缩小晶体管的尺寸来提高处理器的速度。现在这一切即将结束。例如,虽然缩小 SRAM 提高了速度(更小的距离,更快的内存访问),但情况已不再如此。当前对 SRAM 的改进不再提高其性能,甚至可能是负面的。虽然张量核心等逻辑变得更小,但这并不一定会使 GPU 更快,因为矩阵乘法的主要问题是将内存分配给张量核心,这由 SRAM 和 GPU RAM 的速度和大小决定。如果我们将内存模块堆叠到高带宽模块 (HBM3+) 中,GPU RAM 的速度仍然会提高,但是对于消费类应用来说,这些模块的制造成本太高了。正如我们在 RTX 30s 和 40s 系列中看到的那样,提高 GPU 原始速度的主要方法是使用更多的功率和更多的冷却。但这不能持续太久。
AMD CPU 使用的小芯片是另一种直接的前进方式。AMD 通过开发 CPU 小芯片击败了英特尔。小芯片是与高速片上网络融合在一起的小芯片。您可以将它们视为两个物理上靠得很近的 GPU,几乎可以将它们视为一个大型 GPU。它们的制造成本更低,但更难组合成一个大芯片。因此,您需要小芯片之间的专有技术和快速连接。AMD 在小芯片设计方面拥有丰富的经验。AMD 的下一代 GPU 将采用 chiplet 设计,而 NVIDIA 目前还没有此类设计的公开计划。这可能意味着与 NVIDIA GPU 相比,下一代 AMD GPU 在成本/性能方面可能更好。
然而,目前 GPU 的主要性能提升是专用逻辑。例如,Ampere 一代 (RTX 30 / A100 / RTX 40) 或扩展 Tensor Memory Accelerator (TMA) 上的异步复制硬件单元,都减少了将内存从慢速全局内存复制到快速共享内存的开销(缓存)通过专门的硬件,因此每个线程可以做更多的计算。TMA 还通过执行读/写索引的自动计算来减少开销,这对于 8 位计算尤为重要,与 16 位计算相比,相同内存量的元素数量翻倍。因此专门的硬件逻辑可以进一步加速矩阵乘法。
低位精度是几年来的另一种直接方法。在接下来的几个月中,我们将看到 8 位推理和训练的广泛采用。我们将在明年看到广泛的 4 位推理。目前,4 位训练的技术还不存在,但研究看起来很有希望,我预计第一个具有竞争预测性能的高性能 FP4 大型语言模型 (LLM) 将在 1-2 年内被训练出来。
目前看来,要达到 2 位精度进行训练几乎是不可能的,但这比进一步缩小晶体管要容易得多。因此,硬件的进步主要取决于使使用硬件提供的专用功能成为可能的软件和算法。
到 2032 年,我们可能仍然能够改进算法 + 硬件的组合,但在那之后将达到 GPU 改进的终点(类似于智能手机)。2032 年后的性能提升浪潮将来自更好的网络算法和海量硬件。目前还不确定消费级 GPU 是否适用。可能是您需要 RTX 9090 才能运行 Super HyperStableDiffusion Ultra Plus 9000 Extra 或 OpenChatGPT 5.0,但也可能是某些公司会提供比 RTX 9090 的电费便宜的高质量 API,而您想要使用笔记本电脑 + API 进行图像生成和其他任务。
总的来说,我认为投资 8 位 GPU 将是未来 9 年的一项非常可靠的投资。4 位和 2 位的改进可能很小,并且只有在可以很好地利用稀疏矩阵乘法后,排序核心等其他功能才会变得相关。我们可能会在 2-3 年内看到某种其他的进步,这将使它成为 4 年后的下一个 GPU,但如果我们继续依赖矩阵乘法,我们就会失去动力。这使得对新 GPU 的投资持续时间更长。
需要 PCIe 4.0 还是 PCIe 5.0?
一般来说,没有。如果您有 GPU 集群,PCIe 5.0 或 4.0 会很棒。如果您有一台 8 倍 GPU 的机器,那没关系,但除此之外,它不会产生很多好处。它允许更好的并行化和更快的数据传输。数据传输在任何应用程序中都不是瓶颈。在计算机视觉中,在数据传输管道中,数据存储可能是瓶颈,但从 CPU 到 GPU 的 PCIe 传输不是。因此,对于大多数人来说,没有真正的理由去获得 PCIe 5.0 或 4.0 设置。好处是在 4 GPU 设置中并行化可能提高 1-7%。
需要 8x/16x PCIe 通道吗?
与 PCIe 4.0 相同——通常不会。并行化和快速数据传输需要PCIe 通道,这很少成为瓶颈。在 4 个通道上运行 GPU 很好,尤其是当您只有 2 个 GPU 时。对于 4 GPU 设置,我更喜欢每个 GPU 8 个通道,但如果您在所有 4 个 GPU 上并行化,以 4 个通道运行它们可能只会将性能降低大约 5-10%。
如果 4 个 RTX 4090 或 3090 每个占用 3 个 PCIe 插槽,该如何安装它们?
您需要获得双插槽变体中的一种,或者您可以尝试使用 PCIe 扩展器将它们分散开来。除了空间,您还应该立即考虑冷却和合适的 PSU。
PCIe 扩展器也可以解决空间和散热问题,但您需要确保机箱中有足够的空间来展开 GPU。确保您的 PCIe 扩展器足够长!
如何冷却 4x RTX 3090 或 4x RTX 3080?
请参阅上一节。
可以使用不同 GPU 类型的多个 GPU 吗?
是的你可以!但是您无法在不同类型的 GPU 之间高效地并行化,因为您通常会以最慢的 GPU 速度运行(数据和完全分片的并行性)。因此,不同的 GPU 工作得很好,但是跨这些 GPU 的并行化将是低效的,因为最快的 GPU 将等待最慢的 GPU 赶上同步点(通常是梯度更新)。
什么是 NVLink,它有用吗?
通常,NVLink 没有用。NVLink 是 GPU 之间的高速互连。如果您的 GPU 集群具有 +128 个 GPU,这将很有用。否则,与标准 PCIe 传输相比,它几乎没有任何优势。
没有足够的钱,即使是您推荐的最便宜的 GPU?
绝对购买二手 GPU。您可以购买一个小型便宜的 GPU 进行原型设计和测试,然后将其推出到云中进行完整的实验,例如 vast.ai 或 Lambda Cloud。如果您只是时不时地在大型模型上训练/微调/推理并花更多时间在较小的模型上进行原型设计,这可能会很便宜。
GPU 的碳足迹是多少?如何在不污染环境的情况下使用 GPU?
我构建了一个碳计算器来计算学术界的碳足迹(从航班到会议的碳排放 + GPU 时间)。该计算器还可用于计算纯 GPU 碳足迹。你会发现 GPU 产生的碳比国际航班多得多。因此,如果您不想产生天文数字的碳足迹,就应该确保拥有绿色能源。如果我们地区没有电力供应商提供绿色能源,最好的办法就是购买碳补偿。许多人对碳抵消持怀疑态度。做他们的工作?他们是骗局吗?
我相信在这种情况下,怀疑只会带来伤害,因为什么都不做比冒着被骗的风险更有害。如果您担心诈骗,只需投资抵消投资组合即可将风险降至最低。
大约十年前,我参与了一个产生碳抵消的项目。碳抵消是通过燃烧中国矿山泄漏的甲烷产生的。联合国官员跟踪了整个过程,他们要求对项目现场进行干净的数字数据和实物检查。在这种情况下,产生的碳抵消是高度可靠的。我相信许多其他项目也有类似的质量标准。
需要在两台机器上并行化什么?
如果你想安全起见,如果你想跨机器并行化,你应该至少获得 +50Gbits/s 的网卡以获得加速。我建议至少有一个 EDR Infiniband 设置,这意味着网卡至少具有 50 GBit/s 的带宽。两张带电缆的 EDR 卡在 eBay 上的售价约为 500 美元。
在某些情况下,您可能能够使用 10 Gbit/s 以太网,但这通常仅适用于特殊网络(某些卷积网络)或您使用某些算法(Microsoft DeepSpeed)。
稀疏矩阵乘法特征是否适用于一般的稀疏矩阵?
似乎并非如此。由于稀疏矩阵的粒度需要有 2 个零值元素,每 4 个元素,稀疏矩阵需要非常结构化。可以稍微调整算法,这涉及将 4 个值合并为 2 个值的压缩表示,但这也意味着 Ampere GPU 无法实现精确的任意稀疏矩阵乘法。
是否需要英特尔 CPU 来支持多 GPU 设置?
我不推荐 Intel CPU,除非你在 Kaggle 比赛中大量使用 CPU(CPU 上的重线性代数)。不过,即使对于 Kaggle 竞赛,AMD CPU 仍然很棒。在深度学习方面,AMD CPU 通常比 Intel CPU 更便宜且更好。对于构建的 4x GPU,我的首选 CPU 将是 Threadripper。我们在大学里用 Threadrippers 构建了数十个系统,它们都运行良好——目前还没有投诉。对于 8x GPU 系统,我通常会选择您的供应商有经验的 CPU。CPU 和 PCIe/系统可靠性在 8x 系统中比直接性能或直接成本效益更重要。
电脑机箱设计对散热有影响吗?
不会。如果 GPU 之间至少有一个小间隙,GPU 通常可以完美冷却。机箱设计将为您提供 1-3 C 更好的温度,GPU 之间的空间将为您提供 10-30 C 的改进。最重要的是,如果 GPU 之间有空间,则冷却并不重要。如果 GPU 之间没有空间,则需要正确的冷却器设计(鼓风机)或其他解决方案(水冷、PCIe 扩展器),但无论哪种情况,机箱设计和机箱风扇都无关紧要。
AMD GPU + ROCm 会赶上 NVIDIA GPU + CUDA 吗?
未来1-2年内不会。这是一个三向问题:Tensor Cores、软件和社区。
AMD GPU 在纯硅方面非常出色:出色的 FP16 性能、出色的内存带宽。然而,与 NVIDIA GPU 相比,它们缺乏 Tensor Core 或等效物,这使得它们的深度学习性能较差。打包的低精度数学不会削减它。没有这个硬件特性,AMD GPU 将永远没有竞争力。有传言称,一些与 Tensor Core 等效的数据中心卡计划在 2020 年推出,但此后没有新数据出现。仅仅拥有与 Tensor Core 等效的数据中心卡也意味着很少有人能够负担得起这样的 AMD GPU,这将为 NVIDIA 带来竞争优势。
假设 AMD 将来会引入类似 Tensor-Core 的硬件功能。那么很多人会说,“但是没有适用于 AMD GPU 的软件!我该如何使用它们?” 这主要是一种误解。通过 ROCm 的 AMD 软件已经取得了长足的进步,通过 PyTorch 的支持也非常出色。虽然我没有看到很多 AMD GPUs + PyTorch 的体验报告,但所有的软件功能都是集成的。看起来,如果您选择任何网络,您都可以在 AMD GPU 上运行它。所以AMD在这里已经走了很长一段路,这个问题或多或少得到了解决。
但是,如果解决软件和Tensor Cores的缺失,AMD还有一个问题:缺乏社区。如果您在使用 NVIDIA GPU 时遇到问题,可以通过 Google 搜索问题并找到解决方案。这建立了对 NVIDIA GPU 的高度信任。您拥有使使用 NVIDIA GPU 变得容易的基础设施(任何深度学习框架都有效,任何科学问题都得到很好的支持)。您拥有使使用 NVIDIA GPU 变得轻而易举的技巧和窍门(例如,apex)。你可以在每个角落找到 NVIDIA GPU 和编程方面的专家,而我对 AMD GPU 专家的了解要少得多。
在社区方面,AMD 有点像 Julia vs Python。Julia 有很大的潜力,许多人会说它是科学计算的高级编程语言,这是正确的。然而,与 Python 相比,Julia 几乎没有被使用。这是因为 Python 社区非常强大。Numpy、SciPy、Pandas 是许多人聚集的强大软件包。这与 NVIDIA 与 AMD 的问题非常相似。
因此,在引入等效的 Tensor Core(1/2 到 1 年?)并且围绕 ROCm 建立强大的社区(2 年?)之前,AMD 可能无法赶上。AMD 总是会在特定的子组(例如,加密货币挖掘、数据中心)中抢夺一部分市场份额。不过,在深度学习领域,NVIDIA 可能会至少再维持几年的垄断地位。
本文链接:https://www.kinber.cn/post/4943.html 转载需授权!
推荐本站淘宝优惠价购买喜欢的宝贝: