~/repos/scenemem/에서 이미 완료됨 — 2026-08-04, job 68392, 15k step, final loss 0.0027pi05_droid init + 절대 joint pos(7)+gripper(1) + DROID state stats 재사용(quantile norm)MolmoSpace(allenai/molmobot-data) 데이터로 pi0.5 finetuning을 하려는 요청. 요구사항: (1) 기존 RoboCasa pi0.5 finetuning 코드 확보, (2) 데이터 위치·완전성 확인 및 필요 시 다운로드, (3) RoboCasa 방식에서 데이터셋만 교체해 학습하되 action 값이 pi0.5 pretrained weight 규약과 정확히 맞는지 보장.
~/repos/Robotics/openpi (robocasa-benchmark fork). 사용 config는 pi05_pretrain_human300 (config.py:1275) — pi05=True, max_token_len=200, groot-스타일 LeRobot 데이터(action 12차원), pi05_base init, batch 64. 결과물: ~/ckpts/pi05_robocasa_pretrain_human300_step75000.
Action 처리: 12차원 action/state를 model action_dim(32)으로 zero-pad → 추론 시 앞 12차원 슬라이스. norm stats는 groot 데이터 자체 통계, pi0.5라 quantile(q01/q99) 정규화 적용.
--check로 largest |normalized action| = 3.88 검증, 학습 loss 정상 수렴. 함정 19개(assets CWD 상대경로, gsutil 파손, wandb TLS 등)가 scenemem/claude/context.md에 문서화되어 있음.MolmoBot-Pi0/에 pi05_mlspaces_finetune config가 이미 존재: pi05_droid init, action = joint velocity(joint_pos_rel/0.2) + gripper/255, DROID norm stats(gs://) 재사용. 단 venv 미구축(uv sync 필요), PyTorch 학습은 JAX ckpt→safetensors 변환 필요, 입력이 raw h5+mp4 포맷(LeRobot 변환본 사용 불가).
| 위치 | 내용 | 상태 |
|---|---|---|
HF allenai/molmobot-data | train split 전체 inflated 9.63 TB (9 config) | 원본 |
scenemem/pi05-mlspaces/data/lerobot/mlspaces/franka_2cam | LeRobot 변환본 30,464 ep / 4.08M frames (2 cam) | 학습에 사용됨 |
scenemem/pi05-mlspaces/data/molmobot-data-train/ | raw h5+mp4, Franka 4 config: Pick 20/753 · PnP 20/1598 · NextTo 5/592 · Color 5/92 shards | 부분 (50 shards) |
~/Dataset/molmobot_data/scripts/ | bulk_download / validate_trajectories / calculate_stats.py (오늘 HF에서 확보) | 확보 |
| RoboCasa fork (레퍼런스) | scenemem (완료) | MolmoBot-Pi0 공식 | |
|---|---|---|---|
| init weight | pi05_base | pi05_droid | pi05_droid |
| action 공간 | robocasa 12차원 (native) | 절대 joint pos 7 + gripper 1 | joint velocity 7 + gripper 1 |
| norm stats | groot 데이터 자체 통계 | DROID state stats 재사용 | DROID stats 재사용 (gs://) |
| 정규화 | pi0.5 공통: quantile (q01/q99), action_dim 32 zero-pad 후 앞 N차원 슬라이스 | ||
| 카메라 | 3뷰 필수 | 2뷰 (exo+wrist) | 2뷰 (exo+wrist) |
| 학습 프레임워크 | JAX | JAX | PyTorch (ckpt 변환 필요) |
pi0.5 pretrained weight 활용 관점에서는 pi05_droid init + DROID stats 재사용(scenemem·공식 공통)이 정석 — MolmoSpace는 DROID-스타일 Franka 시뮬 데이터이므로 pi05_base보다 pi05_droid가 가까운 init이다.
step 14999 체크포인트에 대해 validate_checkpoint.py(open-loop action L1, zero-motion 베이스라인 대비, 128 샘플 / 127 에피소드, horizon 15)를 실행. 15fps 데이터라 "현재 자세 유지"(zero-motion)만 해도 강한 예측기이므로, 이를 이기는지가 학습 여부의 판정 기준(1.5x 미만이면 실패).
경로 1 (scenemem 이어가기)을 권장. 목표했던 finetuning이 이미 완주됐고 action 정합성 검증까지 끝났다. 남은 것은 체크포인트 품질 검증과 bench-v2 평가다. 새로 학습해야 한다면(다른 데이터 구성·하이퍼파라미터) 같은 파이프라인 재사용이 최소 비용.
경로 3 (RoboCasa fork 이식)은 "robocasa에서 한 것과 똑같이"라는 표현에 문자 그대로는 부합하지만, 카메라 3뷰 요구·groot 포맷 변환·norm stats 재산출이 전부 새로 필요해서 실익이 없다. RoboCasa365와의 비교 실험이 목적일 때만 고려.
사용자 결정: scenemem 선행작업은 데이터 누락(50/3,035 shards만 사용)·오류 가능성으로 배제. AllenAI 공식 pi05_mlspaces_finetune(pi05_droid init) 경로로 처음부터 셋업.
| 항목 | 검증 결과 |
|---|---|
| 카메라 2뷰 | pi05_droid 사전학습 자체가 2뷰 (exterior+wrist, 3번째 슬롯 zero+mask=False — DroidInputs 코드). RoboCasa fork의 3뷰 요구는 그 fork 자체 선택 |
| arm ÷0.2 | 물리 변환 아님 — per-step max joint delta 0.2 rad 정규화 규약. 공식 eval 설정 max_joint_delta: 0.2로 왕복 닫힘. 데이터 p99(|delta|)=0.2305≈캡. ÷0.2 후 p99 0.473 ∈ DROID action q99(0.448~0.79) |
| gripper ÷255 | MolmoSpace는 완전 이진 {0,255}(중간값 0%), 유지형 커맨드, 255=닫힘. DROID는 연속 bimodal(mean 0.45/std 0.44) — 이진은 그 두 mode 위의 부분집합. 방향 일치, quantile norm이 {0,1}→{-1,+1} |
| state 의미 | Franka 관절 지문 일치 (dim3 항상 음수 [-2.89,-1.15] vs DROID [-2.77,-0.45]; dim5 양수 [+1.33,+2.79] vs [+1.17,+3.47]). gripper state ÷0.824033=MAX_MLSPACES_GRIP_WIDTH. pi0.5는 continuous state 미사용(if not self.pi05) — discrete 토큰만, 8개 정수(패딩 전), 사전학습과 동일 코드 경로 |
| padding 8→32 | 사전학습 규약 그대로 — pi05_droid norm stats dims 8-31이 정확히 전부 0 (zero-pad로 사전학습됨). PadStatesAndActions는 openpi 표준 transform |
| E2E 파이프라인 | 실데이터 48샘플×16스텝: 정규화 action \|a\|>3 = 0% (max 2.21), gripper 정확히 {-1,+1}, prompt 'Task: ..., State: 158 122 ...' pi0.5 정식 포맷, NaN 없음 |
| 항목 | 상태 |
|---|---|
데이터: FrankaPnP OmniCam part1 전체 (train 660/660 shards 1.53TB + val) → ~/Dataset/molmobot_data/raw | 221,111 ep / 58.1M frames (scenemem의 14배). 4h35m (hf_transfer) |
| 후처리: valid_trajectory_index.json (배포 h5에 mask 내장 확인 — 300/300, valid 98.5%) | ✅ 34초, 38,789 houses |
| venv (uv sync 8GB) + transformers 패치 | ✅ |
| pi05_droid JAX→PyTorch 변환 (7.2GB safetensors) + 로드 검증 | ✅ missing 0 / unexpected 0 |
| DROID norm stats prefetch (gsutil 파손 우회) | ✅ |
학습 스크립트 MolmoBot-Pi0/scripts/train_pi05_mlspaces.sh (auto-resume 내장 → sbmr 호환) | ✅ 작성 |
| login 100-step 학습 스모크 (GPU 1, batch 16) | ✅ loss 1.45→1.22, VRAM peak 34.5GB, 3m05s, NaN 없음 |
본 학습 제출 — job 80517 (--qos=own 8 GPU / 96 CPU / 1600GB / 2일, 20k steps, batch 256) | ✅ 제출됨 (제출 시점 클러스터 118/120 → PENDING) |
opencv-python; sys_platform=='never')로 수정. (b) torch cu126: B200 sm_100 커널 부재로 no kernel image — pytorch cu128 인덱스 핀으로 수정 (2.7.1+cu128). 둘 다 pyproject.toml에 영구 반영.--part 필터는 --max_part_shards 없이는 미적용 (part0 2TB를 받을 뻔). convert 스크립트는 실패해도 exit 0 + checkpoint 루트 경로 필요. 다운로드는 hf_transfer로 2.7배 개선 (660 shards 4h35m).