NVIDIA|NVIDIA独家绝技 CUDA正在被赶下神坛?( 三 )


虽然如今标准 DRAM 的价格仅为每 GB 几美元,但为了获得机器学习所需的海量带宽,Nvidia 使用 HBM 内存,这是一种由3D 堆叠 DRAM 层组成的设备,需要更昂贵的封装 。
HBM 在每 GB 是10 到 20 美元的范围内,这包括封装和产量成本 。
内存带宽和容量的成本限制不断出现在 Nvidia 的 A100 GPU 中 。如果不进行大量优化,A100 往往具有非常低的 FLOPS 利用率 。FLOPS 利用率衡量训练模型所需的总计算 FLOPS 与 GPU 在模型训练时间内可以计算的理论 FLOPS 。
即使领先研究人员进行了大量优化,60% 的 FLOPS 利用率也被认为是大型语言模型训练的非常高的利用率 。其余时间是开销,空闲时间花在等待来自另一个计算/内存的数据,或者及时重新计算结果以减少内存瓶颈 。
从当前一代的 A100 到下一代 H100,FLOPS 增长了 6 倍以上,但内存带宽仅增长了 1.65 倍 。这导致许多人担心 H100 的利用率低 。A100需要很多技巧才能绕过内存墙,H100 还需要实现更多技巧 。
H100 为Hopper 带来了分布式共享内存和 L2 多播(multicast) 。这个想法是不同的 SM(think cores)可以直接写入另一个 SM 的 SRAM(共享内存/L1 缓存)中 。这有效地增加了缓存的大小并减少了DRAM 读/写所需的带宽 。
未来的架构将依赖于向内存发送更少的操作,以最大限度地减少内存墙的影响 。应该注意的是,较大的模型往往会实现更高的利用率,因为 FLOPS 需要按 2^n 缩放,而内存带宽和容量需求往往会按 2*n 缩放 。
算子融合——解决方法
有分析人士认为,就像训练 ML 模型一样,了解您所处的状态可以让您缩小重要的优化范围 。例如,如果您将所有时间都花在内存传输上(即您处于内存带宽限制状态),那么增加 GPU 的 FLOPS 将无济于事 。
另一方面,如果您将所有时间都花在执行大型 matmuls(如计算绑定机制)上,那么将您的模型逻辑重写为 C++ 以减少开销将无济于事 。
而回顾 PyTorch 获胜的原因,这是由于 Eager 模式提高了灵活性和可用性,但转向 Eager 模式并不全是阳光和彩虹 。在 Eager 模式下执行时,每个操作都从内存中读取、计算,然后在处理下一个操作之前发送到内存 。如果不进行大量优化,这会显着增加内存带宽需求 。
因此,在 Eager 模式下执行的模型的主要优化方法之一称为算子融合(operator fusion) 。操作被融合,而不是将每个中间结果写入内存,因此在一次传递中计算多个函数以最小化内存读/写 。算子融合改善了运算符调度、内存带宽和内存大小成本 。
NVIDIA|NVIDIA独家绝技 CUDA正在被赶下神坛?
文章图片

这种优化通常涉及编写自定义 CUDA 内核,但这比使用简单的 python 脚本要困难得多 。
作为一种内置的妥协,随着时间的推移,PyTorch 在 PyTorch 中稳定地实现了越来越多的算子(operator) 。其中许多算子只是简单地将多个常用运算融合到一个更复杂的函数中 。
算子的增加使得在 PyTorch 中创建模型变得更容易,并且由于内存读/写更少,Eager 模式的性能更快 。缺点是 PyTorch 在几年内激增到 2,000 多个算子 。
NVIDIA|NVIDIA独家绝技 CUDA正在被赶下神坛?
文章图片

我们会说软件开发人员很懒惰,但说实话,几乎所有人都是懒惰的 。如果他们习惯了 PyTorch 中的一个新算子,他们将继续使用它 。
开发人员可能甚至没有意识到性能的提高,而是使用该算子,因为这意味着编写更少的代码 。