← 목록
2026-09-02 — Analysis

"물체를 든 채 시작 + Place 명령만" — closed-loop hand-off 벤치로 Q1·Q2 재측정

MolmoBot / pi0.5 · molmo-augment place 데이터 · goal image 조건화 · NextTo HardBench 200편

TL;DR

21.1 → 21.1%
hand-off 성공 (mix20k → place10k)
22.2 → 23.9%
goal off → on (p=0.86)
−23%
val arm L1, goal on
+50%
val arm L1, 틀린 goal
71.8%
expert 상한
73%
crop goal이 유지하는 goal 이득

1 배경 / 측정 정의

2-stage(pick → navigation → place)의 low-level VLA가 물체를 든 채 제어권을 넘겨받은 뒤 잘 내려놓지 못한다. 두 질문: Q1 place 전용 데이터(molmo-augment, NextTo의 preplace→retreat 구간 15k편)로 학습하면 잘 놓는가, Q2 goal image를 넣는 것이 큰 의미가 있는가.

오전 결론의 한계: Q1을 val open-loop L1(−22%)과 HardBench(pick부터 시작)로 답했는데, 사용자가 원한 것은 "이미 든 채 시작해서 Place 명령만 받았을 때의 성공률"이다. 둘 다 그 질문의 직접 답이 아니다.

그래서 그 상황을 그대로 재현하는 closed-loop 벤치를 만들었다. 학습 클립이 잘린 지점(expert phase preplace)과 같은 시점에서 정책에 넘기므로 시작 상태 분포가 학습 데이터와 일치한다.

2 벤치 구축과 실험 설계

hand-off place 벤치 (molmobot_pi0/eval/handoff.py)

스모크 11회에서 잡은 함정 (context.md 24–27): - hydra: import된 모듈의 @hydra.main은 config_path를 pkg 경로로 해석 → 진입 파일에 main을 따로 두고 __wrapped__ 호출 - 로그인 8000 포트 점유 → POLICY_SERVER_PORT env (eval.py 하드코딩 2곳 수정) - JsonEvalTaskSampler는 policy의 add_auxiliary_objects를 안 불러 grasp_collision_* body 없음 → sampler 서브클래스 - bench JSON에 min/max_surface_to_surface_gap 없음(None) → task와 같은 fallback(0/0.05) - planner가 task_sampler_config.max_place_receptacle_sampling_attempts 필요 → expert config에 datagen sampler 설정 - 원본 planner는 배치 위치 1회 샘플·IK 실패 시 즉시 예외 → 24회 재샘플 × grasp 2회 (RetryingNextToPlanner) - NextTo collect_info KeyError 'position_error' → Q1까지의 NextTo 수치는 pipeline 요약값(비교 유효), 패치됨

실험 목록

job내용목적
107382pi05_mlspaces_place_goal 학습 (init droid, 10k step, goal exo_camera_2, dropout 0.5), loss 0.0050place10k와 goal 유무만 다른 A/B
107598 / 107599 / 107600val open-loop L1: goal on / off / shuffle(다른 에피소드의 goal)goal의 내용을 읽는가
107595 / 107596 / 107597hand-off 벤치: mix20k / place10k / place_goal10k(goal off)Q1, Q2 closed-loop
107603hand-off 벤치 goal-on 변형: place_goal10kQ2 closed-loop
107743val: 학습 goal PNG를 관측처럼 crop해 넣은 L1 (GOAL_PREPROC=crop)goal 도메인 갭 프로브

3 결과

① val open-loop L1 (39,040 프레임, 정규화 공간, 낮을수록 좋음)

모델all (8d×16)arm (7d)gripper (1d)step0
mix20k (place 없음)0.11160.10620.14950.1097
place10k0.08700.08590.09500.0856
place_goal10k, goal off0.08980.08850.09830.0881
place_goal10k, goal on0.07200.06830.09790.0732
place_goal10k, 틀린 goal(shuffle)0.12850.13240.10160.1263
val L1
Figure 1. val open-loop L1. goal on은 arm 오차를 23% 줄이고, 틀린 goal은 50% 늘린다. gripper는 세 조건 모두 ~0.10으로 goal과 무관.
goal의 내용을 읽는다: on vs off −19.8%(all), 틀린 goal은 off 대비 +43% — 3번째 이미지 슬롯이 "있냐"가 아니라 "무엇이 찍혔냐"가 팔 궤적을 정한다. gripper(언제 놓느냐)는 place 데이터가 이미 해결한 부분이라 goal과 무관.

② closed-loop hand-off 성공률

모델전체 (평가 편수)공통 117편놓음vs goal-on (McNemar)
mix20k (place 없음)30/142 = 21.1%27 = 23.1%96.5%19:18, p=1.00
place10k30/142 = 21.1%26 = 22.2%99.3%16:14, p=0.86
place_goal10k, goal off31/142 = 21.8%26 = 22.2%99.3%17:15, p=0.86
place_goal10k, goal on28/117 = 23.9%28 = 23.9%100%—
scripted expert (pass 1 완주)102/142 = 71.8%벤치의 현실적 상한
hand-off success and failure modes
Figure 2. (좌) closed-loop 성공률, (우) 마지막 프레임에서 물체가 어디에 있었는가. 네 모델의 분포가 사실상 같다.
Q1·Q2 모두 closed-loop 무변화: mix20k vs place10k는 142편에서 17:17 완전 동률. goal on/off도 p=0.86. open-loop에서 본 개선이 성공률로 이어지지 않았다.

③ 실패 분해 (마지막 프레임의 물체–수용체 표면 거리)

분류mix20kplace10kgoal offgoal on
성공19.7%19.0%17.6%20.5%
근접 실패 (≤15 cm, 같은 표면)18.3%16.9%16.9%16.2%
15–40 cm 벗어남28.9%35.9%32.4%29.1%
>40 cm23.2%18.3%22.5%18.8%
다른 표면(바닥 등)8.5%8.5%9.9%11.1%
수용체 밀림1.4%1.4%0.7%4.3%
최종 표면거리 중앙값 (hand-off 시 0.396 m)0.171 m0.204 m0.227 m0.240 m
≤10 cm 비율32%27%29%32%

네 모델 모두 물체를 hand-off 지점에서 절반쯤 가져가서 놓는다. 놓는 행동은 문제가 아니고(released 97–100%), 참조 물체까지 마지막 15–40 cm를 못 맞춘다. place 데이터도 goal도 이 분포를 못 바꿨다.

goal image examples
Figure 3. 왼쪽: goal-on 러너가 만든 goal 이미지(expert가 놓은 장면). 오른쪽: 각 모델의 최종 프레임. S/F는 판정(goal-on은 집계 전 스냅샷이라 ?).

4 Takeaway

의미

Q1 재답: place 데이터는 시연 행동의 재현(open-loop, 특히 릴리즈 타이밍)은 확실히 좋게 하지만, 사용자가 원하는 "놓기 성공률"은 그대로다. 오전의 "place를 잘한다"는 결론은 val L1을 과신한 오판이었다.

Q2 재답: goal image는 학습 분포에서 큰 의미가 있다(arm −23%, 틀린 goal이 오도). 하지만 sim closed-loop hand-off에서는 이득이 0이고 최종 위치 분포조차 안 움직였다 — sim에서는 goal이 사실상 안 읽히는 것으로 보인다.

가장 유력한 원인 = goal 도메인 갭. 학습 goal은 원본 카메라의 480×640(4:3) 프레임을 360×640으로 세로 squash한 것이고, 관측은 같은 프레임을 center-crop한 것이다. sim 배포 goal은 eval 카메라 352×624(16:9), 즉 관측과 같은 크롭형 기하이고 squash가 없다. 모델은 "squash된 goal"만 배웠다.

지표 교훈: open-loop L1(전 프레임 평균 action 오차)은 이송 구간의 방향 예측 개선을 크게 잡지만, 마지막 15–40 cm의 정밀 배치 실패는 못 잡는다. 이 프로젝트의 지표는 hand-off 벤치 성공률 + 최종 표면거리 분포여야 한다.

5 Next Steps

goal 도메인 갭 프로브 (job 107743) 완료

val에서 학습 goal PNG를 관측과 같은 전처리(resize + center-crop, 360×640)로 넣은 L1 = 0.0768 (goal on 0.0720 / off 0.0898). crop 기하로도 goal 이득의 73%가 유지된다 → squash/crop 기하 차이는 closed-loop 무효과의 주원인이 아니다(잔여 27%만 설명).

goal 조건allarmgripper
off0.08980.08850.0983
on (학습 기하, squash)0.07200.06830.0979
on, crop (배포 기하)0.07680.07390.0978
틀린 goal0.12850.13240.1016

진단 2잡 제출 (extra 큐, own 보존) 대기/진행

107752 틀린 goal closed-loop(다른 에피소드의 goal PNG) 완료: 19.7%(23/117) vs goal on 23.9% / off 22.2%. 방향은 on > off > wrong이지만 유의하지 않고(on vs wrong 14:9, p=0.41) 최종 위치 분포도 같다(중앙값 0.208 m, ≤10 cm 29%) → sim closed-loop에서 goal 내용의 영향은 약하며 정밀 배치를 바꾸지 못한다. open-loop(틀린 goal +43%)와 대조적.
107753 늦은 goal 프레임(go_home 진입 30 step 뒤, 팔이 물체에서 떨어진 장면) 완료: 23.9%(28/117), goal-on과 쌍별 12:12로 정확히 동률 — goal 프레임 시점도 무관.

조건 (공통 117편)mix20kplace10kgoal offgoal ongoal on, 늦은 프레임틀린 goal
hand-off 성공률23.1%22.2%22.2%23.9%23.9%19.7%
최종 결론: sim closed-loop hand-off에서 goal 조건화는 정답·늦은 프레임·틀린 goal 어느 쪽이든 성공률(±4%p, p≥0.4)과 최종 위치 분포를 바꾸지 못한다. open-loop에서의 큰 효과(arm −23%, 틀린 goal +50%)는 시연 상태 분포 안에서만 성립한다.

그 뒤

둘 다 무효과로 확인됐으므로 goal 재학습(crop 전처리·늦은 프레임)은 우선순위가 낮다. 정밀 배치 자체(마지막 15–40 cm; 참조 물체 접지)를 다루는 방향이 맞다 — NextTo 전체 태스크가 어떤 데이터 혼합에도 무변화였던 것과 같은 병목이다. 후보: 배치 직전 구간 오버샘플링, wrist 카메라 활용·해상도, place 지점을 명시하는 저수준 목표(좌표/마커) 조건화, NextTo 판정 거리별 커리큘럼. 사용자 2-stage 파이프라인에서는 현재 ckpt 중 어느 것을 써도 hand-off 성공률은 같다(~22%).

벤치 보완

expert 불가 29%(58/200) → grasp 후보 재시도 확대 또는 bench 필터로 분모 확대. expert 상한 71.8%도 같이 보고. 2-stage 파이프라인의 실제 goal 소스(저장된 사전 관측)도 관측과 같은 전처리를 거치게 할 것.