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 OOMval batch size 通常 = train,可单独设 val_micro_batch_size
save 时 OOMdistributed save 不应 OOM;用 save_optim_on_train_end=False 跳过 optim

11.3NaN / loss spike

现象处理
0-1 step NaN用 bf16 而非 fp16;或降 init_method_std
中途 NaNlr 太大;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性能调优清单

  1. model.use_flash_attention=True
  2. model.fp8=True(H100/H200);
  3. model.activation_checkpointing=selective(不是 full);
  4. 选 TP 时优先 NVLink 域;
  5. PP 时 micro_batch 数 ≥ 4 × pp_size;
  6. 开 sequence_parallel + tp_comm_overlap;
  7. 开 distributed_fused_adam(默认);
  8. data loader prefetch_factor ≥ 4。

11.8这章你需要带走的