ROLL SEQUENCE PACKING
ROLL框架目前支持了Sequence Packing功能,通过句子打包来避免pad token,提高计算效率。本文档详细介绍该功能的实现思路以及相应使用配置方法。
注意:目前只有
megatron_strategy支持了sequence_packing。
1. 简介
在RL训练场景中,rollout数据的分布通常具有长尾效应。而在常规的训练过程中,我们通常将一个micro batch的数据组合为一个batch进行训练,每条样本都会被pad到预设的最大长度,这不仅导致了算力被消耗在了大量pad token上,而且拖慢了训练速度。
为了解决上面的问题,ROLL中提供了Sequence Packing这一特性,其核心思路是:
- 将当前micro batch中长短不同的句子打包在一起以消除pad token
- 使用打包算法优化打包效率,减少micro batch数量,提高训练效率
2. 实现原理
2.1 数据划分层次结构
在分布式训练中,数据按照以下层次结构进行划分:
GLOBAL BATCH (全局批次)
├── DP RANK 0 → BATCH 0
│ └── MINI BATCH 0 (用于一次梯度更新)
│ ├── MICRO BATCH 0 (最小计算单元)
│ ├── MICRO BATCH 1
│ └── ...
├── DP RANK 1 → BATCH 1
│ └── MINI BATCH 0
│ ├── MICRO BATCH 0
│ └── ...
└── ...
- GLOBAL BATCH: actor_infer产生的完整rollout结果
- BATCH: Global Batch按DP rank划分后的子集
- MINI BATCH: Batch中用于单次梯度更新的数据(考虑gradient accumulation)
- MICRO BATCH: Mini Batch进一步划分的最小计算单元,参与单次forward/backward
在常规训练中,每个micro batch中的样本都会被padding到固定长度,造成大量计算资源浪费。Sequence Packing通过在micro batch级别进行序列打包来解决这个问题。
2.2 序列打包核心机制
Sequence Packing的核心目标是在消除padding token的同时,确保在复杂的分布式训练环境下(特别是Context Parallel和Tensor Parallel)能够正确、高效地运行。为了实现这一目标,打包过程需要满足特定的对齐要求,这些要求直接关系到模型能否正常训练以及训练效率的高低。
2.2.1 对齐要求:2×CP_SIZE×TP_SIZE的倍数
在启用Context Parallel (CP) 和 Tensor Parallel (TP) 的情况下,序列长度必须是 2 × CP_SIZE × TP_SIZE 的倍数。
这个对齐要求来源于两个并行策略的需求:
-
TENSOR PARALLEL (TP) 需求:当启用Sequence Parallel时,序列会在forward过程中被切分到不同的TP rank上处理,因此序列长度需要能被TP_SIZE整除。
-
CONTEXT PARALLEL (CP) 需求:为了实现CP负载均衡,序列需要被切分为2×CP_SIZE个逻辑块,因此序列长度需要能被2×CP_SIZE整除。
综合这两个需求,序列长度必须是 2 × CP_SIZE × TP_SIZE 的倍数,这样才能同时满足TP和CP的正确运行要求。
2.2.2 为什么需要因子2?CP负载均衡详解
在Context Parallel (CP) 训练中,因果注意力机制的特殊性会导致严重的负载不均衡问题。
问题根源 - 因果注意力的不对称性
考虑一个长度为6的序列 [0, 1, 2, 3, 4, 5],在CP=2的情况下:
完整的因果注意力掩码:
0 1 2 3 4 5
0 [ 1 0 0 0 0 0 ]
1 [ 1 1 0 0 0 0 ]
2 [ 1 1 1 0 0 0 ]
3 [ 1 1 1 1 0 0 ]
4 [ 1 1 1 1 1 0 ]
5 [ 1 1 1 1 1 1 ]