一、显存基础:什么是显存?显存与内存的区别,显存在AI训练/推理中的核心作用

大家好,我是你们的老朋友。今天咱们来聊聊显存——这个在AI训练中让人又爱又恨的东西。

说实话,我见过太多同学在显存上栽跟头了。明明模型设计得挺好,一跑起来就OOM(Out of Memory)。或者训练到一半,突然报错说显存不够。嗯,这种痛,我懂。

所以这一章,咱们把显存彻底讲透。从它是什么,到它和内存到底有啥区别,再到它在AI训练和推理中到底扮演什么角色。把这些基础打牢了,后面讲优化技巧你才能听得明白。

1.1 什么是显存?

显存,全称是「视频随机存取存储器」(Video Random Access Memory,VRAM)。说白了,它就是显卡上专门用来存数据的内存条。

你想想看,显卡要处理图像、渲染3D场景,数据量巨大。如果每次都要去系统内存里拿数据,那速度慢得没法忍。所以显卡自己带了一块高速缓存区,这就是显存。

在AI领域,显存的作用就更关键了。模型参数、中间激活值、梯度、优化器状态……这些东西全都要塞进显存里。显存不够,模型就跑不起来。

核心要点:显存是GPU的「工作台」。工作台越大,你能同时处理的数据就越多。

1.2 显存与内存的区别

很多新手会问:显存和内存不都是存数据的吗?有啥区别?

区别大了去了。我拿一个实际项目中的例子来说吧。

有一次我在训练一个BERT-large模型,系统内存有64GB,但显存只有16GB。结果呢?内存还剩一大半,显存却爆了。为什么会这样?

咱们来看这张对比表:

对比维度 显存(VRAM) 内存(RAM)
物理位置 焊在显卡PCB上 插在主板上
访问速度 极高(HBM2e可达2TB/s) 较高(DDR5约50GB/s)
容量 较小(通常4-80GB) 较大(通常8-512GB)
延迟 极低 较低
主要用途 GPU计算数据暂存 CPU计算数据暂存
带宽 极高(宽位宽+高频率) 中等
ECC纠错 部分支持(如A100) 服务器内存支持

你看,显存最大的优势就是带宽。GPU一次能并行处理成千上万个线程,如果数据喂得不够快,计算单元就得干等着。显存的高带宽就是为了喂饱这些「饿狼」。

我个人习惯把显存比作「厨房的灶台」,内存比作「冰箱」。灶台空间有限,但拿取食材快;冰箱空间大,但来回跑浪费时间。AI训练时,我们尽量把常用数据放在「灶台」上。

1.3 显存在AI训练中的核心作用

好,现在咱们进入正题。显存在AI训练中到底存了哪些东西?我给大家拆解一下。

一次典型的训练迭代,显存里要装这些东西:

  1. 模型参数:权重矩阵、偏置项。这是最占显存的部分之一。
  2. 梯度:反向传播时计算的梯度,大小和参数一样。
  3. 优化器状态:比如Adam优化器会保存一阶动量和二阶动量,每个参数额外占2倍空间。
  4. 中间激活值:前向传播时每层的输出。这个量往往比参数还大!
  5. 输入数据:当前batch的样本数据。
  6. 临时缓冲区:框架内部用于各种计算的临时空间。

我给大家画一张图,看看这些组件在训练流程中是怎么流转的:

AI训练中显存数据流转图 输入数据 (Batch样本) 前向传播 (生成激活值) 中间激活值 (占用最大!) 损失计算 反向传播 梯度 参数更新 优化器状态 模型参数(权重 + 偏置)—— 常驻显存 图例 输入数据 中间激活值 梯度 优化器状态 模型参数

从这张图你能看到,显存里同时要装下这么多东西。我经常跟团队说:显存不是用来「存」数据的,是用来「算」数据的。每一块显存都在为计算服务。

实战小技巧:如果你想知道自己的模型到底占了多少显存,可以用PyTorch的 torch.cuda.memory_summary() 查看详细分配情况。我每次调优前都会先跑一下这个命令。

1.4 显存在AI推理中的核心作用

推理阶段和训练阶段不太一样。推理时不需要保存梯度,也不需要优化器状态。但显存依然很关键。

推理时显存主要装这些东西:

  • 模型参数:和训练一样,必须常驻显存。
  • 中间激活值:虽然推理不需要反向传播,但前向传播过程中每层的输出还是要暂存的。
  • 输入/输出缓冲区:处理批量请求时,需要缓存输入数据和输出结果。
  • KV Cache:这是大语言模型推理特有的。每次生成一个token,都要把之前所有token的Key和Value缓存下来。这个量随着序列长度线性增长,非常吃显存。

我曾经优化过一个GPT推理服务,batch size从1调到8,显存直接翻了三倍。为什么?因为KV Cache是每个请求独立的,batch越大,缓存越多。

注意:推理时显存不够,不会像训练那样直接OOM崩溃,而是会触发「显存交换」——把部分数据换到内存里。但这一交换,延迟就上去了。我曾经见过一个服务,因为显存不足,推理延迟从50ms飙到了500ms。所以推理场景下,显存同样不能省。

1.5 显存容量估算:一个实战例子

说了这么多理论,咱们来算一笔账。假设我要训练一个7B参数的LLaMA模型,用Adam优化器,batch size=1,序列长度=2048,hidden_dim=4096。

咱们来估算一下显存占用:

组件 计算公式 占用大小
模型参数 7B × 2 bytes (FP16) 14 GB
梯度 同参数大小 14 GB
优化器状态 2 × 参数大小 (Adam) 28 GB
中间激活值 约 32 × hidden_dim × seq_len × layers 约 8-12 GB
其他开销 框架、临时缓冲区等 约 2-4 GB
总计 约 66-72 GB

看到没?一个7B模型,用FP16训练,居然要70GB左右的显存!这就是为什么A100 80GB成了标配。如果你只有一张RTX 4090(24GB),那根本跑不动。

我刚开始做大模型时,也天真地以为7B参数就是7GB。结果一跑就OOM,查了半天才发现自己少算了优化器状态和激活值。嗯,这个坑我替你们踩过了。

1.6 本章小结

好,咱们来捋一捋这一章的核心内容:

  • 显存是GPU的专用高速缓存,带宽远高于系统内存,但容量有限。
  • AI训练时显存要装5大类数据:参数、梯度、优化器状态、中间激活值、输入数据。
  • 中间激活值往往是最占显存的,很多人只关注参数大小,忽略了激活值。
  • 推理时KV Cache是显存大户,尤其对于长序列生成任务。
  • 显存估算要全面,别只算参数,否则上线必翻车。

下一章,咱们会深入讲「显存瓶颈的定位方法」——怎么用工具看显存到底被谁吃了。到时候我会分享几个我实际用过的调试技巧,保证实用。

想要更多资料,联系可可