File size: 5,775 Bytes
ac29381
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
# 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  # 指定网络接口
```