Index
⚠️ 이 리포트의 결론은 무효입니다 (2026-08-10 확인)
여기 실린 A/B 수치는 pretrained 비디오 모델이 아니라 random init에서 학습된 모델의 것입니다. upstream repo가 .pt 체크포인트를 조용히 스킵하는 버그 때문이며, 가설 자체가 “video prior가 더 나은 표현을 준다”이므로 검증이 성립하지 않습니다. 경위: random-init 사고 리포트
2026-08-07 — Experiment

Arm A/B 중간 프로브 — 15K 시점에서 B가 9.2pt 뒤진다

Cosmos Policy | 중간 검증 자동화 + 첫 A/B 신호

TL;DR

19.2
Arm A @15K (%)
10.0
Arm B @15K (%)
±3.6
프로브 노이즈 (pt)
~7.5h
30K 판별까지

1 배경 — 레포에 중간 검증이 없다

학습이 arm당 45K step / 약 2.5일이라, 끝에서야 결과를 보면 (a) 파이프라인 버그를 뒤늦게 발견하거나 (b) 이미 실패한 arm에 GPU를 이틀 더 쓴다.

수단상태
run_validationFalse — validation loop 없음
every_n_sample_regevery_n=100000 — 45K까지 가도 한 번도 안 돎
per-component 지표(action_l1_loss 등)코드엔 있으나 wandb로만 전송 → 워커 TLS 문제로 껐기 때문에 소실
콘솔에는 aggregate Loss:뿐인데, 이건 arm 간 비교가 불가능하다 — B는 mid-frame denoise 항이 추가되고 dropout에 따라 slot 수가 11/13으로 바뀐다. 그래서 실제 태스크 성공률로 중간 곡선을 뽑기로 했다.

2 프로브 자동화

파일역할
scripts/dcp_to_pt.pyDCP → .pt 변환. 덮어쓰기 거부, 재실행 안전
scripts/eval_ckpt_job.sh체크포인트 1개: 변환 → 6 task × 20 trial
scripts/submit_ckpt_evals.sh멱등 드라이버. 마커 파일로 중복 방지 — 워처가 죽어도 재실행하면 따라잡는다

30분 주기 워처(PID 40487)가 5K/15K/30K/45K 도달 시 자동 제출한다.

프로브 task 6개 — A/B 결과를 보기 전에 고정

PnPCounterToCab PnPCounterToSink PnPStoveToCounter ← PnP 3개 (가설 표적) CoffeeSetupMug TurnOnMicrowave OpenSingleDoor ← 비-PnP 3개 (Arm 0 기준 31.3~84.7%)

Arm 0 수치만 보고 정했다. 포화 task(TurnOffMicrowave 99.3, CloseDrawer 98.7)는 어느 쪽으로도 차이가 안 보여 제외. 진단용이며 최종 판정에 쓰지 않는다.

3 도중에 잡은 치명적 버그 45K였으면 57시간 손실

TypeError: Unsupported format: .../iter_000002500/model

학습은 DCP 샤드 디렉토리(.metadata + __N_0.distcp)를 쓰는데, model_loader.py:218이 load_from_local = True를 하드코딩해 모든 비-s3 경로가 easy_io.load()로 간다. easy_io는 파일 확장자로 포맷을 판단하므로 확장자 없는 디렉토리에서 죽는다. 바로 아래 DCP 네이티브 분기는 s3://에서만 실행되어 도달 불가능한 죽은 코드다.

Arm B 설계 전제도 함께 검증됐다. state_t=13 학습 가중치를 state_t=11 설정으로 로드하는 것이 설계의 핵심인데 한 번도 실행된 적이 없었다. 2500 체크포인트로 확인: 687키가 공식 715키의 완전한 부분집합(빠진 28개는 전부 _extra_state), shape 불일치 0, 공식 대비 mean|Δ| 0.012~0.030 → 실제 학습된 별개 모델. 행동도 NaN 0건 / 고유 action 2371개로 정상. 0%는 로딩 실패가 아니라 미학습(5.6% 지점).

4 결과

iterArm A (stock)Arm B (mid-frame)Δ
5K0.00.00
15K19.210.0−9.2
30K대기 (~7.5h 후) — 판별 지점

15K 태스크별 — 격차가 한 곳에 몰려 있다

taskABΔ
TurnOnMicrowave400−40
OpenSingleDoor6555−10
PnPCounterToSink50−5
PnPCounterToCab550
PnPStoveToCounter000
CoffeeSetupMug000

전반적 열화가 아니다. B는 TurnOnMicrowave에서 20회 전부 500스텝 타임아웃(A는 평균 399스텝) — 아직 이 태스크를 못 여는 상태다.

학습 상태 (08-07 09:54)

ArmJobiter속도GPU util45K까지
A72438 (n21)~23,9004.26 s/it95~100%~25h
B72439 (n2)~24,4005.06 s/it99~100%~28.6h

sjob 진단 무경고. 920~940W/1000W, GPU 메모리 105/178 GiB(40% 여유 — batch 50이 가능했다는 뜻), CPU 23~24% throttle 0%.

5 Takeaway

현재 흐름은 가설에 불리하다. 다만 두 해석이 살아있다.

(a) 늦게 배우는 중 — B의 목적함수는 엄격히 더 어렵다(denoise 대상 13개 vs 11개, dropout으로 절반은 11개). 같은 step 수에서 뒤처지는 것은 예측되는 바이며, 이런 정책은 태스크가 0→40→70 계단식으로 풀리므로 B가 아직 못 열었을 뿐일 수 있다.

(b) 그냥 더 나쁘다 — mid-frame slot이 용량·gradient만 가져가고 아무것도 돌려주지 않는다. 설계 당시 적어둔 사망 시나리오 1번(action chunk supervision이 이미 dynamics를 준다)이다.

프로브는 1 seed × 20 trial이라 6-task 평균 노이즈가 ±3.6pt. 9.2pt는 시사적이나 결정적이지 않다.

중간 프로브를 만든 결정 자체는 옳았다. DCP 로딩 버그와 state_t 전환 전제를 45K가 아니라 2500에서 잡았다.

6 Next

[~7.5h 후] 30K 프로브 — B 계속/중단 결정

격차 좁혀짐 → (a). B를 45K까지 계속
유지·확대 → (b) 유력. scancel 72439로 B 중단, 4 GPU 반환. 45K 전체 평가 불필요

Arm A는 어떤 경우에도 45K까지 계속한다 — baseline 자체로 가치가 있고, 축소 batch(global 200 = 논문의 1/4)가 논문 67.1%에 얼마나 근접하는지 보여준다.

[~25~29h 후] 45K 최종 평가

DCP 변환 → 24 task × 3 seed 전체 → 사전 등록 지표로 판정: 1차 24-task 평균(kill criterion 5pt, 노이즈 0.79pt) / 2차 PnP 8-task 평균 / 개별 task는 15pt 미만 주장 금지.

max_iter=1000000이라 45K에서 자동 정지하지 않는다. 학습을 돌려둔 채 평가하고 결과를 본 뒤 취소한다 — 곡선이 아직 가파르면 90K까지 계속하는 선택지가 살아있다(A 4.4일 / B 4.9일, 7일 제한 안).

미해결

wandb를 꺼서 per-component 지표가 없다. 되살리려면 job.wandb_mode=offline + 재시작이나, 현 시점 손실이 커서 이번 실험에서는 포기한다.