Index
2026-07-21 — Experiment

Cosmos3-Nano-Policy-DROID × RoboLab — B200 클러스터 end-to-end 평가

Cosmos3 | Job 50830 · 2×B200 · isaac-lab:2.2.0 · 이미지 빌드 없음

TL;DR

4/4
Success
100%
Success Rate
7:03
Job Elapsed
141s
Model Load
1.20
it/s
24
Server Infers

1 배경 / 목적

이전 단계(Stage A)에서 policy 서버 단독 추론은 검증했지만, state를 home pose로 합성해 넣었기 때문에 "정책이 동작한다"까지만 말할 수 있었다. task success rate 같은 정량 평가를 하려면 RoboLab 시뮬 client를 붙여야 한다.

기존 한계: 업스트림 쿡북이 Docker 컨테이너 2개를 --net host로 통신시키는 구조 — 워커 pod 내 Docker 실행 불가(§14), job 간 통신 불가(§4), pod당 이미지 1개, 디스플레이 없음. 네 가지가 전부 충돌.

2 작업 내용

설계: 단일 pod, 2 GPU, 2 인터프리터

구성선택이유
이미지nvcr.io/nvidia/isaac-lab:2.2.0 직접 사용login DinD 빌드는 20GB+ 이미지를 emptyDir(32Gi)에서 빌드·푸시해야 해 위험. 이미지에 gcc/git이 이미 있어 빌드 이유 없음
GPU 0policy 서버 — cosmos3 venv (cu130 torch)venv가 자기 python을 들고 있어 이미지와 무관하게 동작
GPU 1RoboLab sim — 이미지의 _isaac_sim/python.shRTX 렌더링과 diffusion 추론의 경합 제거
RoboLab 코드NAS 클론 + PYTHONPATHASSET_DIR이 repo 상대경로라 pip install -e . 불필요, 에셋을 이미지에 굽지 않아도 됨
부족 패키지NAS --target + --no-deps3개뿐. --no-deps로 이미지의 numpy/rich/typing_extensions shadowing 회피
scripts/run_robolab_eval.sh 서버 bg 기동 → /healthz 폴링 → client 실행 scripts/robolab_cosmos3_runner.py 업스트림 run.py의 클러스터 대응판 scripts/probe_isaaclab_env.sh 이미지/렌더 진단 (heartbeat 계측) scripts/probe_isaac_paths.sh Kit 쓰기 경로 진단 (CPU 전용) client는 env -u LD_LIBRARY_PATH -u VIRTUAL_ENV 로 실행 — 두 인터프리터 격리

해결한 블로커 4개

1. RoboLab 클론이 깨져 있었음 — 인터럽트된 clone 상태로 git index가 비어 3512개 파일이 staged-deletion으로 보이고, 실제 파일은 알파벳순 assets/ 중간까지만 존재. GIT_LFS_SKIP_SMUDGE=1 git reset --hardgit lfs pull로 에셋 6.3GB 복원.
2. Kit 쓰기 권한 — 진짜 렌더링 블로커
PermissionError: '/isaac-sim/kit/data'HydraEngine rtx failed creating scene renderer. 워커 pod는 uid 10010인데 이미지의 /isaac-sim은 root 소유(755). CPU 전용 probe로 확인한 결과 쓰기 가능한 경로는 /tmp. 업스트림 run_docker.sh는 root로 돌며 bind-mount로 우회하고 있어 재현 불가.
해결: kit --help에 정식 옵션 존재 — --portable-root PATH: Enable portable mode and place data/cache/logs folders there. IsaacLab AppLauncher--kit_args로 Kit 인자를 sys.argv에 주입하므로 이걸로 전달. 별도로 하드코딩된 ~/.cache/ovHOME=/tmp/ovhome으로 처리. portable root는 /tmp가 아닌 NAS에 둬서 셰이더 캐시(173MB)가 job 간 유지되도록 함.
3. Kit shutdown hang — 오진할 뻔한 지점
권한 수정 후에도 exit 124 반복. 원인 파악이 안 된 건 계측 부실 — 파이썬 stdout이 파이프에서 블록 버퍼링돼 진행 상황 print가 통째로 유실. python -u + 30초마다 phase를 찍는 daemon 스레드를 넣자 즉시 판명: heartbeat가 app.close에서 1770초 넘게 계속 뛰고 있었다.
4. Warp CUDA 초기화 실패 — 무해로 판정 — isaac-sim 5.0 번들 Warp가 cuDeviceGetUuid(구 심볼)를 찾는데 클러스터 드라이버가 CUDA 13이라 없음. 환경 생성과 전 에피소드를 통과했으므로 DROID 조작 태스크는 Warp 경로를 타지 않음.

3 결과

Job 50830 COMPLETED, Elapsed 00:07:03 (2×B200, --qos=extra)

태스크 성공률 — BananaInBowlTask, 4 envs

지표비고
Success4/4 = 100.0%95% CI [47.8–99.5] — n=4라 CI가 매우 넓음
Score(total)1.000
에피소드 길이165 / 172 / 167 / 188 steps평균 11.53s @ dt=0.0667
EE path length0.96 m
EE speed mean8.2 cm/smax 22.7–26.3 cm/s
EE SPARC−2.62궤적 부드러움 지표
joint RMSE mean0.021–0.025env별

타이밍

서버 체크포인트 로드
141 s
policy inference (합)
57.1 s
per sim-step (amortized)
304 ms
env step avg
439.4 ms
video write
16.7 s
wall total
156.5 s
throughput
1.20 it/s
서버 추론 호출
24 회

산출물: env별 rollout mp4 4개(각 ~6MB) + viewport mp4 4개, episode_results.jsonl, log_0_env{0..3}.json

미해결 관찰 — 호출당 latency가 Stage A보다 느림: 57.144s / 24 calls = 2381ms/call인데 Stage A action-only 벤치는 966ms round-trip이었다. 첫 호출 warmup(Stage A 실측 27.0s)을 빼면 30.1s / 23 = 1310ms로 좁혀지지만 여전히 갭이 있다. RoboLab의 policy_inference_s 타이머에는 client측 전처리(3뷰 카메라 텐서 GPU→numpy, resize_with_pad, F.interpolate, msgpack)가 포함되어 순수 서버 시간이 아니다. 원인 귀속은 아직 측정으로 확인하지 않았다.
확인한 경고 (문제 아님): no training action dataset config found; using default ActionTransformPipeline 경고가 Stage A probe 로그에도 동일하게 존재. 공개 체크포인트에 학습 데이터셋 config가 동봉되지 않아 나는 정상 동작이며, 4/4 성공이 기본 파이프라인의 액션 정규화가 올바름을 뒷받침. 우리 셋업이 만든 회귀가 아님.

4 Takeaway

의미

Docker 2컨테이너 전제의 업스트림 워크플로를 이미지 빌드 없이 단일 sbatch pod로 재현했다. --container= + venv + PYTHONPATH 조합만으로 IsaacSim 급 스택이 이 클러스터에서 돌아간다는 게 확인됐고, 이 패턴은 다른 RoboLab 정책(pi0_family, gr00t, dreamzero)에 그대로 재사용 가능하다.

방법론 측면에서 더 값진 교훈은 exit 124를 세 번 봤는데 원인이 두 번 달랐다는 점이다. 계측 없이 timeout만 보고 "렌더링이 안 된다"고 결론냈다면 이미지 빌드나 설계 변경으로 갔을 텐데, 실제로는 렌더링이 처음부터 정상이었고 종료 처리만 막혀 있었다. hang 디버깅에 heartbeat + phase 라벨은 필수 — 침묵은 진행 중과 데드락을 구분해주지 않는다.

5 Next Steps

미해결 한계

n=4는 통계적으로 무의미 — 95% CI가 [47.8–99.5]로 사실상 정보가 없다. --num-envs 10 이상 또는 --num-episodes-adaptive 200(TRI LBM 프로토콜, CI 폭 ≤0.14)로 재측정 필요.

latency 귀속 미완 — 2381ms/call vs 966ms 갭. client 전처리와 서버 시간을 분리 계측해야 X-WAM 비교표에 RoboLab 조건 수치를 추가할 수 있다.

다음 실험

벤치마크 전체 스윕 — 120개 태스크. 태스크당 ~2.6분(4 env) 기준 약 5시간, env를 늘리면 더 길어짐.

웜 캐시 효과 측정 — 이번 job이 셰이더 캐시를 채웠으므로 다음 job의 Kit 기동 시간을 비교하면 NAS portable-root의 실익이 정량화된다.

Cosmos3-Edge-Policy-DROID--format-prompt-as-json True 필요.