一、显存基础概念
显存是什么?
显存,全名叫「视频内存」,英文叫 VRAM(Video Random Access Memory)。
说白了,它就是 GPU 专用的「工作台」。CPU 有内存,GPU 就有显存。你训练模型、跑推理、渲染画面,所有数据都得先搬到显存里,GPU 才能动手干活。
我个人习惯把显存想象成一个巨大的棋盘。每个格子存一个数字,GPU 的成千上万个核心同时在这些格子上做运算。棋盘越大,能同时处理的数据就越多。
举个例子,你有一张 1024×1024 的图片,每个像素有 RGB 三个通道,每个通道用 4 字节的浮点数表示。那这张图占多大显存?
1024 × 1024 × 3 × 4 = 12,582,912 字节 ≈ 12 MB
嗯,一张图就 12MB。你要是跑个 ResNet-50,batch size 设 256,光输入数据就得吃掉 3GB 显存。这还不算模型参数和中间激活值。
核心要点:显存是 GPU 直接访问的存储空间,所有计算数据必须先进入显存,GPU 才能处理。
显存与内存的区别
很多新手会问:「显存和内存不都是存数据的吗?有啥区别?」
区别大了去了。我列个表,你一看就明白:
| 对比维度 | 显存(VRAM) | 内存(DRAM) |
|---|---|---|
| 物理位置 | 焊在显卡上,离 GPU 核心近 | 插在主板上,离 CPU 近 |
| 带宽 | 极高(HBM2e 可达 1.6 TB/s) | 较低(DDR5 约 50 GB/s) |
| 延迟 | 较低(但比寄存器高很多) | 较高(跨总线访问) |
| 容量 | 较小(消费级 8-24GB,专业级 40-80GB) | 较大(通常 16-128GB) |
| 用途 | GPU 计算数据、纹理、帧缓冲 | 操作系统、应用程序、通用数据 |
| ECC 纠错 | 专业卡有,消费卡没有 | 服务器内存有,普通内存没有 |
你想想看,为什么显存带宽比内存高几十倍?因为 GPU 需要同时喂饱几千个核心。CPU 只有几个核心,内存带宽够用就行。GPU 要是带宽不够,核心就得干等着,这叫「显存带宽瓶颈」。
我在项目中遇到过一个问题:用 RTX 3090 训练一个 7B 参数的模型,显存刚好够,但训练速度就是上不去。一分析,发现是显存带宽打满了,核心利用率只有 40%。后来换了 A100,HBM2e 带宽翻了三倍,问题直接解决。
小技巧:判断你的任务是不是带宽瓶颈,可以用 nvidia-smi 看「GPU Utilization」和「Memory Utilization」。如果 GPU 利用率低但显存利用率高,八成是带宽卡脖子了。
显存在 GPU 计算中的角色
显存在 GPU 计算里到底扮演什么角色?我总结了三层:
- 数据中转站:CPU 把数据从内存搬到显存,GPU 才能处理。处理完再搬回去。
- 工作缓冲区:模型参数、中间激活值、梯度,全得暂存在显存里。
- 结果暂存池:GPU 算完的结果,先放显存,等 CPU 来取。
这三层角色,决定了显存管理的核心矛盾:容量有限,但需求无限。
我画了一张图,帮你理解数据在 GPU 计算中的流动路径:
你看这张图就明白了。数据从 CPU 内存搬到显存,走的是 PCIe 总线,速度大概 16 GB/s(PCIe 4.0 x16)。但数据从显存搬到 GPU 核心,走的是内部总线,速度能到 1 TB/s 以上。差了整整两个数量级。
所以,显存管理的核心原则就是:尽量减少数据在 CPU 和 GPU 之间的搬运。数据一旦进了显存,就让它老老实实待着,别来回倒腾。
避坑指南:我曾经在一个项目里,每步训练都从 CPU 加载数据到显存,结果训练速度慢得像蜗牛。后来改成用 DataLoader 预加载 + pinned memory,速度直接翻了 5 倍。记住:PCIe 是窄路,显存内部才是高速公路。
显存的物理结构
显存不是一块完整的大内存,它由多个显存芯片组成。比如一张显卡有 8 个 2GB 的 GDDR6 芯片,总共 16GB。
这些芯片通过显存控制器连接到 GPU 核心。每个控制器管理一个或多个芯片。带宽的计算公式很简单:
显存带宽 = 显存频率 × 位宽 ÷ 8
举个例子:
GDDR6 频率 1750 MHz,位宽 256-bit
带宽 = 1750 × 256 ÷ 8 = 56,000 MB/s ≈ 56 GB/s
嗯,这里要注意:显存频率通常标的是「有效频率」,实际物理频率要除以 2。GDDR6 是双倍数据率,所以有效频率是物理频率的两倍。
HBM(高带宽显存)就不一样了。它把显存芯片堆叠起来,通过硅中介层和 GPU 核心连在一起。位宽能做到 4096-bit,带宽轻松上 TB/s。A100 的 HBM2e 带宽是 1.6 TB/s,H100 的 HBM3 更是到了 3.35 TB/s。
个人经验:选显卡时别光看显存容量,带宽同样重要。你跑大模型训练,带宽不够的话,核心再多也白搭。我见过有人用 RTX 3060(192-bit 位宽)跑大模型,显存 12GB 够用,但速度被位宽卡得死死的。
显存分配的基本单位
显存分配不是按字节来的,而是按「页」来的。GPU 驱动会把显存分成固定大小的页,通常是 4KB 或 64KB。你申请 1 字节,它给你一页。
这就导致了显存碎片化的问题。你频繁申请和释放不同大小的显存块,页表会变得支离破碎。到最后,明明总容量还有剩余,但就是分配不出一块连续的大显存。
我记得有一次调试一个推理服务,显存占用显示还剩 2GB,但一加载模型就报 OOM。查了半天,发现是碎片化导致的。后来改成启动时一次性分配好所有显存,问题就没了。
所以,显存分配的最佳实践是:能一次分配就别分多次,能复用就别重复申请。
好了,显存的基础概念就讲到这里。你理解了显存是什么、和内存的区别、在计算中的角色,后面讲分配机制、优化策略的时候,你就能跟上节奏了。