一、显存基础:GPU显存架构、带宽与容量
大家好,我是你们的老朋友。今天咱们聊聊显存。
说实话,显存这东西,很多同学一开始都不太在意。觉得「反正显存不够就加呗」。但真正做项目时,你会发现——显存就是你的命根子。我见过太多人,模型还没跑起来,先被OOM(Out of Memory)干趴下了。
所以第一章,咱们把显存的基础打牢。你想想看,地基不稳,后面优化技巧再花哨也没用。
1.1 GPU显存架构:它到底长什么样?
先问个问题:显存在GPU里扮演什么角色?
说白了,显存就是GPU的「工作台」。CPU有内存,GPU就有显存。你的模型参数、中间计算结果、梯度、优化器状态……全得放在这个工作台上。
现代GPU的显存架构,我习惯把它分成三层来看:
- 全局显存(Global Memory):最大的那块,通常几GB到几十GB。所有线程都能访问,但速度相对慢。我刚开始做训练时,经常在这里踩坑——频繁读写全局显存,性能直接崩。
- 共享显存(Shared Memory):每个线程块独享,速度极快。你可以把它想象成「小组内部的小黑板」。我建议你在写自定义算子时,尽量多用共享显存,能省不少带宽。
- 寄存器(Registers):每个线程私有的,最快但容量极小。嗯,这里要注意:寄存器溢出(Register Spill)是性能杀手,我曾经因为一个循环里变量太多,导致寄存器不够用,性能直接腰斩。
核心要点:显存不是一块铁板,它有层级结构。优化显存的第一步,就是搞清楚你的数据到底在哪一层。
下面这张图,是我自己画的显存架构简图,帮你快速建立直觉:
1.2 显存带宽与容量:两个关键指标
做显存优化,你天天都会跟这两个数字打交道。
带宽,说白了就是「显存的数据吞吐速度」。单位是GB/s。我举个例子:你有一块H100,带宽约2TB/s。这意味着每秒钟能从显存里读出2TB的数据。听起来很快对吧?但你的模型参数动辄几十GB,一次前向传播就要读好几次,带宽很快就吃满了。
容量,就是显存能装多少数据。单位是GB。这个好理解,但坑在于——你以为容量够,其实不够。为什么?因为除了模型参数,还有中间激活值、梯度、优化器状态……我做过一个项目,模型参数才7B,但训练时显存占用直接飙到40GB+。你想想看,中间激活值才是真正的「显存吞金兽」。
| 指标 | 含义 | 典型值(消费级) | 典型值(数据中心级) |
|---|---|---|---|
| 显存带宽 | 数据读写速度 | RTX 4090: ~1 TB/s | H100: ~2 TB/s |
| 显存容量 | 可存储数据总量 | RTX 4090: 24 GB | H100: 80 GB |
我的小技巧:选GPU时,别只看容量。带宽同样重要。我见过有人用低带宽卡跑大模型,训练速度慢到怀疑人生。说白了,带宽决定了你的GPU「饿不饿」,容量决定了「能不能装下」。
1.3 显存与内存的区别:别搞混了
这个问题,我面试时经常问。很多同学答不上来。
显存和内存,虽然都叫「存」,但完全是两码事:
- 物理位置不同:内存插在主板上,CPU管。显存在GPU卡上,GPU管。
- 访问方式不同:CPU通过内存控制器访问内存,GPU通过显存控制器访问显存。两者之间通信要走PCIe总线——这玩意儿慢得可怜。我做过测试,PCIe 4.0 x16的理论带宽才32 GB/s,跟显存带宽差了两个数量级。
- 延迟差异巨大:内存延迟几十纳秒,显存延迟几百纳秒。但GPU靠大量线程并行来掩盖延迟,所以实际体验上,显存并不慢。
避坑指南:我曾经犯过一个错误——把大量数据频繁在内存和显存之间搬来搬去。结果训练速度被PCIe带宽卡死,GPU利用率不到10%。后来我改成一次性把数据加载到显存,速度直接翻了8倍。记住:尽量减少CPU和GPU之间的数据搬运。
1.4 为什么需要优化显存?
这个问题,说白了就是——显存是稀缺资源,而且越来越稀缺。
你看看现在的模型:GPT-3有1750亿参数,光参数就要350GB(FP16)。你一块H100才80GB,根本装不下。怎么办?要么用多卡,要么优化显存。
优化显存的好处,我总结三条:
- 省钱:少买一张卡,省几万块。我有个朋友,靠优化显存把4卡训练改成单卡训练,直接省了20万。
- 提速:显存优化往往伴随着计算优化。比如梯度检查点(Gradient Checkpointing),虽然多算了点计算,但省了显存,反而能跑更大的batch size,整体速度更快。
- 能跑更大的模型:这是最直接的。同样的硬件,优化后能跑原来两倍大的模型。我做过一个项目,优化前只能跑7B模型,优化后直接上13B,效果提升明显。
一句话总结:显存优化不是锦上添花,而是刚需。尤其在大模型时代,不会优化显存,你连模型都跑不起来。
好了,第一章就到这里。显存的基础概念,咱们已经聊透了。下一章,我会带你看看「显存都去哪儿了」——也就是显存占用的详细分析。到时候咱们用代码实际测一测,看看模型参数、梯度、激活值到底各占多少。
想要更多资料,联系可可