logo Mr.Robota 具身智能学习手册 EN
第十五章:Challenge竞赛

问题清单与解决方案

下面的“解决”分成三类:

  • 已验证修复:有明确的复测结果或官方回执;
  • 工程缓解:降低风险,但没有证明提高线上分数;
  • 未解决假设:观察到相关性,但没有足够实验建立因果关系。

1. 训练数据文件齐全,但数据语义仍需验证

现象

550 条 processed 文件数量正确、模型能训练,仍然可能存在 action/qpos 时间偏移、三相机顺序错误、专家 profile 混合或 rescue 轨迹的动作模式不一致。

已验证修复

建立严格 audit:检查文件集合、16-D、左右臂 metadata、有限值、三相机长度和逐帧 next-state 对齐。canonical processed550 达到 next_state_max_error=0,manifest SHA 也固定。

仍需改进

把每条 layout 的采集配置、对象模型、姿态、yaw、expert profile、stock/retry/rescue 来源固化到独立 manifest;不要只用一个全局 episode 数字掩盖 joint coverage 空洞。

2. rescue 数据占比高,可能造成分布偏差

现象

exact550 里 rescue=257,占比很高。rescue 轨迹解决了数据覆盖和落盘问题,但它们可能带有不同的接管阶段、速度、末端姿态和动作时序。

工程处理

先保留 canonical550 不改主线,避免在临近截止时同时改数据、gripper 权重和采样。另建 clean50 用于诊断,观察最干净子集能否快速学会。

结论边界

clean50 与 exact550 的表现差异支持“数据分布值得研究”,但不足以证明 rescue 是线上低分的唯一原因。后续应做同架构、同 seed、同评测拓扑的 stock/rescue ablation,并用新 seed panel 验证。

3. 训练步数不够,不能用低 loss 掩盖

现象

官方 ACT 目标是 6000 epoch,但主线最终只完成到 e1250,随后又尝试了 e1500/e1750/e2000 方向。临近截止的短续训不能替代从头完整训练,也不能保证优化器状态、数据顺序和归一化统计等价。

已验证事实

e1250 那一段是正常完成阶段性 1000/1000,不是 OOM。停止原因是人为阶段上限和硬件/截止时间约束。

正确做法

开赛前锁定 6000 epoch 计算预算;每 250 epoch 落盘一份不可变 checkpoint;每个完整 checkpoint 只在空闲、干净、单进程 evaluator 上做固定 fresh3;用 fixed seed 的 success 选择候选,而不是只看 train/val loss。

4. 普通 runner 与 trace runner 分数不同

现象

clean50 e6500 的普通 fresh3 是 0/3, 1/3,trace 诊断版是 1/3, 5/9。同一权重出现明显差异。

根因判断

trace 版本对 run_act_eval.py 做了 monkey-patch 来记录动作边界和终态,运行拓扑、reset 顺序、初始化和 RNG 消耗不能自动视为与官方 runner 相同。

解决

普通 runner 结果作为正式门禁;trace 只用于定位失败阶段。两者并列保存,不挑高、不平均、不将 trace 高分提交到线上。

以后要做

最终 gate 使用 organizer-matched persistent process,公开 seed 顺序固定,模型只加载一次,逐 episode reset 路径与官方一致。若要隔离 hang,可用独立进程做筛选,但不能把筛选结果直接当最终成绩。

5. 本地 public seed 与线上 private seed 差距很大

现象

历史控制候选本地 fresh3 为 2/3,线上 T4 只有 25.3/100。本地公开 3 条成功率不能代表私有 100 条的平均层数。

解决

建立分级评测:fresh3 只做接口/明显坏模型筛选,fresh10/20 做候选稳定性,之后使用完整固定 public panel;候选还必须通过代码包、checkpoint、stats 和官方环境 preflight。

不应做

不能把一次 clean50 trace 成功、训练集 replay、专家轨迹视频或“没有报错”写成线上 success。不能在看过失败 seed 后把它们加入训练再用原 seed 报告泛化提升。

6. 正确账号与提交队列确认

现象

曾经误用另一个只解锁到较低赛道的账号提交 T4,服务端返回 403。之后第二版虽然在截止前启动上传,但官方回执在截止后到达。

已验证修复

提交前只保留令牌尾号作核对,使用已解锁 T4 的账号重新提交,拿到明确的 #719 T4 和 submit_exit=0。第二版收到 提交已截止 后,停止重复重投。

以后要做

提交脚本应先执行账号解锁状态检查,上传结束必须保存官方 response、queue id、server SHA 和时间戳。截止前没有回执时,不应根据“进程还在”推断已入队。

7. 提交包边界和 checkpoint 命名

现象

T2/T3/T4 线上评测只支持官方 ACT 依赖和选手上传的最小代码面。把整个工程根目录、软链接、wandb、原始数据或额外依赖放进包,会带来解包拒绝、导入失败或配置/权重不匹配。

解决

提交前将代码根限定为 external/robotwin_local 的最小 immutable snapshot;checkpoint 包固定为 policy_last.ckpt + dataset_stats.pkl;拒绝符号链接、硬链接、父目录穿越和额外包;本地模拟打包后先做 ACT import smoke。

以后要做

所有提交候选必须记录:代码树 SHA、deploy config SHA、权重 SHA、stats SHA、打包文件清单和 server response。不要让 policy_best.ckpt、policy_last.ckpt 或 config 的语义在训练、评测、上传三处不一致。

8. 官方 action alignment 与本地修改

现象

ACT loader 在 sim 数据路径下使用 next-state 语义。若本地把 action[max(0, start_ts - 1):] 改成 action[start_ts:],表面上只是少一帧,实际会改变每个训练样本的目标。

解决

主线固定 action shift=0,并对原始数据做 action[t] == qpos[t+1] 审计。任何对齐实验都用独立 run name、独立 stats 和独立 checkpoint,不能与模型规模、gripper loss 或数据采样同时改变。

9. 4090 欠费关机与 PRO 6000 迁移

现象

远程 4090 由于余额不足关机,训练与评测时间线被打断;临时申请/充值、重新开机、同步环境消耗了赛末窗口。云端 PRO 6000 还存在其他用户任务、磁盘空间和 GPU 归属约束。

工程缓解

  • 运行时采用断点续传,并在迁移后做文件数、大小、SHA 和 import 门禁;
  • 兼容 Python 3.10 / PyTorch / SAPIEN / MPlib / cuRobo 环境优先做可验证镜像,而不是截止前临时重建;
  • 大数据、checkpoint 和日志分开存放,避免根盘被环境占满;
  • 不强占其他用户任务,也不在同一 GPU 并发启动多个 SAPIEN evaluator。

结论

这是工程可用性问题,不是模型质量被某张 GPU“决定”的证据。之后应设置持久盘、余额告警、开机自启动恢复和每日可恢复 checkpoint。

10. 低分后的真正修复优先级

如果要重赛,优先级应是:

  1. 先锁定官方环境和 persistent evaluator;
  2. 重新审计 layout/object/pose/yaw joint coverage;
  3. 在 clean official code 上完整训练到预定 horizon;
  4. 对 rescue / retry / stock 做单变量 paired ablation;
  5. 对 gripper timing、lift/transport/release 阶段做失败聚类;
  6. 用独立 fresh seed panel 验证提升;
  7. 最后才打包提交。

不建议的路线是只把 epoch 从 1250 机械加到 2000、只看 loss、只挑一次 trace 高分,或同时改五个数据和模型变量。