【翻译】为深度学习购买哪种GPU: 我在深度学习中使用GPU的经验和建议

文章目录

深度学习是一个具有强烈计算要求的领域,你对GPU的选择将从根本上决定你的深度学习体验。但是,如果你想购买一个新的GPU,哪些功能是重要的?GPU内存、核心、张量核心、缓存?如何做出一个具有成本效益的选择?这篇博文将深入探讨这些问题,解决常见的误解,让你对如何思考GPU有一个直观的认识,并借给你建议,这将有助于你做出适合你的选择。

这篇博文旨在让你对GPU和NVIDIA的新安培系列GPU有不同程度的了解。你可以选择:(1) 如果你对GPU如何工作的细节不感兴趣,与CPU相比,什么使GPU速度快,以及新的NVIDIA RTX 40 Ampere系列的独特之处,你可以直接跳到性能和每美元性能图表以及推荐部分。成本/性能数字构成了这篇博文的核心,围绕它的内容解释了构成GPU性能的细节。

(2) 如果你担心具体的问题,我已经在博文的后面部分回答并解决了最常见的问题和误解。

(3) 如果你想深入了解GPU、缓存和Tensor Cores的工作原理,最好是从头到尾阅读这篇博文。你可能想根据你对所提出的主题的理解,跳过一两节。

概述

这篇博文的结构如下。首先,我将解释是什么让GPU变得快速。我将讨论CPU与GPU、Tensor Cores、内存带宽和GPU的内存层次,以及这些与深度学习性能的关系。这些解释可能会帮助你对在GPU中寻找什么有一个更直观的感觉。我讨论了新的NVIDIA RTX 40安培GPU系列的独特功能,如果你购买GPU,这些功能值得考虑。从那里,我针对不同的场景提出了GPU建议。之后是一个问答部分,是在Twitter线程中向我提出的常见问题;在该部分中,我还将讨论常见的误解和一些杂项问题,如云与桌面、冷却、AMD与NVIDIA,以及其他。

GPU是如何工作的?

如果你经常使用GPU,了解它们的工作原理是非常有用的。这些知识将帮助你了解GPU是快还是慢的情况。反过来,你也许能够更好地理解为什么你首先需要一个GPU,以及其他未来的硬件选项如何能够与之竞争。如果你只想获得有用的性能数字和论据来帮助你决定购买哪种GPU,你可以跳过这一部分。对于GPU如何工作的问题,最好的高层次解释是我在Quora上的回答。

在Quora上阅读Tim Dettmers对 "为什么GPU非常适合深度学习 "的回答\n这是一个高水平的解释,很好地解释了为什么GPU比CPU更适合深度学习。如果我们看一下细节,我们就可以理解是什么让一个GPU比另一个更好。

对深度学习处理速度最重要的GPU规格

本节可以帮助你对如何思考深度学习的性能建立一个更直观的理解。这种理解将有助于你自己评估未来的GPU。本节按照每个组件的重要性进行排序。张量核心是最重要的,其次是GPU的内存带宽,缓存层次,最后才是GPU的FLOPS。"

张量核心

张量核心是能够进行非常有效的矩阵乘法的微小核心。由于任何深度神经网络中最昂贵的部分是矩阵乘法,因此张量核心非常有用。在快速方面,它们是如此强大,以至于我不推荐任何没有张量核心的GPU。

了解它们是如何工作的,有助于理解这些专门用于矩阵乘法的计算单元的重要性。在这里,我将向你展示一个简单的A*B=C矩阵乘法的例子,其中所有矩阵的大小为32×32,有无张量核心的计算模式是什么样的。这是一个简化的例子,并不是一个高性能的矩阵乘法内核的确切写法,但它有所有的基本要素。一个CUDA程序员会把它作为第一份 “草稿”,然后用双缓冲、寄存器优化、占用率优化、指令级并行等概念一步步优化它,在此我就不讨论了。

为了充分理解这个例子,你必须理解周期的概念。如果一个处理器以1GHz的速度运行,它每秒可以完成10^9个周期。每个周期代表一个计算的机会。然而,大多数时候,操作需要的时间超过一个周期。因此,我们本质上有一个队列,下一个操作需要等待下一个操作完成。这也被称为操作的延时。

下面是一些重要的操作的延迟周期时间。这些时间在不同的GPU世代会有变化。这些数字是针对安培GPU的,它们的缓存相对较慢。"

  • 全局内存访问(高达80GB):~380周期\n
  • 二级缓存: ~200个周期
  • L1高速缓存或共享内存访问(每个流式多处理器最多128kb)。~34周期
  • 融合乘法和加法,a*b+c(FFMA):4个周期
  • Tensor Core矩阵乘法。1个周期

每个操作总是由32个线程组成的包来执行。这个包被称为线程的翘曲。战群通常以同步模式运行–战群内的线程必须相互等待。GPU上的所有内存操作都是为战队而优化的。例如,从全局内存加载的粒度为32*4字节,正好是32个浮点,在一个战线上的每个线程正好有一个浮点。我们可以在一个流式多处理器(SM)中拥有多达32个经线=1024个线程,相当于一个CPU核心的GPU。一个SM的资源被分配给所有活动的经线。这意味着,有时我们希望运行较少的经线,以便每个经线有更多的寄存器/共享内存/张量核心资源。

对于下面的两个例子,我们假设我们有相同的计算资源。对于这个32×32矩阵乘法的小例子,我们使用了8个SM(大约是RTX 3090的10%)和每个SM的8个翘板。

为了了解周期延迟如何与每个SM的线程和每个SM的共享内存等资源一起发挥作用,我们现在看一下矩阵乘法的例子。虽然下面的例子大致上遵循了有张量核心和无张量核心的矩阵乘法的计算步骤顺序,但请注意这些是非常简化的例子。矩阵乘法的真实案例涉及到更大的共享内存瓦片和略有不同的计算模式。

没有张量核心的矩阵乘法

如果我们想做一个AB=C的矩阵乘法,其中每个矩阵的大小为32×32,那么我们想把重复访问的内存加载到共享内存中,因为其延迟大约低五倍(200个周期与34个周期)。共享内存中的一个内存块通常被称为内存块或只是一个内存块。将两个32×32的浮点加载到一个共享内存瓦片中,可以通过使用232的翘板来并行进行。我们有8个SM,每个有8个warps,所以由于并行化,我们只需要从全局到共享内存做一次顺序加载,这需要200个周期。

为了做矩阵乘法,我们现在需要从共享内存A和共享内存B中加载一个32个数字的向量,并进行融合乘法和累加(FFMA)。然后将输出存储在寄存器C中。我们进行分工,使每个SM做8x点乘(32×32)来计算C的8个输出。为什么正好是8(在旧的算法中是4)是非常有技术含量的。我推荐Scott Gray关于矩阵乘法的博文来理解这个。这意味着我们有8次共享内存访问,每次花费34个周期,还有8次FFMA操作(32次并行),每次花费4个周期。总的来说,我们的成本是:

200个周期(全局内存)+834个周期(共享内存)+84个周期(FFMA)=504个周期

让我们来看看使用张量核心的周期成本。

使用张量核心的矩阵乘法

通过张量核心,我们可以在一个周期内进行4×4矩阵乘法。要做到这一点,我们首先需要将内存进入张量核心。与上面类似,我们需要从全局内存中读取(200个周期)并存储在共享内存中。为了做一个32×32的矩阵乘法,我们需要做8×8=64个Tensor Cores操作。一个SM有8个Tensor Cores。因此,有了8个SM,我们就有了64个张量核心–正是我们需要的数量我们可以通过1次内存传输(34个周期)将数据从共享内存传输到张量核心,然后进行这64次并行的张量核心操作(1个周期)。这意味着在这种情况下,Tensor Cores矩阵乘法的总成本是:

200个周期(全局内存)+34个周期(共享内存)+1个周期(Tensor Core)=235个周期。

因此,我们通过张量核心将矩阵乘法成本从504个周期大幅降低到235个周期。在这个简化案例中,张量核心降低了共享内存访问和FFMA操作的成本。

这个例子是简化的,例如,通常每个线程都需要计算从全局内存向共享内存传输数据时,要读和写哪个内存。通过新的Hooper(H100)架构,我们另外让张量内存加速器(TMA)在硬件中计算这些指数,从而帮助每个线程专注于更多计算,而不是计算指数。

带有张量核心和异步拷贝的矩阵乘法(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%。

从这些例子中可以看出,为什么下一个属性,即内存带宽,对于配备张量核心的GPU是如此关键。由于全局内存是迄今为止使用张量核心进行矩阵乘法的最大周期成本,如果能够减少全局内存的延迟,我们甚至可以获得更快的GPU。我们可以通过提高内存的时钟频率(每秒更多的周期,但也有更多的热量和更高的能源需求)或增加在任何时候可以传输的元素数量(总线宽度)来做到这一点。

内存带宽

从上一节中,我们已经看到,张量核心的速度非常快。事实上,速度如此之快,以至于它们大部分时间都是闲置的,因为它们在等待内存从全局内存到达。例如,在GPT-3大小的训练中,使用巨大的矩阵–对张量核心来说越大越好–我们的张量核心TFLOPS利用率约为45-65%,这意味着即使是大型神经网络,也有50%的时间张量核心是空闲的。

这意味着,当比较两个带有Tensor Cores的GPU时,每个GPU性能的最佳指标之一是其内存带宽。例如,A100 GPU的内存带宽为1,555 GB/s,而V100为900 GB/s。因此,A100对V100的基本估计速度是1555/900=1.73倍。

二级缓存/共享内存/一级缓存/寄存器

由于向张量核心的内存传输是性能的限制因素,我们正在寻找能够更快地向张量核心传输内存的其他GPU属性。二级缓存、共享内存、一级缓存和使用的寄存器数量都是相关的。为了理解内存层次结构如何实现更快的内存传输,有助于理解在GPU上如何进行矩阵乘法。

为了执行矩阵乘法,我们利用了GPU的内存层次结构,从缓慢的全局内存,到较快的二级内存,到快速的本地共享内存,再到闪电般的寄存器。然而,内存越快,它就越小。

虽然从逻辑上讲,L2和L1内存是一样的,但L2缓存更大,因此需要穿越的平均物理距离更大,以检索一个缓存行。你可以把L1和L2缓存看作是有组织的仓库,在那里你想检索一个物品。你知道物品在哪里,但是对于较大的仓库来说,去那里平均需要更长的时间。这就是L1和L2缓存的本质区别。大=慢,小=快。

对于矩阵乘法,我们可以利用这种分层分离成越来越小,从而越来越快的内存块来进行非常快的矩阵乘法。为此,我们需要将大的矩阵乘法分成小的子矩阵乘法。这些块被称为内存瓦

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值