Transformer 并行性到底体现在哪里

作者:php是最好的2026.11.04 13:40浏览量:0

简介:很多人把“Transformer 比 RNN 快,因为它并行”当成默认结论,却说不清并行到底发生在训练还是推理、注意力计算还是多卡扩展。本文从 RNN 的串行瓶颈出发,拆解 Transformer 在训练与推理两侧的并行边界,重点解释为什么生成阶段会出现“并行架构、串行行为”的现象,帮助读者建立对并行性的准确判断,而不是停留在口号式认知。

一、为什么需要重新审视“Transformer 并行”这句话

“Transformer 比 RNN 快,因为它并行”,这句话在技术分享、面试问答和架构评审里出现频率极高。它本身不算错,但如果把这句话当成无需进一步解释的结论,就容易掩盖很多关键细节。并行到底发生在哪个阶段?是训练阶段、推理阶段,还是两者都成立?是单个序列内部并行,还是多个序列之间并行?是算法层面的并行,还是硬件层面的并行?

这些问题之所以重要,是因为它们直接影响工程决策。例如,在模型服务化时,如果只看到“Transformer 并行”,却没有意识到生成阶段的并行边界,就可能对吞吐、延迟和资源利用率做出错误预估。事实上,同一类硬件上,Transformer 在预填充阶段的计算利用率可能很高,而进入逐 token 生成阶段后利用率明显下降。这个现象不是参数配置失误,而是模型结构与计算模式共同决定的。

因此,本文的核心目标是:把“并行”这个词拆开,从训练和推理两条链路出发,说明 Transformer 的并行性到底体现在哪里,又在哪里消失了。

二、对比对象:RNN 与 Transformer 的序列建模方式

要理解 Transformer 的并行性,首先要明确它对比的是谁。这里对比的是两种主流序列建模结构:

  • RNN 类模型:包括基础 RNN、LSTM、GRU 等变体。它们以时间步为单位处理序列,当前时刻的隐藏状态依赖上一时刻的隐藏状态,形成严格的顺序依赖。
  • Transformer 类模型:基于自注意力机制和前馈网络堆叠而成。它在处理序列时,不依赖上一个时间步的隐藏状态,而是通过注意力机制一次性建立序列内任意位置之间的连接。

两者解决的是同一类问题:对序列数据进行建模,例如文本、语音、时间序列等。它们的输入都可以是长度不固定的 token 序列,输出也可以根据任务不同而变化。相同点在于,两者都需要学习序列中的顺序信息和上下文依赖关系;不同点在于,它们为“如何建模依赖关系”选择了完全不同的计算路径。

三、RNN 的并行瓶颈:串行依赖是核心问题

RNN 的计算过程可以概括为:

  1. h_t = f(h_{t-1}, x_t)

其中 h_t 是第 t 步的隐藏状态,x_t 是第 t 步的输入。这个公式看起来简单,但它包含了一个强约束:必须先计算 h_{t-1},才能计算 h_t。这意味着序列内部的各个时间步无法并行执行。

可以用一个类比来理解:RNN 处理一条序列就像一个人逐字阅读一本书,每读一个字之前必须先记住前面所有的理解结果。即使同时读多本书,也就是在 batch 维度上并行,每本书内部的阅读过程仍然是逐字推进的。

这种串行依赖在反向传播中同样存在。反向传播通过时间展开后,梯度必须从最后一个时间步逐层传回第一个时间步。序列越长,前向计算和反向传播的串行链就越长。这不仅限制了并行加速的空间,还带来了梯度消失和梯度爆炸问题。LSTM 和 GRU 通过门控机制缓解了梯度传播问题,但并没有消除“必须等待上一步”的串行内核。

从硬件角度看,GPU 等并行计算设备擅长同时执行大量独立的矩阵运算。RNN 的串行结构使得硬件在单个序列内部无法充分利用并行能力。即使 batch 很大、序列很多,单条序列的计算延迟仍然由序列长度决定。这种结构难以通过堆叠硬件来线性降低单序列延迟。

四、Transformer 的并行性:训练阶段的全局展开

Transformer 的训练阶段是并行性体现得最充分的地方。以自注意力机制为例,给定输入序列 X = [x_1, x_2, ..., x_n],自注意力计算可以写成:

  1. Q = X W_Q
  2. K = X W_K
  3. V = X W_V
  4. Attention(Q, K, V) = softmax(QK^T / sqrt(d_k)) V

这个计算过程中,Q、K、V 的计算与序列长度无关,而是对整个序列的所有位置同时进行。QK^T 一次性建立所有位置两两之间的注意力分数,softmax 之后再与 V 做加权求和。整个过程不存在“必须等上一个位置算完”的依赖关系。

这意味着,在训练阶段,Transformer 可以同时计算序列中所有位置的表示。对于一条长度为 n 的序列,RNN 需要 O(n) 个串行步骤,而 Transformer 在前向计算中只需要 O(1) 个串行步骤,其余计算都可以并行完成。反向传播时,梯度也不再需要沿时间步逐步回传,因为前向计算中没有时间步循环。

这种并行性带来的直接好处是:硬件利用率更高,训练速度可以随着硬件规模的扩展而提升。尤其在多卡训练场景下,Transformer 的矩阵运算可以更自然地切分到多张计算设备上并行执行。训练阶段几乎不存在单序列内部的串行瓶颈。

五、推理阶段的不对称性:预填充与生成的分野

推理阶段的情况要复杂得多。Transformer 的推理通常分为两个阶段:

  • 预填充阶段:一次性输入全部已知 token,计算所有位置的隐藏状态。
  • 生成阶段:逐个生成新 token,每生成一个 token 就把它加入输入序列,再计算下一个 token。

预填充阶段与训练阶段的前向计算相似,可以充分利用并行性。输入序列的所有位置同时计算,硬件利用率较高。

生成阶段则不同。每生成一个新 token,都需要把新 token 与之前所有 token 一起重新计算注意力。虽然注意力机制本身仍然可以并行计算所有位置,但由于每次只能生成一个 token,不同生成步骤之间形成了严格的串行依赖。第 t 个 token 的生成必须先有第 t-1 个 token 的输出,然后才能进行第 t 次前向计算。

这就是“并行架构、串行行为”的核心来源。如果把生成阶段看作一个循环:

  1. for step in range(max_length):
  2. output = transformer(input_so_far)
  3. next_token = sample(output[-1])
  4. input_so_far = concat(input_so_far, next_token)

这个循环本身是串行的。每次循环内部虽然可以并行计算,但循环之间必须顺序执行。因此,生成阶段的硬件利用率主要受限于“每次只能算一个位置”的约束。与训练阶段的全序列并行相比,生成阶段的计算密度显著降低,硬件利用率自然下降。

六、为什么生成阶段“退回”串行?

很多人会问:为什么生成阶段不能并行生成多个 token?原因在于自回归生成的机制。Transformer 在文本生成任务中通常采用自回归方式,即当前 token 的生成依赖于前面所有已生成的 token。这是语言模型建模联合概率分布的自然方式:

  1. P(y_1, y_2, ..., y_T) = ∏_{t=1}^{T} P(y_t | y_1, ..., y_{t-1})

这个公式本身就是一个串行分解。要并行生成多个 token,就必须在输出质量和并行粒度之间做权衡。一些非自回归生成方法尝试并行预测多个位置,但通常会牺牲部分生成质量或增加额外的迭代修正步骤。因此,当前主流的自回归生成仍然保持串行模式。

这也解释了为什么部分场景下,优化推理性能的重点不是“让生成更并行”,而是“让每次串行步骤的计算更快、更省资源”。例如通过 KV 缓存复用、批处理调度、量化压缩等技术降低单步开销,而不是强行改变串行依赖结构。

七、并行性对比总结

下面从几个关键维度对 RNN 与 Transformer 的并行性进行对比:

维度 RNN Transformer
训练阶段单序列内部并行 不支持,时间步严格串行 支持,全序列并行计算
训练阶段 batch 并行 支持,但单序列延迟仍受长度限制 支持,且单序列内部也可并行
推理预填充阶段 逐 token 串行处理 全序列并行处理
推理生成阶段 逐 token 串行处理 逐 token 串行处理,但单步内部可并行
硬件利用率 长序列下单序列利用率较低 训练和预填充阶段高,生成阶段下降
梯度传播方式 沿时间步串行回传 无时间步循环,梯度并行回传
长程依赖建模 受梯度消失/爆炸影响 注意力机制直接建模任意距离依赖

这个表格揭示了一个容易被忽略的事实:Transformer 的并行性主要体现在训练和预填充阶段,而在自回归生成阶段,它并没有摆脱串行依赖。理解这个差异,有助于在模型训练和推理部署时做出更合理的资源规划。

八、不同场景下的选型与优化思路

8.1 训练场景

在训练场景下,如果任务涉及长序列建模,Transformer 通常比 RNN 更适合利用大规模并行硬件。因为训练阶段需要对整个序列反复进行前向和反向计算,Transformer 的全序列并行结构可以显著缩短单次迭代时间,并通过多卡并行进一步扩展训练规模。

需要注意的是,Transformer 训练阶段的显存开销通常高于 RNN,尤其是自注意力矩阵的空间复杂度与序列长度相关。因此在超长序列场景下,可能需要引入稀疏注意力、分块注意力或状态空间模型等改进方案。

8.2 在线推理场景

在线推理场景中,生成阶段的串行特性使得延迟优化更加复杂。对于需要快速生成某个结果的应用,如果生成 token 数较多,延迟会线性累积。此时可以考虑以下方向:

  • 缩短单步计算时间:通过模型量化、蒸馏、剪枝等方式减小模型规模。
  • 复用中间结果:在生成过程中缓存已计算的状态,避免重复计算历史序列。
  • 批处理调度:将多个请求合并处理,提高单步计算密度,但需要注意不同请求的生成长度差异。

8.3 离线批处理场景

离线批处理场景中,预填充阶段可能占据较大比例。此时 Transformer 的并行优势更加明显,可以在一次前向计算中处理大量输入 token。对于长文档摘要、批量文本分类等任务,Transformer 的吞吐表现通常优于 RNN。

九、结论:并行性不是整体属性,而是阶段性特征

回到最初的问题:Transformer 的并行性到底体现在哪里?更准确的回答是:Transformer 的并行性体现在它用注意力机制替代了 RNN 的时间步循环,从而在训练和预填充阶段实现了序列内部的并行计算。但在自回归生成阶段,它仍然必须逐 token 串行输出,这是序列概率建模方式带来的结果,而非实现层面的缺陷。

因此,不能把“Transformer 并行”当成一个无条件的整体判断。更工程化的表述应该是:Transformer 在训练阶段和推理预填充阶段具有明显的并行优势;在推理生成阶段,并行优势让位于自回归生成的串行依赖。理解这个边界,才能解释为什么同一模型在不同阶段会出现截然不同的硬件利用率表现。

对于工程实践而言,这意味着:

  • 训练时,可以充分利用 Transformer 的并行结构进行大规模扩展;
  • 推理部署时,需要对生成阶段单独评估,关注单步延迟、显存占用和批处理调度;
  • 如果场景对生成延迟极其敏感,可能需要进一步优化自回归过程,或者评估非自回归类方案是否符合质量要求。

并行不是 Transformer 的全貌,而是一个阶段性、结构性的特征。把“并行体现在哪里”这个问题拆开看,是真正理解 Transformer 的第一步。