LLM 训练中的 BATCH、STEP、EPOCH:一份从底层逻辑到工程实践的完整拆解
导读:很多刚接触大模型训练的同学,会被 Batch、Step、Iteration、Epoch 这几个词搅得头大——它们到底谁包含谁?为什么 LLM 论文里几乎不提 Epoch?为什么 YOLO 训练要跑 300 个 Epoch,而 LLaMA 预训练连 1 个 Epoch 都跑不完?这篇文章试图用最直白的方式,把这三个概念彻底讲透,并对比传统深度学习(以 YOLO 为代表)与大语言模型在训练范式上的根本差异。
一、三个概念的精确定义
1.1 Batch(批次)
一句话定义:模型在执行一次前向传播 + 反向传播 + 参数更新时,所"消化"的样本集合。
在 LLM 语境下,一个"样本"通常是一条固定长度的 token 序列(如 4096 tokens)。所以一个 Batch 的物理含义是:
Batch 消耗的数据量 = Batch Size × Sequence Length(tokens)关键区分——Micro Batch vs Global Batch:
| 概念 | 含义 | 决定因素 |
|---|---|---|
| Micro Batch Size | 单张 GPU 一次实际能塞进去的样本数 | 显存容量(受激活值、梯度、优化器状态约束) |
| Global Batch Size | 一次参数更新所聚合的总样本数 | Micro Batch × 数据并行卡数 × 梯度累积步数 |
真正影响优化动力学(梯度方差、收敛轨迹)的是Global Batch Size,而不是某张卡上的 Micro Batch。
1.2 Step / Iteration(迭代步)
一句话定义:模型完成一次完整的"前向 → 计算 Loss → 反向 → 更新权重"循环,计为 1 个 Step。
1 Step = 处理 1 个 Global Batch + 1 次权重更新在分布式训练中,由于梯度累积(Gradient Accumulation)的存在:
1 Step = Gradient Accumulation Steps × Micro Batch 的前向/反向 → 最后统一做一次 AllReduce + 参数更新所以Step 是训练的"原子计时单位"。学习率调度器(Cosine、Warmup)以 Step 为横轴;日志里的lm_loss也是逐 Step 记录。
1.3 Epoch(轮次)
一句话定义:将训练集从头到尾完整遍历一次,称为 1 个 Epoch。
1 Epoch = 所有训练样本被模型"看过"一遍数学关系:
Steps per Epoch=⌈Ntotal samplesGlobal Batch Size⌉ \text{Steps per Epoch} = \left\lceil \frac{N_{\text{total samples}}}{\text{Global Batch Size}} \right\rceilSteps per Epoch=⌈Global Batch SizeNtotal samples⌉
Epoch 的本质是"数据覆盖率"的度量——它回答的是"这份数据被模型反复咀嚼了几遍"。
二、三者的层级关系(一张图讲清楚)
Training Run │ ├── Epoch 1 │ ├── Step 1 ← 处理 Global Batch #1(更新一次权重) │ ├── Step 2 ← 处理 Global Batch #2(更新一次权重) │ ├── ... │ └── Step M ← 数据遍历完毕,Epoch 1 结束 │ ├── Epoch 2 │ ├── Step M+1 │ ├── ... │ └── Step 2M │ └── ...(重复 N 个 Epoch)包含关系:Epoch ⊃ Step ⊃ Batch
一个 Epoch 由若干 Step 组成;每个 Step 消耗一个 Global Batch。
三、LLM 训练 vs 传统深度学习(YOLO):范式差异全景对比
这是本文最核心的部分。LLM 和 YOLO 虽然都跑在 GPU 上、都用 SGD 家族的优化器,但训练范式几乎是两个物种。
3.1 数据规模与遍历策略
| 维度 | LLM 预训练(如 LLaMA 3 405B) | YOLOv8 目标检测训练 |
|---|---|---|
| 数据规模 | 15.6T tokens(约 12 万亿词) | COCO:~118K 张图;自定义集:几千~几万张 |
| 遍历次数 | ≈ 1 Epoch,甚至 < 1 Epoch | 100 ~ 300 Epochs |
| 核心约束 | Chinchilla Scaling Law:数据量 ∝ 参数量 | 数据有限,必须反复利用 |
| 过拟合风险来源 | 数据重复(记忆化) | 训练轮数过多 |
为什么 LLM 预训练只跑一遍数据?
根据 Chinchilla 论文(2022)的结论,计算预算(FLOPs)应在模型参数量NNN和训练 token 数DDD之间做最优分配,经验比例约为D≈20ND \approx 20ND≈20N。以 70B 模型为例,最优 token 数约 1.4T。当数据池本身就有 15T+ tokens 时,根本不需要(也不应该)重复遍历——重复等于让模型死记硬背,泛化能力断崖下跌。
为什么 YOLO 要跑几百个 Epoch?
目标检测数据集通常只有几万张标注图像,而模型参数量(以 YOLOv8n 为例约 3.2M)相对数据量并不小。单遍遍历远远不够让模型收敛到好的 mAP,必须通过多轮遍历 + 数据增强(Mosaic、MixUp、HSV 扰动)来"榨干"每一份标注信息。
3.2 Batch 的语义差异
| LLM | YOLO | |
|---|---|---|
| 一个"样本"是什么 | 一条 token 序列(如 8192 tokens 的文档片段) | 一张图像(如 640×640×3) |
| Batch Size 的典型值 | Global Batch:2M ~ 4M tokens/step(换算约 256~512 条序列) | 8 ~ 64 张图/step |
| Batch 大小的瓶颈 | 显存(激活值随 seq_len 线性增长)+ 集群通信带宽 | 单卡显存(特征图分辨率) |
| BatchNorm 依赖 | ❌ 无(用 LayerNorm / RMSNorm,与 batch 无关) | ✅ 强依赖(BN 统计量需要足够 batch) |
一个关键推论:YOLO 中 Batch Size 过小(如 < 4)会导致 BN 统计量严重偏移,检测精度直接崩盘。而 LLM 中不存在这个问题——LayerNorm 是逐样本独立计算的,Batch Size 理论上可以设为 1(只是效率极低)。
3.3 Step 的时间尺度差异
| LLM 预训练 | YOLO 训练 | |
|---|---|---|
| 总 Step 数 | 数十万 ~ 数百万步(如 LLaMA 3 约 3.8M steps) | 几千 ~ 几万步 |
| 单 Step 耗时 | 数秒 ~ 数十秒(跨数千卡同步) | 0.1 ~ 2 秒(单机 1~8 卡) |
| 总训练时长 | 数周 ~ 数月(集群规模 1K~16K GPU) | 数小时 ~ 数天(单机) |
| Step 的"含金量" | 每步消耗数百万 tokens,影响全局 loss 曲线 | 每步消耗几十张图,影响 epoch 内局部 loss |
3.4 Epoch 概念的存在感
| LLM 预训练 | LLM 微调(SFT) | YOLO | |
|---|---|---|---|
| Epoch 是否常用 | ❌ 几乎不提 | ✅ 常用(3~5 Epochs) | ✅ 核心超参(100~300) |
| 进度描述方式 | “已训练 X T tokens” / “第 N steps” | “第 X epoch / 共 Y epoch” | “Epoch 127/300” |
| 数据增强跨 Epoch | 无(数据只过一遍) | 有(shuffle + 可能重复) | 强依赖(Mosaic、翻转等) |
3.5 学习率调度与 Batch 的耦合
YOLO / 传统 CV:
- 常用 Cosine Annealing 或 StepLR
- Batch Size 翻倍 → LR 线性翻倍(Linear Scaling Rule)
- Warmup 通常 3~5 个 Epoch(占训练总量 ~2%)
LLM 预训练:
- Cosine Decay + 长 Warmup(通常 2000 步,约占总步数 0.1%~0.5%)
- Global Batch Size 从 4M tokens 提到 16M tokens 时,LR 需要同步调整(常用 sqrt scaling 而非 linear scaling,因为大 batch 下 linear rule 过于激进)
- 训练末期 LR 衰减至峰值的 10% 左右,最后可能还有一段"annealing"阶段用高质量数据做低 LR 收尾
四、一个具体的数值案例对比
案例 A:LLaMA 3 70B 预训练(简化)
模型参数: 70B 训练数据: 15T tokens 序列长度: 8192 tokens Global Batch Size:4M tokens / step 总 Step 数: 15T / 4M ≈ 3,750,000 steps 总 Epoch 数: ≈ 1(数据只过一遍) 集群规模: 6144 × H100 GPU 训练时长: ~54 天案例 B:YOLOv8m 在 COCO 上训练
模型参数: ~25.9M 训练数据: 118K 张图(COCO train) 输入尺寸: 640 × 640 Batch Size: 16(单卡)× 8 卡 = 128 张/step Steps/Epoch: 118000 / 128 ≈ 922 steps 总 Epoch: 300 总 Step 数: 922 × 300 ≈ 276,600 steps 训练时长: ~2 天(8×A100)直观感受
| 指标 | LLaMA 3 70B | YOLOv8m |
|---|---|---|
| 总 Step 数 | 375 万 | 27.6 万 |
| 每 Step 数据量 | 4M tokens(≈ 300 万词) | 128 张图 |
| 数据被看的遍数 | ~1 遍 | 300 遍 |
| 训练的核心矛盾 | 算力效率(MFU) | 数据利用率(小数据防过拟合) |
五、为什么 LLM 预训练中 Epoch "消失"了?
这不是偶然,而是三个因素共同作用的结果:
5.1 数据量碾压模型容量
当训练数据有 15T tokens、模型只有 70B 参数时,数据量远超模型能"记住"的上限。重复遍历不仅无益,反而有害——模型会开始逐字记忆训练文本,丧失泛化能力(即"记忆化污染")。
5.2 Compute-Optimal 约束
Chinchilla 定律告诉我们:给定计算预算,数据量和模型大小存在最优配比。在这个配比下,数据恰好被"用一遍"就耗尽了算力预算。多跑一个 Epoch 意味着要么砍模型参数,要么超出算力预算。
5.3 工程叙事的变化
在 LLM 团队的日常沟通中,进度追踪单位变成了:
- Tokens consumed(已消耗 token 数)
- Steps completed(已完成步数)
- MFU(Model FLOPs Utilization,算力利用率)
“Epoch"这个词在预训练语境下变得没有信息量——因为答案永远是"大约 1”。
六、Batch Size 选择的工程权衡
6.1 LLM 场景
| 考量 | 大 Global Batch(如 4M tokens) | 小 Global Batch(如 256K tokens) |
|---|---|---|
| 梯度估计 | 方差小,方向稳定 | 方差大,有噪声 |
| 训练效率 | GPU 利用率高,通信占比低 | GPU 空闲多,通信频繁 |
| 收敛质量 | 可能陷入 sharp minima,泛化略差 | 噪声有正则化效果,泛化可能更好 |
| 显存需求 | 需要更多卡或梯度累积 | 单节点可跑 |
| LR 适配 | 需要更大 LR + 更长 Warmup | 小 LR 即可 |
工业实践:预训练通常选择 2M~4M tokens 的 Global Batch;微调(SFT)通常 128~512 条序列;RLHF 阶段可能更小(32~128)。
6.2 YOLO / CV 场景
| 考量 | 大 Batch(64+) | 小 Batch(4~8) |
|---|---|---|
| BN 统计 | 准确,训练稳定 | 噪声大,可能用 SyncBN 或 GroupNorm 替代 |
| 数据增强 | 单步内增强多样性有限 | 每步变化多,隐式正则 |
| 检测精度 | 可能略降(sharp minima) | 通常更好 |
| 训练速度 | 快 | 慢 |
YOLO 的特殊性:由于 Mosaic 增强(4 张图拼 1 张)的存在,实际 batch 内的"有效样本"是标称值的 4 倍,这本身就是一种隐式的 batch 扩大。
七、梯度累积:连接 Micro 与 Global 的桥梁
在 LLM 训练中,单卡显存往往只能容纳很小的 Micro Batch(如 1~2 条 8192-token 序列)。梯度累积允许我们在不增加显存的前提下"模拟"大 Batch:
# 伪代码示意formicro_stepinrange(gradient_accumulation_steps):batch=next(dataloader)# 取一个 micro batchloss=model(batch)/grad_accum_steps loss.backward()# 梯度累加,不清零optimizer.step()# 所有 micro batch 梯度攒完后,统一更新optimizer.zero_grad()此时:
Global Batch Size = Micro Batch Size × Num GPUs × Gradient Accumulation Steps在 YOLO 训练中,梯度累积较少使用——因为图像分辨率固定、显存需求可预测,通常直接调 Batch Size 即可。
八、总结:一张对照表收尾
| 对比维度 | LLM 预训练 | LLM 微调(SFT) | YOLO / 传统 CV |
|---|---|---|---|
| Batch 单位 | token 序列(如 8192 tokens) | 指令-回答对(变长,padding/packing) | 图像(如 640×640) |
| 典型 Global Batch | 2M~4M tokens | 128~512 条样本 | 64~128 张图 |
| 总 Step 量级 | 百万级 | 数百~数千 | 数万~数十万 |
| Epoch 数 | ≈ 1(甚至 < 1) | 3~5 | 100~300 |
| 进度度量 | Tokens consumed / Steps | Epoch / Steps | Epoch |
| Norm 层 | RMSNorm(与 batch 无关) | 同左 | BatchNorm(强依赖 batch) |
| 数据增强 | 无(或极轻微) | 无 / 轻微改写 | 重度(Mosaic、HSV、翻转) |
| 核心矛盾 | 算力效率 vs 数据质量 | 防过拟合 vs 学新知识 | 数据利用率 vs 泛化 |
| LR 与 Batch 关系 | sqrt scaling 为主 | 线性或 sqrt | 线性 scaling |
九、写在最后
理解 Batch、Step、Epoch 不仅仅是"背定义",它背后映射的是一个模型如何在有限算力下从有限数据中提取最大信息这个根本问题。
- 在 YOLO 的世界里,数据是稀缺品,所以用 Epoch 反复压榨;
- 在 LLM 的世界里,算力是稀缺品,所以数据只过一遍、把每一步的 MFU 逼到极致;
- 在 LLM 微调的世界里,高质量数据再次变得稀缺,Epoch 又回到了舞台中央。
同一个概念,在不同资源约束下扮演着截然不同的角色。这或许就是工程与算法交汇处最迷人的地方。
参考:Chinchilla Scaling Laws (Hoffmann et al., 2022);LLaMA 3 Technical Report (Meta, 2024);YOLOv8 Documentation (Ultralytics);Megatron-LM Training Framework (NVIDIA)