JOVANA
Library Glossary Getting Started Three Levels Fields How it works Mission
Join the mission
All guides

硬件:GPU、TPU 与扩展

为什么现代 AI 跑在专用芯片上,一个模型如何铺展到数百块芯片上训练,以及那些算力真正的代价——以美元、瓦特和工程痛苦来计。

为什么不直接用 CPU?

到现在你已经知道,一个神经网络在底层其实是一长串矩阵乘法,由激活函数粘接而成。无论是前向传播还是反向传播,用算术的话说,都是同样那么几种运算,在大片大片的数字网格上重复亿万次。普通 CPU 是出色的通才:少数几个极快的核心,几乎什么都能做,一件复杂的事接着一件。这恰恰是这份工作所不需要的形状。我们要的不是每一步多聪明,而是把*同一个简单步骤*——相乘再相加——荒唐地重复无数次,而且同时进行。

GPU(图形处理单元)生来就是为了一次画出几百万个像素,所以它的造法恰恰相反:成千上万个又小又简单的核心,对不同的数据齐步执行*同一条*指令。这碰巧正是一次矩阵乘法的样子。TPU(张量处理单元)走得更远——这是谷歌专为深度学习的张量运算设计的芯片,其电路让数字像水流一样穿过一格格乘加单元,从而几乎不必去内存里慢吞吞地往返取数。两者都属于我们称为 GPU 与 TPU 的家族,而它们之所以要紧,头号原因是并行:不是每一步更快,而是在同一瞬间发生的步骤多得多。

当一块芯片不够用

单块现代加速器已经非凡,可一个基础模型大语言模型会从两个彼此独立的方向把它撑爆,把这两者分开来看很值得。第一是时间:哪怕是一块快芯片,要啃完在数万亿 token 上的一次训练,也得花上几年。第二是内存:模型的参数,加上更新它们所需的梯度与优化器状态,根本塞不进一块芯片的内存。任何一个问题,都会把你逼上分布式训练——把工作拆到许多芯片、往往是许多台机器上,用高速链路连成一体。

这里有一个定义整个领域的要害:协同工作的芯片必须彼此*交谈*,而交谈相比计算是慢的。每当两块 GPU 要就一个数字达成一致,字节就得沿电缆奔走一趟,而那根电缆远比芯片内部的运算慢得多。所以分布式训练从来不是干净利落的提速——加上第二台机器,从来都凑不满双倍的吞吐。全部的本事,就在于把工作安排得让芯片把时间花在*计算*上,把*等待通信*的时间压到最低。请记住这股张力;它解释了接下来的每一个设计抉择。

拆分工作的三种方式

对于「我们到底拆什么?」这个问题,有三种诚实的回答,而真实系统会把三者糅合在一起。它们统称为数据、模型与流水线并行。最简单的是数据并行:每块芯片都持有模型的*一份完整副本*,但看到的是小批量的*不同切片*。各自在自己的切片上算出梯度,然后所有芯片把梯度平均到一起,好让每一份副本保持完全一致。这很好理解、扩展性也好——直到模型本身大到一块芯片放不下,那时把它复制到处处便成了不可能。

当模型放不下,你就转而拆*模型*。模型(或张量)并行把单独一个巨大的层切到多块芯片上——A 芯片持有一个权重矩阵的左半,B 芯片持有右半——于是一次矩阵乘法由它们合力算出,芯片在运算中途交换部分结果。流水线并行则把*不同的层*放到不同芯片上,像装配线上的工位:1 号芯片做最前面几层,把输出交给 2 号芯片,依此类推。这里的危险是「气泡」——2 号芯片在等 1 号的第一份输出时只能空闲——所以工程师会一次喂进许多微批量,让每个工位都不停工,就像真正的装配线绝不会卡在第一个工人那里。

DATA PARALLEL        each chip = full model, different data slice
   chip0 [MODEL] <- batch[0:8]   \
   chip1 [MODEL] <- batch[8:16]   >  average gradients --> sync
   chip2 [MODEL] <- batch[16:24] /

MODEL PARALLEL       one big layer split across chips
   chip0 [layer L: left half ]
   chip1 [layer L: right half]   exchange partials mid-multiply

PIPELINE PARALLEL    different layers on different chips
   chip0 [layers 1-8] -> chip1 [layers 9-16] -> chip2 [layers 17-24]
三种拆分一目了然。大模型真实的训练会把三者同时叠起来(「三维并行」):跨机器做流水线,机器内做张量切分,整个集群上做数据并行。

混合精度:一半的位数,几乎全部的精度

还有第二根杠杆,与拆分工作彼此独立,几乎是白送地换来速度与内存。默认情况下,网络里的每个数字都用 32 位浮点存储——精度慷慨,却在内存和搬运它的能耗上都昂贵。[[mixed-precision-training|混合精度训练]]改用 16 位(甚至 8 位)浮点来做大部分运算,这大致把内存用量减半,也让芯片的专用单元跑得更快,同时为那些真正需要多几位的部分保留一份 32 位的权重主副本。令人意外的是精度损失之小:在带噪声的数据上训练出来的网络足够稳健,把大多数运算的精度削掉一点,几乎不会动摇最终结果。

算力的真实代价

这一切硬件的昂贵,远不止租用账单那么简单。有钱的代价——训练一个前沿模型,可能要花掉数百万美元的芯片小时。有电力以及训练的环境代价——大型训练动辄消耗数兆瓦,数据中心的用水与碳足迹都是实打实的。还有一种更隐蔽的代价:工程师的时间,因为一个本该连跑几周的集群,会遇上芯片故障、网络打嗝、运行停滞,总得有人守着它。把两种状态分开看会有帮助。训练是一次性的、残酷的开销;之后为模型提供服务——它的推理成本——单次请求很小,却要永远付下去,落在每个用户的每一次查询上。

这种成本结构,也正是为什么「惨痛的教训」——即把更多算力和数据砸向通用方法,往往胜过手工雕琢的小聪明——既是真的、却又容易被误读。「直接扩大规模」只有在你掏得起账单、管得住工程、并接受收益递减时才行得通。研究者测出的缩放定律是真实而平滑的,但它们是*幂律*:每新增一截能力,所花的算力都不成比例地多于上一截。扩展是一种策略,而不是通往愈来愈强能力的免费扶梯——更绝不是通向通用智能的自动通道。诚实的框架是工程经济学:你在以陡升的价格,买入一份数额已知的改进。

而这正是本篇令人振奋的收尾:硬件是一根杠杆,不是一种宿命。后面几级台阶,大体都在讲*怎么少花钱*——把模型缩小,让它服务起来更便宜;把请求成批处理,让每块芯片干更多活;并盯住延迟与吞吐之间的权衡。你不需要一千块 GPU 才能做出出色的工作。你需要的是搞懂硬件擅长什么、成本藏在哪里,以及什么时候该扩大规模、什么时候该把规模用得*更聪明*。