eval_robocasa_seeds.sh가 CKPT를 전달하지 않아 24개 job 전부가
public NVIDIA 체크포인트를 평가하고 armAit45000 라벨을 붙였을 것.
~67%라는 그럴듯한 숫자가 나와 알아채기 어렵다.scripts/arm_ckpt.sh로 차단 — arm 이름 매핑을 한 곳으로 모으고
11개 경로를 전부 테스트. 최종 평가가 이제 bash scripts/submit_final_eval.sh 한 줄.30K 프로브까지 약 7시간, 45K 최종 평가까지 약 25~29시간이 남았다. 그 유휴 시간에 최종 평가 경로를 미리 밟아보기로 했다. 15K 프로브 때 DCP 로딩 버그를 45K가 아니라 2500에서 잡아 57 GPU-시간을 아낀 경험이 있어서다.
submit_arm0.sh는 Arm 0 전용 하드코딩이므로 CKPT/CONFIG 전달하도록 수정 필요” —
이 한 줄이 실제로 무엇을 요구하는지 확인하는 것이 출발점이었다.scripts/eval_robocasa_seeds.sh가 srun 자식에게 넘기는 것은 네 개뿐이었다:
그리고 eval_robocasa.sh는 다음 기본값을 갖는다:
따라서 ARM=armAit45000 bash scripts/submit_arm0.sh는 에러 없이 실행되고,
24개 job 전부가 공개 체크포인트를 평가한 뒤 결과에 우리 arm 라벨을 붙인다.
Arm 0 재현값이 66.9%였으므로 나오는 숫자는 ~67% —
“우리 모델이 논문 수준을 재현했다”로 읽히는, 완전히 틀린 결과.
같은 arm→체크포인트 매핑이 eval_ckpt_job.sh와 submit_ckpt_evals.sh에
각각 하드코딩돼 있어 세 번째 사본이 생길 참이었다. 한 곳으로 모았다.
arm<A|B>it<N>은 프로브가 이미 run_id_note에 쓰던 문자열이라,
프로브 · 최종 평가 · collector가 하나의 규칙을 공유하게 됐다
(--arm armAit45000 하나로 집계).
eval_robocasa_seeds.sh는 .pt가 없으면 변환 명령을 알려주며 즉시 실패한다.
여기서 변환하지 않는 이유: 24개 job이 같은 3.7GB 파일에 동시에 쓰게 된다.
eval_ckpt_job.sh와 submit_ckpt_evals.sh도 리졸버를 쓰도록 바꿨는데,
이 둘은 7시간 뒤 30K 프로브를 자동 제출해야 하는 라이브 경로다.
경로 문자열이 한 글자라도 틀리면 [ -d ... ] 검사가 조용히 실패하고
30K 프로브는 영원히 제출되지 않는다.
sbm과 마커 디렉토리를 스텁으로 바꾼 사본으로, 이미 존재하는
iter_000022500에 대해 탐지→제출 경로가 실제로 발화하는지 확인했다.
| 검증 항목 | 기대 | 결과 |
|---|---|---|
| bash 문법 (5개 스크립트) | 통과 | ✅ |
리졸버 arm0 | CKPT/CONFIG 미설정 | ✅ |
리졸버 armAit15000 / armBit45000 | 올바른 config + 경로 | ✅ |
리졸버 armCit1, armA_45000 | 거부 | ✅ |
seeds, .pt 없음 | exit 1 + 변환 명령 출력 | ✅ |
seeds, .pt 있음 (A/B) | CKPT/CONFIG가 srun까지 전달 | ✅ |
seeds, arm0 | CKPT 미설정 유지 | ✅ |
submit_final_eval.sh ITER=45000 | 미도달 중단, 제출 0건 | ✅ |
submit_final_eval.sh ITER=15000 DRY_RUN | 변환 스킵, 제출 0건 | ✅ |
| 프로브 탐지 (iter 22500, 스텁) | A/B 둘 다 제출 발화 | ✅ |
| 프로브 멱등성 (마커 재검사) | nothing new to submit | ✅ |
라이브 큐 부작용 0건 — 테스트 중 잘못 생성된 srun 할당이 없는지 squeue로 확인했다.
| Arm | Job | iter | 속도 | QOS | 30K | 45K | 90K | wall limit |
|---|---|---|---|---|---|---|---|---|
| A (stock) | 72438 (n21) | ~24,380 | 4.27 s/it | core-own | 16:50 | 08-08 10:40 | 08-10 16:00 | 08-13 05:11 |
| B (mid-frame) | 72439 (n2) | ~24,790 | 5.04 s/it | core-own | 17:30 | 08-08 14:30 | 08-11 05:30 | 08-12 23:21 |
core-own이라 preempt 불가.
90K도 wall limit 안에 들어간다 (A 61h / B 42h 여유). 체크포인트 150G, NAS 여유 65T — 제약 아님.지금까지 겪은 함정 6개 중 4개(wandb TLS, output root, HF 경로 오인, DCP 포맷)는
시끄럽게 죽어서 금방 잡혔다. 나머지 2개 —
sacct가 실패를 COMPLETED로 보고하는 것, 그리고 이번의 public 체크포인트 폴백 —
는 성공한 것처럼 보인다. 평가 경로에서 default 값은 안전장치가 아니라 함정이다.
45K는 논문의 step 수를 맞춘 것이지 sample 수가 아니다. 우리 global batch는 200, 논문은 800.
| 종료점 | 본 샘플 | 논문 대비 | A | B | 7일 안? |
|---|---|---|---|---|---|
| 45K | 9.0M | 25% | 08-08 10:40 | 08-08 14:30 | ✅ |
| 90K | 18.0M | 50% | 08-10 16:00 | 08-11 05:30 | ✅ (여유 61h/42h) |
| 180K | 36M | 100% | 8.9일 | 10.5일 | ❌ (resume 1회) |
가설 (a)가 맞다면 — B의 목적함수가 더 어려워 늦게 배운다면 — 45K에서 끊는 것은 구조적으로 B에게 불리하다. 그래서 45K를 1차 헤드라인으로 고정하고 90K까지 계속 돌려 2차(라벨 명시)로 병기하기로 했다.
scancel 72439,
그 경우 A만 90K까지 간다.kill 결정은 프로브(6 task × 1 seed × 20 trial, 노이즈 ±3.6pt)로 내린다. 정당한 중간분석이며 1차 지표를 오염시키지 않는다. 다만 그 경우 B의 24-task 수치는 존재하지 않는다. 30K 프로브를 최종 결과처럼 쓰지 말고 “자원 제약으로 중간분석에서 중단, 24-task 측정 없음”이라고 그대로 적는다.
per-component 지표(action_l1_loss) 없음 — wandb를 껐기 때문. 이번 실험에서는 포기.
GPU 메모리 40% 유휴 (105/178 GiB) → batch 50 가능했음. 다음 실험에 반영.