Index
2026-09-21 — Experiment

RoboTwin 성공 판정 기준(zwcrit) 재평가 — stamp_seal · move_stapler_pad

lingbot-va | RoboTwin 43-seen/7-unseen 트랙 A | job 130608 · 134193 (2026-09-18 실행)

TL;DR

47.0%
stamp_seal 최고 (zwcrit+pnp)
61.0%
move_stapler_pad (zwcrit)
4.0%
stamp_seal 원본
1.0%
move_stapler_pad 원본
13.4
GPU-hours (2 jobs)

1 배경 / 목적

RoboTwin unseen-7 zero-shot 평가(260910-robotwin_unseen7_eval_final.html)는 평균 27.86% vs paper baseline 17.45%(+10.41p)였지만 태스크별 편차가 극심했다 — place_bread_basket +42.67p, move_stapler_pad 1.0%로 -22.33p. 이어 260911 카드에서 stamp_seal 4.0%의 원인 하나가 학습 분포 밖 instruction 문구임을 분리했다(4.0%→19.0%).

그 카드 이후에도 남은 의문은 채점 자체였다. 이 평가는 stock RoboTwin(RoboTwin/envs/*.py)의 check_success로 채점되는데, Zero-WAM은 두 태스크의 check_success를 자체 env(Zero-WAM/evaluation/robotwin/envs/)로 덮어쓴 별도 eval root(Zero-WAM/tmp/robotwin_eval_root, 2026-09-15 생성)를 쓴다. 비교 대상인 paper의 LingBot-VA baseline이 어느 기준으로 채점됐는지 확인되지 않은 상태에서, stock 기준의 절대 수치를 "조작 능력"으로 읽어도 되는지가 불명확했다.

기존 한계: 260910/260911 카드의 성공률은 모두 stock 기준 채점. 문구만 분리했을 뿐 판정 허용 오차라는 두 번째 교란 요인은 통제되지 않았다.

2 작업 내용

모델·checkpoint·seed·rollout 수는 고정하고 eval root(ROBOTWIN_ROOT)만 stock → Zero-WAM으로 바꿨다. script/eval_robotwin_task.sh가 이미 ROBOTWIN_ROOT env를 받고 EVAL_TAG로 결과 디렉토리를 분리하므로 코드 수정은 없다.

판정 기준 diff (Zero-WAM eval root에서 override된 env는 이 2개뿐)

태스크stock check_successzwcrit check_success
stamp_sealseal–target xy 오차 eps1 = 0.01 (1 cm) + 양 gripper openeps1 = 0.03 (3 cm), 나머지 동일
move_stapler_padstapler–pad 3축 오차 [0.02, 0.02, 0.01] 이내 + stapler quaternion 성분 spread < 0.02(사실상 특정 yaw 강제) + 양 gripper openstapler xy가 pad half-size(0.055×0.03)+margin 0.025 이내 + stapler–pad 물리 접촉 + 양 gripper open. yaw·z 제약 제거 (주석: "Use physical contact with the pad instead of enforcing a specific stapler yaw")

제출 (전부 core-own, --container=nvcr.io/nvidia/isaac-lab:2.2.0, checkpoint robotwin_seen43_train/step32000, seed 0, 100 rollout, demo_clean)

# job 130608 — 2 GPU, 태스크당 1 GPU. 원본 문구 + zwcrit ROBOTWIN_ROOT=Zero-WAM/tmp/robotwin_eval_root EVAL_TAG=zwcrit \ bash script/eval_robotwin_seen43.sh 32000 100 0 move_stapler_pad,stamp_seal (sbatch --gres=gpu:2 -c 16 --mem 400GB --time 10:00:00 --dependency=afterany:130258) # job 134193 — 1 GPU. 학습 스타일 문구 + zwcrit ROBOTWIN_ROOT=Zero-WAM/tmp/robotwin_eval_root EVAL_TAG=zwcrit_pnpprompt \ LINGBOT_INSTRUCTION_TEMPLATE="Pick up {A} with {a} and place it on the {B} mat." \ bash script/eval_robotwin_seen43.sh 32000 100 0 stamp_seal (sbatch --gres=gpu:1 -c 8 --mem 200GB --time 10:00:00)

왜 이 설계인가: 260911의 LINGBOT_INSTRUCTION_TEMPLATE 변수와 이번 ROBOTWIN_ROOT 변수를 독립적으로 켜고 꺼서, stamp_seal에서 문구 × 기준의 2×2 요인 설계를 완성했다. 모델 재학습이나 추론 경로 변경이 없어 채점 기준의 순수 효과만 남는다. 결과는 eval/step32000_zwcrit/, eval/step32000_zwcrit_pnpprompt/에 baseline과 분리 저장.

범위 주의: job 130608은 Zero-WAM 디렉토리에서 제출돼 sacct WorkDir는 Zero-WAM이지만 실행 스크립트·checkpoint·결과 저장은 모두 lingbot-va 쪽이다.

3 결과

(a) stamp_seal — 문구 × 판정 기준 2×2 (step32000, seed 0, n=100)

Run문구판정 기준성공SRvs paper (3.67%)
step32000원본 "stamp …"stock (1 cm)4/1004.0%+0.33p
step32000_pnpprompt학습 스타일 pnpstock (1 cm)19/10019.0%+15.33p
step32000_zwcrit원본 "stamp …"zwcrit (3 cm)34/10034.0%+30.33p
step32000_zwcrit_pnpprompt학습 스타일 pnpzwcrit (3 cm)47/10047.0%+43.33p

문구 효과 (pnp − 원본)

stock 기준 +15.0p (4→19) / zwcrit 기준 +13.0p (34→47)

기준 효과 (zwcrit − stock)

원본 문구 +30.0p (4→34) / pnp 문구 +28.0p (19→47)

두 요인의 조합 효과는 두 열에서 거의 같다(문구 +15 vs +13, 기준 +30 vs +28; 차이 2p). n=100 이항 표준오차가 19%에서 ≈3.9p, 47%에서 ≈5.0p이므로 이 2p 차이의 상호작용은 노이즈와 구분되지 않는다 — 즉 두 요인은 가산적으로 보는 게 안전하다.

(b) move_stapler_pad — 원본 문구, 판정 기준만 변경

Run판정 기준성공SRvs paper (23.33%)
step32000stock (yaw·z 제약)1/1001.0%-22.33p
step32000_zwcritzwcrit (contact 기반)61/10061.0%+37.67p

(c) unseen-7 집계에 미치는 영향 (산술 추정 — 별도 7-task 재평가는 아님)

Zero-WAM eval root가 덮어쓰는 env가 위 2개뿐이므로 나머지 5개(place_object_scale 34, place_bread_basket 60, open_microwave 34, place_empty_cup 62, stack_blocks_three 0)는 stock과 동일하다고 보고 합산했다.

구성7-task 성공 합계 / 700평균 SRvs paper (17.45%)
stock 기준 (260910 카드)19527.86%+10.41p
stamp_seal·move_stapler_pad만 zwcrit (원본 문구)28540.71%+23.26p

(d) 비용

Job구성ElapsedGPU-hQOS
130608 lva_zwcrit2 GPU × 2 태스크, 09-18 01:37→06:084h31m37s9.06core-own
134193 lva_pnp_zwcrit1 GPU × 1 태스크, 09-18 11:32→15:494h17m09s4.29core-own
핵심 발견: 모델·checkpoint·seed·(원본) 문구가 동일한데 move_stapler_pad가 1%→61%로 움직였다. 1%는 "조작 실패"가 아니라 stapler를 pad에 놓고도 yaw/z 허용 오차(quaternion spread < 0.02, z 1 cm)를 못 맞춘 경우가 대부분이었을 가능성이 높다.
한계: (1) rollout 단위로 어느 episode가 fail→success로 뒤집혔는지는 확인하지 않았다(정책 sampling 비결정성으로 궤적이 동일하다는 보장 없음). (2) paper baseline(17.45% 평균, stamp_seal 3.67%, move_stapler_pad 23.33%)이 stock/zwcrit 중 어느 기준으로 채점됐는지 이 리포트에서 검증하지 못했다.

4 Takeaway

의미

1) 채점 기준이 문구보다 큰 교란 요인이다. stamp_seal에서 기준 효과(+28~30p)가 문구 효과(+13~15p)의 약 2배. 260911 카드가 stamp_seal 저조 원인을 "문구"로 진단했지만, 4.0%→19.0%는 전체 격차(4.0→47.0, +43p)의 약 1/3에 불과했다.

2) unseen-7 태스크별 편차는 "cross-task 조작 일반화"로 해석하면 안 된다. move_stapler_pad -22.33p(stock)가 +37.67p(zwcrit)로 뒤집혔다. 260910 카드의 "태스크별 편차 극심" 결론과 260911의 wording 민감도 결론은 모두 채점 기준 통제 없이는 조작 능력 지표로 못 쓴다.

3) baseline 비교의 전제가 흔들린다. 우리 수치(stock)와 paper 수치의 채점 기준이 다르면 delta(+10.41p)는 정책 차이가 아닌 채점 차이를 섞는다. 이후 모든 unseen-7 비교는 채점 기준을 명시해야 한다.

5 Next Steps

미해결 한계

  • paper LingBot-VA baseline의 채점 기준 미확인 — stock이면 우리 zwcrit 수치와 직접 비교 불가, zwcrit이면 stock 수치(27.86%)가 과소평가.
  • zwcrit 재평가는 seed 0 · 2개 태스크 · 100 rollout뿐. 분산 미확인(paper 프로토콜은 3 seed).
  • stamp_seal 47.0%에서도 남은 53%가 tolerance 3 cm 안에 못 들어오는 경우인지, 진짜 조작 실패인지 분해 안 됨.

다음 실험

  • 기준 판정 로그 추가: check_success를 stock/zwcrit 둘 다 매 step 평가해 episode별 (stock, zwcrit) 성공 쌍을 저장 → 재실행 없이 rollout 단위 flip 비율과 "허용 오차 경계 근처 실패"의 비중을 측정.
  • 나머지 5개 태스크 zwcrit 재확인: override 밖 태스크가 정말 stock과 동일한지, 7-task 평균 40.71%(산술 추정)가 실측과 맞는지 검증.
  • seed 3개(paper 프로토콜)로 stamp_seal·move_stapler_pad를 zwcrit 기준 재평가해 평균±분산 확보.
  • paper baseline 채점 기준을 Zero-WAM 코드/논문 부록에서 확정해, 확정되는 즉시 unseen-7 비교 표를 같은 기준으로 재작성.