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-B | Latent-D |
| Dataset 마지막 | hidden (T=5) | hidden[1:] - hidden[:-1] (T=4) |
| KV tokens | 5×27×48 = 6,480 | 4×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 이상.