Sophia 的全部训练在一张 NVIDIA RTX 5090 上完成。为什么用 GPU 而不是 CPU?
CPU vs GPU
CPU(中央处理器)有少量的强大核心——通常 8 到 32 个。每个核心速度极快,能处理复杂的逻辑分支。但核心数少,同一时刻只能并行做十几件事。
GPU(图形处理器)有大量的简单核心——几千到几万个。每个核心比 CPU 核心弱得多,不擅长复杂逻辑。但当你需要对大量数据做同样的简单操作时,几千个核心同时工作的吞吐量远超 CPU。
矩阵乘法正是这种操作:对几百万个数字做乘法和加法——每个乘加操作独立且简单。GPU 在矩阵乘法上的速度是 CPU 的几十到几百倍。
核函数(Kernel)
GPU 上执行的程序叫核函数。你可以把它理解为:一段代码被几千个核心同时执行,每个核心处理数据的不同部分。
一次矩阵乘法就是一次核函数调用。PyTorch 在你写 A @ B 时,底层会调用 NVIDIA 优化过的矩阵乘法核函数(cuBLAS),几千个核心同时工作,毫秒级完成。
但核函数的启动有固定开销——从 CPU 发指令到 GPU 开始执行需要几微秒。如果核函数本身的计算量很小(比如只做几百次乘加),启动开销比计算本身还大——这就是为什么 GPU 不适合小规模计算。
显存层级
GPU 的显存(Video RAM, VRAM)是模型参数和中间结果存放的地方。RTX 5090 有 32 GB 显存。
但显存不是唯一的存储。GPU 内部还有多级缓存:
寄存器(最快,每个核心自己的)
共享内存 / L1 缓存(很快,同一组核心共享)
L2 缓存(快,全 GPU 共享)
显存 / HBM(最慢,但最大——32 GB)
数据从显存读到寄存器需要几百个时钟周期。如果计算量不够大,核心会花大部分时间等待数据从显存传过来,而不是在做实际计算。
带宽瓶颈
RTX 5090 的理论计算速度是每秒约 100 万亿次 BF16 乘加(100 TFLOPS 量级)。但它的显存带宽——数据从显存到计算核心的传输速度——是每秒约 1.8 TB。
这意味着:如果一个操作对每个数据只做很少的计算(比如逐元素加法——读两个数字,做一次加法,写回一个数字),显存带宽会成为瓶颈——计算核心大部分时间在等数据。
矩阵乘法不同:它对每个数据做大量计算(每读一个数字要做几百次乘加),计算量远超数据传输量——它是计算密集型的,能把 GPU 的算力用满。
这就是为什么 Transformer 的核心操作(矩阵乘法)在 GPU 上效率极高,而一些辅助操作(归一化、激活函数、残差加法)反而是带宽瓶颈。
下一章节来算一下:训练 Sophia 到底需要多少显存,各部分各占多少。