클린 RoboCasa 데이터를 기다리는 동안, DA3 backbone 교체 비용을 조기에 정량화하고 데이터 도착 시 두 트랙(Any4D / DA3)을 동시에 학습 큐에 던질 수 있게 prototype 셋업. 사용자 합의 스코프: 학습 미실행, 셋업+검증만.
5개 작업: 1) DA3 조사 → 2) connector 스케치 → 3) stitch search → 4) phase-B loss 설계 → 5) train shell.
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.
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.
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 Term | Any4D path | DA3 path |
|---|---|---|
| Depth | per-view (s,b) LS fit | per-clip 1 scalar (median ratio) |
| Ray | pseudo dense L1 | origin scaled + direction unit split L1 |
| Pose (rot) | quat L1 | 3×3 matrix L1 (sign ambiguity 회피) |
| Pose (trans) | per-clip 1 scale | 동일 depth scale 공유 |
| Scene flow | pseudo L1 | drop |
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 흘릴지 제어.
| 파일 | 라인 | 상태 |
|---|---|---|
src/models/lgm_connector_da3.py | 235 | AST OK + smoke test (token shape 1×96×778×1024 ✓) |
scripts/find_stitch_layer_da3.py | 322 | AST OK + job 2803 실행 완료 |
src/models/phase_b_loss_da3.py | 232 | AST OK + smoke test (loss components 정상 ✓) |
scripts/train_lgm_robocasa_da3_v0.py | 296 | AST OK (학습 미실행) |
scripts/find_stitch_layer_da3.sh | 27 | exec |
scripts/train_lgm_robocasa_da3_v0.sh | 60 | exec (STITCH_LAYER=6 기본값 갱신) |
| Layer | MSE | 순위 |
|---|---|---|
| 5 | 0.0253 | 2위 |
| 6 | 0.0252 | 1위 (best) |
| 7 | 0.0285 | 3위 |
| 8+ | — | 제외 (cross-view attention) |
pred["ray"].shape 자동 감지 후 GT ray를 그 해상도로 계산하는 로직 추가 완료. 별도 resize 비용 없음.| 번호 | 이슈 | 수정 |
|---|---|---|
| 1 | out_layers는 da3.backbone에 있음 — pretrained 아님 | 경로 수정 |
| 2 | cam_token 치환에서 None일 때 skip 안 됨 (cam_token 없는 경우) | None 분기 추가 |
| 3 | DPT head에 raw tuple 직접 못 보냄 — get_intermediate_layers 후처리 필요 | norm + CLS/register slice + 순서 swap 추가 구현 |
| 4 | stitch search에서 backbone.out_layers 잘못된 경로 | n=1 placeholder로 단순화 |
| 5 | B200 1-GPU SLURM CVD 버그: CVD=1이지만 cgroup은 GPU 0만 → device_count()=0 | find_stitch_layer_da3.sh에 unset CUDA_VISIBLE_DEVICES 추가 |
CUDA_VISIBLE_DEVICES=1로 set하는데 cgroup은 GPU 0만 노출 → torch.cuda.device_count()==0. 1-GPU 잡에만 해당. multi-GPU 잡(4 GPU torchrun 등)에는 영향 없음.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 같은 외부 모델로 보충 가능.
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 트랙과 병렬).
Any4D vs DA3 동일 데이터/step 비교. cross-view consistency (각 cam pred depth scale/shape 일관성) 정성 비교. GRPO reward signal 안정성 비교가 최종 목적.