数据、模型与流水线并行(data, model, and pipeline parallelism)
/ DAY-tuh, MOD-ul, and PIPE-line PAR-uh-lel-iz-um /
这是把训练任务拆到许多芯片上的三种主要办法,每一种回答的是不同的问题。想象一张巨大的餐厅订单。数据并行最简单:给每位厨师同一份完整食谱,却发给不同批次的食材,到头来大家再对一对账。每块芯片都拿着模型的一份完整副本,各自处理训练样本中不同的一块,然后把学到的东西平均起来。
模型并行(常叫张量并行)则用于食谱本身大得一个厨师脑子都装不下时。你把一道菜拆给好几位厨师——一个切配、一个煎炒、一个摆盘——也就是把模型的层、甚至单独一层切开摊到芯片上,每块芯片只拿着网络的一小片。流水线并行则是那条装配线:厨师甲永远做头道,递给厨师乙做第二道,依此类推;模型被切成一段段先后相连的阶段,每段住在不同芯片上,数据像生产线上的汽车那样一路流过去。
为什么这很重要:今天最大的模型,对任何单块芯片都太大了,所以这三种通常一齐上阵——这才是「在一千块 GPU 上训练一个模型」背后真正的含义。诚实的权衡在于:每一种策略都会添上通信与复杂度。流水线并行尤其会在每批的开头和结尾让芯片闲着(所谓「气泡」),等流水线灌满又排空。选对它们的搭配,是一桩精细的平衡活,取决于模型的形状、硬件,以及把这一切串起来的网络。
一个单块 GPU 装不下的模型,被切成 4 份(模型并行),又排成 4 个阶段(流水线)。然后把这整套 4 芯片的配置复制 64 遍,每一份喂以不同的样本(数据并行)——256 块芯片,三种策略一齐上。
真实的前沿训练把三种一齐糅在一起——这种布局是常态,而非例外。
数据并行很省事,可一旦模型本身已经塞不进单块芯片的内存,它就毫无用处了——到处复制根本不可能。正是那堵「内存墙」,让模型并行与流水线并行有了存在的理由,哪怕它们搭起来更费事。