mg30_real_h50 raw 부호와 byte-mismatch → Pi0.5 학습 source로 부적합 → v3.0 직접 읽기 라인 신규 구축기존 IDM v2 (idm_robocasa_mg3000_v2_state_8gpu/checkpoint-60000, loss 0.0121) 는 학습 데이터의 idm_state.npz에 quat sign canonicalize (연속 프레임간 q ↔ -q 부호 통일)가 적용되어 있다. 수학적으로 동등하지만, 다운스트림 VLA(Pi0.5)가 사용할 mg30_real_h50의 observation.state가 raw HDF5 부호를 그대로 쓰기 때문에 IDM dump 결과와 VLA 학습 source가 byte-mismatch가 된다.
예시 비교 (CloseDoubleDoor demo_0 frame_0):
| 필드 | IDM v2 npz (canonicalized) | raw HDF5 / mg30_real_h50 | 일치 |
|---|---|---|---|
| base_to_eef_quat | (+0.992, +0.022, +0.125, -0.016) | (-0.992, -0.022, -0.125, +0.016) | 부호 반전 ✗ |
| base_to_eef_pos | (0.235, -0.025, 0.585) | (0.235, -0.025, 0.585) | byte ✓ |
| gripper_qpos | (+0.0206, -0.0205) | (+0.0206, -0.0205) | byte ✓ |
| base_pos / base_quat | 일치 | 일치 | byte ✓ |
목표: mg30_real_h50 (HF v3.0, 720 ep, raw quat 보존)을 직접 학습 source로 쓰는 v2 라인을 신규 구축. v3.0 → v2.1 변환 없이 그대로 read. 모델 architecture 0 변경.
AV1 codec (libsvtav1), chunks_size=1000 → 720 ep / 1 chunk / 1 data file. 비디오는 3 cam × 2 mp4 (concat AV1). action = 12-dim [-1,1] (min_max identity), state = 16-dim H50 schema.
| Backend | 2-frame seek | 3-cam aggregate | 결과 |
|---|---|---|---|
| decord | — | — | ✗ AV1 미지원 (open 실패) |
| PyAV (libdav1d) | 12.8 ms | 38 ms | ✓ 동작 |
| torchvision.io | — | — | ✓ (deprecated 경고) |
| torchcodec | 0.73 ms | 2 ms | ✓ 채택 (17×) |
gr00t/data/dataset_h50_pixel_v2.py (~330 줄): transforms bypass, v3.0 직접 read, PyAV→torchcodec, model-ready dict 반환scripts/idm_training_h50_pixel_v2.py (~150 줄): feature_source="h50_v3_pixel" 분기 추가scripts/run_idm_train_robocasa_h50_v2_8gpu.sh (~50 줄): 8 GPU, bs 16, grad_accum 8, 60K steps, auto-resume사용자 지적: "Pi0.5 학습은 torchcodec으로 했더니 더 빠르다." 측정 결과 17× 개선 확인 → dataset_h50_pixel_v2.py av.open → VideoDecoder 교체. SLURM shell에 LD_LIBRARY_PATH export 추가.
| 항목 | PyAV | torchcodec | 비율 |
|---|---|---|---|
| 2-frame seek (1 cam) | 12.8 ms | 0.73 ms | 17× |
| 3-cam aggregate (per sample) | 38 ms | ~2 ms | 19× |
| Smoke __getitem__ (warm, 6 frames) | 44-48 ms | 12 ms | 4× |
| Mini train it/s (B200, bs 4) | 11.47 | 10.82 | model forward bound |
| 검증 항목 | 결과 |
|---|---|
| images shape | (6, 3, 256, 256) ✓ |
| actions shape / mask | (16, 32) / [0:28]=True [28:32]=False ✓ |
| action norm 범위 | [-1, 1] ✓ |
| state quat ‖q‖ | 1.000 (eef + base 양쪽) ✓ |
| cold call / warm call | 650 ms / 12 ms |
8 GPU × 6.5 it/s 가정 → 60K step ÷ (6.5 × 8) ≈ ~31시간 (B200 8 GPU, effective batch 1024)
latent-A v2의 base_to_eef_pos 254mm, base_quat 1.4m 오차 문제는 sign canonicalize 외에도 MG-3000 precompute npz와 mg30_real_h50 간의 quat 부호 불일치에서 기인했을 가능성이 있다. h50 pixel v2는 이 변수를 제거하고 순수하게 pixel→action+state end-to-end로 학습하므로 state quality 개선이 기대된다. 8 GPU 학습 완료 후 24-ep eval이 분기점.
또는 minhopark own 빌리려면 --qos=own으로 제출 (latent v2도 같은 방식).
| 모델 | EEF Action mm | State quality |
|---|---|---|
| MG-30 v2_8gpu (action only) | 134.8 | — |
| Latent-A v2 (action+state) | 127.9 | base_pos 1.4m ❌ |
| h50 pixel v2 (이번) | TBD | TBD |