AB
AiBoss站
百科

什么是上下文并行(Context Parallelism)?

上下文并行(Context Parallelism,CP)是 NVIDIA 官方文档描述的一种模型并行方法:它把神经网络激活值沿序列维度切分到多张 GPU 上,使每张 GPU 只保存一段序列的激活与必要的 Key/Value 对,从而降低长序列训练的内存占用与计算开销。

上下文并行(Context Parallelism,CP)是 NVIDIA 官方文档描述的一种模型并行方法,它把神经网络激活值的处理沿序列维度切分到多张 GPU 上,即对输入张量按序列维度做划分。它要解决的问题是:当序列很长时,单张 GPU 放不下整条序列的激活值,训练无法继续;把序列切开分散到多张 GPU 之后,模型就能处理更长的序列,同时降低处理长序列的内存占用与计算开销。

为什么重要

在上下文并行出现之前,长上下文训练主要依赖已有的并行手段。按照 NVIDIA 官方文档在并行策略指南中的分类,这些手段大致分为两类。

一类是数据并行(Data Parallelism,DP)。它把模型复制到多张 GPU 上,数据批次在各 GPU 之间均匀分配、独立处理。计算负载虽然被分散了,但为了保持各模型副本一致,训练步之间必须做跨 GPU 通信。分布式数据并行(Distributed Data Parallelism,DDP)的做法是在每次参数更新前同步参数梯度,具体是用 all-reduce 通信集合把各模型副本的梯度求和。分布式优化器(Distributed Optimizer)则是一种更省内存的数据并行部署方式:它把优化器状态和高精度主参数分片存放在各数据并行 GPU 上,而不是复制,因此梯度同步改用 reduce-scatter,更新后的参数分片再通过 all-gather 汇总。

另一类是模型并行(Model Parallelism,MP),它把模型参数切分到多张 GPU 上以降低单卡内存需求。其中张量并行(Tensor Parallelism,TP)把单个层的参数张量分散到多张 GPU 上,既减少模型状态内存,也因为每卡张量变小而节省激活内存,但每卡核心计算量变小会带来 CPU 开销上升。

问题在于,这些方法切分的是参数、优化器状态或数据批次,并没有直接针对「序列长度」这一维度做切分。序列越长,激活值越大,单卡内存压力越突出。NVIDIA 官方文档明确指出,上下文并行对训练长上下文模型至关重要,因为它把序列激活值分布到多张 GPU 上,让模型能够处理更长的序列。文档还特别区分了它与序列并行(Sequence Parallelism,SP)的不同:SP 只切分特定层的激活值,而 CP 切分的是所有层的激活值。

工作机制

按照 NVIDIA 官方文档的说明,上下文并行的核心做法与执行流程可以拆成以下几点。

  • 按序列维度切分激活值。CP 把输入张量沿序列维度划分,把神经网络激活值的处理分散到多张 GPU 上。与只作用于特定层的序列并行不同,CP 划分的是所有层的激活值。
  • 前向传播各管一段。在前向传播过程中,每张 GPU 只处理序列的一个片段,并且只保存该片段所需的 Key 和 Value(KV)对,而不是整条序列的 KV。
  • 反向传播跨卡重组 KV。在反向传播过程中,这些 KV 对需要跨 GPU 重新组装。文档描述其使用 all-gather 与 reduce-scatter 等通信方案,并在环形(ring)拓扑下转换为点对点通信。
  • 实现依托 Megatron Core 与 Transformer Engine。NVIDIA 文档称,NeMo 框架同时借助 Megatron Core 和 Transformer Engine 的能力来高效实现 CP,相关实现位于 Megatron Core 面向 Transformer Engine 的封装以及 Transformer Engine 的注意力模块中。
  • 通过配置参数启用。在 NeMo 框架中启用 CP,需要在模型配置里设置 context_parallel_size 参数,该参数指定序列激活值分布到多少张 GPU 上;把它设为大于 1 的值,即可在 Megatron Strategy 内部启用覆盖整个序列的模型并行。

文档给出的配置示例中,MegatronStrategy 同时接受 tensor_model_parallel_sizepipeline_model_parallel_sizevirtual_pipeline_model_parallel_sizecontext_parallel_sizesequence_parallelexpert_model_parallel_size 等参数,示例里 context_parallel_size 取值为 1,并注明这是启用上下文并行的示例位置。文档同时指出,模型训练设置的更多细节可在 NeMo 2.0 预训练相关文档中查看和修改。

需要说明的是,上述机制描述来自 NVIDIA 官方文档对自身实现的说明,属于该文档的主张,不代表所有框架的实现方式都相同。

典型例子

NVIDIA 官方文档中出现的具体用法与系统包括以下几项。

  • NeMo 框架中的启用方式。文档给出的示例是在 nl.MegatronStrategy 配置里设置 context_parallel_size,并把它设为大于 1 来启用序列范围的模型并行。
  • Megatron Core 与 Transformer Engine 的组合。文档称 NeMo 框架利用这两者的功能来实现 CP,并指向 Megatron Core 面向 Transformer Engine 的封装与 Transformer Engine 的注意力模块作为实现参考。
  • 环形拓扑下的点对点通信。文档描述反向传播中 KV 对的重组使用 all-gather 与 reduce-scatter,并在环形拓扑下转换为点对点通信。
  • 与其他并行方式的并列配置。在 Megatron Bridge 的并行策略指南中,数据并行、张量并行、流水线并行等策略被描述为可以通过模型提供者类配置、并可任意混合使用;上下文并行是这套并行策略体系中的一员。

文档没有给出具体的加速比、内存节省比例或序列长度上限等量化结果,因此这里也不做推断。

边界与常见误解

第一,容易把上下文并行与序列并行混为一谈。NVIDIA 文档明确区分了两者:序列并行切分的是特定层的激活值,而上下文并行切分的是所有层的激活值。二者不是同一件事,尽管在配置中可能同时出现。

第二,容易把它当成数据并行或张量并行的替代品。从文档的定位看,CP 针对的是序列维度,解决的是长序列带来的激活内存与计算开销问题;数据并行解决的是批次吞吐与副本一致性,张量并行解决的是单层参数与激活的切分。文档把各类并行策略描述为可以混合使用,而不是互相取代。

第三,CP 不是没有代价的。文档提到,反向传播中需要跨 GPU 重组 KV 对,依赖 all-gather、reduce-scatter 以及环形拓扑下的点对点通信。这意味着启用 CP 会引入额外的跨卡通信;文档的表述是这种方法在显著降低内存占用的同时保持计算效率,但并未给出通信开销的具体数值。

第四,启用方式有前提。文档说明需要在模型配置中设置 context_parallel_size 且取值大于 1,才会在 Megatron Strategy 内部启用;也就是说它是一项需要显式配置的能力,而不是默认开启的行为。

第五,适用范围应以文档为准。上述内容均出自 NVIDIA 面向 NeMo 框架与 Megatron Bridge 的官方文档,描述的是该框架体系下的实现与配置方式。其他框架是否提供同名机制、实现细节是否一致,本文档未作说明,不应据此推断为通用结论。

参考资料