显存基础与架构:GDDR6、HBM 与内存层次

做 AI 训练和推理,说白了就是在跟显存打交道。模型越来越大,数据越来越多,显存一满,性能直接跳水。我见过不少团队,模型设计得挺好,结果一跑就 OOM,然后开始各种魔改代码——其实根子往往在显存上。

这一章咱们先把地基打牢。显存类型、带宽怎么算、GPU 里内存到底怎么组织的,这些搞清楚了,后面讲优化才有底气。

显存类型:GDDR6 与 HBM

目前主流 GPU 用的显存就两种:GDDR6 和 HBM(高带宽内存)。你想想看,一个消费级显卡,一个数据中心专用卡,定位完全不同。

特性 GDDR6 HBM2e / HBM3
位宽 32-bit 每颗粒 1024-bit 每堆叠
单颗容量 8-16 Gb 8-24 Gb
典型带宽 ~576 GB/s (RTX 4090) ~2 TB/s (H100)
功耗 较高 较低(通过 TSV 堆叠)
成本 低 高
主要场景 游戏、消费级 AI 数据中心、HPC

我个人习惯,拿到一块新卡,第一件事就是查它的显存类型和带宽。为什么?因为这直接决定了你能跑多大的模型、多高的吞吐。

关键认知: 显存带宽 = 频率 × 位宽 × 每周期传输次数。GDDR6 用 32-bit 颗粒拼出 384-bit 甚至 512-bit,而 HBM 直接通过硅中介层堆叠,位宽轻松上千。这不是技术路线之争,是物理限制下的不同取舍。

显存带宽计算:别被纸面数据骗了

很多同学看显卡参数,直接拿「显存频率 × 位宽」算带宽。嗯,这里要注意,GDDR 用的是 DDR 技术,一个时钟周期传两次数据。公式其实是:

带宽 (GB/s) = (显存频率 MHz × 位宽 bit × 2) / 8 / 1000

举个例子,RTX 4090 显存频率 21 Gbps,位宽 384-bit:

带宽 = (21000 × 384 × 2) / 8 / 1000 = 2016 GB/s

等等,官方标称是 1008 GB/s?问题出在哪?

因为 GDDR6X 用了 PAM4 信号,每个周期传 4 个电平,等效频率翻倍。但很多工具直接拿「有效频率」算,结果就乱套了。我建议你直接用 NVIDIA-smi 或者 rocm-smi 看实际报告值,别自己手算。

避坑指南: 我曾经在调一个 70B 模型时,发现带宽利用率死活上不去。查了半天,原来是代码里用错了带宽计算公式,导致预期和实际差了 30%。从那以后,我所有带宽计算都统一用「有效频率 × 位宽 × 每周期传输次数 / 8」,并且跟官方文档对一遍。

GPU 内存层次结构

GPU 的内存不是铁板一块。从寄存器到全局显存,每一层的延迟和带宽差了好几个数量级。你想想看,如果能把频繁访问的数据放到 L1 或共享内存里,性能能翻多少倍?

GPU 内存层次结构 寄存器 (Register) ~1 周期, 几十 KB L1 / 共享内存 (Shared Memory) ~30 周期, 48-164 KB 每 SM L2 缓存 ~200 周期, 几十 MB HBM / GDDR 显存 ~400-800 周期, 几十 GB 延迟递增 → 延迟递增 → 延迟递增 → 💡 优化核心思路 • 把频繁复用的数据放到共享内存,避免反复读显存 • 利用寄存器减少全局内存访问次数 • 合并访问(coalescing)让显存带宽利用率最大化

从上图你能看到,寄存器最快但容量极小,L1/共享内存次之,L2 缓存再慢一些,最慢的就是 HBM/GDDR 显存。但容量反过来,显存最大。

实战技巧: 我调优时有个习惯——先看 kernel 的 occupancy(占用率)。如果 occupancy 低,往往是因为寄存器或共享内存用太多,导致每个 SM 能同时跑的线程数减少。这时候就得权衡:是用更多共享内存来减少显存访问,还是牺牲一点局部性来提升并行度?没有标准答案,得看具体模型。

内存层次对 AI 训练的影响

训练大模型时,显存瓶颈通常出现在三个地方:

  • 模型参数:几十 GB 到几百 GB,必须放在显存里
  • 优化器状态:Adam 等优化器需要额外存一阶/二阶动量,显存翻倍
  • 中间激活值:前向传播时每层的输出,反向传播要用,占大头

我遇到过最典型的场景:一个 13B 模型,用 FP16 训练,光参数就 26 GB,加上优化器状态和激活值,A100 的 80 GB 显存直接爆了。后来通过激活值重计算(activation recomputation)和混合精度训练,才勉强塞进去。

说白了,显存优化就是一场「空间换时间」和「时间换空间」的博弈。你理解了底层的内存层次,才能做出正确的取舍。

一句话总结: 显存类型决定了带宽天花板,内存层次决定了数据搬移的成本。搞懂这两点,你再看那些显存优化技术——梯度检查点、ZeRO、FlashAttention——就会觉得豁然开朗。