Index
2026-05-01 — Progress

LGM-DA3 Prototype 셋업 완료

VGGRPO | Connector · Stitch Search (best=6) · Phase-B Loss · Train Shell — 총 1300라인

TL;DR

6
DA3 best layer
0.0252
stitch MSE
4.59s
forward/96views
8.95GB
peak GPU (no_grad)
25.27M
LoRA trainable
1300
총 라인

1 배경 / 목적

클린 RoboCasa 데이터를 기다리는 동안, DA3 backbone 교체 비용을 조기에 정량화하고 데이터 도착 시 두 트랙(Any4D / DA3)을 동시에 학습 큐에 던질 수 있게 prototype 셋업. 사용자 합의 스코프: 학습 미실행, 셋업+검증만.

5개 작업: 1) DA3 조사 → 2) connector 스케치 → 3) stitch search → 4) phase-B loss 설계 → 5) train shell.

2 작업 내용

1. Connector (src/models/lgm_connector_da3.py, 235L)

LGMConnectorDA3: Wan VAE latent list → tokens [B, S, N, C] (S=N_CAM×T). Conv3d 구조 v2와 동일 (16→1024, kernel 5, stride (1,2,2), padding 2). DA3StitchedBackbone: connector + DA3 wrapping, GT extrinsic 조건부 cam_token 생성, stitch_layer부터 forward.

# smoke test 결과 input: 3 cam × 32 frame VAE latent tokens: [1, 96, 778, 1024] ✓

2. Stitch Search (scripts/find_stitch_layer_da3.py, 322L)

find_stitch_layer_robocasa.py의 closed-form ridge regression 패턴 재사용. 탐색 범위 layer [1..8] (alt_start=8 이상은 cross-view 의존으로 제외). Hook: da3.backbone.pretrained.blocks[idx-1] forward hook.

# 실행 (SLURM job 2803, 1 GPU core-extra, ~12분) bash scripts/find_stitch_layer_da3.sh

3. Phase-B Loss (src/models/phase_b_loss_da3.py, 232L)

Any4D의 per-view (s,b) alignment 전체 제거. per-clip 1 scalar scale로 단순화. scene_flow 항목 drop. Ray는 DA3 DPT 출력 해상도 자동 감지 후 GT ray 맞춤 계산 (depth와 spatial이 다를 수 있음).

Loss TermAny4D pathDA3 path
Depthper-view (s,b) LS fitper-clip 1 scalar (median ratio)
Raypseudo dense L1origin scaled + direction unit split L1
Pose (rot)quat L13×3 matrix L1 (sign ambiguity 회피)
Pose (trans)per-clip 1 scale동일 depth scale 공유
Scene flowpseudo L1drop
# smoke test identity poses → rot/trans loss 0, depth/ray L1 정상 수렴 ✓

4. Train Shell (scripts/train_lgm_robocasa_da3_v0.py, 296L)

train_lgm_robocasa_v0.py 구조 미러링. DDP, sbmr launcher, auto-resume. gt_cam_inject 플래그로 GT extrinsic/intrinsic → DA3 cam_enc 흘릴지 제어.

3 결과

파일별 검증 상태

파일라인상태
src/models/lgm_connector_da3.py235AST OK + smoke test (token shape 1×96×778×1024 ✓)
scripts/find_stitch_layer_da3.py322AST OK + job 2803 실행 완료
src/models/phase_b_loss_da3.py232AST OK + smoke test (loss components 정상 ✓)
scripts/train_lgm_robocasa_da3_v0.py296AST OK (학습 미실행)
scripts/find_stitch_layer_da3.sh27exec
scripts/train_lgm_robocasa_da3_v0.sh60exec (STITCH_LAYER=6 기본값 갱신)

Stitch Layer Search 결과 (job 2803)

LayerMSE순위
50.02532위
60.02521위 (best)
70.02853위
8+제외 (cross-view attention)
Best layer = 6 (MSE 0.0252). U자형 커브, layers 5/6이 거의 동일 (5: 0.0253). Any4D best=7과 1 layer 차이 — DA3의 within-image regime (< alt_start=8) 깊은 쪽이 sweet spot.

Forward Dry Run (DA3StitchedBackbone, login 1-GPU)

입력: 3 cam × 32 frame VAE latent (random) 출력 검증: depth [1, 96, 294, 518] ✓ depth_conf [1, 96, 294, 518] ✓ extrinsics [1, 96, 3, 4] ✓ intrinsics [1, 96, 3, 3] ✓ ray [1, 96, 168, 296, 6] ← 주의: depth 대비 0.57× spatial ray_conf [1, 96, 168, 296] ✓ forward: 4.59s (no_grad), peak GPU: 8.95 GB (B200) 학습 backward 예상: ~30-40 GB → OK (B200 1장 80GB)
Ray 해상도 이슈 발견: DA3 DPT head가 ray를 depth보다 저해상도로 출력 (168×296 vs 294×518). phase_b_loss_da3.py에서 pred["ray"].shape 자동 감지 후 GT ray를 그 해상도로 계산하는 로직 추가 완료. 별도 resize 비용 없음.

발견/수정한 버그 5건

번호이슈수정
1out_layersda3.backbone에 있음 — pretrained 아님경로 수정
2cam_token 치환에서 None일 때 skip 안 됨 (cam_token 없는 경우)None 분기 추가
3DPT head에 raw tuple 직접 못 보냄 — get_intermediate_layers 후처리 필요norm + CLS/register slice + 순서 swap 추가 구현
4stitch search에서 backbone.out_layers 잘못된 경로n=1 placeholder로 단순화
5B200 1-GPU SLURM CVD 버그: CVD=1이지만 cgroup은 GPU 0만 → device_count()=0find_stitch_layer_da3.shunset CUDA_VISIBLE_DEVICES 추가
B200 1-GPU CVD quirk (job 2802 verified): SLURM이 CUDA_VISIBLE_DEVICES=1로 set하는데 cgroup은 GPU 0만 노출 → torch.cuda.device_count()==0. 1-GPU 잡에만 해당. multi-GPU 잡(4 GPU torchrun 등)에는 영향 없음.

4 Takeaway

전환 비용 = 1300라인, 6시간

DA3 backbone 전환 비용을 조기에 정량화: 1300라인, 6시간 작업. "6개월짜리 재설계"가 아니라 작은 surgery로 확인. connector v2 → da3의 핵심 추상화 (Conv3d + view-stack)가 그대로 옮겨간다.

scale alignment가 per-view → per-clip으로 가는 것은 DA3 인코더 cross-view attention의 직접적 효과. 현재 eye_in_hand s=1.77~6.49 변동 문제의 본질적 해결책이다. scene_flow drop도 의미 있는 결정: GRPO 단계에서 RAFT 같은 외부 모델로 보충 가능.

5 Next Steps

✅ 완료 (이번 세션)

LoRA target 검증 (25.27M trainable), forward dry run (4.59s, 8.95GB), stitch search (best=6, MSE 0.0252), phase_b_loss_da3.py ray spatial mismatch 처리.

클린 데이터 도착 후

HDF5 경로 swap → preprocess_robocasa_cam.py 재실행 → sbmr 제출 (Any4D 트랙과 병렬).

conda activate vggrpo sbmr 5 "bash scripts/train_lgm_robocasa_da3_v0.sh" \ --gres=gpu:4 -c 56 --mem 800GB --qos=core-extra

장기 평가

Any4D vs DA3 동일 데이터/step 비교. cross-view consistency (각 cam pred depth scale/shape 일관성) 정성 비교. GRPO reward signal 안정성 비교가 최종 목적.