| # DreamZero 训练指南 |
|
|
| --- |
|
|
| ## 1. 超参调优 |
|
|
| ### 全量 SFT 推荐参数 |
|
|
| | 参数 | 推荐值 | 说明 | |
| |------|--------|------| |
| | `learning_rate` | 1e-5 | 全量微调,比 LoRA 小 10x | |
| | `weight_decay` | 1e-5 | 轻微权重衰减 | |
| | `warmup_ratio` | 0.05 | 5% 步数线性预热 | |
| | `lr_scheduler_type` | cosine | 余弦退火 | |
| | `adam_beta1` | 0.95 | Adam beta1 | |
| | `adam_beta2` | 0.999 | Adam beta2 | |
|
|
| ### LoRA 推荐参数 |
|
|
| | 参数 | 推荐值 | |
| |------|--------| |
| | `learning_rate` | 1e-4 | |
| | LoRA rank | 64 | |
| | LoRA alpha | 128 | |
| | LoRA target modules | q_proj, k_proj, v_proj, o_proj | |
|
|
| ### 学习率调整策略 |
|
|
| - **从零开始训练**: `learning_rate=1e-5`, `warmup_ratio=0.05` |
| - **从 checkpoint resume**: 学习率通常重置为初始值或减半 |
| - **Loss 震荡**: 减小学习率至 5e-6 |
| - **Loss 不降**: 检查数据预处理是否正确 |
|
|
| --- |
|
|
| ## 2. Batch Size 和 Global Batch Size |
|
|
| ```bash |
| # global_batch_size = per_device_train_batch_size * num_gpus * gradient_accumulation_steps |
| # 32 GPU 训练: 推荐 global_batch_size=128 |
| global_batch_size=128 |
| per_device_train_batch_size=1 |
| # gradient_accumulation_steps = 128 / (1 * 32) = 4 |
| ``` |
|
|
| --- |
|
|
| ## 3. 显存优化决策树 |
|
|
| ``` |
| 训练时 OOM? |
| ├── 使用 8-bit Adam? → 未使用 → 加 optim=adamw_bnb_8bit |
| ├── 开 gradient_checkpointing? → 未开 → 加 model.gradient_checkpointing=true |
| ├── 可降低视频分辨率? → 是 → 降低 image_resolution_width/height |
| ├── 可减少帧数? → 是 → 减少 num_frames |
| └── 以上都不行 → 使用 ZeRO-3 + CPU offload |
| ``` |
|
|
| ### 各优化节约的显存 |
|
|
| | 优化手段 | 显存节约 | 计算开销 | |
| |---------|---------|---------| |
| | 8-bit Adam | ~50% 优化器显存 | 无(更慢的更新) | |
| | Gradient Checkpointing | ~30% 激活显存 | ~15% 计算时间 | |
| | ZeRO-3 (vs ZeRO-2) | ~20% 总显存 | ~5% 通信开销 | |
| | CPU Offload | 额外 ~30% | ~20% 时间 | |
|
|
| --- |
|
|
| ## 4. Checkpoint 管理 |
|
|
| ### 保存 |
|
|
| ```bash |
| save_steps=2000 # 每 2000 步保存 |
| save_total_limit=4 # 保留最近 4 个 + 最优 |
| save_strategy=steps # 按步数保存 |
| ``` |
|
|
| ### Resume |
|
|
| ```bash |
| # 从指定 checkpoint 恢复 |
| torchrun ... experiment.py \ |
| ++training_args.resume_from_checkpoint=./output/libero_full/checkpoint-50000 |
| ``` |
|
|
| **注意**: ZeRO-3 checkpoint 按 rank 分片保存,恢复时 GPU 数量必须一致。 |
|
|
| ### ZeRO-3 Checkpoint 合并 |
|
|
| 如果需要在不同 GPU 数之间迁移 checkpoint: |
|
|
| ```bash |
| # 使用 DeepSpeed 的 zero_to_fp32.py |
| python zero_to_fp32.py \ |
| --checkpoint_dir ./checkpoint-50000 \ |
| --output_file ./pytorch_model.bin |
| ``` |
|
|
| --- |
|
|
| ## 5. 多节点训练注意事项 |
|
|
| ### NCCL 配置 |
|
|
| ```bash |
| export NCCL_DEBUG=WARN # 减少日志量 |
| export NCCL_IB_DISABLE=0 # 启用 InfiniBand |
| export NCCL_IB_TIMEOUT=22 # IB 超时 |
| export NCCL_IB_RETRY_CNT=4 # IB 重试次数 |
| export NCCL_SOCKET_IFNAME=^docker0,lo # 排除 docker/loopback |
| ``` |
|
|
| ### 常见问题 |
|
|
| | 问题 | 原因 | 解决 | |
| |------|------|------| |
| | NCCL timeout | 网络配置错误 | 检查 NCCL_IB_*、NCCL_SOCKET_IFNAME | |
| | 训练挂起 | DataLoader worker 死锁 | 设置 `dataloader_pin_memory=false` | |
| | Loss 不一致 | 数据加载不统一 | 检查 `seed` 和 DataLoader shuffle | |
| | OOM | 显存不足 | 参考显存优化决策树 | |
| |
| --- |
| |
| ## 6. DataLoader 优化 |
| |
| | 场景 | num_workers | pin_memory | prefetch_factor | |
| |------|-------------|------------|-----------------| |
| | 单 GPU | 4 | false | 2 | |
| | 单节点 8 GPU | 8 | true | 4 | |
| | 多节点 | 8 | true | 4 | |
| |
| **注意**: `dataloader_pin_memory=true` 在 decord 视频后端可能导致问题,如遇训练挂起可设为 false。 |
| |
| --- |
| |
| ## 7. 实验跟踪(Wandb) |
| |
| ```bash |
| # 配置 Wandb |
| export WANDB_API_KEY=your_key |
| export WANDB_ENTITY=your_entity |
| |
| # 启动训练 |
| torchrun ... experiment.py \ |
| report_to=wandb \ |
| wandb_project=dreamzero-sft \ |
| ... |
| ``` |
| |
| Wandb 记录内容: |
| - `loss`: 总损失 |
| - `dynamics_loss_avg`: 视频预测损失 |
| - `action_loss_avg`: 动作预测损失 |
| - `learning_rate`: 学习率 |
| - `grad_norm`: 梯度范数 |
| - `training_step_time`: 每步时间 |
| - `model_forward_time`: 前向时间 |
| |
| --- |
| |
| ## 8. 从 LoRA 切换到全量 SFT |
| |
| ```bash |
| # LoRA |
| train_architecture=lora |
| optim=adamw_torch |
| learning_rate=1e-4 |
| |
| # 全量 SFT |
| train_architecture=full |
| optim=adamw_bnb_8bit # 必须!否则 5B 优化器状态 ~40GB |
| learning_rate=1e-5 |
| ``` |
| |
| --- |
| |
| ## 9. 基准 Loss 参考 |
| |
| | Benchmark | Step 1 | Step 5 | Step 100 | Step 1k | Step 10k | Step 100k | |
| |-----------|--------|--------|----------|---------|----------|-----------| |
| | LIBERO | ~2-3 | ~1.0-1.5 | ~0.8-1.0 | ~0.6-0.8 | ~0.5-0.7 | ~0.35-0.5 | |
| | ManiFeel | ~1.5-2.5 | ~0.8-1.2 | ~0.6-0.8 | ~0.5-0.6 | ~0.35-0.5 | ~0.25-0.35 | |
| | RoboTwin | ~3-5 | ~1.5-2.0 | ~1.0-1.5 | ~0.8-1.2 | ~0.6-0.9 | ~0.4-0.6 | |
| |
| Loss 持续高于参考范围的可能原因: |
| - 学习率不合适 |
| - 数据预处理不一致(state/action 未正确 padding) |
| - 视频帧率与 state 频率不对齐 |
| |
| --- |
| |
| ## 10. 故障排除 |
| |
| ### "CUDA out of memory" |
| |
| ```bash |
| # 添加这些参数 |
| per_device_train_batch_size=1 |
| model.gradient_checkpointing=true |
| optim=adamw_bnb_8bit |
| training_args.deepspeed="groot/vla/configs/deepspeed/zero2_offload.json" |
| ``` |
| |
| ### "RuntimeError: Expected all tensors to be on the same device" |
| |
| 可能是 VAE 或模型设备不匹配。检查 `experiment.py` 中的设备分配。 |
| |
| ### 训练突然变慢 |
| |
| - 检查 CPU 内存(dataloader_workers 可能导致内存交换) |
| - 检查磁盘 IO(数据是否在 SSD 上) |
| - 减少 dataloader_num_workers |
| |
| ### NCCL 初始化失败 |
| |
| ```bash |
| export NCCL_DEBUG=INFO # 查看详细 NCCL 日志 |
| export NCCL_IB_DISABLE=1 # 如果 IB 不可用 |
| export NCCL_SOCKET_IFNAME=eth0 # 指定网络接口 |
| ``` |
| |