molmobot_place_oc@10000은 학습
혼합에 press가 없어(pick·pnp·next-to·color·augment place·open·close만) 전용 체크포인트 라우팅이 필요했다resume online 파일럿 s0(잡 150578)이 누름 과제(train_1843) 첫 누름 서브골에서
ModuleNotFoundError: No module named 'molmobot_pi0'로 종료됐다 — 워커 PYTHONPATH가 스냅샷(src_s1)뿐이라
press 분기의 molmobot_pi0.eval.press_task import가 실패한 것. REMAINING_EPISODES를 못 찍어 babysitter가
"비정상 종료"로 보고 재제출 → 같은 곳에서 또 죽는 재시도 루프 직전에 중지됐다. 누름이 필요한 셀은 본 런
103/342칸(fd856246 93/132 · 61871a3e 10/210)이라 이 결함을 못 고치면 본 런의 30%가 전량 죽을 뻔했다.
결함을 하나씩 잡을 때마다 1시간짜리 잡을 태우는 대신, 로그인 스모크(smoke_press.py, 빌드 96s + 5스텝,
API $0)로 orchestrator와 같은 호출 순서를 끝까지 통과시키며 순서대로 해소했다.
| # | 결함 | 원인 | 수정 |
|---|---|---|---|
| ① | ModuleNotFoundError | 워커 PYTHONPATH가 스냅샷뿐 | press_task.py를 스냅샷 src_s1에 고정 복사, run_online 시작 시점 import 확인 |
| ② | BaseMujocoTask.__init__ 인자 개수 불일치 | press_task가 센서 리팩터(2492a8f) 이전 molmo_spaces 기준 | super().__init__(env, exp_config) |
| ③ | descendant_geoms() 키워드 인자 불일치 | 인자명 변경 | visible_only=False |
| ④ | 판정 거리 inf — 누름이 절대 성공 불가 | 버튼 바디가 자식 링크(..._1_2_5_button)인데 하네스는 GT uid 이름(..._1_0_5_button)만 탐색 | press_button_body — 가전 서브트리 탐색(datagen press_front와 동일 규칙) |
| ⑤ | 접근면 22%가 가전 뒤쪽 | 기존 가전 중심 링 샘플링 | 버튼 정면 접근(cos>0.5), 0.65/0.70/0.75/0.60m × 0/±10/±20° |
| ⑥ | 판정 기준이 datagen과 불일치 | 벤치 판정(패널 접촉)은 datagen이 실제로 누른 자세도 못 알아봄 | datagen_press_judge — 손↔버튼 접촉 ≥1 또는 geom 거리 <3mm |
datagen 누름 구간(subtasks ok=True)의 로봇 자세를 씬에 대입·mj_forward로 재생해 벤치 판정과 datagen 판정을 비교했다.
| 가전 | 누름 구간 | 벤치 판정 | datagen 판정 | 음성 대조 |
|---|---|---|---|---|
| 세탁기 | 11 | 0 | 11 | 0/5,275 |
| 건조기 | 12 | 0 | 12 | 0/3,973 |
| 커피머신 | 9 | 0 | 9 | 0/5,346 |
| 전자레인지 | 11 | 0 | 11 | 0/7,382 |
| 합계(20편) | 43 | 0 | 43 | 0/21,976 |
벤치 판정의 최근접 거리는 2.6~5.3cm(중심점 거리라 실제 접촉에서도 3cm를 넘음), 접촉 0 — 즉 벤치 판정 기준으로는 datagen이 실제로 성공시킨 누름조차 전부 실패로 잡혔다. 사용자 결정(260923): "데이터 생성기 판정대로" 채택.
orchestrator.run_episode(press_policy=None) — decision.skill == "press"면 그 서브골만
press_policy로 라우팅(register/goal/get_action_chunk), entry["policy_route"]에 기록. 워커는
새 스크립트 run_online_worker_press.sh로 같은 GPU에 두 번째 서버(:8801) 기동. 테스트 401건 통과.
| 조건 | place_oc | place_oc_press |
|---|---|---|
| 1차 기존 접근 · 벤치 판정(좁은 접촉) | 0/24 | 0/24 |
| 2차 정면 접근 · 벤치 판정(패널 접촉) | 0/24 | 3/24 (.13) |
| 3차 정면 접근 · datagen 판정 | 1/24 [.01, .20] | 14/24 (.58) [.39, .76] |
| 참고: MolmoBot 벤치 200편 | .000 (최근접 29.7cm) | .370 (3.2cm) |
3차 가전별(press): 세탁기 5/6 · 전자레인지 5/6 · 커피머신 3/6 · 건조기 1/6. 성공까지 스텝 중앙값 100(누름 horizon 300). 짝지은 비교 press>main 14칸 · main>press 1칸(건조기, 231스텝에 3mm 근접 — 우연 스침으로 보임).
누름은 이제 "불가능"이 아니라 VLA 능력 범위 안의 측정 가능한 작업이 됐다. 특히 ④번 결함(버튼 자식 링크를 못 찾아 판정 거리가 무한대가 되는 것)은 예외조차 던지지 않고 조용히 0점을 내는 종류라 — ①~③이 먼저 명시적으로 터져줬기 때문에 드러났다는 점이 인상적이다. place_oc(주 정책)는 두 조건 모두 0이었으므로, 누름 서브골만 별도 체크포인트로 라우팅하는 결정이 필요했다는 근거가 확보됐다.
건조기 1/6(10~22cm 최근접)으로 다른 가전 대비 낮음 — 원인이 접근 자세인지 모델 능력인지 미분리.
본 런 342칸(누름 포함 103칸)을 src_s2 스냅샷 + run_online_worker_press.sh 워커로 실행. 재생 검증은 datagen 성공 사례(ok=True)만 다뤘으므로, datagen 실패 누름에 대한 특이도는 음성 대조로 대신 확인된 상태를 유지.