一层模型太大,单张 GPU 放不下,常见办法是把这一层也拆开。张量并行做的就是这件事。同一次矩阵运算由多张卡各算一部分,随后交换中间结果,让下一步看到完整或约定好的分片。

我查了 Megatron-LM 两篇论文、Megatron Core 指南和 PyTorch 当前文档。这个概念经常和多卡训练一起出现,部署结果很受通信影响。每张卡少算了一部分,同时也多了等待其他卡的时刻。

一层里面怎样分工

Transformer 的注意力和前馈网络都包含大矩阵乘法。Megatron-LM 会沿矩阵的行或列切权重,让不同 GPU 计算不同切片。注意力头也能分给不同设备。后续运算需要完整结果时,系统执行全归约、全收集或归约散射一类集合通信。

原始 Megatron-LM 论文强调,这套做法只需在原生 PyTorch 运算之间插入少量通信,不要求另造编译器。研究团队当时用 512 张 GPU 训练 83 亿参数 Transformer,并报告相对单 GPU 基线达到 76% 的扩展效率。这个数字说明方案在那组模型和机器上可行,不能直接当成任意集群的加速承诺。

每张卡只保存权重分片,训练时还会保存对应的梯度与优化器状态,单卡内存因此下降。输入激活怎样摆放则由具体切法决定,布局接错时,系统会多做一次本可避免的收集。

PyTorch 现在把常见切法做成 ColwiseParallel、RowwiseParallel 和 SequenceParallel 等接口。列切输出通常仍是分片,行切常把输出还原成复制布局,二者可以配合组成 MLP 或注意力模块。文档同时标明这些接口仍属实验性,升级版本时要检查计划、布局和检查点是否兼容。

卡越多,等通信的次数也越多

张量并行的通信发生在层内。模型走过几十层,集合通信也会反复出现。GPU 之间有 NVLink 之类高速互连时,等待比较容易藏进计算;跨到较慢的节点网络以后,新增卡可能主要在搬数据。Megatron Core 因此通常把张量并行留在高速互连域内,再用流水线并行或数据并行向更多节点扩展。

推理也有同样的账。多张卡同时算一个请求,可以降低单卡权重占用,并缩短某些大矩阵运算。小批量、短输入或网络较慢时,通信固定开销会吃掉收益。四张卡能放下模型,只回答了容量问题,还没有回答每个请求要等多久。

实际验收应固定模型、精度和输入输出长度,分别测一张、两张、四张卡的首词元延迟、生成间隔和总吞吐。再记录设备是否同机、互连类型与集合通信耗时。曲线在哪一档开始变平,张量并行就该停在那里,剩余 GPU 留给请求副本往往更划算。

参考资料