BananaInBowlTask 50/50 steps 완주, 3.24 it/s, EXIT=0type=2(discrete GPU)로 인식 — 소프트웨어 렌더러 폴백이 아님policies/dreamzero/)가 이미 존재 — 직접 구현 불필요max|flash-sdpa| = 0.00000)출발점은 "DreamZero를 RoboLab에서 돌려보고 싶다"였다. 그런데 "robolab"이 무엇인지에 대한 오해로 문제 정의가 두 차례 뒤집혔다.
| 단계 | 가정 | 도출된 결론 |
|---|---|---|
| 1차 | robolab = 실제 로봇 랩 | 불가능 worker pod ingress가 닫혀 외부 로봇이 접속 불가. login node 상시 서빙은 클러스터 규칙 위반 |
| 2차 | robolab = 별도 GPU 머신 | 접근 불가 SSH private key 없음, known_hosts에 github.com뿐 |
| 실제 | RoboLab = Isaac Lab 기반 시뮬레이션 벤치마크 | 가능 시뮬과 정책 서버를 같은 pod에 배치 → 네트워크 제약 소멸 |
~/repos/Robotics/RoboLab에 이미 클론된 NVIDIA NVlabs의 벤치마크(RoboLab-120, 100+ manipulation task)였다. 시뮬레이터이므로 모든 것이 한 worker pod 안에서 완결된다. 앞선 두 단계의 블로커가 전부 무의미해졌다.
그리고 policies/dreamzero/{run.py,client.py} — DreamZero 공식 어댑터가 이미 포함되어 있었다. 기본값이 localhost:5000이라 단일 pod 구성이 설계상 자연스럽다.
이로써 남은 실질 질문은 단 하나로 좁혀졌다: Isaac Sim이 B200에서 도는가? RoboLab README가 NVIDIA RTX GPU required를 명시하고 VRAM 가이드가 전부 L40(48GB) 기준이라, datacenter GPU에서는 실패할 것으로 예상했다.
설치(uv sync, 18GB) 후 import부터 연달아 막혔다. 그런데 표면 증상과 진짜 원인이 달랐다.
| 증상 | 표면 해석 (오답) | 실제 원인 |
|---|---|---|
ImportError: libGL.so.1 | login node에 OpenGL 없음 | libglvnd 로더만 부재 |
| Vulkan 라이브러리 검색 0건 | B200이 Vulkan 미지원 | libvulkan.so.1 로더만 부재 |
NVIDIA Container Toolkit이 벤더 구현은 주입했지만, 그 위에 얹히는 벤더 중립 로더 계층은 이미지에 없었다. libglvnd와 Vulkan 로더는 애플리케이션과 드라이버 사이의 dispatch 레이어인데, 이게 없으면 드라이버가 아무리 멀쩡해도 libGL.so.1을 찾는 프로그램은 전부 실패한다.
즉 하드웨어 제약이 아니라 컨테이너 이미지 구성 문제였고, 따라서 sudo 없이 유저 레벨로 해결 가능했다.
libglvnd 본체는 libOpenGL.so.0 / libGLdispatch.so.0만 제공한다. 정작 필요한 libGL.so.1 / libEGL.so.1 / libGLX.so.0는 *-conda-x86_64 하위 패키지가 제공하며, 설치 경로가 lib/가 아니라 x86_64-conda-linux-gnu/sysroot/usr/lib64/다. 두 경로를 모두 LD_LIBRARY_PATH에 넣어야 한다.
type=2 = VK_PHYSICAL_DEVICE_TYPE_DISCRETE_GPU. 소프트웨어 렌더러(lavapipe) 폴백이 아니라 실제 하드웨어 경로임이 확정됐다. 이 시점에서 "RT core 부재로 렌더링 붕괴" 시나리오가 배제됐다.
참고: Vulkan 열거는 CUDA_VISIBLE_DEVICES를 따르지 않아 8장이 모두 보인다. 렌더 GPU는 --/renderer/activeGpu=N으로 별도 지정해야 한다.
success: False는 정상이다. run_empty는 정책 없이 빈 액션을 넣으므로 바나나를 못 집는 게 기대 동작이다. 검증 대상은 성공률이 아니라 시뮬+렌더 파이프라인의 구동 여부였다.
GLFW initialization failed, failed to open the default display — X 서버 없이 창을 안 띄우는 headless 모드라 당연하다. 렌더링은 Vulkan 경로로 별도 진행된다.
ImportError)에서 판단을 멈췄다면 멀쩡히 돌아가는 경로를 포기했을 것이다. 벤더 라이브러리 존재 여부까지 내려가 확인한 것이 분기점이었다..gl conda prefix + LD_LIBRARY_PATH 패턴은 이 클러스터에서 Isaac Sim / Omniverse / OpenGL 계열을 쓰는 모든 향후 작업에 그대로 적용된다.dreamzero conda env가 torch 2.7.1+cu128, README 요구는 torch 2.8+/CUDA 12.9+ → 정합성 확인 필요ffmpeg 부재 → 비디오 녹화 사용 시 conda 설치 필요--num-envs 상향 시 VRAM 실측 미확인. 가이드는 L40(48GB) 기준이라 B200(183GB)에서 상향 여지 큼--task BananaInBowlTask로 소규모 end-to-end--remote-uri로 호스팅 엔드포인트에 붙으면 14B 서빙 GPU를 절약 가능시뮬레이터 쪽이 확인됐으니 정책 쪽을 준비했다. 기존 dreamzero env는 실행 불가능한 상태였다 — torchaudio만 2.8/cu129로 튀어 있고 flash-attn이 없는, 부분 업그레이드를 시도하다 중단된 흔적이었다. 기존 env를 덮지 않고 새 env를 생성했다.
| 패키지 | 구 env (사용 불가) | 신 env dreamzero-robolab | 요구 |
|---|---|---|---|
| torch | 2.7.1+cu128 | 2.8.0+cu129 | 2.8.0 |
| torchvision | 0.22.1+cu128 | 0.23.0+cu129 | 0.23.0 |
| torchaudio | 2.8.0+cu129 | 2.8.0+cu129 | 2.8.0 |
| transformers | 4.46.2 | 4.51.3 | ckpt: 4.51.3 |
| flash-attn | 없음 | 2.8.3.post1 | 필수 |
GEAR-Dreams/DreamZero-DROID는 public repo라 HF 토큰 불필요. 전체 ~65GB 중 tensorrt/(~19GB)는 GB200 전용이라 제외.
config.json에서 diffusion_model_pretrained_path / image_encoder_pretrained_path / text_encoder_pretrained_path가 모두 null임을 확인했다. 즉 모든 가중치가 safetensors에 통합돼 있어 Wan2.1-I2V-14B와 umt5-xxl을 따로 받을 필요가 없었다.
Invalid cross-device linkERROR: Failed building wheel만 보면 컴파일 실패로 오독하기 쉽다. 실제로는 prebuilt wheel을 이미 받아둔 상태였고, 임시 디렉토리가 /tmp(로컬 디스크)이고 목적지가 ~/.cache/pip(NAS gpfs)라 os.rename이 파일시스템 경계를 넘지 못한 것뿐이다. TMPDIR을 NAS로 지정해 해결. NAS 홈 + 로컬 /tmp 조합인 이 클러스터에서 반복될 패턴이다.
부수 주의: PATH의 기본 nvcc가 ~/cudas/cuda-13.0을 가리켜 torch cu129와 불일치한다. CUDA_HOME=/usr/local/cuda-12.8 명시 필요.
action_horizon=24 ↔ RoboLab 어댑터 기본 open_loop_horizon=24 정확히 일치 → 튜닝 불필요load_pretrained_det_decode_layer_path가 NVIDIA 내부 경로를 가리키나, grep 결과 dataclass 필드 선언 1곳에만 존재하고 로드 코드가 없다 → 죽은 설정