跳到主要内容

算力的地基 — 为什么深度学习首先是搬运问题

这一章讲三件事: GPU 这种「打游戏用的硬件」为什么恰好成了深度学习的引擎; 这里先交代一个单位:「批」就是「一小堆样本一起算」;为什么把样本成批喂进去几乎不额外花钱;以及「张量」这个全书到处出现的包装格式 到底是什么。它在全书的位置:第 01 章说训练是「调几百万次数」,这一章回答 「这几百万次凭什么算得完」。

1. 顶层全景:瓶颈不在算,在搬

先给一句反直觉的话,这一章所有内容都是它的注脚:

限制深度学习速度的,通常不是「有多少个计算电路」,而是「数据搬得有多快」。1

一台 GPU(Graphics Processing Unit,图形处理器——原本为游戏画面实时渲染而造的 芯片)身上有几千个计算单元——一个单元就是一个能算乘加的小电路—— 和一块自己的高速内存。这些单元同时各算各的,这个性质叫并行。

但计算单元要算的数, 得先从电脑的主内存搬进 GPU 的内存,再从 GPU 内存搬进计算单元旁边的 缓存(cache——容量更小、速度更快的临时存放处,而且这样的缓存有好几层)。 这条搬运链上最慢的一环,是电脑主内存和 GPU 内存之间的那根管子2

电脑主内存 ──(最慢的一根管)──> GPU 内存 ──(几层缓存)──> 几千个计算单元
│ │
└──────── 原则:数据一旦搬过去,就在那里尽量多算 ──────────┘

图说:整条链上,搬比算贵。这一章的两个主角(批、张量)都是为了让
「每搬一次,就多算一点」。

由此得出全书反复使用的一条工程铁律:避免跨设备拷数据;计算要组织成 「把一批数据一次搬齐、就地算完」的形状3

2. 为什么恰好是 GPU

GPU 和深度学习的相遇是个巧合,原书讲得很清楚:它本来是为实时图像合成设计的—— 游戏里每一帧画面要同时算几百万个像素的颜色,这逼它长成了「几千个单元同时干 同一种简单运算」的形状。而深度学习的计算(下一章会看到,主体是成堆的乘法加法) 恰好也是这个形状4

巧合之后是跟进:随着 AI 用量变大,GPU 里被塞进了专门加速这类运算的 「张量核心」,Google 还造了专用芯片 TPU(Tensor Processing Unit)5

给两个数建立量感(都来自原书)6:

  • 一块标准 GPU 的理论峰值是每秒 10¹³–10¹⁴ 次浮点运算——浮点运算就是一次 带小数点的加减乘除(英文缩写 FLOP)——它是这行衡量「算了多少活」的标准单位; 作为参照,你手里一台普通笔记本的 CPU 峰值大约是这个的百分之一到千分之一 (补充:不在书里,来自通用知识);
  • GPU 自带内存一般 8 到 80 GB(吉字节,约等于 8 到 80 部高清电影的体积)。 第 05 章会看到,大模型的参数根本放不进这个量级——那是第 05 章要解决的问题。

还有一个省钱的发现:小数的标准存法用 32 个二进制位(FP32),但实测表明, 用 16 位、甚至对一部分中间量用更少的位,效果并不变差7。位数减半, 搬运量和内存占用直接减半——在「搬比算贵」的世界里,这是白捡的一倍。 这条会一路长到第 12 章的「4 个位存一个数」。

3. 成批处理:本章主走查

「搬比算贵」推出的第一个具体做法,是把样本成批处理。这一节拿一个具体场景 走完它。

场景:你有一个模型,要对图片做处理。模型有,比如说,1 亿个参数 (这个数在第 05 章的表里属于「视觉模型」的常规量级)。现在来了 64 张图要处理。

一张一张喂会怎样: 每处理一张图,那 1 亿个参数都得从 GPU 内存被搬到 计算单元旁边的缓存一次。搬 1 亿个数,算 1 张图;搬 1 亿个数,算 1 张图。 64 张图,参数就要搬 64 趟。

成批喂会怎样: 把 64 张图打包成一「批」,一次全搬进 GPU 内存, 64 张图并行地算。 这趟里,参数只搬一次,64 张图全用同一批参数算完8

这一「批」在这行有个正式名字:批量(batch,一次打包一起算的一组样本)。

原书给的关键事实是:GPU 处理「一批能放进内存的样本」, 和处理「一个样本」几乎一样快9

逐张处理: [搬参数][算图1] [搬参数][算图2] … [搬参数][算图64] ← 64 趟搬运
成批处理: [搬参数][算 图1‥图64 一起] ← 1 趟搬运

图说:算的部分几乎不变慢,搬的部分省掉 63 趟。
这就是「批量」成为这行默认单位的原因。

这个事实的影响超出本章:第 04 章会讲,训练时每次调参数只依据一小批样本 而不是全部数据——这个做法能成立,一半靠的就是「一批和一条一样快」。

4. 张量:所有参与方说好的包装格式

前面一直在说「数据」,现在给它正式的名字和形状。

在深度学习里,一切要算的东西——输入信号、模型的参数、中间结果——都被组织成 张量(tensor):把一堆标量(单个的数)沿着若干条离散的轴排好的一整坨。

它的两个特例你早见过:沿一条轴排的一串数,叫向量(vector)。

沿两条轴排的数表,叫矩阵(matrix);张量就是这两个特例 向更多轴的推广:三条轴的张量可以想象成一本「数的书」,每页是一张矩阵10

几条轴各管什么,由数据的种类决定11:

数据张量形状各轴的含义
一段声音(一串按时间排的数)T × DT = 时长(多少个时间点),D = 每个时间点上用来描述它的数的个数——这样的描述数叫特征(feature),D 也叫通道数(channel)
一张彩色图3 × H × W3 = 红绿蓝三个通道,H、W = 高和宽
一批 50 张 32×24 的彩色图50 × 3 × 24 × 32最前面加一条轴表示「哪一张」

轴的数量,与两个贯穿全书的命名

注意通道数可以远不止 3:在大模型内部,一个位置上的特征向量可以有几千个通道12。 轴的数量(这张表有 3 条、4 条)有个名字,叫维度

而「高维」就是轴多、每根轴上的数多的意思, 不是说它在空间里弯曲。

还有两个贯穿全书的命名13:

  • 模型在计算中途造出来的中间张量,叫激活(activation)——名字借自 「神经元被激活」的类比,但它就是「中间结果」的意思;
  • 第 01 章说的「参数」,存在内存里也是张量(比如一张矩阵)。

这个格式为什么值钱:产业链接头处的标准件

张量这个格式不只是图方便。原书点出了它的真正价值:它是整条产业链接头处的标准件14。 写驱动的、写计算库的、设计模型的、造芯片的,所有人事先都知道 「数据会以张量的样子来」,于是每一环都能围绕「张量可以切块、可以就地换看顺序」 来做最优设计。一个具体例子:张量的实现把「形状」和「数据在内存里的实际摆放」 分开存——所以像「把 50×3×24×32 换看成 50×24×32×3」这种换轴操作, 不用挪动任何一个数,改一下形状描述就行,快得免费15

5. 作者的判断与证据

  • 「研究要永远在数学正确和可实现之间找平衡」是作者对这门学科生态的判断。 原书说,GPU 的技术约束反过来塑造了研究本身——一个新方法光在数学上漂亮不够, 还得能高效地在这套硬件上跑16。这个判断贯穿全书:第 08 章的 「平方代价」、第 12 章「每个参数只留几个位」的做法,都是这条约束的产物。
  • 「一批和一条一样快」是作者给的工程经验事实,没有配测量数据,但它是 后续章节(一小批一小批地训练、并行策略)的地基,全书多处依赖它。
  • 16 位不损性能,原书注明是「empirical results show」——经验结论,不是定理。

6. 边界与局限

  • 本章讲的是「单块 GPU」的世界。模型大到一块卡装不下之后怎么办,原书放在 §3.8,我们放在第 05 章讲。
  • 「10¹³–10¹⁴ 次/秒」是书出版年代的量级(2023 年前后);硬件代际更新很快, 具体数字会过时,但「搬比算贵、一批等于一条」这两条结构性事实不会过时
  • 张量库(PyTorch、JAX 这些深度学习框架)提供的上百种算子,本章只给了存在性声明, 具体算子(卷积、注意力等)在第 06–08 章逐个讲。
  • 原书没讲 CPU 与 GPU 之间那根管子(总线)的规格差异,也没讲多机之间的网络—— 那些属于系统侧,不在本书范围。

7. 可带走的

  1. 这门工程的瓶颈是搬运,不是计算。看任何深度学习系统的性能,先问「数据搬了几趟」;
  2. GPU 合用是巧合:游戏渲染逼出来的并行形状,恰好是深度学习要的形状;
  3. 一批样本和一条样本几乎同样快——所以「批」是这行组织计算的默认单位;
  4. 位数减半,搬运和内存减半:32 位→16 位不损效果,是白捡的;
  5. 张量 = 沿若干轴排好的一坨数,是向量、矩阵的推广;它是全产业链的标准件;
  6. 「通道」就是一个位置上的特征个数:图像输入是 3,模型内部可以是几千;
  7. 中间结果叫「激活」,参数也是张量——到这一步,「模型」在内存里长什么样你已经能想象了;
  8. 换轴、换形状不挪数据:形状描述和数据摆放分开存。

8. 原文地图

主题原书章原文位置
瓶颈是内存读写而非计算单元Efficient Computationtext/05-fm-efficient-computation.txt:26(搜「several thousand parallel units」) · text/05-fm-efficient-computation.txt:32(搜「slowest link」)
GPU 的来历与 TPUEfficient Computationtext/05-fm-efficient-computation.txt:17(搜「originally designed for real-time image synthesis」) · text/05-fm-efficient-computation.txt:21(搜「Tensor Pro」)
批量处理与「一批等于一条」Efficient Computationtext/05-fm-efficient-computation.txt:42(搜「This is achieved, in particular」) · text/05-fm-efficient-computation.txt:51(搜「almost as quickly」)
峰值算力与内存、16 位Efficient Computationtext/05-fm-efficient-computation.txt:54(搜「theoretical peak」) · text/05-fm-efficient-computation.txt:61(搜「16 bits」)
张量定义、通道、激活Efficient Computationtext/05-fm-efficient-computation.txt:73(搜「series of scalars」) · text/05-fm-efficient-computation.txt:28(搜「number of」) · text/05-fm-efficient-computation.txt:81(搜「activations」)
50 张图的例子Efficient Computationtext/05-fm-efficient-computation.txt:96(搜「fifty RGB」)
形状与存储分离Efficient Computationtext/05-fm-efficient-computation.txt:105(搜「separates the shape representation」)
张量作为产业链标准件Efficient Computationtext/05-fm-efficient-computation.txt:116(搜「instrumental in achieving computational efficiency」)

Footnotes

  1. 出处:「Efficient Computation」第 26–30 段(text/05-fm-efficient-computation.txt:26,搜「several thousand parallel units」)。原文:「The limiting factor is usually not the number of computing units, but the read-write operations to memory」。

  2. 出处:「Efficient Computation」第 31–40 段(text/05-fm-efficient-computation.txt:32,搜「slowest link」;text/05-fm-efficient-computation.txt:36,搜「levels of cache」)。

  3. 出处:「Efficient Computation」第 42 段(text/05-fm-efficient-computation.txt:42,搜「This is achieved, in particular」)。

  4. 出处:「Efficient Computation」第 17–18 段(text/05-fm-efficient-computation.txt:17,搜「originally designed for real-time image synthesis」)。

  5. 出处:「Efficient Computation」第 19–24 段(text/05-fm-efficient-computation.txt:20,搜「dedicated tensor cores」)。

  6. 出处:「Efficient Computation」第 54–58 段(text/05-fm-efficient-computation.txt:54,搜「theoretical peak」)。

  7. 出处:「Efficient Computation」第 59–62 段(text/05-fm-efficient-computation.txt:61,搜「16 bits」)。原文:「empirical results show that using encoding on 16 bits, or even less for some operands, does not degrade performance」。

  8. 出处:「Efficient Computation」第 43–49 段(text/05-fm-efficient-computation.txt:43,搜「batches of sam」)。原文:「Proceeding by batches allows for copying the model parameters only once, instead of doing it for each sample」。

  9. 出处:「Efficient Computation」第 50–52 段(text/05-fm-efficient-computation.txt:51,搜「almost as quickly」)。

  10. 出处:「Efficient Computation」第 66–74 段(text/05-fm-efficient-computation.txt:73,搜「series of scalars」)。原文:张量「are series of scalars arranged along several discrete axes … generalize the notion of vector and matrix」。

  11. 出处:「Efficient Computation」第 84–98 段(text/05-fm-efficient-computation.txt:84,搜「time series」;text/05-fm-efficient-computation.txt:96,搜「fifty RGB」)。

  12. 出处:「Efficient Computation」第 91–94 段(text/05-fm-efficient-computation.txt:93,搜「several thousands」)。

  13. 出处:「Efficient Computation」第 76–82 段(text/05-fm-efficient-computation.txt:81,搜「activations」)。

  14. 出处:「Efficient Computation」第 115–121 段(text/05-fm-efficient-computation.txt:116,搜「instrumental in achieving computational efficiency」)。

  15. 出处:「Efficient Computation」第 100–108 段(text/05-fm-efficient-computation.txt:105,搜「separates the shape representation」)。

  16. 出处:「Efficient Computation」第 12–15 段(text/05-fm-efficient-computation.txt:15,搜「balance mathematical soundness」)。