# Seq1F1B 长序列训练高效流水线并行算法

Seq1F1B是一种高效的序列级别的1F1B（one-forward-one-backward）流水线调度算法，为强化大模型长序列分布式训练而设计。该算法基于Megatron-LM框架，并引入全新的策略进行显存优化和减少流水线气泡。

## 简介

近年来，流水线并行已成为大语言模型分布式训练的重要技术。然而，随着训练序列长度达到32k甚至128k，现有的流水线并行方法常常面临高内存占用和显著的气泡大小问题，从而影响训练效率。Seq1F1B通过将批次级别的可调度单元分解为更细粒度的序列级别单元来解决这些挑战，从而改善工作负载平衡并减少内存使用。
Seq1F1B在64个NVIDIA A100 GPU组成的集群上可以高效训练300亿参数的大语言模型，并且最大序列长度可达64k，而且是在不使用重计算策略的情况下（意味着更高的吞吐）。这种性能水平是当前流水线并行方法无法达到的。

## 特点

- **细粒度可调度单元**：将批次级别单元分解为序列级别单元，以增强工作负载平衡。
- **减少内存占用**：优化内存使用，允许训练更长的序列。
- **更小的流水线气泡**：高效调度减少流水线阶段的空闲时间。
- **可扩展训练**：在64个NVIDIA A100 GPU集群上可训练具有300亿参数的大语言模型，并且序列长度可达64k。
- **同时支持1f1b和交错1f1b调度方式。**

##使用说明

| 参数 | 类型 | 默认值 | 说明 |
|------|------|--------|------|
| --pipe-sp-strategy | str | uniform_comp | 序列切割方式，默认uniform_comp方式，即计算均衡切割，每段seq非等长，而是根据均分计算量的方式切分；也可以选择使用average均匀切割方式|
| --pipe-sp-splits | int | 1 | seq切分的段数，由硬件显存决定，通常在保证最大化显存利用的同时尽量减小切分段数，更多的切分段数会增加迭代时常|
| --use-flash-attn | bool | true | 在使用seq1f1b时必须使用该参数|
| --schedule-method | str | seq1f1b | 在使用seq1f1b时必须使用该参数， 默认最优seq1f1b，还支持interleaved_seg1f1b|
---

##特别说明

- **seq1f1b暂不支持使用激活值重计算**
- **seq1f1b不支持transformer engine**
- **seq1f1b仅支持mcore + local或legacy + local方式**
- **推荐uniform_comp + seq1f1b最优方式**