Index
2026-09-08 — Engineering

FrankaPressButtonBench 신설 — press 평가 벤치 구축

MolmoBot | 새 태스크 클래스 + 200편 JSON 벤치 + 판정 로직 검증

TL;DR

200
벤치 편/집
3cm
press_radius
4
가전 카테고리
3회
스모크 반복

1 배경 / 목적

press 트랙(버튼 누르기 11,070편) 데이터는 학습에 바로 쓸 수 있으나, 평가 수단이 없었다 — molmospaces 벤치와 태스크 클래스 어디에도 press가 존재하지 않는다. 사용자 지시: "press bench 새로 만들어주면 좋겠고."

설계 원칙: 동시에 사용자 질문 "open도 평가 환경이 학습환경이랑 같은건가?"에 답하며 확인한 open의 학습-평가 갭(별도 카드 참조)이 그대로 반영됐다 — 학습과 평가의 물체·판정 기준을 맞춰야 한다.

2 작업 내용

1) press 태스크 클래스 (molmobot_pi0/eval/press_task.py)

molmo_spaces에 press가 없어 PressButtonTask(PickTask 상속) + PressButtonTaskConfig + PressButtonTaskSpec를 새로 작성.

성공 판정 (같은 스텝에 모두 만족): - 손끝 그리퍼 geom → 버튼 지점 거리 ≤ press_radius(3cm) - 버튼 패널 body 접촉 - 가전 이동 ≤ max_fixture_shift(5cm) ※ 누름은 순간 동작 → 한 스텝만 만족해도 래치 버튼 지점: press_point(월드)를 가전 루트 프레임 오프셋으로 변환해 들고 다님 → 가전이 움직여도 추적됨 보상: 손끝→버튼 거리 기반 0~1 연속값 task_info: 스텝별 dist_to_press/min_dist_to_press/touching_link/ fixture_shift/near_press 기록 → 사후 반경 변경 가능 (place의 replace@r과 동일 방식)

2) venv 등록 (scripts/patch_molmo_spaces_press.py)

두 venv 대상, 멱등, .press_orig 백업, --revert 지원. ① TASK_CLASS_TO_CONFIG_CLASS["PressButtonTask"] 등록 ② benchmark_schema.ALL_TASK_SPEC_CLASSES에 스펙 추가(button_body·press_point가 task_config로 복사되게 함) ③ set_joint_values가 press에서 조기 반환(세탁기·전자레인지는 articulation object라 grasp file 없으면 ValueError).

3) 벤치 생성 (scripts/build_press_bench.py)

press shard 3개(0000·0001 press, 0022 washer, 총 6GB)를 받아 h5만 추출 → 각 편의 frozen_config(pickle)에서 씬·로봇·카메라·태스크·언어를 뽑아 AI2 형식(benchmark.json + benchmark_metadata.json)으로 변환. 생성기 fork에만 있는 클래스는 TolerantUnpickler로 placeholder 치환해 읽는다(find_spec+hasattr 판정, try-except 미사용).

결과 벤치: procthor-10k/FrankaPressButtonBench/ FrankaPressButtonBench_20260908_200ep_json_benchmark - 200편 / 200채 (집당 1편) - 커피머신 67 · 세탁기 50 · 건조기 43 · 전자레인지 40 - 씬: procthor-objaverse 107 + procthor-10k 93 (에피소드별 scene_dataset, 혼합 가능) - 카메라 5종 (기존 벤치와 동일) - held_out_houses.json (200채) 별도 저장 → 학습 시 반드시 제외 집계: scripts/summarize_press.py (press@1/2/3/5cm, 근접만, 접촉, 밀림, 카테고리별) 실행: scripts/rollout_press.sh (MODEL_KIND=pi|mbot)

3 결과 (수치)

스모크 검증 (로그인 GPU 1장, 2편, pi0.5 place_oc@20k — press 미학습)

회차조건결과조치
1차버튼 body 탐색못 찾음데이터의 button_body(..._1_1_2_button)는 생성기 fork 이름, 우리 씬은 접미사 없는 ..._1_1_2 → 접미사 제거 후보 추가
2차접촉만으로 판정미학습 모델 2/2 오탐 성공패널 body가 geom 74개짜리 큰 링크라 아무 데나 닿아도 통과 → 거리 3cm + 접촉 동시 요구로 조임
3차 (최종)거리+접촉+밀림 동시 판정의도대로 구분커피머신 편 실패(최근접 8.2cm, 가전 9.8cm 밀려 실격) / 세탁기 편 성공(2.7cm, 접촉, 밀림 0)
핵심 검증: 3차 스모크에서 성공/실패 편이 판정 로직 설계 의도(정밀 접근 + 접촉 + 가전 안 밀기)대로 정확히 갈렸다.
미학습 pi0.5 기준선(감): 스모크 2편 기준 press@3cm 0.5, 최근접 중앙값 5.5cm — 표본이 2편뿐이라 200편 정식 기준선은 별도 측정 필요.

4 Takeaway

의미

press는 이제 closed-loop 성공률로 잴 수 있다. 판정이 데이터 생성 규칙(접촉 ∧ 정밀 접근 ∧ 가전 안 밀기)과 같은 취지라 학습-평가 정합성이 open보다 낫다. 물체도 4종(커피머신·전자레인지·세탁기·건조기)이라 open처럼 "한 물체만 학습" 문제가 덜하다.

open 트랙에서 얻은 교훈을 press에 그대로 적용했다: 학습 데이터에 없는 물체·동작이 벤치에 섞이면 점수가 안 오른다(open 카드 참조). press는 학습 데이터와 벤치가 같은 4종 분포이므로, 향후 성능이 안 오르면 데이터 분포가 아니라 모델/학습량 문제로 해석할 수 있다.

5 Next Steps

미해결 한계

200편 정식 baseline이 아직 없다(스모크 2편뿐). press_radius 3cm는 초기값으로, 어느 반경이 주 지표가 될지 아직 결정 안 됨(단 집계 스크립트가 4개 반경을 모두 산출하므로 사후 결정 가능).

다음 작업

1) 기준선 측정: 미학습 모델(pi0.5 place_oc@20k, MolmoBot no-goal@10k)로 200편 평가 → press 학습 전 baseline 확보(각 1GPU 4–6h).
2) 학습 투입: press 65GB 전량 다운로드 → sensor_data 채우기(open/close와 같은 수리) → press/washer 두 데이터셋으로 분리(집 번호 85개 충돌) → held_out_houses.json 200채 제외 → 비율 press 0.10 추가해 재학습.
3) 벤치 확장 여지: 현재 shard 3개(227채)에서만 추출 — 더 다양한 집을 원하면 shard를 더 받아 재생성(build_press_bench.py --n).