observation.state 2-timestep 버그 발견·수정·검증factory.py:62 resolve_delta_timestamps가 observation.state에도 [0, 16] 적용 → state shape (2, 16) malform. train-eval 불일치로 loss 수렴해도 SR=0 구조적 보장.train_bc.py에서 observation.state를 delta_indices에서 pop. state shape (2,16) → (16,) 실증 검증 PASS.Pi0.5-Delta IDM은 두 프레임(x_t, x_{t+16})의 픽셀 차분을 입력으로 pseudo-action을 labeling하는 접근법이다. v1(state-off) / v2(state-on) / normfix 세 단계를 거쳤으나 EEF mm가 각각 562 / 540 / 396 mm로 SigLIP2 baseline 107mm 대비 3.7~5.2×에 머물렀고, SR은 모든 run에서 ≈0%였다.
이번 세션의 목적은 체계적인 통제 실험으로 "delta 가설 기각"이 정당한지 확인하는 것이었다. 조사 방향: ① chunk=16 호환성, ② in-train eval 버그, ③ pi05_delta 코드 경로 자체.
B1(first mode, 단일 프레임)은 사실상 plain pi05와 동일 입력인데도 부진. wandb config diff에서 working plain pi05와 B1의 차이를 추출했더니 3개뿐이었다: chunk_size(16/50), n_action_steps(16/25), policy.type(pi05_delta/pi05). lr·optimizer·wd·batch 등 모든 HP가 동일. launch_pi05_b0_ref.sh:7 주석에 "chunk=16→50 pi05_base head 호환"이 명시되어 있어 chunk 교란 가능성을 검증해야 했다.
Fix-2(first→closed-loop eval 라우팅)를 적용한 B1(5001)을 resume @8000 후 4933과 동일 척도(closed-loop SR)로 비교. 유일한 차이 = policy.type=pi05_delta.
4933 정상(SR 상승) + 5001 flat-0 → pi05_delta 코드 경로 단일 용의자로 좁혀진 뒤 소스를 탐색했다.
CPU 스모크: state shape (2,16)→(16,), image (2,3,128,128) 유지 PASS. 5031(first_sf) launch 후 wandb 로그에서 "dropped observation.state from delta_indices" 마커 확인. closed-loop SR 추적으로 4933과 비교.
버그 탐색 과정에서 delta_mode 3종(delta/first/2frame) 구현도 완료했다 — 모델 코드 0 변경, config field + monkey-patch 라우팅만.
| 파일 | 변경 내용 |
|---|---|
configuration_pi05_delta.py | delta_mode field + __post_init__ (2frame 시 empty_cameras=3 자동) |
modeling_pi05_delta.py | _preprocess_images_first_only, _preprocess_images_two_frame 추가 |
convert_to_delta_input_policy.py | _MODE_TO_FN 라우팅 (config.delta_mode로 train/eval 자동 일관) |
train_bc.py | STATEFIX + Fix-2 per-mode eval 라우팅 (_delta_offline 분기) |
idm_intrain_eval.py | 신규 — mode-correct offline in-train eval (delta/2frame) |
launch_pi05_delta_idm.sh | DELTA_MODE / GRAD_CKPT / EXP_TAG env hook 추가 |
policy.type → pi05_delta 코드 경로 버그 확정.observation.state shape (2, 16) 실증 확인. monkey-patch 3종 미처리 → train/eval 완전 불일치. v1/v2/normfix 562/540/396mm 전부 무효 선언.| 실험 | config | step | SR | 판정 |
|---|---|---|---|---|
| 4933 | plain pi05, chunk=16, working recipe | 2K→5K | 0.60→0.80 | chunk OK, 기준선 |
| 5001 | pi05_delta first mode, Fix-2 fixed eval | 9K→13K | 0/0/0/0.05/0.05 | pi05_delta 경로 버그 확정 |
policy.type. SR 0.60 vs 0.00. pi05_delta 코드 경로 버그가 원인이며 normfix/chunk/eval-harness는 모두 무관.| 실험 | EEF mm | state-on? | 버그 영향 | 유효성 |
|---|---|---|---|---|
| v1 (state-off) | 562.1 | No | state 축 무관. 단 normfix(A) 버그 포함 | ❌ 무효 (normfix 미적용) |
| v2 (state-on) | 539.9 | Yes | state (2,16) malform 완전 오염 | ❌ 무효 |
| normfix (state-on) | 395.9 | Yes | state malform 오염 + normfix partial fix | ❌ 무효 |
| SigLIP2 baseline (Latent-IDM A) | 107 | — | 별개 아키텍처, 무관 | ✅ 유효 |
| Step | 5031 first_sf (statefix) | 4933 plain pi05 (baseline) |
|---|---|---|
| ~2K | 0.30 | 0.60 |
| ~4K | 0.80 | 0.75 |
| ~6K | 0.65 | 0.80 |
| ~10K | 0.75 | — |
| ~17K | 0.95 | — |
| Job | 계정 | 실험 | 목적 | 신호 |
|---|---|---|---|---|
| 5114 | minhopark | delta_sf (★핵심) | 버그 없는 delta-IDM 첫 신뢰 가능한 eef_mm | eval/eef_mm 수렴값 |
| 5115 | minhopark | 2frame_sf | 대체 입력 scheme (자연 이미지 2개) | eval/eef_mm |
| 5031 | taewoongkang | first_sf | statefix 검증용 (✅ 완료) | closed-loop SR ≈ 4933 |
| 4933 | taewoongkang | plain pi05 chunk=16 | 통제 baseline | closed-loop SR |
사용자는 반복해서 "코드 잘못/improper experiment일 확률 높다"를 주장했다. "값이 NaN 아니면 버그 없음", "SR=0은 forward-IDM이라 원래 그런 것", "cold라 0"이라는 안이한 설명이 반복적으로 틀렸다. 진실은 체계적인 통제 실험(4933, 5001)과 소스 확인(factory.py)으로만 도달했다.
key.startswith("observation.")는 delta_indices를 image-only로 제한하려는 의도였으나 state까지 매칭. 이 1-줄 조건이 수주간의 실험 결과를 전부 무효화했다. state처럼 "당연히 delta를 안 쓰겠지"라는 암묵적 가정에 대해 명시적 예외처리가 필요했다. fix(pop state from delta_indices)는 1줄이지만 그 영향은 결정적이었다.
효과적이었던 방법: (1) config diff — working vs broken run의 정확한 차이 3개만 추출, (2) 통제 실험 — 가설을 하나씩 소거(chunk→eval라우팅→pi05_delta 경로), (3) 실증 검증 — 주장이 아니라 shape 출력으로 확인. "NaN 없음 = 버그 없음"은 잘못된 기준 — malformed input이라도 loss는 수렴할 수 있다.
statefix + 공정 input(pixel delta) 조건에서 처음으로 신뢰 가능한 eef_mm 측정이 이루어진다. wandb run pi05_delta_idm_4gpu_state_on_sf_acc2, Monitor bxlsvyh9i. 20K 수렴값으로 SigLIP2 107mm 대비 판정 — 결과는 closed-loop eval 카드에 기록됨.
delta-입력 대신 x_t와 x_{t+16}을 각각 별도 image token으로 넣는 scheme. B200 OOM 이력(4823→grad_ckpt fix) 있으므로 OOM 시 BATCH=8 fallback. delta_sf 결과 대비 "자연 이미지 2개 vs 차분" 비교 가능.
① lerobot/pi05_base 로드 시 embed_tokens.weight missing 경고는 Gemma tied-embedding 양성 artifact — pretrained 미로드 아님. 알람 금지.
② checkpoint rotation race: 학습 중 잡의 특정 step ckpt를 eval에 pin하면 rotation으로 소멸 위험. 완료된 잡의 최종 ckpt 사용.
③ in-train eval: delta/2frame은 offline-replay eval, first/plain pi05는 closed-loop eval. 혼용 금지.