질문은 “world model의 3D 일관성은 control을 사는가”다. 선행 연구 지형이 두 진영으로 갈려 있고 다리가 없다.
| 진영 | 대표 연구 | 보고 지표 | 빠진 것 |
|---|---|---|---|
| 3D 일관성 | PAIWorld, Geometry Forcing, GEM-4D | 3D 지표만 | SR 보고 0편 |
| 표현 정렬 | AGRA, MECo-WAM, Spatial Forcing | SR만 | 3D 정확도 0편 |
policy_server.py:206이 run_depth=False라 정책 추론 시 아예 실행되지 않는다. 즉 이미 training-time-only 정규화 장치다 → 그 1.64B를 학습 시점 표현 정렬로 대체할 수 있는가?세 arm은 기하 지도신호 하나만 다르다. 레시피는 완전히 동일하다.
| arm | 기하 지도신호 | 추가 파라미터 | 추론 비용 | 최종 video_loss |
|---|---|---|---|---|
| A | 없음 | 0 | 0 | 0.1316 |
| B | explicit 4D 생성 (depth branch) | 1.64 B | 0 (실행 안 됨) | 0.1221 |
| C | implicit 정렬 (VGGT-Ω REPA) | 0.029 B | 0 (teacher 학습 전용) | 0.1314 |
repa_frames는 버리는 노브가 아니라 실험의 축이다정렬 대상 프레임을 고르는 이 노브가 선행 두 연구가 갈리는 지점 그 자체다: cond(latent 0 = 현재 관측) = Spatial Forcing(VLA), gen(latent 1·2 = 생성 프레임) = Geometry Forcing(video), all = 둘의 합. 이번 arm C는 all이다.
초안에서는 “latent 0은 clean 조건이라 정렬을 거저 만족시킨다”며 제외했으나 거저가 아니다 — DiT feature → VGGT feature 매핑은 clean 입력에서도 배워야 하고 단지 쉬울 뿐이다. 반대로 추론 시 frame 0은 정책이 실제로 조건으로 받는 관측이므로 오히려 정통으로 겨냥해야 할 대상이다.
view1=0.60 vs view0/2=0.07로 움직인다. 1:1 대응이 지배적이면서 다른 뷰도 함께 움직인다 = teacher 내부 global attention(24개 중 19개가 full global)이 cross-view 정보를 타깃에 실어 넘긴다는 직접 증거. multi-view는 loss 배선이 아니라 teacher가 만든다.max_steps=20000 reached, preempt 2회 모두 자동 복구(손실 80 step + 0 step), NaN 0, rank 파일 8개.
| subset | n | arm A no depth | arm B +1.64B depth | arm C +29M REPA |
|---|---|---|---|---|
| ALL (24) | 1200 | 61.08% | 66.00% | 64.67% |
| PnP (8) | 400 | 44.00% | 53.75% | 46.75% |
| non-PnP (16) | 800 | 69.62% | 72.12% | 73.62% |
| subset | 비교 | 차이 (%p) | SE | z | 95% CI | 판정 |
|---|---|---|---|---|---|---|
| ALL | B−A | +4.92 | 1.96 | 2.51 | [+1.07, +8.76] | 유의 |
| ALL | C−A | +3.58 | 1.97 | 1.82 | [−0.28, +7.45] | 미확립 |
| ALL | B−C | +1.33 | 1.94 | 0.69 | [−2.47, +5.14] | 미확립 |
| PnP | B−A | +9.75 | 3.52 | 2.77 | [+2.86, +16.64] | 유의 |
| PnP | B−C | +7.00 | 3.53 | 1.98 | [+0.09, +13.91] | 유의(경계) |
| PnP | C−A | +2.75 | 3.52 | 0.78 | [−4.15, +9.65] | 미확립 |
| non-PnP | C−A | +4.00 | 2.25 | 1.78 | [−0.41, +8.41] | 미확립 |
| non-PnP | B−C | −1.50 | 2.22 | −0.67 | [−5.86, +2.86] | 노이즈 |
arm C는 VGGT-Ω와 코사인 0.89로 정렬됐다. 정렬 자체는 확실히 학습됐고 1,000 step에 이미 0.85에 도달했다. 그런데 PnP에서 explicit depth 생성에 7.00%p 뒤진다(z=1.98). 집기·놓기가 요구하는 공간 정밀도는 표현 정렬만으로 오지 않는다는 뜻이다.
이건 REPA 계열 방법론에 대한 구체적인 제약 조건이고, “정렬 지표가 좋아졌다”를 성능 근거로 쓰는 관행에 대한 반례이기도 하다.
1. [최우선] 100 rollout/task 재평가 — arm A · arm C. SE가 1.97 → 약 1.4%p로 줄어 +3.58이 z≈2.6이 된다. 8 GPU × 약 1.5h × 2 arm. 릴리스 ckpt에서 50/task 75.8% vs 100/task 75.3%로 −0.5%p 수렴한 이력이 있어 신뢰할 만하다.
2. C0 ablation — repa_frames = cond vs gen. 관측 정렬(Spatial Forcing)과 생성 정렬(Geometry Forcing) 중 무엇이 SR을 사는가. 같은 백본·teacher·레시피에서 둘을 직접 비교한 선행 연구가 없다. all은 720 토큰에 신호를 나눠 실어 어느 쪽도 충분히 밀지 못했을 수 있다 — 실측 프레임당 gradient: all 1.66e-4 / gen 2.49e-4 / cond 4.97e-4. PnP가 요구하는 것이 현재 관측의 정밀한 3D라면 cond가 답일 수 있다.
3. λ_scale 스윕 (C4). 최종 repa_scale 1.644 × 0.05 = 0.082로 video_loss(0.131)의 63%. GF의 0.05는 그쪽 teacher feature 스케일 기준이라 우리 teacher에 맞는다는 보장이 없다.
4. relational loss (C2). PAIWorld와 MECo-WAM이 독립적으로 둘 다 anchor 기반 관계 정렬을 택했다. dense 정렬이 약하다는 신호일 수 있고, 이번 PnP 실패가 그 증거일 수 있다.
5. frozen probe. arm A·C에는 depth 출력이 없으므로 네 arm을 공통 3D 축에 올릴 유일한 수단. 미착수.
| # | 함정 | 왜 안 보였나 |
|---|---|---|
| 1 | vae_stride: (4, 16, 16)는 YAML에서 문자열이라 [0]이 '(' | num_frames_per_latent가 아무도 안 쓰던 dead assignment였다. REPA가 첫 소비자 |
| 2 | DeepSpeedStrategy는 step을 torch.autocast로 감싸지 않는다. DeepSpeed가 파라미터를 직접 캐스팅 → dtype을 맞춰줄 주체가 없음 | (bf16 param, fp32 activation) 조합에서만 터진다. 활성값을 projector dtype으로 명시 캐스팅해야 함 |
| 3 | elementwise_affine=False는 근본 수정이 아니었다 | 실패가 LayerNorm에서 Linear로 옮겨갔을 뿐(mat1 and mat2 must have the same dtype) |
| 4 | stub 테스트가 실제 조건을 대신 채우면 그 조건은 검증되지 않는다 — 3회 연속 놓침 | ①값 하드코딩 ②DeepSpeed 밖 fp32 ③bf16을 autocast 안에서 실행(= 안전한 조합만 테스트) |
| 5 | $((0020000))은 8진수로 8192가 된다(조용히) | [ x -ge y ]는 10진수라 안전. step이 zero-padded로 로깅됨 |
| 6 | 격리 벤치마크가 실제 비용을 2배 과소평가 — “7.9% 세금”으로 보고했으나 실제 1.32× | accum=4라 optimizer step당 4회 + 8-rank 경합. arm 간 같은 step의 speed 비교가 정답이었다 |
| 7 | 평가를 sbm으로 제출하면 preempt 시 재개가 없다 | arm C 평가가 23/24에서 잘림. 평가도 sbmr을 쓸 것 |
scripts/eval_robocasa.sh의 EVAL_RANKS(개별 태스크 재실행 — 이번에 두 번 썼다) · tmp/compare_arms.py(N-arm 비교, 모든 summary에 있는 태스크만 집계) · tmp/autoeval_armC.sh(완주를 sacct가 아닌 로그 최대 step으로 판정) · tmp/test_repa_plumbing.py(3 모드 × 3 dtype).