跳到主内容

张量并行是怎么切开一层的?关键步骤一次讲清

2026-10-18 发布 来源:我告诉你AI导航 阅读

训练大模型时如果单卡放不下,把数据分给多卡也没用——模型副本根本复制不出来。张量并行换了个思路:模型不复制,而是把每一层内部的矩阵运算横向或纵向切开,每张卡只算其中一块。本文按机制层讲法,把切分、前向、反向、通信四步一次讲清。

训练大模型时如果单卡放不下,把数据分给多卡也没用——模型副本根本复制不出来。张量并行换了个思路:模型不复制,而是把每一层内部的矩阵运算横向或纵向切开,每张卡只算其中一块。本文按机制层讲法,把切分、前向、反向、通信四步一次讲清。

切分:列并行与行并行

先看切分这一步。进来的是一个大的权重矩阵,比如 Transformer 层里的投影矩阵,按列切或者按行切两种基本方式。列并行是把输出维度切开,每张卡拿到若干列,前向时各算各的输出片段;行并行是把输入维度切开,每张卡拿到若干行,前向时各算部分和再相加。出去的是一组小矩阵,合起来覆盖原矩阵的全部计算。切哪个维度不是随意的,要保证下一步的输入能对齐。

前向:拼输出与加部分和

第二步是前向计算。列并行时,每张卡用自己的权重片段和完整输入算出部分输出,然后做一次 all-gather 把各段输出拼成完整结果传给下一层。进来的是完整输入和小权重片段,出去的是本层完整输出。行并行则相反,输入要先做一次 scatter 切成片段分发下去,各卡算出部分和后 all-reduce 相加,出来的同样是完整结果。

反向:怎么切就怎么还

第三步是反向传播。前向怎么切的,反向就怎么还回来。列并行对应的是对输出梯度做 scatter,各卡只用自己那段误差更新自己那段权重;行并行对应的是对输入梯度做 all-reduce 合并。进来的是上层传回的梯度,出去的是本层各权重片段的更新量。因为每张卡始终只碰自己那段,激活值和权重都不必整块驻留。

同一层切两个方向,前向和反向的动作正好相反:

环节列并行行并行
切分维度切输出维度,每卡拿若干列切输入维度,每卡拿若干行
前向计算权重片段乘完整输入,各算输出片段输入先 scatter 成片段,各算部分和
前向通信all-gather 把各段输出拼成完整结果all-reduce 把部分和相加
反向还原输出梯度做 scatter,各卡只更新自己那段权重输入梯度做 all-reduce 合并

通信:每层两次的代价

第四步是通信协调。张量并行对通信极其敏感,前向一次 all-gather 或 all-reduce,反向再来一次,每层两次。进来的是各卡的片段数据,出去的是同步后的完整数据;通信量不大但频次高,所以实践中常把张量并行限制在单机多卡内,机器之间用带宽更高的互联,否则通信等待会吃掉切分省下的时间。这类等待不陌生:同时让 DeepSeek 和豆包接力处理一个长任务,后一步总要等前一步把中间结果传过来,任何一头慢,整体就慢。工程上还会把通信和计算重叠起来,算这一批的时候传上一批的结果,把等待藏进计算里。

它和数据并行是正交的,可以叠加:机内用张量并行解决放不下,机间用数据并行解决训不快。层与层之间还能再套流水线并行,把模型按层分段交给不同机器。显存吃紧时先看ZeRO 的分片思路,改动比张量并行小得多。

切分方式的选择也和显存占用直接相关。微调阶段常见的组合打法——冻结、量化、分片三板斧——在微调的显存是怎么省的里逐个拆开;训练时数据的顺序安排则和数据打乱强相关。

  • 切分:列并行切输出维度,行并行切输入维度,按计算对齐选
  • 前向:列并行 all-gather 拼输出,行并行 all-reduce 加部分和
  • 反向:前向怎么切反向就怎么还,各卡只更新自己那段
  • 通信:每层两次同步,频次高,适合机内高速互联
  • 定位:解决放不下,与数据并行正交可叠加

张量并行快问快答三则

  • 列并行和行并行能混用吗?:可以,一个层内先列后行或交替使用都常见,只要保证拼接和相加的顺序接得上。
  • 为什么张量并行一般不超过八路?:通信频次随路数线性涨,超过一定路数后省下的显存抵不上通信等待,通常换更大单卡或改切分层级。
  • 切分后精度会掉吗?:数学上切分前后等价,掉精度一般来自通信实现或混合精度的配置问题,不是切分本身导致。

反馈页面信息

请描述需要更正的地方,页面标题和网址会自动附上。

也可以发邮件至 [email protected]