Index
2026-09-05 — Experiment / Analysis

MolmoBot(F=2) + goal 이미지: hand-off replace@5cm 35% / 6.7 cm — pi0.5 place_oc(12% / 15 cm)의 3배, goal 없으면 26 cm · Open은 pi0.5보다 못함(5.6%), Close 동급

MolmoBot · `allenai/MolmoBot-DROID`에서 10k step 이어 학습 (`molmobot_runs/molmobot_place_oc_goal/10000`) · place 0.16 + open/close 0.10 · 복원 프롬프트 · goal 꼬리 이미지 블록 · hand-off 130편 · Open 198 / Close 200편

TL;DR

35.4%
replace@5cm (MolmoBot goal on)
12.0%
replace@5cm (pi0.5 place_oc on)
6.7 vs 25.6 cm
goal까지 중앙값 on / off
5.6%
Open 198편 (pi0.5 11.1%)
42.0%
Close 200편 (pi0.5 45.5%)

1 배경 / 구현

pi0.5 place_oc(09-04)는 goal 이미지로 replace@5cm 12%, 중앙값 15 cm에 머물렀고 5–15 cm 근접 실패가 병목이었다. 사용자 지시로 공식 MolmoBot(F=2: SigLIP2 + Qwen3-4B, 관측 2프레임×2카메라, 36층 flow expert)에 같은 데이터·비율로 이어 학습하고, goal 이미지도 v2와 같은 방식(배치 완료 프레임, 존재 2/3, 텍스트 뒤 별도 블록, 관측→goal 누수 차단)으로 받도록 MolmoBot/ 코드에 구현했다.

goal 주입: 에피소드 마지막 프레임(관측 exo randomized_zed2_analogue_1) → 질문 뒤 꼬리 블록 [<|image|>] + "Goal image" + 이미지 토큰 · attention image_tokens_head_only (관측 이미지끼리·goal 블록 내부만 양방향) · goal_presence_prob 0.667 학습: MolmoBot/scripts/train_molmobot_goal.sh — init ~/ckpts/molmobot_droid, 8 GPU own, global 256 / device 16, 10k step, seq 1152, n_obs_steps 2 / obs_step_delta 8 비율: main 0.24 / Pick 0.12 / PnP-p0 0.08 / NextTo 0.12 / Color 0.08 / place 0.16 / open 0.10 / close 0.10 (메인 4종만 프롬프트 템플릿, place/open/close는 h5 원문) 잡: 110200(step ~3100에서 원본 누락 mp4로 중단 → 카메라 파일 존재 대체 추가) → 110383 재개(step 3000, wandb rewind 불가라 새 run) · 총 8 h 27 m · flow loss 0.0117 → 0.0062 평가: 어댑터 molmobot_pi0/eval/policies/molmobot.py (policy=molmobot, 절대 joint + max_joint_delta 0.2) · hand-off 110585–110588 · Open 110692 · Close 110590 (own, 각 1 GPU) 로더 점검 tmp/check_mb_openclose_loader.py: open/close/place 40샘플씩 — 프롬프트 원문("open the chest", "Close the chestofdrawers"), 관측 4장 + goal 1장(2/3), 카메라 대체 0건

2 hand-off closed-loop — replace 기준 (프롬프트 "Place the X on the {받침면}.", 130편)

조건replace@5cm@10cm@15cmgoal까지 중앙값NextTo(구)off-surface
MolmoBot goal on35.4% (46)63.8% (83)75.4% (98)6.7 cm63.8% (83)17
MolmoBot goal off4.6% (6)13.8% (18)22.3% (29)25.6 cm25.4% (33)24
MolmoBot 틀린 goal2.3% (3)7.7% (10)12.3% (16)43.2 cm18.5% (24)56
MolmoBot goal on, "next to Y" 프롬프트16.9% (22)42.3% (55)56.2% (73)11.4 cm59.2% (77)20
pi0.5 place_oc goal on (117편, 09-04)12.0% (14)27.4% (32)44.4% (52)15.1 cm50.4% (59)20
pi0.5 place_oc goal off (117편)0.9% (1)6.8% (8)11.1% (13)44.2 cm19.7% (23)16
공식 MolmoBot zero-shot, goal 없음 (130편)3.6%12.3%—41.6 cm15.4%—
CDF and success bars
Figure 1. (좌) 최종 물체 위치 → goal 이미지 속 위치의 xy 거리 CDF. MolmoBot goal ON(on-the)이 5 cm에서 이미 35%, 10 cm에서 64%로 다른 모든 곡선 위. next-to 프롬프트 ON은 pi0.5 v2(next-to)와 겹침. OFF/WRONG은 25–43 cm. (우) replace@5/10/15 cm와 구 NextTo.

공통 103편 쌍 비교 (pi0.5·기준선 포함)

조건replace@5@10NextTo거리 중앙값MolmoBot goal on 대비 (McNemar @5 / @10 · Wilcoxon 거리)
MolmoBot goal on33.0%64.1%61.2%6.8 cm—
MolmoBot goal off4.9%15.5%24.3%25.0 cm31:2 (p=1.3e-7) / 53:3 (p=8e-13) · +13.7 cm (p=7e-15)
MolmoBot 틀린 goal1.0%7.8%18.4%40.5 cm34:1 / 59:1 · +27.5 cm (p=1e-17)
MolmoBot goal on (next-to)17.5%42.7%60.2%11.4 cm21:5 (p=0.0025) / 30:8 (p=5e-4) · +2.1 cm (p=6e-4); NextTo 14:13 동률
pi0.5 place_oc goal on12.6%30.1%51.5%14.2 cm31:10 (p=0.0015) / 40:5 (p=8e-8) · +7.6 cm (p=4e-8); NextTo 22:12 (p=0.12)
pi0.5 place_oc goal off1.0%6.8%19.4%44.2 cmMolmoBot off 대비: 5:1 (p=0.22) / 15:6 (p=0.078) · 거리 25.0 vs 44.2 cm (p=5e-5)
pi0.5 v2 goal on (on-the)10.7%32.0%35.9%13.4 cm29:6 (p=1e-4) / 45:12 (p=1e-5) · +7.3 cm (p=1e-6)
pi0.5 v2 goal on (next-to)14.6%39.8%57.3%13.0 cmMolmoBot next-to 대비: 13:16 / 17:20 (p≥0.7) · 거리 +2.8 cm (p=0.005)
공식 MolmoBot zero-shot (on-the)3.9%12.6%15.5%43.7 cm33:3 / 58:5 · +28.8 cm (전부 p<1e-6)
goal 이미지가 정밀도를 만든다. 같은 130편에서 goal on vs off는 @10cm 53:3, 거리 13.7 cm 차이. 틀린 goal은 off보다 더 멀고(43 vs 26 cm, p=2e-4) 표면 이탈이 두 배(56 vs 24) — 모델이 goal을 실제로 읽고 그 자리로 가려 한다. pi0.5에서 남았던 5–15 cm 근접 실패 구간이 MolmoBot에서 크게 풀렸다(@5cm 12.8 → 35.4%).
백본 효과는 goal 없을 때 거리에만. MolmoBot goal-off 25 cm vs pi0.5 goal-off 44 cm(p=5e-5): 공식 MolmoBot의 언어 배치 능력이 남아 절반 거리까지는 가지만 replace@5cm는 4.6%로 pi0.5와 다를 바 없다. 프롬프트 형식: "next to Y"로 바꾸면 @5 35 → 17%, 거리 6.7 → 11.4 cm로 pi0.5 v2(next-to)와 동급. 학습 place 데이터의 문장 형식("on the {받침면}")에 맞출 때만 우위가 나타난다.

3 Open / Close HardBench (goal 없음, 언어만)

물체Open MolmoBotOpen pi0.5 place_ocOpen pi0.5 zero-shot (part1@15k)Close MolmoBotClose pi0.5 place_oc
chestofdrawers (증강 데이터 99%)4/44 = 9.1%11/44 = 25.0%3/44 = 6.8%18/48 = 37.5%18/48 = 37.5%
refrigerator5/43 = 11.6%5/43 = 11.6%3/43 = 7.0%31/48 = 64.6%32/48 = 66.7%
desk1/44 = 2.3%3/44 = 6.8%3/44 = 6.8%13/48 = 27.1%17/48 = 35.4%
stand1/44 = 2.3%3/44 = 6.8%4/44 = 9.1%18/49 = 36.7%23/49 = 46.9%
microwaveoven0/230/230/234/71/7
전체11/198 = 5.6%22/198 = 11.1%13/198 = 6.6%84/200 = 42.0%91/200 = 45.5%
Open: 같은 198편에서 MolmoBot → pi0.5 place_oc +17/−6 (McNemar p=0.035), MolmoBot ↔ pi0.5 zero-shot 12:10 (p=0.83). 학습 물체 chestofdrawers에서 pi0.5는 6.8 → 25.0%였지만 MolmoBot은 9.1%. 로더 점검으로 open 7.5k편이 정상 투입된 것을 확인했으므로 데이터 문제가 아니라 MolmoBot이 10k step에 당기기 스킬을 흡수하지 못한 것(후보: open 샘플 10%(≈256k)로는 36층 flow expert에 부족, 2프레임·절대 joint 규약 — 미검증). Close: 84 → 91, +41/−34 (p=0.49) 무변화, 둘 다 천장.

4 영상 (hand-off 시점부터, 프롬프트 "Place the X on the {받침면}.")

행: MolmoBot goal ON / goal OFF / WRONG goal / pi0.5 place_oc goal ON. 열: 모델이 받은 goal 이미지 | exo | wrist. 노란 테두리 = hand-off 첫 8 프레임. goal은 두 모델 모두 관측 exo 카메라의 pass-1 완료 프레임(MolmoBot은 zed2_analogue_1, pi0.5는 droid_shoulder).

house_912 — "Place the silver kettle on the countertop."

MolmoBot goal ON 1.3 cm(replace 성공), OFF 40 cm, WRONG 표면 이탈. pi0.5 place_oc는 12 cm 근접 실패 — 같은 goal에서 MolmoBot이 더 정확히 자리를 잡음.
MolmoBot goal ON: REPLACE OK (1.3 cm from goal) · MolmoBot goal OFF: FAIL: 40 cm from goal · MolmoBot WRONG goal: FAIL: off-surface (xy 60 cm, dz -94 cm) · pi0.5 place_oc goal ON: near miss (12 cm from goal) | NextTo OK

house_461 — "Place the shiny silver kettle on the countertop."

MolmoBot ON 1.4 cm, OFF 64 cm, WRONG 68 cm. pi0.5 16 cm(NextTo만 성공). 언어는 '싱크대 위'만 말하니 goal 없이는 어디든 놓음.
MolmoBot goal ON: REPLACE OK (1.4 cm from goal) · MolmoBot goal OFF: FAIL: 64 cm from goal · MolmoBot WRONG goal: FAIL: 68 cm from goal · pi0.5 place_oc goal ON: FAIL: 16 cm from goal | NextTo OK

house_219 — "Place the glossy red vase with vertical ridges on the dining table."

MolmoBot ON 0.8 cm, OFF 29 cm, WRONG 표면 이탈. pi0.5 31 cm — pi0.5가 goal을 받고도 놓친 에피소드를 MolmoBot은 복원.
MolmoBot goal ON: REPLACE OK (0.8 cm from goal) · MolmoBot goal OFF: FAIL: 29 cm from goal · MolmoBot WRONG goal: FAIL: off-surface (xy 24 cm, dz -33 cm) · pi0.5 place_oc goal ON: FAIL: 31 cm from goal | NextTo OK

house_607 — "Place the shallow blue-gray metal frying pan on the countertop."

MolmoBot ON 0.6 cm, OFF 15 cm, WRONG 11 cm(우연 근접). pi0.5 9 cm 근접 실패 — 5–15 cm 구간이 MolmoBot에서 풀린 전형.
MolmoBot goal ON: REPLACE OK (0.6 cm from goal) · MolmoBot goal OFF: FAIL: 15 cm from goal · MolmoBot WRONG goal: near miss (11 cm from goal) · pi0.5 place_oc goal ON: near miss (9 cm from goal)

house_100 — "Place the small red potato on the countertop."

반례: MolmoBot ON·OFF 모두 표면 이탈(떨어뜨림), WRONG 36 cm. pi0.5 9 cm 근접. MolmoBot의 off-surface 17편 중 하나 — 작은 물체(감자)의 파지 유지 실패.
MolmoBot goal ON: FAIL: off-surface (xy 42 cm, dz -94 cm) · MolmoBot goal OFF: FAIL: off-surface (xy 32 cm, dz -94 cm) · MolmoBot WRONG goal: FAIL: 36 cm from goal | NextTo OK · pi0.5 place_oc goal ON: near miss (9 cm from goal) | NextTo OK

5 Takeaway / Next

의미

2-stage(pick→nav→place)의 place 단계는 MolmoBot + goal 이미지가 현재 최선이다: goal 위치 5 cm 안 복원 35%, 10 cm 안 64%. pi0.5 place_oc 대비 3배이고, 이 차이는 goal 이미지의 위치 정보를 액션으로 옮기는 정확도에서 온다(goal off·wrong 대조로 확인). 관측 2프레임과 더 큰 LLM이 goal 대비 현재 위치의 차이를 더 정확히 읽는다고 해석한다.

반면 새 스킬(open)은 같은 데이터로 pi0.5만 배웠다. 백본에 따라 "정밀 배치"와 "새 동작 습득"이 갈리므로, 당장은 place = MolmoBot goal 모델, open/close = pi0.5 place_oc로 라우팅하는 것이 합리적이다. 배포에서는 place 지시문을 학습 형식("Place the X on the {받침면}.")으로 고정해야 우위가 유지된다.

다음

(1) MolmoBot replace 남은 실패 — 5–10 cm 28%(37편), 10–15 cm 12%, off-surface 17편: goal 존재 비율 1.0, 정밀 배치 클립 가중, goal 프레임 팔 가림 제거. (2) open: MolmoBot open 비율 0.10 → 0.2 또는 20k step, 아니면 open만 pi0.5 라우팅. (3) 배포 교란(base 위치·goal 시점·산만 물체 `HANDOFF_PERTURB`)을 MolmoBot에 적용해 pi0.5 v2(13.4 → 16–17 cm)와 비교. (4) `optimizer.pt`(13 GB×8) 삭제는 사용자 확인 후.

ckpt : ~/ckpts/molmobot_runs/molmobot_place_oc_goal/10000 (unsharded model.pt 20 GB + config.yaml; step10000/ sharded 원본) 결과 : handoff_eval/results/molmobot_oc_{on,off,wrong,on_nextto}_step10000.json · molmobot_base_off_{onsupport,nextto}_step0.json rollout_eval_molmobot/molmobot_place_oc_goal/FrankaOpenHardBench/step10000 · FrankaCloseFixedBench/step10000 잡 : 학습 110200 → 110383 · hand-off 110585–110588 · Close 110590 · Open 110692 (own) 스크립트: MolmoBot/scripts/train_molmobot_goal.sh · convert_run_ckpt.sh · MolmoBot-Pi0/scripts/rollout_handoff_molmobot.sh · rollout_val_molmobot.sh · tmp/paired_compare.py · tmp/tally_openclose.py · tmp/check_mb_openclose_loader.py 로그 : claude/260905/progress-molmobot_goal_image.md · analysis-molmobot_goal_results.md