Chapter 11
调试与调优
📌 commit 2ea3e0fNeMo 大模型训练常见错误
NeMo 训练栈深、配置项多,常见错误也多。本章按"启动 / OOM / NaN / 性能 / 多机"五类列高频问题。
11.1启动类
| 现象 | 处理 |
| "No module named megatron" | pip install megatron-core 或用 NGC 镜像 |
| Apex 没装 | 用 NGC 镜像,别本地编译 |
| tp_size × pp_size 不能整除 num_gpus | 调整 TP/PP 或 GPU 数 |
| tokenizer 找不到 | 看 model.tokenizer.model_path 是否存在 |
| checkpoint 找不到 | restore_from_path 路径错;或不该用 restore,该用 resume |
11.2OOM
| 位置 | 处理 |
| 第 0 step OOM | 降 micro_batch_size;加 TP;开 activation_checkpointing |
| 第 N step OOM | 显存碎片化;开 PYTORCH_CUDA_ALLOC_CONF=expandable_segments:True |
| val OOM | val batch size 通常 = train,可单独设 val_micro_batch_size |
| save 时 OOM | distributed save 不应 OOM;用 save_optim_on_train_end=False 跳过 optim |
11.3NaN / loss spike
| 现象 | 处理 |
| 0-1 step NaN | 用 bf16 而非 fp16;或降 init_method_std |
| 中途 NaN | lr 太大;grad_clip 没设;查异常 batch |
| FP8 训练 NaN | 降 fp8_margin(默认 0);或退到 bf16 验证 |
| loss spike 后恢复 | 正常;持续 spike 才有问题 |
11.4性能问题
| 现象 | 处理 |
| GPU 利用率低 | 开 nvidia-smi dmon -s ucp 看是 idle 还是等通信 |
| 第一步特别慢 | JIT compile + indexed dataset 第一次扫描;warmup 跳过 |
| tp_size=8 比 tp_size=4 还慢 | 跨 NVLink 拓扑;尽量在 NVLink 域内 TP |
| PP 气泡大 | num_microbatches ≥ 4 × pp_size;开 interleaved |
| MFU 低于 40% | 缺 flash-attn / fused norm / FP8;逐个验证 |
11.5多机问题
| 现象 | 处理 |
| 多机比单机慢得多 | 没用 IB;NCCL 走 socket fallback 慢 10× |
| NCCL init 卡死 | 查 NCCL_SOCKET_IFNAME;防火墙开端口 |
| Slurm 启动失败 | srun vs sbatch 区别;NCCL 环境变量要 export |
| 多机加载 ckpt 慢 | 分布式 save/load;用 distributed_checkpoint_loading=True |
11.6调试技巧
# 1) 开 verbose
export NEMO_LOG_LEVEL=DEBUG
export NCCL_DEBUG=INFO
export TORCH_DISTRIBUTED_DEBUG=DETAIL
# 2) 先用小模型 + 单机跑通
trainer.devices=2 model.num_layers=4 model.hidden_size=512
# 3) 用 nemo run --dryrun 检查 recipe
nemo_run.run(recipe, executor=run.LocalExecutor(), dryrun=True)
# 4) tensorboard 实时看 loss / grad-norm
tensorboard --logdir ./pretrain_out/tb_logs
11.7性能调优清单
- 开
model.use_flash_attention=True;
- 开
model.fp8=True(H100/H200);
- 开
model.activation_checkpointing=selective(不是 full);
- 选 TP 时优先 NVLink 域;
- PP 时 micro_batch 数 ≥ 4 × pp_size;
- 开 sequence_parallel + tp_comm_overlap;
- 开 distributed_fused_adam(默认);
- data loader prefetch_factor ≥ 4。
11.8这章你需要带走的
- NeMo 大多数装机和启动问题:用 NGC 镜像可解决;
- NaN 优先用 bf16 而非 fp16;FP8 时降 fp8_margin;
- 性能不达标先开 flash_attn + activation_ckpt selective;
- 多机必用 IB;NCCL 不该走 socket 后退;
- 开 verbose 时三联:
NCCL_DEBUG=INFO + TORCH_DISTRIBUTED_DEBUG=DETAIL + NEMO_LOG_LEVEL=DEBUG。