一、显存基础:GPU架构简介、显存类型与带宽、显存与系统内存的区别、为什么需要优化显存
1.1 GPU架构:一张图看懂显存怎么“跑”
先聊聊GPU架构。很多人觉得GPU就是一堆计算单元堆在一起,其实没那么简单。
我习惯把GPU想象成一个大型工厂:
- 计算单元(SM/CU):就是工人,负责干活
- 显存(VRAM):就是仓库,存放原材料和成品
- 显存带宽:就是传送带的速度,决定了工人能多快拿到材料
你想想看,工人再能干,如果传送带太慢,仓库里的材料送不过来,那也只能干等着。这就是为什么显存带宽比显存容量有时候更重要。
下面这张图是我自己画的,帮你理解GPU内部的数据流动:
核心要点:显存带宽 = 显存频率 × 显存位宽 × 每时钟传输次数。说白了,位宽越宽、频率越高,数据搬运就越快。
1.2 显存类型:GDDR vs HBM,到底选哪个?
目前主流的显存就两种:GDDR6 和 HBM2e/HBM3。
我记得第一次接触HBM显存时,被它的带宽吓了一跳。同样是显存,HBM2e的带宽能做到GDDR6的3-4倍。但代价也很明显——贵,而且容量做不大。
| 特性 | GDDR6 | HBM2e / HBM3 |
|---|---|---|
| 典型带宽 | ~600 GB/s | ~2 TB/s |
| 单颗容量 | 8-16 GB | 2-4 GB(堆叠后可达16-80GB) |
| 功耗 | 较高 | 较低 |
| 成本 | 低 | 高 |
| 典型应用 | 消费级显卡(RTX 4090) | 数据中心(A100、H100) |
我的经验:做AI推理时,如果模型能塞进显存,GDDR6完全够用。但训练大模型(比如LLaMA-70B),HBM几乎是唯一选择。我曾经在GDDR6的卡上硬跑大模型,结果显存带宽成了瓶颈,训练速度慢得让人抓狂。
1.3 显存 vs 系统内存:别搞混了
很多人问我:「显存和内存不都是存数据的吗?有啥区别?」
嗯,区别大了去了。我打个比方:
- 系统内存:就像你家的冰箱,什么都能放,但拿东西慢
- 显存:就像厨房的操作台,只放马上要用的食材,拿取速度极快
具体来说,有这几个关键区别:
- 物理位置不同:显存在GPU旁边,内存离CPU近。数据从内存到显存要走PCIe总线,这本身就有延迟。
- 带宽差距巨大:显存带宽是内存的10-40倍。我见过有人把数据放内存里,每次训练都从内存读,结果GPU利用率不到20%。
- 容量与成本权衡:内存便宜容量大,显存贵容量小。所以优化显存的核心思路就是——把最常用的数据留在显存里,不常用的放内存。
避坑指南:我曾经犯过一个错误——在PyTorch里用 pin_memory=True 时,以为数据已经在显存里了。其实它只是锁页内存,数据还在CPU侧。真正进显存需要 .cuda() 操作。这个坑我踩过,你别再踩了。
1.4 为什么需要优化显存?
说白了,就三个字:不够用。
你看看现在的AI模型:
- BERT-Large:~1.3GB 参数
- GPT-3 175B:~350GB 参数(FP16)
- LLaMA-70B:~140GB 参数
而消费级显卡的显存呢?RTX 4090 才24GB。就算A100也才80GB。大模型根本塞不下。
我遇到过最极端的情况:一个客户想在单卡上跑LLaMA-65B的推理。65B模型FP16就要130GB,24GB的卡怎么跑?
这时候就需要显存优化技术了:
- 量化:把FP16变成INT8,显存直接减半
- 模型并行:把模型切分到多张卡上
- 显存卸载:把不用的层临时挪到内存里
- 梯度检查点:训练时只存部分中间结果,反向传播时重新计算
一句话总结:显存优化不是锦上添花,而是刚需。没有优化,很多模型根本跑不起来。后面我会手把手带你把这些技术都过一遍。
好了,这一章的基础知识就到这里。记住这张图、这个表格,后面我们会反复用到这些概念。