# 6.4 批次与序列长度：效率与质量的平衡

批次大小（Batch Size）和序列长度（Sequence Length）是影响训练效率、模型质量和显存占用的两个关键变量。

## 6.4.1 批次大小的影响

**大批次的优势**：

* 更稳定的梯度估计（减少噪声）：大批次时，单个样本的异常值对梯度的影响被平均化
* 更高的 GPU 利用率：矩阵乘法的计算与显存访问比例更优
* 更快的训练吞吐量：更少的参数更新迭代次数

**大批次的风险**：

* **泛化性能下降**：过大的批次可能导致梯度太“平滑”，使模型更容易陷入尖锐的（泛化差的）局部最优。相反，适度的梯度噪声实际上有助于找到更平坦（泛化更好）的最优区域
* **内存瓶颈**：直接增大物理批次会线性增加显存占用，很快就会达到硬件限制
* **学习率的敏感性增加**：大批次通常需要调整学习率，这增加了超参数调优的复杂度

**实践中的折中**：现代训练通常使用**梯度累积**（见[6.3.4](/llm_internals/di-er-bu-fen-xun-lian-pian/06_training_techniques/6.3_regularization.md)）来在显存约束下达成大的有效批次大小。物理批次大小保持相对较小（以保留梯度噪声），而通过累积多步梯度来模拟大批次的稳定性。

原始 Transformer 使用约 25,000 词元/批次进行训练。现代大语言模型的批次规模要大得多——GPT-3 使用 320 万词元/批次，Llama 3 更是从初始阶段的 400 万词元/批次逐渐增大到 1600 万词元/批次。这些是全局训练批次，通常由数据并行、张量并行、流水线并行、上下文并行、micro-batch 调度和必要的梯度累积共同实现，而不是靠单节点显存直接承载。

## 6.4.2 序列长度的管理

序列长度直接影响注意力计算的内存占用（$$O(n^2)$$ 的时间和空间复杂度）和模型能捕捉的最大上下文范围。

**填充与打包**：同一批次中的序列需要统一长度。传统做法是将短序列填充到最大长度，但这浪费了大量计算。**序列打包**（Sequence Packing）是一种更高效的方法——将多个短序列拼接在一起填满一个完整的训练样本，并配合 block-diagonal/block-triangular attention mask、FlashAttention varlen 的 `cu_seqlens`，或等价的序列边界元数据，确保不同序列之间不交互。`position_ids` 只能重置位置编号，不能阻断样本间 attention。这种方法可以提升显存和计算的利用率，特别是在处理包含大量短文本的数据集时。

**动态长度策略**：一些训练框架支持多种优化策略：

* **按长度分组**：将相近长度的序列放入同一批次，减少填充浪费
* **渐进式长度扩展**：在训练过程中逐步增加序列长度——先用短序列（如 512 tokens）快速迭代以建立基础特征，后期切换到长序列（如 4096 tokens）以学习长距离依赖
* **长度采样**：按某种分布随机采样序列长度，而非固定值，以提升模型对变长输入的鲁棒性

**长序列训练的挑战**：随着序列长度增加，注意力的 $$O(n^2)$$ 复杂度迅速成为瓶颈。现代优化包括：

* **Flash Attention**：通过 IO 优化减少显存访问，避免保存完整的 $$n \times n$$ 注意力矩阵
* **分组查询注意力（GQA）**：减少 Key/Value 头数量，让多个 Query 头共享 K/V，降低 KV 缓存和相关访存开销
* **梯度检查点**（见 6.4.3）：以计算换显存

## 6.4.3 显存占用分析

训练 Transformer 时的显存主要被四部分占用。下表是未分片 Adam 训练的教学化口径，实际占比会随精度、ZeRO/FSDP 分片、序列长度、激活重计算和并行策略显著变化：

| 组成部分  | 占用比例   | 说明                     |
| ----- | ------ | ---------------------- |
| 模型参数  | \~25%  | 权重矩阵                   |
| 梯度    | \~25%  | 与参数同等大小                |
| 优化器状态 | \~40%  | Adam 需要存储一阶/二阶矩（2倍参数量） |
| 激活值   | \~10%+ | 用于反向传播，随序列长度和批次大小增长    |

表 6-1：训练时显存占用的典型分布

这个分析表明，在未分片 Adam 训练中，**优化器状态常是最大的显存消耗者之一**——这正是 ZeRO 等优化技术的主要优化目标（见[第七章](/llm_internals/di-er-bu-fen-xun-lian-pian/07_distributed_training/7.2_zero.md)）。但在长上下文和大 micro-batch 场景下，激活值也可能成为主导瓶颈。

**梯度检查点**（Gradient Checkpointing，也叫激活重计算）是一种以计算换显存的技术：不保存所有层的激活值，而是只保存部分层的激活值，其他层的激活值在反向传播时重新计算。经典均匀链式分析可把激活显存降到约 $$O(\sqrt{L})$$（$$L$$ 为层数），但现代 Transformer 的实际节省和额外计算开销取决于选择性重计算策略。


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://yeasy.gitbook.io/llm_internals/di-er-bu-fen-xun-lian-pian/06_training_techniques/6.4_batch_sequence.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
