pi05_delta 등록 — _preprocess_images_with_delta monkey-patch로 5D→4D delta 변환. 9/9 unit tests PASS.현 IDM 트랙(Pixel SigLIP2-large, Latent multistream)보다 Pi0.5가 24-ep heldout에서 더 좋은 이유가 pretrained PaliGemma backbone 때문이라는 가설. Pi0.5의 VLA 사전학습에서 이미 시각-언어-행동 연계를 학습했으므로 IDM 형태로 fine-tune하면 현 SigLIP2 IDM을 능가할 수 있다.
기존 Latent-IDM 트랙들 (A: 107.5mm, v3: 110.9mm)은 모두 random-init DiT 기반이다. PaliGemma full backbone을 활용하면 표현 풍부성에서 우위를 가질 수 있다.
IDM 입력 형태: 두 프레임 x_t와 x_{t+16}의 forward delta를 입력으로 사용 — closed-loop이 아닌 open-loop labeling 상황이라 IDM 원정의(vision-only, state output)와 일치. disable_proprioceptive_obs=true로 state input 차단.
observation_delta_indices가 obs feature별로 다른 delta 미지원이라 이를 우회하려면 라이브러리 수정 필요. v1은 action만(12-dim), state output은 v2 트랙으로 분리.4개 핵심 결정 확정:
PI05Policy._preprocess_images (modeling_pi05.py:1131) — 5D 입력 시 깨짐 확인 → monkey-patch 채택.disable_proprioceptive_obs: top-level CLI flag (policy.disable_proprio 아님).observation_delta_indices=[0, 16]: subclass + register pattern으로 config 상속.update_method_to_delta_input, train_bc.py L489에 후크.신규 파일 (robot-data-gen):
resfit/lerobot/policies/pi05/configuration_pi05_delta.py — PI05DeltaConfig(PI05Config), delta_lookahead=16, observation_delta_indices=[0, 16] property, @PreTrainedConfig.register_subclass("pi05_delta").resfit/lerobot/policies/pi05/modeling_pi05_delta.py — compute_delta 헬퍼 + _preprocess_images_with_delta (5D→4D forward delta 후 super 4D path).resfit/lerobot/utils/convert_to_delta_input_policy.py — update_method_to_delta_input (types.MethodType monkey-patch).수정 파일: libs/lerobot/.../factory.py elif 분기 추가, convert_to_multi_env_policy.py pi05_delta 포함, train_bc.py policy 생성부 분기 추가.
단위 테스트 (GR00T-Dreams): tests/test_pi05_delta.py 9개.
새 PI05DeltaPolicy 클래스로 상속하지 않고 monkey-patch를 선택한 이유: (a) PI05Policy.from_pretrained가 "pi05" 타입을 가정한 경로가 많아 새 클래스 시 weight load 재구현 필요, (b) 차이가 _preprocess_images 한 함수뿐이라 상속 비용 과함, (c) update_method_to_multi_env가 이미 monkey-patch 패턴 사용 — 일관성.
scripts/eval_pi05_delta_idm.py (473 lines) — open-loop chunk 단위 labeling + sim replay. 24 task × 30 ep heldout (mapping_heldout_to_hdf5.json). EEF mm + SR 측정.
Bug fix 2건:
4d3dc50): model module import 시 register_subclass 미실행 → "Couldn't find a choice class" 에러 → model module에 configuration side-effect import 추가.c2811e7): eval script가 32-dim state 빌드 시도 → dataset native 16-dim과 충돌 → 16-dim으로 정정.| Test | 검증 내용 | 결과 |
|---|---|---|
test_compute_delta_5d_two_frame | (2,2,3,128,128) → (2,3,128,128), img[1]-img[0] | PASS |
test_compute_delta_5d_single_frame_passthrough | T=1 → 그대로 (2,3,128,128) | PASS |
test_compute_delta_4d_passthrough | (B,C,H,W) 4D 그대로 | PASS |
test_compute_delta_5d_wrong_T_raises | T=3 → ValueError("T in") | PASS |
test_compute_delta_3d_raises | 3D → ValueError("must be 4D or 5D") | PASS |
test_pi05_delta_config_observation_indices | delta_lookahead=16, indices=[0, 16] | PASS |
test_pi05_delta_config_custom_lookahead | delta_lookahead=8 → [0, 8] | PASS |
test_pi05_delta_config_registered_in_lerobot | get_choice_class("pi05_delta") is not None | PASS |
test_preprocess_images_with_delta_routes | monkeypatch로 4D 전달 검증 | PASS |
| Step | Loss | Gradient norm |
|---|---|---|
| 10 | 0.395 | 7.51 |
| 20 | 0.196 | 2.12 |
| 30 | 0.194 | 1.37 |
| 50 | 0.186 | 1.11 |
| 80 | 0.148 | 0.58 |
| 100 | 0.148 | 0.77 |
| Track | mm (24-ep) | 비고 |
|---|---|---|
| Latent-A multistream | 107.46 | 현재 best |
| Latent-A v3 multi-layer | 110.9 | |
| Pixel v2_8gpu (batch 1024) | 134.8 | baseline |
| Pi0.5 Delta-IDM (목표) | <107.5 | Full train 완료 후 측정 |
기존 IDM 트랙은 모두 random-init SigLIP + DiT 조합이었다. Pi0.5 전체를 IDM 형태로 전이학습하는 이 접근은 세 가지를 동시에 검증한다: (1) pretrained VLA backbone이 IDM task로 전이되는가, (2) chunk_size=16으로 token seq 축소가 action_expert weight 활용에 문제 없는가, (3) state input 없이도 PaliGemma가 action을 정확히 labeling할 수 있는가. Smoke 통과로 모두 초기 긍정 신호.
run_pi05_delta_eval.sh wrapper).resolve_delta_timestamps 패치 또는 collate override로 obs.state를 별도 chunk indexing. v1 결과 좋으면 진행.