xargs 슬롯을 영구 점유. UNIT_TIMEOUT 도입으로 해결.run4(clean-50 학습, step_30000)로 RoboTwin 2.0 공식 리더보드 지표(c2c/c2r)를 확정해야 한다. 기존에 확보한 X-WAM 90.7%는 randomized-500까지 학습한 뒤 randomized로 평가한 random2random 수치라 리더보드 c2r(clean만 보고 randomized 평가)과 성격이 다르다는 것을 이미 확인했으므로, run4의 c2c/c2r 자체가 "τ₀-WM을 리더보드 규칙대로 돌리면 몇 점인가"에 대한 최초의 유효한 답이다.
과거 50-task 평가(97360+97992+99112)의 _result.txt 완료 시각 히스토그램에서 정상 구간 20 units/h = 200 rollout/h
(96 clients / 8 GPU)를 확인. 리더보드 1개 설정 = 5,000 rollout ≈ 25h. 병목은 GPU가 아니라 시뮬레이터 + OptiX 레이트레이싱
(GPU 점유율 ~2.5%, 렌더 방식은 학습 데이터 수집과 동일해야 하므로 낮출 수 없음).
| job | 지표 | TASK_CONFIG | QOS | SAVE_ROOT |
|---|---|---|---|---|
| 101482 → 103069 → 103186 | c2c | demo_clean | own(보호) | eval_results/robotwin_run4_c2c |
| 101483 → 101947 | c2r | demo_randomized | extra(preempt 가능) | eval_results/robotwin_run4_c2r |
공통: MODEL_PATH=.../step_30000 EVALS=100 SHARDS=10 PARALLEL_CLIENTS=96,
--gres=gpu:8 -c 96 --mem 1600GB --container=nvcr.io/nvidia/isaac-lab:2.2.0. _result.txt 기반 skip으로
preempt/재제출 시 완료 unit은 보존.
c2c(job 101482)가 18시간 35분 경과·444/500 units에서 완전히 정지. 시간당 완료 unit이 35→35→21→24→9→0으로 붕괴. 결과 없는 56개 unit의 클라이언트 로그 mtime 분포를 확인:
| n | min | p25 | median | p75 | max |
|---|---|---|---|---|---|
| 56 | 136분 | 537분 | 704분(11.7h) | 954분 | 1,099분 |
10분 내 활동 중인 클라이언트 0개, 브로커는 71분 전까지 정상 → policy 응답은 정상 수신했지만
시뮬레이터 스텝 도중 멈춤. xargs -P 96 풀에서 행 걸린 56개 클라이언트가 슬롯을 영구 점유해 전체 파이프라인 정지.
run_task의 재시도는 클라이언트 종료에만 발동하므로 hang에는 무력했다.
scripts/eval_robotwin_tau.sh 클라이언트 호출을
timeout --kill-after=60 ${UNIT_TIMEOUT:-18000}로 감쌈. 5시간(18,000s)은 정상 unit 평균(~2.7h, 처리량 역산)을
죽이지 않으면서 11~18시간짜리 행만 잡도록 산정. scancel 101482 후 job 103069로 재제출(444 units 보존, 56 units만 재실행) →
job 103186에서 최종 COMPLETED.| 항목 | 값 |
|---|---|
| c2c task-mean | 70.68% |
| 측정 범위 | 50/50 task, 499/500 units = 4,990 rollout |
| 통계 오차 | pooled binomial SE 0.64pp |
| 분포 | 중앙값 73.0% / 최소 16% / 최대 100% |
| task 구간 | ≥90%: 13개 / 50–90%: 26개 / <50%: 11개 |
job 이력: 101482(18h35m, 444 units, hang으로 정지) → 103069(2h 타임아웃 도입 전 구간 5h, 481) → 103186(2h 타임아웃, COMPLETED 6h00m, 499). 마지막 1 unit(blocks_ranking_size shard8)은 attempt 0/1/2 전부 hang → 포기(n=90).
| 비교 | 값 | 해석 |
|---|---|---|
| [A] 전체 50 task, 같은 모델: c2c 70.68% → c2r 33.15% | −37.53pp | clean-50 학습이 clean 분포에 과적합 |
| [B] 동일 44 task, 둘 다 demo_randomized 평가: run1 51.32% → run4 c2r 33.07% | −18.25pp | "randomized가 어려워서"가 아니라 "학습에 randomized가 없어서" |
| task | c2c | c2r | run1 r2r |
|---|---|---|---|
| click_alarmclock | 100.0 (n100) | 66.0 (n100) | 98.0 (n100) |
| click_bell | 100.0 (n100) | 95.0 (n100) | 92.0 (n100) |
| shake_bottle | 100.0 (n100) | 96.0 (n100) | 86.0 (n100) |
| shake_bottle_horizontally | 100.0 (n100) | 92.0 (n100) | 93.0 (n100) |
| grab_roller | 98.0 (n100) | 42.0 (n100) | 84.0 (n100) |
| adjust_bottle | 95.0 (n100) | 28.0 (n100) | 69.0 (n100) |
| dump_bin_bigbin | 95.0 (n100) | 67.0 (n100) | 69.0 (n100) |
| place_cans_plasticbox | 95.0 (n100) | 55.0 (n100) | 63.0 (n100) |
| move_playingcard_away | 94.0 (n100) | 15.0 (n100) | 60.0 (n100) |
| place_container_plate | 93.0 (n100) | 69.0 (n100) | 76.0 (n100) |
| stack_blocks_two | 93.0 (n100) | 64.0 (n100) | 70.0 (n30) |
| place_burger_fries | 91.0 (n100) | 56.0 (n100) | 61.0 (n100) |
| place_bread_skillet | 90.0 (n100) | 44.0 (n100) | 62.0 (n100) |
| place_object_stand | 88.0 (n100) | 38.0 (n100) | 55.0 (n80) |
| stack_bowls_two | 88.0 (n100) | 71.2 (n80) | — |
| lift_pot | 85.0 (n100) | 1.0 (n100) | 44.0 (n100) |
| open_laptop | 84.0 (n100) | 42.0 (n100) | 43.0 (n100) |
| press_stapler | 84.0 (n100) | 66.0 (n100) | 75.6 (n90) |
| pick_dual_bottles | 80.0 (n100) | 67.0 (n100) | 66.7 (n90) |
| place_empty_cup | 79.0 (n100) | 47.0 (n100) | 72.2 (n90) |
| place_shoe | 78.0 (n100) | 42.0 (n100) | 65.6 (n90) |
| move_pillbottle_pad | 77.0 (n100) | 4.0 (n100) | 57.0 (n100) |
| beat_block_hammer | 76.0 (n100) | 22.0 (n100) | 75.0 (n100) |
| move_can_pot | 75.0 (n100) | 5.6 (n90) | 25.0 (n100) |
| place_bread_basket | 73.0 (n100) | 43.0 (n100) | 49.0 (n100) |
| stamp_seal | 73.0 (n100) | 30.0 (n100) | 70.0 (n10) |
| pick_diverse_bottles | 72.0 (n100) | 42.0 (n100) | 48.0 (n100) |
| blocks_ranking_rgb | 71.0 (n100) | 7.5 (n80) | 12.5 (n80) |
| place_object_basket | 70.0 (n100) | 17.0 (n100) | 36.2 (n80) |
| handover_mic | 69.0 (n100) | 9.0 (n100) | 54.4 (n90) |
| place_can_basket | 68.0 (n100) | 20.0 (n100) | 42.5 (n80) |
| put_bottles_dustbin | 66.0 (n100) | 20.0 (n20) | — |
| scan_object | 66.0 (n100) | 23.3 (n90) | 42.5 (n80) |
| place_object_scale | 60.0 (n100) | 19.0 (n100) | 36.0 (n100) |
| turn_switch | 60.0 (n100) | 44.0 (n100) | — |
| stack_blocks_three | 56.0 (n100) | 13.3 (n30) | — |
| place_dual_shoes | 55.0 (n100) | 13.0 (n100) | 23.3 (n90) |
| open_microwave | 53.0 (n100) | 15.0 (n80) | 35.0 (n80) |
| stack_bowls_three | 52.0 (n100) | 32.0 (n50) | — |
| place_phone_stand | 50.0 (n100) | 32.0 (n100) | 50.0 (n50) |
| handover_block | 48.0 (n100) | 6.7 (n60) | 11.1 (n90) |
| place_a2b_right | 47.0 (n100) | 10.0 (n100) | 34.4 (n90) |
| place_fan | 46.0 (n100) | 4.0 (n100) | 37.8 (n90) |
| place_a2b_left | 44.0 (n100) | 9.0 (n100) | 43.0 (n100) |
| blocks_ranking_size | 40.0 (n90) | 3.8 (n80) | 11.0 (n100) |
| place_mouse_pad | 40.0 (n100) | 12.0 (n100) | 26.2 (n80) |
| move_stapler_pad | 37.0 (n100) | 8.0 (n100) | 19.0 (n100) |
| put_object_cabinet | 37.0 (n100) | 22.0 (n50) | — |
| rotate_qrcode | 27.0 (n100) | 3.8 (n80) | 10.0 (n70) |
| hanging_mug | 16.0 (n100) | 3.3 (n90) | 4.0 (n100) |
n = rollout 수. c2c는 49개 task가 n=100(blocks_ranking_size만 n=90),
c2r은 37개가 n=100이고 13개는 부분 커버리지다. 미완료 42 units는 전부 SR 6~32%의 최하위 task에 몰려 있으며,
저커버리지 task를 모두 제곱합해도 50-task 평균의 불확실성은 1pp 미만이라 추가 라운드를 돌리지 않았다
(라운드별 수확도 +65 → +46으로 체감). run1 열은 randomized-500 학습 모델을 randomized로 평가한 값이며 44 task만 존재한다.
리더보드가 c2c와 c2r을 둘 다 요구하는 이유가 정확히 이것이다 — c2c만 보면 τ₀-WM이 매우 잘하는 것처럼 보인다(70.68%, 상당수 task 90%+). 하지만 clean-50만으로 학습하면 clean 분포에 과적합돼 randomized 평가로 전이되지 않는다(−40pp). τ₀의 비디오 타워는 사전학습이 실사(AgiBot 등) 도메인이라, 시각 분포가 좁은 clean-50만 posttrain하면 렌더 변화 (배경/조명/클러터/테이블 높이)에 취약해진다 — 이전 진단에서 "ACVS가 RoboTwin sim에서 OOD"라고 나온 것과 같은 축의 문제다.
① c2r 커버리지: 37/50 task만 n=100이고 나머지는 부분(최저 put_bottles_dustbin n=20).
시뮬레이터 hang이 randomized 씬에서 훨씬 잦아 3라운드(347 → 412 → 458 units)를 돌리고도 42 units가 남았다.
다만 결측이 모두 최하위 SR task에 몰려 있어 평균에 대한 기여 불확실성은 1pp 미만이다.
② 시뮬레이터 hang의 근본 원인 미규명: 클라이언트가 policy 응답을 정상 수신한 뒤 에피소드 중간
임의 step에서 얼어붙는다(예: step 724/1700에서 127분 정지). 브로커·정책 서버는 정상이므로 SAPIEN 렌더나
모션 플래너 쪽 데드락으로 추정되나 확인하지 못했다. 현재는 UNIT_TIMEOUT으로 우회 중.
③ held-out split 부재: 학습 config의 val이 train과 같은 데이터를 가리킨다.
1순위 — ACVS RoboTwin posttrain (runner/posttrain_sim.py, ~17h).
앞선 진단에서 τ₀의 병목은 생성이 아니라 선택이었다: 8-샘플 오라클 0.94 cm로 X-WAM 단일 샘플(1.31 cm)보다 좋은데,
RCS 선택기는 여지의 29%만 회수하고(순위상관 +0.11) ACVS는 RoboTwin sim에서 보상 상관 −0.14로 역상관이었다.
그런데 같은 ACVS가 AgiBot(사전학습 도메인)에서는 21.95 dB로 장면을 유지한다 — 즉 모델이 약한 게 아니라 도메인 미스매치다.
sim 도메인에 맞춰 posttrain하면 TTC가 살아날 가능성이 높고, 이것이 τ₀ 논문의 핵심 주장 검증에 해당한다.
2순위 — 데이터 측면: 이번 결과로 c2r의 직접 원인이 학습 분포임이 확인됐다. clean+randomized 혼합 학습은 리더보드 규격 위반이지만 일반화-과적합 트레이드오프 진단용으로는 유효하다. 다만 run1(randomized-500, 51.32%)이 이미 그 방향의 답을 주고 있어 신규 정보량은 적다.