一、显存基础:显存是什么、显存与内存的区别、显存在深度学习中的作用

做深度学习这几年,我见过太多同学上来就堆模型,结果一跑就OOM(显存溢出)。说白了,很多人根本没搞懂显存到底在干什么。今天咱们就从最基础的说起。

1.1 显存是什么?

显存,全名叫「视频随机存取存储器」,英文叫VRAM。你可以把它理解成显卡自己的「工作台」。

CPU那边有内存,显卡这边有显存。它们俩分工不同。CPU负责调度、逻辑控制,显卡负责大规模并行计算。显存就是给显卡临时存数据的地方。

我个人习惯把显存比作厨房的「操作台面」。你切菜、炒菜、摆盘,全在这台面上进行。台面越大,你能同时处理的东西就越多。显存也是这个道理。

核心要点:显存是GPU直接访问的高速存储区域,用于存放模型参数、中间激活值、梯度、优化器状态等数据。

1.2 显存 vs 内存:到底差在哪?

很多新手会问:「我内存有32GB,为什么显存只有8GB就跑不动了?」

嗯,这里要注意:内存和显存是两个完全不同的东西。它们之间不能直接互相借用。CPU只能读内存,GPU只能读显存。数据要从内存搬到显存,得走PCIe总线,这个速度比显存内部慢得多。

我列个表格,你一看就明白了:

对比项 内存(RAM) 显存(VRAM)
谁在用 CPU GPU
主要用途 操作系统、应用程序 深度学习、图形渲染
带宽 几十GB/s 几百到上千GB/s
容量 通常16-128GB 通常4-80GB
延迟 较高(纳秒级) 较低(纳秒级但更优)
与CPU/GPU距离 近(CPU直连) 远(通过PCIe)

为什么会这样?因为GPU的设计目标就是「吞吐量优先」。它不在乎单次访问快不快,它在乎的是能不能一口气塞进去一大堆数据同时算。所以显存带宽做得极高,但容量反而受限。

我在项目中遇到过一件事:有次训练一个BERT-large模型,内存还有20GB空闲,但显存只有11GB,结果直接OOM。当时我第一反应是「内存够啊怎么还崩」,后来才意识到——模型根本不在内存里跑,它只认显存。

避坑指南:我曾经以为把数据放到内存里,GPU就能自动用上。错!你必须手动把tensor搬到GPU上(.cuda()或.to(device)),否则它就在CPU上干等。

1.3 显存在深度学习中的作用

深度学习训练过程中,显存主要干三件事:

  • 存模型参数:权重、偏置,这些是模型的核心
  • 存中间激活值:前向传播时每一层的输出,反向传播时要用
  • 存梯度和优化器状态:Adam这类优化器会额外存一阶、二阶动量

你想想看,一个参数量10亿的模型,每个参数用float32存(4字节),光参数就要4GB。再加上激活值、梯度、优化器状态,轻松翻倍。

我举个例子,训练一个ResNet-50,batch size设为256:

模型参数:约25M个参数 × 4字节 ≈ 100MB
中间激活:每张图约15MB × 256 ≈ 3.8GB
梯度:与参数大小相同 ≈ 100MB
优化器状态(Adam):2倍参数 ≈ 200MB
总计:约4.2GB

看到没?激活值才是显存大户。很多人只盯着模型参数,忽略了激活值,结果一跑就炸。

小技巧:我个人习惯在训练前先用torch.cuda.memory_summary()看一眼显存分配情况。哪个tensor占了多少,一目了然。这能帮你快速定位显存泄漏。

1.4 知识体系总览

下面这张图,我把显存相关的核心概念串起来了。你一看就能明白整个知识结构:

显存知识体系总览 显存(VRAM) 显存是什么 GPU直接访问的高速存储 存放模型参数/激活值/梯度 显存 vs 内存 带宽:显存高(几百GB/s) vs 内存低 容量:内存大(16-128GB) vs 显存小 数据需通过PCIe搬运 深度学习中的作用 存储模型参数(权重+偏置) 存储中间激活值(前向传播) 存储梯度 + 优化器状态 显存容量 = 模型大小 + 激活值 + 梯度 + 优化器状态

这张图把显存的核心知识点串起来了。左边是「显存是什么」,中间是「显存 vs 内存」,右边是「深度学习中的作用」。底部那条公式,你每次训练前都可以在心里默念一遍。

好了,这一章就到这里。显存基础打牢了,后面讲优化技巧你才能理解为什么这么做。下一章咱们聊聊「显存去哪儿了」—— 我会手把手带你分析一个模型到底把显存吃在了哪里。


可可精品资料库