摘要
在 30k baseline 提交之后,我继续对 SmolVLA 进行 scale:从 30k → 50k → 70k → 90k 逐步加训,每阶段评测四类衣物的效果。本文详细对比 70k 和 90k 在四类任务上的完整评测结果,记录"为什么明明 90k 多训了 20k 步,最终却选了 70k",以及我对 scaling 在这个任务上演化趋势的观察。
正文
效果可见B站视频:
1. 背景:30k 不够用
30k 四类 baseline 的结果:
| 类别 | 30k Success Rate |
|---|---|
| top_short | 8.33% |
| top_long | 50.00% |
| pant_long | 16.67% |
| pant_short | 75.00% |
看 Isaac Sim 面板上的表现,top_long 和 pant_short 的 rollout 已经比较像样了,但 top_short 和 pant_long 还差得远——大部分 episode 动作看着有点意思,但几何判定过不了。
直觉上,30k step 对于一个四类混合任务可能不够。继续 scale。
2. 训练路线
训练策略:基于前一个 checkpoint resume 继续训练,而不是每次从头训。
| 阶段 | 起始 | 追加步数 | 累计步数 | batch_size |
|---|---|---|---|---|
| Baseline Submit | pretrained | 30k | 30k | 48 |
| Scale 50k | 30k ckpt | 20k | 50k | 48 |
| Scale 70k | 50k ckpt | 20k | 70k | 48 |
| Scale 90k | 70k ckpt | 20k | 90k | 48 |
每次 resume + 20k step,batch_size 保持 48。
# 从 50k resume 到 70k 的示例命令
tmux new -s smolvla70k
conda activate lehome311
source .venv/bin/activate
cd /root/gpufree-data/lehome-challenge
POLICY_PATH=$(ls -d outputs/train/smolvla_4types_from30k_plus20k_*/checkpoints/020000/pretrained_model | tail -n 1)
echo "resume from: $POLICY_PATH"
RUN_NAME=smolvla_4types_from50k_plus20k_$(date +%Y%m%d_%H%M%S)
LEHOME_DATASET_ROOT=Datasets/example/four_types_merged \
HF_HOME=/root/gpufree-data/hf-cache \
HF_HUB_OFFLINE=1 \
TRANSFORMERS_OFFLINE=1 \
HF_HUB_ENABLE_HF_TRANSFER=0 \
lerobot-train \
--config_path=configs/train_smolvla_submit.yaml \
--policy.path="$POLICY_PATH" \
--policy.push_to_hub=false \
--rename_map='{"observation.images.top_rgb":"observation.images.camera1","observation.images.left_rgb":"observation.images.camera2","observation.images.right_rgb":"observation.images.camera3"}' \
--steps=20000 \
--batch_size=48 \
--save_freq=2000 \
--log_freq=500 \
--output_dir=outputs/train/${RUN_NAME} \
2>&1 | tee outputs/train/${RUN_NAME}.log
每个阶段训练完后,对四类衣物各跑一轮完整评测。
3. 70k 评测结果(完整数据)
评测使用 custom_smolvla policy type,headless 模式,每类跑 12 个 episode。
3.1 top_long(70k)
Total Episodes: 12
Average Return: 149.14 ± 52.64
Success Rate: 58.33%
Per-Garment:
Top_Long_Seen_0: 100.00%, Avg Return = 115.02
Top_Long_Seen_1: 0.00%, Avg Return = 210.31
Top_Long_Seen_2: 100.00%, Avg Return = 131.10
Top_Long_Seen_3: 100.00%, Avg Return = 127.94
Top_Long_Seen_4: 100.00%, Avg Return = 130.72
Top_Long_Seen_5: 100.00%, Avg Return = 91.60
Top_Long_Seen_6: 0.00%, Avg Return = 200.22
Top_Long_Seen_7: 0.00%, Avg Return = 130.28
Top_Long_Seen_8: 100.00%, Avg Return = 112.65
Top_Long_Seen_9: 100.00%, Avg Return = 107.07
Top_Long_Unseen_0: 0.00%, Avg Return = 161.39
Top_Long_Unseen_1: 0.00%, Avg Return = 271.36
Seen 实例 7/10 成功,Unseen 全部失败。
3.2 top_short(70k)
Total Episodes: 12
Average Return: 203.72 ± 111.41
Success Rate: 25.00%
Per-Garment:
Top_Short_Seen_1: 100.00%, Avg Return = 90.27
Top_Short_Seen_2: 100.00%, Avg Return = 112.11
Top_Short_Seen_5: 100.00%, Avg Return = 244.29
(其余 9 个均为 0.00%)
12 个 episode 中只有 3 个成功。和 30k top_short 成功率一模一样(25%),scale 没有带来提升。但成功的几个 episode 的 Avg Return 在降低(90、112),说明成功的轨迹变高效了。
3.3 pant_long(70k)
Total Episodes: 12
Average Return: 123.52 ± 48.47
Success Rate: 41.67%
Per-Garment:
Pant_Long_Seen_3: 100.00%, Avg Return = 97.39
Pant_Long_Seen_5: 100.00%, Avg Return = 67.85
Pant_Long_Seen_6: 100.00%, Avg Return = 84.53
Pant_Long_Seen_9: 100.00%, Avg Return = 175.19
Pant_Long_Unseen_0: 100.00%, Avg Return = 100.88
(其余 7 个均为 0.00%)
相比 30k 的 16.67%,涨到了 41.67%。虽然绝对值不算高,但趋势是好的。
3.4 pant_short(70k)
Total Episodes: 12
Average Return: 136.63 ± 53.45
Success Rate: 83.33%
Per-Garment:
Pant_Short_Seen_0: 100.00%, Avg Return = 102.02
Pant_Short_Seen_1: 0.00%, Avg Return = 188.84
Pant_Short_Seen_2: 100.00%, Avg Return = 79.87
Pant_Short_Seen_3: 100.00%, Avg Return = 127.27
Pant_Short_Seen_4: 100.00%, Avg Return = 127.89
Pant_Short_Seen_5: 100.00%, Avg Return = 84.13
Pant_Short_Seen_6: 100.00%, Avg Return = 127.25
Pant_Short_Seen_7: 100.00%, Avg Return = 134.12
Pant_Short_Seen_8: 100.00%, Avg Return = 109.85
Pant_Short_Seen_9: 100.00%, Avg Return = 104.69
Pant_Short_Unseen_0: 0.00%, Avg Return = 267.19
Pant_Short_Unseen_1: 100.00%, Avg Return = 186.48
Seen 9/10 成功!Unseen 1/2 成功。这个结果相当不错,而且 Avg Return 整体在 100-130 之间,说明轨迹比较高效。
4. 90k 评测结果(完整数据)
4.1 top_long(90k)
Total Episodes: 12
Average Return: 154.72 ± 66.58
Success Rate: 41.67%
Per-Garment:
Top_Long_Seen_1: 100.00%, Avg Return = 129.40
Top_Long_Seen_2: 100.00%, Avg Return = 111.76
Top_Long_Seen_3: 100.00%, Avg Return = 126.03
Top_Long_Seen_4: 100.00%, Avg Return = 138.33
Top_Long_Unseen_0: 100.00%, Avg Return = 133.35
(其余 7 个均为 0.00%)
70k 是 58.33%,90k 反而掉到了 41.67%。回退了。
4.2 top_short(90k)
Total Episodes: 12
Average Return: 168.92 ± 76.70
Success Rate: 25.00%
Per-Garment:
Top_Short_Seen_1: 100.00%, Avg Return = 100.79
Top_Short_Seen_2: 100.00%, Avg Return = 104.74
Top_Short_Seen_4: 100.00%, Avg Return = 158.97
(其余 9 个均为 0.00%)
和 70k 持平,都是 25%。top_short 就是顽固,怎么 scale 都没用。
4.3 pant_long(90k)
Total Episodes: 12
Average Return: 122.73 ± 34.11
Success Rate: 33.33%
Per-Garment:
Pant_Long_Seen_3: 100.00%, Avg Return = 174.67
Pant_Long_Seen_5: 100.00%, Avg Return = 79.76
Pant_Long_Seen_6: 100.00%, Avg Return = 98.77
Pant_Long_Unseen_0: 100.00%, Avg Return = 111.30
(其余 8 个均为 0.00%)
70k 是 41.67%,90k 掉到 33.33%。又回退了。
4.4 pant_short(90k)
Total Episodes: 12
Average Return: 132.61 ± 57.43
Success Rate: 83.33%
Per-Garment:
Pant_Short_Seen_0: 100.00%, Avg Return = 101.98
Pant_Short_Seen_1: 0.00%, Avg Return = 212.14
Pant_Short_Seen_2: 100.00%, Avg Return = 71.23
Pant_Short_Seen_3: 100.00%, Avg Return = 82.07
Pant_Short_Seen_4: 100.00%, Avg Return = 128.95
Pant_Short_Seen_5: 100.00%, Avg Return = 88.13
Pant_Short_Seen_6: 100.00%, Avg Return = 122.54
Pant_Short_Seen_7: 100.00%, Avg Return = 132.82
Pant_Short_Seen_8: 100.00%, Avg Return = 162.85
Pant_Short_Seen_9: 100.00%, Avg Return = 99.32
Pant_Short_Unseen_0: 0.00%, Avg Return = 268.39
Pant_Short_Unseen_1: 100.00%, Avg Return = 120.96
Seen 9/10 成功,和 70k 完全一致。83.33% 持平。
5. 汇总对比
| 类别 | 30k | 70k | 90k | 70k vs 90k |
|---|---|---|---|---|
| top_long | 50.00% | 58.33% | 41.67% | ↓ 退步 |
| top_short | 8.33% | 25.00% | 25.00% | → 持平 |
| pant_long | 16.67% | 41.67% | 33.33% | ↓ 退步 |
| pant_short | 75.00% | 83.33% | 83.33% | → 持平 |
6. 分析与选择
6.1 为什么选 70k
- top_long 从 58.33% 掉到 41.67%,这是 90k 最明显的退化。掉了足足 16.67 个百分点。
- pant_long 也退步了,从 41.67% 掉到 33.33%。
- top_short 和 pant_short 持平,没有因为额外训练而受益。
- 没有任何一个类别在 90k 有明显提升。
这不是"过拟合"的典型症状(因为 loss 仍然在下降),但评测指标确实在变差。可能是训练分布和评测分布的 mismatch 在加训后被放大,也可能是某些类别在训练后期被"遗忘"了。
6.2 各类别的趋势观察
top_short 是最顽固的:从 30k(8.33%)到 70k(25%)到 90k(25%),在 25% 上面锁死了。可能的原因:
- 短袖折叠策略本身更难学
- 数据量不够
- 需要不同的数据增强策略
pant_short 是最稳定的:30k 就 75%,70k 83.33%,90k 83.33%。可以说 30k 就基本学好了,后面的 scale 只是微调。
top_long 和 pant_long 是最"摇摆"的:它们对训练步数敏感,70k 是峰值,90k 回退。
6.3 没做的事情
- 没做数据增强变体对比
- 没试更大的 batch_size(L40 48G 不够)
- 没试学习率调度策略调整
- 没做 checkpoint ensemble
这些都是"如果时间够可能会更好"的方向。但在 solo 参赛、临近截止的约束下,我选择在 70k 打住,推进到 pi0.5 做最后一搏。
7. 小结
在 SmolVLA 上走完了 30k → 70k → 90k 的 scaling 实验。核心发现:
- 小规模 scaling(30k → 70k)带来了整体提升,尤其是 pant_long(16.67% → 41.67%)
- 继续 scale 到 90k 出现了 top_long 和 pant_long 的回退
- top_short 始终是短板,最高只到 25%
- pant_short 始终是强项,稳定在 75-83%
最终选择 70k checkpoint 作为提交结果。