Index
2026-09-07 — Analysis

RoboTwin hub 레포 — 기존 처리 방식 점검과 통합 방향

RoboTwin | 11개 정책 레포의 RoboTwin 2.0 사용 실태 조사, upstream(XPolicyLab) 대비 이탈 분석, hub 구조 제안

TL;DR

11
조사 레포
3
upstream 커밋 계열
4
평가 하네스 종류
94.15%
flex-pi 재현(논문 94.6)
~8.6pp
하네스 갭(tau 앵커)

1 배경 / 목적

RoboTwin 2.0 실험이 flex-pi, X-WAM 계열, tau-0-wm, FastWAM, ImageWAM, lingbot, FlowWAM 등에 흩어져 있고 각 레포가 시뮬레이터를 따로 vendoring해 왔다. 2026-09-07 upstream main(HEAD 96c1fea)을 새로 clone해 학습·평가 hub로 삼으려는 시점에 (1) 기존 처리 방식, (2) 그 타당성, (3) 더 나은 구조를 점검했다. 코드 변경 없음(XPolicyLab submodule init만).

기존 한계: 레포마다 다른 upstream 커밋·로컬 패치·step limit·instruction 셋. 한 레포의 에셋 변경이 다른 레포 평가를 오염(9/2). 정책과 시뮬이 한 conda env라 정책마다 sapien env clone.

2 조사 방법

3 결과

3.1 flex-pi의 기존 처리 방식 (가장 완성도 높음)

항목방식비고
시뮬 코드third_party/RoboTwin vendoring, upstream bf44be51 + 로컬 패치 7파일(디노이저 env, step-limit env, pkl2hdf5 RGB 등), upstream policy/* 삭제README.vendor.md
에셋X-WAM 트리 심링크 → 9/2 변조 사고 → HF 재다운 assets_own 전용 사본. background_texture(11 GB)만 아직 심링크lift_pot 4%/0% vs 100% 이상치로 발견
envflexpi-eval = robotwin clone + flexpi deps(torch 2.8.0+cu129). 정책·시뮬 한 프로세스원본 env는 tau 잡이 사용 중
평가 루프자체 Hydra MULTIRUN manager → eval_robotwin_single.py → vendored script/eval_policy.py in-processpolicy/flexpi_policy 심링크
클러스터isaac-lab 2.2.0 컨테이너, VK_ICD, LD_LIBRARY_PATH(시스템 lib 우선), PYTHONNOUSERSITE, ffmpeg 심링크, ROBOTWIN_RT_DENOISER=optixsmoke 96555/96564
프로토콜50 task × {clean, random} × 100 ep, unseen 양쪽, 4 step, replan 32, Flex-π 절반 step limit, 1 worker/GPU2 worker/GPU는 8 unit hang
성과full-joint 94.15% / action-only 94.93% / clean-50 avg 70.68논문 94.6

3.2 11개 레포 횡단 현황

레포RoboTwin 위치 / 커밋assets평가 방식실행 가능
X-WAMsubmodule @ c3ddfa8, 디노이저 패치 미커밋유일하게 완비(+curobo)ZMQ broker/server/client(upstream eval_policy 대체)가능 (자체 미착수)
X-WAM-action/-metaview핀만, 미초기화없음md5 동일 사본불가
X-WAM_MoT / Delta_actionX-WAM 심링크공유동일 사본, 미사용—
tau-0-wmX-WAM 트리 직접 참조(+쓰기)차용X-WAM ZMQ + 자체 server_zmq리더보드 수치 산출 c2c 70.68 / c2r 33.15, X-WAM sft 앵커 82.1(논문 90.7)
FastWAMvendored bf44be51없음Hydra in-process불가 step-limit 파일·policy 경로 불일치
ImageWAMvendored bf44be51(디노이저 패치 없음)_download.py만Hydra in-process불가 Tencent 경로 dangling
lingbot-vla-v2 / lingbot-va외부 checkout placeholder—websocket 서버 + 클라이언트미실행
FlowWAM외부 $ROBOTWIN_ROOT, 소스 무수정—HTTP/msgpack + upstream eval_policy미실행
flex-pivendored bf44be51 + 패치assets_ownHydra in-process94.15% 재현
구조적 문제 6가지: ① upstream 커밋 3계열 → 시뮬 코드 3종 ② B200 필수 디노이저 패치가 미커밋 diff에만 ③ 가변 에셋 트리 1개를 4개 레포가 공유 + eval 스크립트가 그 안에 쓰기 ④ 하네스 4종(하네스 자체가 ~8.6pp) ⑤ 데이터 포맷 3종 + clean-50 정의 2종 ⑥ stall 가드(timeout)는 tau 스크립트 하나에만.

3.3 새 upstream(96c1fea)과 vendored 사본의 차이

변경내용영향
구조script/→scripts/, task_config/→env_cfg/task_config/, policy/ 삭제 → XPolicyLab submodule기존 vendored 경로와 비호환
데이터 포맷XPolicyLab v1.0 HDF5(vision/cam_head/colors, state/, action/), episode_0000000.hdf5로컬 구 layout(observation/head_camera/rgb, joint_action/vector)은 새 로더가 못 읽음
평가 코드렌더/물리 동일. open_laptop, put_object_cabinet, place_object_scale에 arm_tag 프리셋(e154702)3 task는 새 코드로 재평가해야 비교 가능
instruction10개 task 문장 정리(41995f7)unseen 분포 변화
기본 프로토콜demo_clean=seen, demo_randomized=unseen(ba23672)flex-pi는 양쪽 unseen → hub에서 프리셋 명시 필요
requirementstorch==2.4.1 pinB200 불가 → robotwin env(torch 2.8) 재사용

3.4 데이터 소스

소스포맷비고
~/Datasets/RoboTwin2.0/dataset/<task>/aloha-agilex_{clean_50,randomized_500}구 layout, 6.5 GB/task변환 필요
HF dataset/<task>/demo_clean.zip새 layout ≈292 MB/taskscripts/download_xpolicylab_data.sh
HF aloha-agilex_randomized_500.zip구 layout 5 GB/task새 포맷 randomized는 HF에 없음
HF lerobot_dataset/RoboTwin_lerobot_v{21,30}.zip3.9 / 6.7 GB공식 LeRobot
변환기 scripts/process_data_xpolicylab.py96c1fea에서 삭제, git show 96c1fea^:…로 복구구 layout → v1.0 변환 확인(observation/joint_action/endpose 읽음)

4 Takeaway

평가

맞았던 것: 컨테이너·Vulkan·optix·ffmpeg·1 worker/GPU 레시피(검증 완료), 프로젝트별 불변 에셋 원칙, 결과 판독 시 정책 실패와 환경 실패 구분. 이 노하우는 hub로 그대로 이식할 자산.

틀렸던 것: 정책 레포마다 시뮬을 vendoring하고 정책·시뮬을 한 env에 넣은 구조. 레포 간 수치 비교 불가, 패치 유실 위험, 공유 에셋 사고, 정책마다 sapien env clone. upstream이 XPolicyLab(정책 서버/시뮬 클라이언트 분리, 어댑터 표준)으로 옮겨간 지금이 통합 적기.

제안 구조: 이 레포(upstream main + XPolicyLab)를 유일한 시뮬/에셋/데이터/평가 hub로. 시뮬 env = robotwin 하나(eval_env_conda_env), 정책 env는 각 레포 것(policy_conda_env). 평가는 scripts/eval_policy.sh multitask가 GPU pool에 task별 policy server + sim client를 띄움(같은 pod 내 local 모드; 원격 serve 모드는 worker ingress 차단이라 불가). 결과 경로 eval_result/<task>/<policy>/<task_config>/<ckpt>/<ts>에 ckpt가 들어가 9/2 매핑 혼동이 구조적으로 사라짐.

5 Next Steps

1. Hub 셋업

HF 에셋 다운로드(objects 3.7 + embodiments 0.2 + background 11 GB) 후 읽기 전용. robotwin env에 XPolicyLab editable + websockets/msgpack. _base_task.py 디노이저 env 패치 1줄, ffmpeg 심링크. demo_policy로 EVAL_ENV_TYPE=debug(로그인, GPU 불필요) → worker 1 GPU sim smoke 2 ep.

2. 데이터 이관

변환기 복구 → adjust_bottle 1 task → HF demo_clean.zip과 대조 → 50 task × {clean_50, randomized_500} CPU sbatch 변환. LeRobot 변환은 hub에서 1회, HF_LEROBOT_HOME NAS 공용.

3. 정책 연결

X_WAM upstream 어댑터 + 사용자 ckpt로 8 task smoke → tau 82.1 앵커와 대조. Flex-π는 create_policy.sh flexpi + model.py(flex-pi deploy_policy 이식) → 94.15% 프로토콜로 재검증.

4. 프로토콜 프리셋

leaderboard(upstream step limit, clean=seen/random=unseen) vs paper-repro(unseen/unseen, 절반 step limit)를 config로 명문화. 디노이저·RoboTwin/XPolicyLab 커밋·assets 해시를 결과 옆에 기록. tau의 timeout stall 가드를 스케줄러에 이식.

미확인

X_WAM 어댑터 action_type=ee의 RoboTwin aloha_agilex 지원, ws 서버 컨테이너 pod 포트 바인딩, 변환본 vs HF demo_clean 동일성.