一、显存基础:显存是什么、显存与内存的区别、显存在深度学习中的作用
做深度学习这几年,我见过太多同学上来就堆模型,结果一跑就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 知识体系总览
下面这张图,我把显存相关的核心概念串起来了。你一看就能明白整个知识结构:
这张图把显存的核心知识点串起来了。左边是「显存是什么」,中间是「显存 vs 内存」,右边是「深度学习中的作用」。底部那条公式,你每次训练前都可以在心里默念一遍。
好了,这一章就到这里。显存基础打牢了,后面讲优化技巧你才能理解为什么这么做。下一章咱们聊聊「显存去哪儿了」—— 我会手把手带你分析一个模型到底把显存吃在了哪里。