Index
2026-05-07 — Plan

RGB/PT Latent Cache 분리 설계

EgoX v2 (exp3) | robocasa_hdf5.py · trainer.py · build_robocasa_latent_cache.py (신규)

TL;DR

0
RGB 재인코딩 (PT 재빌드 시)
3
수정 파일
1
신규 파일
5
Smoke Tests (V1~V5)

1 배경 / 목적

robocasa T2V 학습 시 Trainer.prepare_dataset이 single-worker dataloader로 latent cache를 빌드한다. VAE encoding이 GPU bottleneck이라 70K demos 기준 수 시간 소요.

현재 cache 구조의 문제

# 현재 (before): <cache_root>/cache/video_latent/robocasa_hdf5/ <F>x<H>x<W1+W2>/ ← use_pointmap=False <key>_s<start>.safetensors (RGB+PT 합친 grid) <F>x<H>x<W1+W2>_hcpt/ ← use_pointmap=True <key>_s<start>.safetensors (RGB+PT 합친 grid)
핵심 문제 1 — RGB reuse 불가: use_pointmap=True/False 모드를 별도 dir로 가르기 때문에 RGB encoding 결과가 두 모드 사이에서 재사용되지 않음. 모드 전환 시 RGB latent 전체 재빌드.
핵심 문제 2 — PT 수정 시 RGB 무효화: view2 GT depth invalid pixel이 norm.json 통계를 오염시키는 버그 수정(PT 재추출) 시 RGB latent까지 통째 무효화돼 VAE 재인코딩 필요. PT와 RGB가 동일 cache 파일에 묶여 있기 때문.
추가 불편: standalone cache builder 없어서 학습 entry(sbatch) 거쳐야만 cache 빌드 가능 → PT 데이터 빌드 전에 RGB latent 선빌드 불가.

2 작업 내용

스코프: RobocasaHDF5Dataset에서만 cache split 적용 (_BaseWidthConcatDataset 미수정). egoexo4d/droid는 이번 스코프 외.

1. cache 디렉토리 분리 구조 (after)

<cache_root>/cache/video_latent/robocasa_hdf5/ <F>x<H>x<W1+W2>_rgb/ ← RGB latent, mode 무관 영구 reuse <key>_s<start>.safetensors (rgb_lat) <F>x<H>x<W1+W2>_pt__<hash16>/ ← PT latent, norm.json 변경 시 자동 새 dir <key>_s<start>.safetensors (pt_lat)

2. PT cache hash 생성 (_pt_meta_hash)

fingerprint 입력: 모든 episode의 norm.json (resolved_path, size, mtime_ns) + pt_norm_mean/std (4DNeX scalar). SHA-256 16자. RANK==0만 stat I/O, 다른 rank는 episode cache JSON에서 hash 읽음 → NAS race 없음.

근거: extract_robocasa_pt.py.ptnorm.json을 동일 함수에서 같이 write하므로 norm.json stat이 PT 데이터의 충분 통계.

3. _build_grid_latent 분해

기존 함수를 _build_rgb_row_build_pt_row 두 헬퍼로 분리. 기존 _build_grid_latent은 두 헬퍼 호출 + cat으로 단순화 (하위 호환 유지).

4. _getitem_t2v cache split 로직

rgb_path = rgb_dir / f"{cache_key}_s{s:04d}.safetensors" pt_path = _pt_cache_dir() / f"{cache_key}_s{s:04d}.safetensors" # RGB: hit → load, miss → build + save # PT: hit → load, miss → build + save # 최종: torch.cat([rgb_row, pt_row], dim=-2) if use_pointmap else rgb_row

5. 신규 파일 및 변경 목록

파일변경
core/finetune/datasets/robocasa_hdf5.py_cache_dirs override, _pt_cache_dir/_pt_meta_hash 신규, _getitem_t2v cache split, is_sample_cached 신규, strict_rgb_must_exist kwarg, episode cache payload pt_meta_hash field
core/finetune/trainer.pyprepare_dataset pre-filter를 is_sample_cached에 위임, _strict_rgb_must_exist forward
scripts/build_robocasa_latent_cache.py (신규)--mode {rgb,pt,both} standalone cache builder (~50줄). Trainer.prepare_models + prepare_dataset 재사용.

6. Legacy cache 마이그레이션

자동 마이그레이션 없음. 기존 _hcpt/ dir은 새 코드가 lookup 안 해 자동으로 "없는 셈". 어차피 view2 outlier 수정으로 PT cache 전체 재빌드 예정 + backward compat 미요구 → 수동 삭제 안내만 README에 추가.

3 결과 (설계 검증 계획)

이 카드는 구현 계획(plan) 문서. 실제 구현 후 아래 5개 smoke test로 검증 예정:

테스트목적기대 결과
V1. RGB cross-mode reuseuse_pointmap=FalseTrue 전환RGB encode log 0회, PT만 인코딩
V2. PT 재빌드 무효화extract_robocasa_pt.py --overwrite로 norm.json mtime 변경 후 재학습_pt__<new_hash>/ 빌드, RGB 디렉토리 untouched
V3. standalone --mode rgbPT 없는 상태에서 RGB 선빌드_rgb/ 채워짐, _pt__*/ 없음, exit 0
V4. multi-GPU race4-GPU 학습 startupnon-RANK-0이 episode cache JSON에서 hash 읽음, stat loop 미실행
V5. legacy cache stale기존 _hcpt/ 가득한 cache_root로 새 코드 실행_hcpt/ 무시, 새 dirs 빌드
현재 상태: 설계 완료, 구현 미착수. V1~V5 smoke test는 구현 후 실행.

4 Takeaway

PT outlier 수정 사이클 단축

현재 진행 중인 view2 PT outlier 수정(GT depth invalid pixel → norm.json 오염 → pred cluster 수백 m 오프셋)의 핵심 불편은 PT 재추출 후 RGB latent도 다시 빌드해야 한다는 것. 이 플랜 구현 시 PT cache만 무효화되고 RGB latent는 재사용 → PT 재빌드→ 재학습 사이클 시간 크게 단축.

standalone builder로 PT 데이터 빌드와 RGB latent 빌드 타임라인을 분리할 수 있어 GPU/CPU 자원 스케줄링도 유연해진다. trainer.pyis_sample_cached만 호출해 cache 기하구조를 직접 알 필요가 없어져 결합도 감소.

5 Next Steps

미해결 한계

base class 확장 미포함: egoexo4d/droid는 이번 스코프 외. 사용 시작 시 _BaseWidthConcatDataset까지 동일 패턴 확장 필요.

norm.json stat I/O: NAS 기준 episode당 1 stat — 수천 demo면 수 초. RANK==0 1회만이라 OK이지만 수만 episodes로 늘면 재고.

legacy _hcpt/ 자동 정리 없음: 사용자 수동 삭제. README에 한 줄 주의.

다음 단계

1단계: 이 plan 승인 → robocasa_hdf5.py 구현 → V1~V5 smoke test 순서로 진행.

2단계: view2 PT outlier 수정을 별도 plan으로 분리 — depth invalid pixel masking / extract_robocasa_pt.py clipping 적용 → norm.json 재추출 → 새 _pt__<new_hash>/ 빌드 → 재학습.

제출 예시:

conda activate <env> # RGB latent 선빌드 (PT 없어도 가능) sbm "python scripts/build_robocasa_latent_cache.py --config configs/robocasa_t2v.yaml --mode rgb" \ --gres=gpu:1 -c 14 --mem 200GB --qos=core-extra -J build_rgb_cache # PT 데이터 준비 후 PT latent 빌드 sbm "python scripts/build_robocasa_latent_cache.py --config configs/robocasa_t2v.yaml --mode pt" \ --gres=gpu:1 -c 14 --mem 200GB --qos=core-extra -J build_pt_cache