robotwin env를 재사용 — 단 실행 중인 worker job이 그 env를 쓰고 있어 클론(flexpi-eval)에만 설치. 원본 env는 파일 하나 안 바뀜.ffmpeg 바이너리 부재(imageio-ffmpeg 정적 바이너리 심링크로 해결), user-site pillow 함정(PYTHONNOUSERSITE=1 pip로 해결).타당성 조사(이전 리포트)의 결론은 "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 수정은 그 잡을 깨뜨릴 수 있었다.| 단계 | 내용 | 근거 / 결과 |
|---|---|---|
| 호환성 검증 | torch 2.8 하드체크 없음(backbone.py:1349 <2.9 soft gate), 학습 전용 의존성(deepspeed/torchcodec/decord/wandb)은 lazy import | eval 경로에서 빠진 pip 패키지 15개만 필요 |
| env 클론 | conda create --clone robotwin → flexpi-eval | 7m10s. sapien/mplib/curobo/torch 보존, 원본 불변 |
| pip | 15개 + 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=null | eval은 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 smoke | scripts/smoke_flexpi_robotwin_worker.sh → sbm ... --container=nvcr.io/nvidia/isaac-lab:2.2.0 | SAPIEN Vulkan은 로그인·기본 이미지에서 "Found no drivers"(tau-0-wm 260818 게이트) → 컨테이너 필수 |
| 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 생성 |
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순위 용의자."기존 env에 eval만" 경로가 맞았고, 클론 한 번으로 라이브 env 리스크를 0으로 만들었다. 실제 막힌 곳은 모델 쪽이 아니라 주변부(ffmpeg, user-site, 컨테이너 Vulkan)였고 전부 재사용 가능한 레시피로 남았다. 남은 변수는 렌더 fidelity(OIDN) 하나 — 이 클러스터의 모든 RoboTwin 수치(tau 포함)에 공통되는 조건이라, 논문 대비 갭을 해석할 때 반드시 같이 봐야 한다.
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.
① 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.
_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회 |
| 성공률 / 추론 / wall | 2/2 · 397.5 ms · 19.4 s | 2/2 · 391.3 ms · 19.6 s |
| Laplacian var (ep0 / ep1) | 929.9 / 937.3 | 496.9 / 473.9 (−47~49%) |
| mean |dx| (ep0 / ep1) | 5.78 / 6.47 | 2.10 / 3.87 |
| mp4 (ep0) | 255 KB | 92 KB |
libnvoptix.so.1 주입). 디노이즈된 입력이 학습 분포(OIDN-denoised)에 더 가깝다. OIDN↔OptiX 출력 차이는 남은 분포 차이(미측정) — sweep이 논문 94.6%와 크게 벌어지면 OIDN 2.3.x 교체가 다음 카드.시뮬레이터 자체(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.
_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와 직접 비교 불가. 사용자 결정: 논문 프로토콜 유지.