Index
2026-05-11 — Plan

Latent-IDM Option D — Δhidden KV (motion-only signal) 설계 + 구현 착수

GR00T-Dreams | Latent Track | Latent-B 폐기 후 새 가설: Δh = h[i+1] - h[i] as KV

TL;DR

5,184
KV tokens (D)
386M
trainable params
556 GB
캐시 재사용
60K
학습 steps

1 배경/목적 — 왜

Latent-B 폐기 사유

Latent-B 60K 학습이 5/6 이후 preempt + lineage 소실로 step 15,000 (25%)에서 정지. Pixel v2_8gpu 134.8mm ≈ Latent-A sliced 131.8mm — 같은 batch 1024에서 pixel ≈ latent. Latent-B가 cost(28GB extractor 또는 556GB 캐시)만큼 값을 줄지 의문이었음. 검증 미완 상태로 폐기, 새 가설로 전환.

Option D 가설

Action은 next state로 가는 변화 예측이다. Latent-B는 매 frame의 absolute feature를 KV로 주는데, action signal은 그 feature들의 차이에 분포할 가능성이 큼. Δfeature만 직접 주면:

  • Pro: motion signal이 KV 토큰 자체에 인코딩 → ActionDiT가 cross-attn으로 찾을 필요 없음 (신호/표현 정렬).
  • Pro: BG/static 정보가 cancel out → noise 감소 + KV 토큰의 정보 밀도 ↑.
  • Con: absolute pose (gripper 닫혔는지, 손이 컵에 닿았는지) 손실 → state-dependent task 약점 가능.

2 작업 내용 — 어떻게

Phase 0 RGB + Cosmos Δ 시각화 사전 검증

학습 5일 돌리기 전, Cosmos hidden의 Δ가 시각적으로 motion 영역에 신호를 가지는지 확인. scripts/viz_latent_D_pre_validation.py 신규 작성 — 3 ep × 3 view(ext1/ext2/wrist) × 4 rows(실제 frame / RGB Δ / ‖Δh‖ heatmap / Δh PCA) 총 9 figure 생성. a_off=24 (중반부, motion 활발) 기준. 판단: 9 figure 중 5+ OK → Go.

Phase 0 결과: claude/260511/viz/latent_D_pre_validation/summary.md — GO 판정, 3 ep × 3 view 모두 ‖Δh‖ heatmap이 RGB Δ의 motion 영역과 시각적으로 일치.

Phase 1 인프라 구현

신규/수정 파일: gr00t/data/dataset_latent_idm.py +class RobocasaLatentIDMDatasetHiddenDelta(RobocasaLatentIDMDatasetHiddenRaw) __getitem__: hidden(5,27,48,5120) → Δh = h[1:]-h[:-1] → (4,27,48,5120) bf16 +def collate_latent_idm_hidden_delta(batch) → (B,4,27,48,5120) gr00t/model/action_head/flow_matching_action_head_idm.py +feature_source == "cosmos_hidden_delta_cache" 분기 __init__: extractor=None, kv_projector=Linear(5120,1024) (B와 동일) encode_visual: data["hidden_delta"] (B,4,27,48,5120) → reshape (B,5184,5120) → kv_projector → (B,5184,1024) IDM_dump/base_latent_D.yaml — base_latent_B_cached.yaml 복사 + feature_source 변경 scripts/idm_training.py — cosmos_hidden_delta_cache 분기 추가 scripts/run_idm_train_robocasa_latent_D_60k_8gpu.sh — B script 복사 + save_steps=2000

Phase 2 Smoke test (real cache 데이터, B=3, 3 step)

파일: tmp/debug_latent_D_real.py step 0: loss 1.531, |grad|.mean 0.0 (bf16 underflow 0.00e+00) step 1: loss 1.424, |grad|.mean 1.64e-06, max 8.05e-04 step 2: loss 1.134, |grad|.mean 2.65e-06, max 2.03e-03 kv_projector weight Δ: max 1.6e-4 → 실제 학습 진행 확인 ✅

Phase 3 60K sbmr 제출

sbmr 20 "bash scripts/run_idm_train_robocasa_latent_D_60k_8gpu.sh" \ --qos=extra --gres=gpu:8 -c 112 --mem 1600GB 하이퍼파라미터: batch=8, grad_accum=16 → eff batch 1024 (A/B와 동일) lr=1e-4, warmup=0.05 save_steps=2000 (B의 5000에서 단축 — 4h 내 저장) max_steps=60000 ETA: ~5.3일

3 Data Flow (batch B=1 기준)

Cache (.pt, NAS 556 GB): blob["hidden"]: (24, 27, 48, 5120) bf16 ↑ 24=VAE temporal compress(93px→24lat), 27/48=patch grid, 5120=DiT block-27 dim Dataset slicing: a_off ∈ {0,4,...,76} → lat_start = (a_off×24)//93 h = hidden[lat_start:lat_start+5] (5,27,48,5120) Δh = h[1:] - h[:-1] (4,27,48,5120) ← D의 추가 encode_visual: Δh.reshape(B, 4×27×48, 5120) = (B, 5184, 5120) kv_projector: Linear(5120→1024) KV = (B, 5184, 1024) ActionDiT (12L): Q: action tokens (B,16,1024) KV: Δh tokens (B,5184,1024) Per-block: SelfAttn(Q) + CrossAttn(Q→KV) + MLP Output: (B,16,32) velocity_pred → flow matching loss

D vs B 차이 (두 가지뿐)

항목Latent-BLatent-D
Dataset 마지막hidden (T=5)hidden[1:] - hidden[:-1] (T=4)
KV tokens5×27×48 = 6,4804×27×48 = 5,184
나머지 전부완전 동일 (modules, forward, optimizer, loss)

4 Takeaway

Phase 0 viz GO 판정: Cosmos hidden의 Δ가 RGB Δ의 motion 영역과 시각적으로 일치 → D 가설의 사전 신뢰성 확보. Smoke test에서 3-step으로 loss 1.531→1.134 + weight Δ 확인 — forward path 완전 정상.
Latent-B 인프라(캐시 556 GB)를 그대로 재사용하므로 추가 cache 빌드 없음. Dataset 한 줄 변경으로 깔끔한 ablation — motion-only vs absolute hidden 가설의 단일 변수 비교.

가설 검증 포인트

H1: D ≥ A (131–115mm) → motion-aligned 가설 ✅
H2: 만약 D가 gripper/contact task에서 약하면 → absolute feature 필요 → [h, Δh] concat variant 후속.
H3: D ≥ pixel v2 (134.8mm) → Δ-only Cosmos hidden만으로 pixel 이상.

5 Next Steps

학습 모니터링: sjob --json <jid> grep -oE "loss.*grad_norm" slurms/taewoongkang_<jid>.out | tail -5 ls -td outputs/idm_robocasa_latent_D_60k_8gpu/checkpoint-* | head -3