pi05_droid는 right_wrist_0_rgb를 zeros+mask=False로 학습했고 공식 eval 하네스도 2캠만 넣는다. 맞추면 eval 어댑터를 새로 짤 필요가 없다.state stats는 절대 joint position이라 재사용, actions stats는 joint velocity라 사용 금지. 잘못 쓰면 정규화 값이 −6.8까지 튀어 flow-matching 타깃이 붕괴.TRAIN_PLAN.md(2026-08-01)에 따라 molmobot-data → LeRobot 변환까지 진행된 상태에서 이후 단계의 구현 계획이 필요했다. 다만 세 가지가 계획 작성 시점과 달라졌거나 미확인이었다.
openpi / molmospaces / 변환 산출물 3곳을 전수 확인했다. 추측 없이 파일·실측으로만 판단.
nvidia-smi, snode --json, df -h로 하드웨어·쿼터·디스크 실측droid_policy.py, pi_policy.py, robot_configs.py, config.py, pi0_config.py, transforms.py 정독house_1044/trajectories_batch_1_of_1.h5)를 열어 액션/상태 정렬을 67스텝 전 구간 수치 검증| 항목 | 구 계획 (3090 24GB) | 신 계획 (B200 183GB) |
|---|---|---|
| full FT 70GB 요구 | 불가 → FSDP 7장 필수 | 1장에 여유 2.5배 |
fsdp_devices | 7 (강제) | 1 |
ema_decay | None으로 꺼야 함 (−13GB) | 0.99 유지 |
| LoRA | 스모크용 강등 논쟁 | 완전히 불필요 |
batch_size | 56 (7의 배수 강제) | 256 (8의 배수) |
| 디스크 여유 | 3.0 TB (제약) | 67 TB (무제약) |
|action[i+1] − qpos[i]| 평균 0.004–0.031 rad vs |qpos[i+1] − qpos[i]| 평균 0.002–0.015 rad → 액션이 상태보다 약 2스텝 앞선 목표값. identity 매핑이 아니다.
policy_dt_ms=66.0 → 구 계획 §5의 fps 불일치 리스크 해소.
또한 joint_pos[0]은 더미(로봇 실제 자세와 무관), joint_pos[-1]은 {} 센티널 → 변환기의 앞뒤 trim 로직이 정확.
| # | 항목 | 현재 | 맞는 값 |
|---|---|---|---|
| 1 | exo 카메라 | randomized_zed2_analogue_1 | droid_shoulder_light_randomization |
| 2 | 이미지 기하 | 624×352 → 224×224 plain squash | resize_with_pad (224×126 + 상하 49px 패딩) |
| 3 | 카메라 수 | 3캠 (right_image 강제) | 2캠 (right_wrist_0_rgb = zeros, mask False) |
| 4 | 저장 형식 | PNG dtype:"image" | video dtype:"video" |
state만 재사용교차 확인: examples/droid/convert_droid_data_to_lerobot.py:143이 step["action"]["joint_velocity"]를 액션으로 저장한다.
actions stats를 쓰면 정규화 값이 (−2.03 − 0.0285)/0.3012 ≈ −6.8로 [−1,1]을 크게 이탈해 flow-matching 타깃이 붕괴한다.
state stats를 state·action 양쪽에 사용① pi0.5는 discrete_state_input=True가 기본이라 state를 정규화 후 토큰으로 이산화한다. 다른 stats를 쓰면 state 토큰 분포가 어긋나 pi05_droid 초기화의 이점이 날아간다.
② state와 action을 같은 정규화 프레임에 두면 action ≈ state + 작은 delta가 정규화 공간에서 성립한다.
③ 고정 stats라 다운로드 규모를 늘려도 정규화가 안 변해 체크포인트 간 비교가 유지된다.
안전성 근거: molmobot 실분포와 std가 사실상 일치, mean 차이도 0.5σ 이내.
소스 h5에 actions/joint_pos(절대)와 actions/joint_pos_rel(delta)가 둘 다 존재. 실측 joint_pos_rel[1] = [0]*7, commanded_action == joint_pos.
FrankaRobotConfig.command_mode = {"arm": "joint_position"}(robot_configs.py:160)이고 PI_Policy가 model_output[:7]을 그대로 action["arm"]에 넣는다 → 절대값이어야 정합. MolmoBot 논문도 "absolute joint positions" 명시.
| 항목 | 내용 | 우리 적용 |
|---|---|---|
| π0.5 finetune | 15K step → 평균 36.0% (zero-shot 10.0%) | 타깃 밴드 / 스텝 수 레퍼런스 |
| SigLIP freeze | vision encoder 전체 동결 — "to prevent overfitting to simulation rendering artifacts" | 1차 기본안으로 채택. PathRegex(".*img.*") |
| warmup | 1k step | 구 계획 값 유지 |
| from-scratch | 200k step / batch 1024 / lr 5e-5 → 93.5% | lr은 그보다 낮게(2.5e-5). 따라잡는 게 목표가 아님 |
샘플당 ≈ 6 × 2.3e9 × 712 tokens ≈ 1.1e13 FLOPs. B200 bf16 peak ~2.25 PFLOPS, JAX/XLA 실효 MFU 30–40% 가정 → 장당 0.7–0.9 PFLOPS.
| 구성 | 추정 step time | 15k step |
|---|---|---|
| 1× B200, batch 32 | ~0.5 s | ~2 h |
| 8× B200, batch 256 | ~2–5 s | ~8–21 h |
| 8× B200, batch 64 | ~0.6–1.3 s | ~3–5 h |
sjob -v로 GPU util을 확인해 데이터 바운드 여부를 판정한다.
pi05_droid와 동일해지므로 molmospaces 내장 PI_Policy를 무수정 사용. zero-shot 베이스라인과 finetune이 같은 코드 경로를 타 비교 신뢰도도 상승. 구 계획의 MlspacesPiPolicy 신규 어댑터는 폐기.| Phase | 내용 | 기간 | 게이트 |
|---|---|---|---|
| 0 블로커 | JAX env 신규 구축 + B200 sm_100 forward 검증 | 0.5–1일 | jax.devices() → B200 8장, pi0.5 forward 통과 |
| 1 | 변환기 수정 5건 + openpi 수정 3건 → val 재변환 | 0.5일 | letterbox 확인, eval 프레임과 픽셀 diff ≈ 0, 45GB → 2GB급 |
| 2 | norm stats 합성 (DROID state → state·actions) | 0.5일 | 정규화 후 99% 분위가 [−3, 3] 이내 |
| 3 | 학습 스모크 — 로그인 10 step + sbatch 500 step | 0.5일 | loss 단조 감소, step/s 실측으로 --time 확정 |
| 4 | train split 다운로드 2~3만 궤적 (~350–530 GB) + 변환 | 1–2일 | house ID ∩ bench-v2 = ∅ 확증 |
| 5 | 본 학습 15k step / batch 256 / 8× B200 / SigLIP freeze | 1–2일 | loss 수렴 |
| 6 | 평가 — PI_Policy 무수정, 5k/10k/15k 체크포인트 비교 | — | zero-shot 대비 향상 |
molmospaces-dataset 경로 불명 — EVAL_PLAN이 참조한 /home/nas2/junhahyung/scene-mem/molmospaces-dataset이 없다. bench-v2 JSON·씬 팩 위치가 있어야 Phase 6 가능. NAS 광역 스캔은 운영 규칙 §15상 금지 → 사용자 확인 필요.results/ 부재).DoorOpeningDataGenConfig의 robot 미확인. val 1샤드로 확인 필요.