vla-sft-code-dreamzero / docs /training-guide.md
poet70's picture
Upload folder using huggingface_hub
ac29381 verified
|
Raw
History Blame Contribute Delete
5.78 kB
# 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 # 指定网络接口
```