Index
2026-05-11 — Progress

IDM v2 Pixel — mg30_real_h50 v3.0 직접 읽기 파이프라인 구축

GR00T-Dreams | IDM v2 (action+state) · AV1 · torchcodec · 720 ep · 8 GPU 학습 준비

TL;DR

17×
torchcodec 가속
0.73 ms
2-frame seek
206K
학습 steps
~31 h
8 GPU 60K ETA
1.273→1.16
30-step loss

1 배경 / 목적

기존 IDM v2 (idm_robocasa_mg3000_v2_state_8gpu/checkpoint-60000, loss 0.0121) 는 학습 데이터의 idm_state.npzquat sign canonicalize (연속 프레임간 q ↔ -q 부호 통일)가 적용되어 있다. 수학적으로 동등하지만, 다운스트림 VLA(Pi0.5)가 사용할 mg30_real_h50observation.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 변경.

2 작업 내용

① mg30_real_h50 v3.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.

② Video Backend 결정 (AV1 → torchcodec)

Backend2-frame seek3-cam aggregate결과
decord✗ AV1 미지원 (open 실패)
PyAV (libdav1d)12.8 ms38 ms✓ 동작
torchvision.io✓ (deprecated 경고)
torchcodec0.73 ms2 ms✓ 채택 (17×)
torchcodec 채택: dlopen 체인 libstdc++ CXXABI_1.3.15 문제를 LD_LIBRARY_PATH (venv lib/ + nvidia/*/lib/) 노출로 해결. Pi0.5 학습 스크립트와 동일 패턴.

③ 신규 코드 3파일

④ Action / State 패킹 스키마

actions[:, 0:12] = action_eef (12-dim, identity norm, raw 이미 [-1,1]) actions[:, 12:15] = base_to_eef_pos (linear norm → [-1,1]) actions[:, 15:19] = base_to_eef_quat (raw, 부호 보존, ‖q‖=1) actions[:, 19:21] = gripper_qpos (linear norm) actions[:, 21:24] = base_pos (linear norm) actions[:, 24:28] = base_quat (raw, ‖q‖=1) actions[:, 28:32] = 0 / mask=False

⑤ Torchcodec 전환 업데이트

사용자 지적: "Pi0.5 학습은 torchcodec으로 했더니 더 빠르다." 측정 결과 17× 개선 확인 → dataset_h50_pixel_v2.py av.open → VideoDecoder 교체. SLURM shell에 LD_LIBRARY_PATH export 추가.

3 결과 (수치)

Video decode 성능 비교

항목PyAVtorchcodec비율
2-frame seek (1 cam)12.8 ms0.73 ms17×
3-cam aggregate (per sample)38 ms~2 ms19×
Smoke __getitem__ (warm, 6 frames)44-48 ms12 ms
Mini train it/s (B200, bs 4)11.4710.82model forward bound

Smoke test (6 idx)

검증 항목결과
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 call650 ms / 12 ms

Mini training (30 step, B200 1 GPU, bs 4)

11.47 it/s
throughput
1.273→1.16
loss (30 step)
206,570
dataset length
612M
params

학습 시간 추정

8 GPU × 6.5 it/s 가정 → 60K step ÷ (6.5 × 8) ≈ ~31시간 (B200 8 GPU, effective batch 1024)

4 Takeaway

Schema 정합성 확보: IDM v2 dump의 [0:12] action + [12:28] state가 mg30_real_h50의 observation.state와 byte-identical (denormalize 후). Pi0.5 학습에 dump 그대로 투입 가능.
v3.0 직접 read 가능 입증: 720 ep × 4시간 single mp4 (AV1) 환경에서 torchcodec streaming으로 dataloader bottleneck 없음 (~2 ms/sample).
모델 architecture 0 변경: FlowMatchingActionHeadIDM + base.yaml siglip path 그대로. 비교 baseline (mg3000_v2_state_8gpu, Latent-A v2)과 head 동일, dataset만 교체 → clean ablation.

핵심 의미

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이 분기점.

5 Next Steps

즉시 (학습 제출)

conda activate gr00t-idm sbmr 5 "bash scripts/run_idm_train_robocasa_h50_v2_8gpu.sh" \ --gres=gpu:8 -c 112 --mem 1600GB --qos=extra

또는 minhopark own 빌리려면 --qos=own으로 제출 (latent v2도 같은 방식).

학습 완료 후