每位AI工程师都应了解的9个GPU概念

像PyTorch这样的框架之所以易于使用,是因为它们隐藏了GPU层面发生的所有复杂性。

但如今的公司和研究实验室正在寻找能够深入了解PyTorch内部工作原理、解释计算预算去向、调试GPU并使LLM更具性能的工程师。

以下是9个简单解释的概念,将帮助你更好地理解GPU。

  • 1、2、3:讨论GPU计算硬件
  • 4、5、6:讨论GPU内存
  • 7、8:讨论程序如何在GPU上执行
  • 9:讨论多个GPU如何连接在一起

让我们开始吧!

1. 流式多处理器

流式多处理器(SM)是NVIDIA GPU的核心计算单元。

它类似于CPU的核心,但有一个主要区别:它可以并行执行指令和特定操作,如矩阵乘法,速度快得多。

虽然CPU核心针对单线程的高速执行进行了优化,但GPU上的SM针对跨多个线程的高吞吐量进行了优化(并行运行大量线程)。

流式多处理器(SM)之所以如此命名,是因为:

  • 它处理数据流(需要类似计算的数据输入持续提供给它)
  • 它包含多个处理单元,可以并行执行数据流上的计算

SM的主要组件包括:

  • CUDA核心(INT32、FP32、FP64):用于基本算术计算
  • 张量核心:用于矩阵乘法计算
  • Warp调度器和分发单元:用于选择下一个运行的线程组(warp)
  • 加载/存储(LD/ST)单元:用于在内存和寄存器之间移动数据
  • 寄存器/寄存器文件:用于临时存储每个线程的数据
  • L1缓存:用于临时存储要在SM组件之间使用的数据
  • 共享内存:与L1缓存相同的SRAM分区,可用于存储数据。虽然L1自动缓存数据,但共享内存可以以编程方式使用。

以下是NVIDIA H100 GPU的SM架构图。单个H100 SXM有132个这样的SM。

虽然上述组件在GPU中最常见,但你可以在H100 GPU中看到更多组件,例如:

  • SFU(特殊功能单元):用于执行指数、对数和三角函数。
  • 纹理(Tex)单元:用于高效处理表面纹理数据
  • 张量内存加速器:用于在全局内存和共享内存之间高效移动多维数据
  • L0和L1指令缓存:小型快速缓存内存,将常用指令存储在计算核心附近

2. CUDA核心

CUDA(计算统一设备架构)核心在SM中每个时钟周期处理一个简单的算术操作,如整数和浮点计算。

不同的CUDA核心处理不同类型的数值精度,如INT32、FP32和FP64,如上图架构图所示。

H100 SXM GPU具有:

  • 每个SM 128个FP32 CUDA核心
  • 每个GPU 16,896个FP32 CUDA核心

CUDA核心比CPU核心简单得多。虽然CPU核心可以执行复杂操作,但CUDA核心的工作是作为基本算术的简单计算器。正是这些核心的大规模并行计算使GPU如此强大。

请注意,"CUDA核心"一词指的是硬件,与CUDA软件生态系统没有直接关系。

3. 张量核心

张量核心是SM中的专用单元,可以执行快速矩阵乘加操作。

这些操作构成了深度学习工作负载的大部分,由张量核心处理,而非矩阵操作(如激活函数、归一化和逐元素操作)则由CUDA核心处理。

NVIDIA于2017年在Volta GPU架构中首次引入张量核心,极大地加速了神经网络训练工作流程。

张量核心还针对不同的数值精度进行了专门优化,如FP16、BF16、TF32和FP64。H100 GPU具有针对低精度格式(如FP8)的专用张量核心,而Blackwell系列GPU则包含针对FP4(具体为NVFP4)的张量核心。

你经常会看到GPU规格中讨论TFLOPS,这指的是GPU张量核心和CUDA核心的性能。

4. 高带宽内存

高带宽内存(HBM)是GPU的主内存。它也称为全局内存或VRAM。这是存储模型权重、激活值和KV缓存的内存。

HBM安装在GPU芯片旁边,与直接蚀刻在芯片上的较小内存组件(L2、L1和寄存器文件)一起工作(片上内存)。

它是一种动态随机存取内存(DRAM),提供更大的容量,比片上内存更便宜,而片上内存是一种静态随机存取内存(SRAM),速度极快但容量小得多。

5. 片上内存

片上内存包括直接蚀刻在芯片上的内存组件,因此称为"片上"。

这些是静态随机存取内存(SRAM)的一种,读写数据速度极快,但比HBM小得多。

按访问速度升序和容量降序排列,这些是:

  • L2内存/缓存(在GPU的所有SM之间共享)
  • L1内存/缓存(在SM的组件之间共享)
  • 寄存器

在上图所示的H100 SM架构图中,你可以看到指令和数据缓存根据它们存储的内容分别标记。另外,"寄存器文件"指的是寄存器的数组或集合,而不是单个寄存器。

FlashAttention这样的算法通过利用这种内存层次结构来加速计算。FlashAttention将注意力计算分割成适合片上内存的小块(称为Tiles),而不是反复从HBM读取中间数据。

6. 内存带宽

内存带宽是数据在HBM和SM之间移动的速率。通常以GB/s或TB/s为单位报告。

一些流行NVIDIA GPU的峰值内存带宽如下:

  • L40S:864 GB/s
  • A100 80GB SXM:2 TB/s
  • H100 SXM:3.35 TB/s
  • B100:8 TB/s

对于LLM推理,每个解码步骤都从HBM加载所有模型权重到计算核心(张量/CUDA核心),为每个序列生成一个token。这导致了内存带宽瓶颈,因为移动数据的速度比SM计算的速度慢得多。

这被描述为**内存墙,**处理器速度的提高比内存速度快得多。这使得大多数LLM推理,特别是解码,是内存密集型而非计算密集型。

7. 内核

内核是一个在多个GPU线程上并行运行的函数,每个线程在不同数据上执行相同的操作。这称为**单指令多线程(SIMT)**执行模型。

PyTorch函数可能会启动一个或多个内核,具体取决于所需的操作。

如果你听说过,内核融合是一种流行的技术,它将多个GPU内核组合成一个,使中间结果保留在寄存器或共享内存中,而不是写入和读回全局内存。FlashAttention是用于注意力相关计算的融合内核的示例。

8. 线程、Warp、块和网格

CUDA(计算统一设备架构)是NVIDIA的GPU编程软件生态系统。使用CUDA在GPU上编程执行被组织成多个层次,理解这些层次很重要。

线程是GPU上最基本的执行单元。每个线程都有自己的一组私有寄存器。

32个线程的组称为Warp。warp中的所有线程在SM上并行执行相同的操作。这使得warp成为GPU上真正的执行单元。

线程被分组为,在单个SM上运行并共享其共享内存。块包含多个线程,这些线程自动分成warp执行。

网格是与内核一起启动的块组。网格中的块是独立的,GPU可以将它们调度到任何可用的SM上。这种执行层次结构使内核可以在SM上扩展。

NVIDIA还在其Hopper架构中引入了线程块集群,其中多个块被分组在一起在相邻的SM上运行,并使用分布式共享内存(DSM)高效共享数据。块集群位于CUDA执行层次结构中的块和网格之间。

需要注意的是,在CUDA中,程序员可以定义线程数量以及网格和块的维度。但是,warp不是由程序员直接创建的。相反,GPU自动将每个块中的线程分组为32个线程的warp进行执行。

9. PCIe、NVLink和NVSwitch

GPU很少单独使用,而是与其他GPU连接以形成大规模数据中心。它们按以下层次结构排列:

  • 服务器或节点(4到8个GPU)
  • 服务器机架(10到100个GPU)
  • 集群或Pod(100到1000个GPU)
  • 数据中心(10,000到100,000个GPU)

各种互连用于GPU间通信。我们讨论的三个重要互连是:

  • PCIe
  • NVLink
  • NVLink与NVSwitch

PCIe是连接硬件组件(如GPU)到CPU和彼此之间的标准总线。

第5代PCIe提供128 GB/s,第6代PCIe提供256 GB/s的双向GPU到GPU带宽。

将其与NVIDIA专有的GPU到GPU互连NVLink进行比较,NVLink在带宽上是PCIe的重大升级。不同版本NVLink在两个GPU之间提供的双向带宽如下:

  • H100上900 GB/s(NVLink 4)
  • B200上1.8 TB/s(NVLink 5)
  • Rubin上3.6 TB/s(NVLink 6)

但是有一个问题:NVLink的总带宽在其连接的GPU之间共享。这意味着如果H100通过NVLink连接到三个其他H100 GPU,其900 GB/s带宽将在连接之间分配。

NVSwitch是NVIDIA的另一个专有系统,为此提供了解决方案。它是一种高带宽、低延迟的结构,连接单个系统内的多个GPU,允许它们在每个连接上共享完整的NVLink带宽。


原文链接:9 GPU Concepts Every AI Engineer Should Know

汇智网翻译整理,转载请标明出处