Index
2026-08-26 — Engineering

Flex-π RoboTwin 2.0 eval 파이프라인 구축 & worker smoke

flex-pi | robotwin env 클론 경로, isaac-lab 컨테이너, 공개 ckpt step_048060

TL;DR

2/2
lift_pot SR
397.5 ms
infer/call (eager)
19.4 s
wall / episode
83.8 s
model load (worker)
−48%
noise w/ optix
96576
sweep job

1 배경 / 목적

타당성 조사(이전 리포트)의 결론은 "RoboTwin은 공식 지원 → env 구축 + 다운로드만". 사용자는 새 flexpi env 대신 기존 robotwin env에 eval만 얹자고 제안했고, 동시에 "설치하다 다른 게 망가지지 않나 — 지금 그 env 쓰고 있을 텐데"를 우려. 목표: 원본 env를 건드리지 않고 공개 ckpt로 RoboTwin eval을 worker에서 end-to-end 돌리는 것.

실제 위험이었음: squeue/scontrol로 확인한 결과 실행 중인 tau_rt_eval_54000(job 96440, +대기 2개)이 worker에서 바로 그 env를 import 중. pip dry-run은 huggingface_hub 1.28→0.36.2, fsspec 다운그레이드를 예고 → 라이브 env 수정은 그 잡을 깨뜨릴 수 있었다.

2 작업 내용

단계내용근거 / 결과
호환성 검증torch 2.8 하드체크 없음(backbone.py:1349 <2.9 soft gate), 학습 전용 의존성(deepspeed/torchcodec/decord/wandb)은 lazy importeval 경로에서 빠진 pip 패키지 15개만 필요
env 클론conda create --clone robotwin → flexpi-eval7m10s. sapien/mplib/curobo/torch 보존, 원본 불변
pip15개 + pip install -e . --no-deps; PYTHONNOUSERSITE=1로 재실행원본 env의 pillow가 ~/.local에만 있어 첫 설치에서 "already satisfied"로 건너뜀 → 문서 권장 플래그로 돌리면 No module named PIL
가중치third_party/RoboTwin/assets → X-WAM, checkpoints/Wan-AI → FastWAM 심링크; ckpt 12.05 GB 다운로드Wan VAE/T5/tokenizer/DINOv3(공유 HF 캐시) 재다운로드 0
config 패치runs/flexpi-robotwin/config.yaml 3줄: redirect_common_files=false, skip_dit_load_from_pretrain=true, action_dit_pretrained_path=nulleval은 CLI model.*을 무시하고 저장 config로 모델 생성(deploy_policy.py:809) — 미패치 시 ModelScope 12.4 GB 추가 다운로드
로그인 검증tmp/check_model_load.py: compose → instantiate → load_checkpoint → processor (렌더 없음)112 s, 25.0 GB, action_dim 14, 3 cam — §1 허용 범위(모델 1회 로드)
worker smokescripts/smoke_flexpi_robotwin_worker.sh → sbm ... --container=nvcr.io/nvidia/isaac-lab:2.2.0SAPIEN Vulkan은 로그인·기본 이미지에서 "Found no drivers"(tau-0-wm 260818 게이트) → 컨테이너 필수
worker env (smoke 스크립트) VK_ICD_FILENAMES=/etc/vulkan/icd.d/nvidia_icd.json PATH=$ENV/bin:$PATH LD_LIBRARY_PATH=/usr/lib/x86_64-linux-gnu:$ENV/lib (컨테이너 시스템 lib 우선) PYTHONNOUSERSITE=1 HF_HOME=/home/nas_main/.cache/huggingface HF_HUB_OFFLINE=1 DIFFSYNTH_MODEL_BASE_PATH=$PWD/checkpoints DIFFSYNTH_SKIP_DOWNLOAD=true

3 결과

Job결과비고
96547 (1차)실패FileNotFoundError: 'ffmpeg' — RoboTwin eval_policy.py:336의 mp4 저장. 그 전 Vulkan(B200)·Render Well·worker 모델 로드 97.75 s·씬 구성은 통과
96555 (2차)lift_pot 2/2 = 100%4m15s(로드 83.8 s 포함). ep1: 111 step, wall 19.4 s, policy 15.2 fps, 추론 4회 × 397.5 ms, sim 5.9 s. mp4 2개 + _result_random.txt 생성
파이프라인 end-to-end 확인: torch 2.8 + 클론 env + 로컬 가중치 + isaac-lab 컨테이너로 논문 프로토콜(unseen, 4 steps, replan 32, full-joint) 실행 가능. 추론 397.5 ms는 eager 기준 — 논문 193 ms(RTX 5090)는 compile/TRT 스택.
OIDN 디노이저 미작동: RoboTwin은 rt 32 spp + set_ray_tracing_denoiser("oidn")로 학습 데이터를 렌더(_base_task.py:214-217). sapien 번들 OIDN 2.0.1의 CUDA 디바이스에 내장된 아키텍처는 compute_90뿐 → B200(sm_100)에서 "unsupported compute capability" → 매 프레임 OIDN Error, 디노이즈 없는 노이즈 이미지가 정책 입력. tau-0-wm RoboTwin eval도 동일(클라이언트 로그당 1,888회). smoke는 2/2였지만 50-task 수치가 논문 94.6%와 벌어지면 1순위 용의자.

4 Takeaway

의미

"기존 env에 eval만" 경로가 맞았고, 클론 한 번으로 라이브 env 리스크를 0으로 만들었다. 실제 막힌 곳은 모델 쪽이 아니라 주변부(ffmpeg, user-site, 컨테이너 Vulkan)였고 전부 재사용 가능한 레시피로 남았다. 남은 변수는 렌더 fidelity(OIDN) 하나 — 이 클러스터의 모든 RoboTwin 수치(tau 포함)에 공통되는 조건이라, 논문 대비 갭을 해석할 때 반드시 같이 봐야 한다.

5 Next Steps

full sweep (사용자 결정)

50 task × clean/random × 100 ep = 10,000 ep. 견적 ~20 s/ep(lift_pot 기준; step 한도 큰 task는 더 김) / (8 GPU × 2 worker) ≈ 4~8 h(eager). eval_flexpi_robotwin.sh config block에 CKPT/DATASET_STATS 설정 + smoke와 같은 env export → sbm ... --gres=gpu:8 -c 64 --mem 1600GB --qos=own --time 12:00:00 --container=nvcr.io/nvidia/isaac-lab:2.2.0.

디노이저 복구 (선택, sweep 전 권장)

① set_ray_tracing_denoiser("optix") — 드라이버 libnvoptix.so.1이 pod에 주입돼 있어 1-GPU smoke로 즉시 시험 가능(디노이저 종류가 달라 분포는 근사). ② OIDN 2.3.x(Blackwell 지원) 바이너리를 sapien/oidn_library/에 같은 soname으로 교체 — 학습 렌더와 동일 디노이저.

속도

TORCH_COMPILE=true(launcher 기본)로 397 → ~200 ms/call 기대. torch 2.8 inductor에서 첫 컴파일 30-60 s/worker.

6 업데이트 — optix 디노이저 검증 & full sweep 제출

_base_task.py:219의 디노이저를 ROBOTWIN_RT_DENOISER(기본 oidn = upstream)로 게이트하고 optix로 smoke(job 96564). 96555(OIDN-off) 영상과 고주파 노이즈를 tmp/compare_video_noise.py로 비교.

OIDN-off (96555)optix (96564)
디노이저 오류40회0회
성공률 / 추론 / wall2/2 · 397.5 ms · 19.4 s2/2 · 391.3 ms · 19.6 s
Laplacian var (ep0 / ep1)929.9 / 937.3496.9 / 473.9 (−47~49%)
mean |dx| (ep0 / ep1)5.78 / 6.472.10 / 3.87
mp4 (ep0)255 KB92 KB
OptiX 디노이저가 컨테이너에서 정상 동작(드라이버 libnvoptix.so.1 주입). 디노이즈된 입력이 학습 분포(OIDN-denoised)에 더 가깝다. OIDN↔OptiX 출력 차이는 남은 분포 차이(미측정) — sweep이 논문 94.6%와 크게 벌어지면 OIDN 2.3.x 교체가 다음 카드.
job 96576 flexpi_rt_sweep (own, 8 GPU × 2 worker, 12 h cap, optix, eager) sbm "bash scripts/sweep_flexpi_robotwin_worker.sh" --gres=gpu:8 -c 64 --mem 1600GB --qos=own --time 12:00:00 \ -J flexpi_rt_sweep --container=nvcr.io/nvidia/isaac-lab:2.2.0 50 task × {clean, random} × 100 ep · unseen · 4 steps · replan 32 · full-joint · 견적 4~8 h 재개: RESUME_DIR=<output dir> 로 같은 스크립트 재제출 (완료된 (task, phase) 스킵)

7 tau(X-WAM 하네스) vs Flex-π — 같은 시뮬인가?

시뮬레이터 자체(sapien/mplib/curobo 바이너리, envs/ 코드, assets, 컨테이너)는 동일. 다른 것은 평가 루프(X-WAM zmq client vs RoboTwin 공식 eval_policy.py), 디노이저(없음 vs optix), phase(randomized만 vs clean+random), 추론(5 steps vs 4 steps) — 그리고 step limit.

step limit 차이: Flex-π vendored _eval_step_limit.yml은 upstream 값을 대체로 절반으로 축소(lift_pot 200/400, blocks_ranking 600/1200, pick_diverse_bottles 140/400, shake_bottle 200/700 …). tau/X-WAM은 upstream 값. → 이번 sweep 수치는 Flex-π 논문 프로토콜 재현용이며 tau와 직접 비교 불가. 사용자 결정: 논문 프로토콜 유지.