← Back
2026-04-28 · progress

Handoff — Closed-loop sim env READY, 다음 세션 바로 실행 진행

TL;DR. > 이 파일을 다음 세션 시작 시 먼저 읽어주세요. 어디까지 됐고 / 다음에

이 파일을 다음 세션 시작 시 먼저 읽어주세요. 어디까지 됐고 / 다음에 무엇을 / 어떻게 / 어느 결정 대기 중인지 한 곳에.

1줄 상태

RoboMME closed-loop sim 의 모든 환경 셋업과 자산 다운로드가 완료. 다음에 할 것은 policy server (GPU 0) + eval client (GPU 1) 두 프로세스를 연결해 BinFill ep0 1 episode closed-loop 을 실제로 굴리는 것. 사용자에게 구현 방식 (i/ii/iii) 결정을 받아야 진행 가능.

어디까지 됐는지 (세션 종료 시점 = 2026-04-28)

✅ Phase 0–3 (VLM-only 검증) — claude/260427/exp-memer_lora_binfill_ep0.md

✅ Closed-loop sim 환경 셋업 (오늘 = 260428)

긴 막힘 끝에 cluster Vulkan 동작 — 자세한 흐름은 setup-robomme_b200_cluster.md. 요약:

✅ 자산 다운로드 완료

자산 경로 크기 용도
MemER LoRA (VLM) ~/ckpts/robomme-memer-lora-checkpoint-1300/checkpoint-1300/ ~1.1 GB grounded subgoal 예측
Qwen3-VL-4B-Instruct (base) ~/.cache/huggingface/hub/models--Qwen--Qwen3-VL-4B-Instruct 8.3 GB LoRA 의 base
VLA symbolic-grounded-subgoal/79999 runs/ckpts/mme_vla_suite/symbolic-grounded-subgoal/79999/{_CHECKPOINT_METADATA, assets, params} 11.55 GB MemER MODEL_TYPE 의 VLA
pi05_base ~/openpi_data/openpi-assets/checkpoints/pi05_base/{assets, params} 12 GB VLA backbone
RoboMME LeRobot v2 ~/Dataset/robomme/<TASK>_lerobot/ (이미 있음) open-loop / 시각화용
RoboMME H5 ~/Dataset/robomme/record_dataset_<TASK>.h5 (이미 있음) dataset builder 입력

assets/norm_stats.jsonruns/assets/mme_vla_suite/robomme/ 에 복사됨.

✅ Env vars / 경로 reference

ROBOMME=/home/nas_main/taewoongkang/conda_envs/envs/robomme
export LD_LIBRARY_PATH=$ROBOMME/lib:$LD_LIBRARY_PATH
export VK_ICD_FILENAMES=/etc/vulkan/icd.d/nvidia_icd.json
export USE_HF=1
export OPENPI_DATA_HOME=/home/nas_main/taewoongkang/openpi_data

이 4개 env 가 동시에 set 되어야 sim + VLM 양쪽 모두 동작.

🚧 다음에 할 것 (BLOCKED on user decision)

1. eval.py 에 mplib monkey-patch 적용 방식 결정

세 가지 선택지 — 사용자가 골라야 함:

기본 추천: (iii) — git-diff 깨끗하고 명시적이고 추후 mplib 0.2.x 호환되는 mani-skill 버전 나오면 wrapper 만 지우면 끝.

2. 실행 범위 결정

기본 추천: 먼저 (a) 로 closed-loop 자체가 동작하는지 보고, 결과 보고 사용자가 (b) / (c) 결정.

실행 명령어 (결정 후 그대로 실행)

(아래는 (i) 또는 (iii) 가정. (ii) 면 sitecustomize.py 만들고 환경변수 일관성만 확인.)

Terminal A — VLA policy server (GPU 0)

cd ~/repos/Robotics/robomme_policy_learning
export OPENPI_DATA_HOME=~/openpi_data
CUDA_VISIBLE_DEVICES=0 uv run scripts/serve_policy.py \
    --seed=7 --port=8000 \
    policy:checkpoint \
    --policy.dir=runs/ckpts/mme_vla_suite/symbolic-grounded-subgoal/79999 \
    --policy.config=mme_vla_suite

처음 한 번 시작 시 JAX 컴파일 + 가중치 로드에 ~30–60s 걸림. "Listening on port 8000" 메시지 뜨면 준비 완료.

Terminal B — sim + VLM client (GPU 1)

cd ~/repos/Robotics/robomme_policy_learning
ROBOMME=/home/nas_main/taewoongkang/conda_envs/envs/robomme
export LD_LIBRARY_PATH=$ROBOMME/lib:$LD_LIBRARY_PATH
export VK_ICD_FILENAMES=/etc/vulkan/icd.d/nvidia_icd.json
export USE_HF=1

# (i) 또는 (iii) 적용 후
CUDA_VISIBLE_DEVICES=1 $ROBOMME/bin/python examples/robomme/eval.py \
    --args.model_seed=7 --args.port=8000 \
    --args.policy_name=symbolic-grounded-subgoal --args.model_ckpt_id=79999 \
    --args.use-memer --args.subgoal-type=grounded_subgoal \
    --args.memer_adapter_path=$HOME/ckpts/robomme-memer-lora-checkpoint-1300/checkpoint-1300 \
    --args.only_tasks=BinFill

only_tasks=BinFill 로 BinFill 만 돌림. ep0 만 돌리려면 추가로 runs/evaluation/.../progress.json pre-populate (eval.py 의 setup_log_dict 가 기존 entries 를 skip 하므로) 또는 eval.py 의 episode loop 에 break 조건 추가. 이 부분은 결정 (a) 시 추가 메모 필요.

결과: runs/evaluation/symbolic-grounded-subgoal/ckpt79999/seed7/<vlm_dir>/ - progress.json (per-episode result) - videos/<TASK>_ep<N>_<flag>_<task_goal>_<difficulty>.mp4 - log.json (final success_rate)

⚠️ 알려진 후속 변수 / 함정

  1. mplib monkey-patch 미적용 시 segfault — 위 실행 명령에서 (i)/(iii) 안 하면 episode reset 시 mplib.Planner.set_base_pose 에서 TypeError: incompatible function arguments.

  2. eval.py 의 try/except 로 episode error 감춤 (line 322 부근). 만약 closed-loop 결과가 이상하면 progress.json"error" entries 확인 필요. try/except 제거하면 stack trace 확인 가능 (사용자의 no-try-except 선호도와 충돌 — 디버깅 시에만 임시 제거).

  3. VLM/VLA GPU 분리serve_policy.py 는 JAX 가 자동으로 모든 GPU 잡으니 반드시 CUDA_VISIBLE_DEVICES=0 로 격리. eval.py 도 별도 GPU (1, 2, …) 에 격리. 현재 GPU 점유 상태 확인 후 비어있는 곳 골라야 함 (nvidia-smi 또는 sgpu).

  4. only_tasks=BinFill 만 안 통하면 TASK_NAME_LIST 의 정확한 표기 확인. examples/robomme/utils.py 참조.

  5. WebSocket 끊김 (long-horizon task) — README Q2 언급. progress.json 에서 resume 가능. BinFill 은 짧으니 일반적으로 안 터짐.

안 까먹어야 할 핵심 발견

  1. NVIDIA Vulkan 이 cluster 에서 안 되던 진짜 이유: conda env 에 GLVND lib (libGL, libGLX, libGLdispatch, libEGL, libOpenGL) 부족 + libdrm 구버전. libGLX_nvidia.so.0 자체는 exist, 단지 dispatch layer 가 없어서 Vulkan instance 만들 때 ErrorIncompatibleDriver 반환. conda-forge libglvnd libgl libglx libegl libopengl libdrm libvulkan-loader 한 줄로 해결.

  2. 결정적 단서: 사용자가 가리킨 /home/nas_main/sungwonhwang/.conda/envs/mav (CARLA 환경). 이 env 의 lib/ 를 LD_LIBRARY_PATH 에 넣으면 작동, 안 넣으면 작동 안 함 → diff 해서 누락 lib 들 찾음. 이런 단서는 다음에 비슷한 cluster 이슈 만났을 때 첫 단계로 시도.

  3. api_memer.py 의 3 fix 는 driver 에 monkey-patch 로 옮겨놨음 (scripts/eval_robomme_memer_lora.py 상단). git diff 로 본 repo 코드 변경 없음. closed-loop eval 측 (examples/robomme/eval.py) 도 같은 원칙 유지하는 게 일관됨 → 위 (iii) 옵션 추천 이유.

  4. mplib 0.1.1 ABI segfault 는 random crash 가 아니라 특정 시스템 lib 조합과 ABI 안 맞아서 발생. 0.2.1 로 업그레이드 + API mismatch monkey-patch 가 minimum-invasive fix.

관련 파일 빠른 참조

파일 내용
claude/context.md 프로젝트 전체 맥락 (최신 상태 반영됨)
claude/260427/plan-evaluate_memer_lora_on_robomme.md 5-phase 체크리스트 (Phase 0–3 done, Phase 4–5 pending)
claude/260427/notes-prompt_format_diff.md Path B 결정 이유 (this repo vs sister repo prompt diff)
claude/260427/exp-memer_lora_binfill_ep0.md VLM-only Phase 0–3 작업 로그
claude/260428/setup-robomme_b200_cluster.md 이 cluster 에서 RoboMME 돌리는 셋업 가이드 + 모든 막혔던 길
claude/260428/handoff-closed_loop_ready.md (이 파일) 다음 세션 핸드오프
scripts/eval_robomme_memer_lora.py open-loop VLM-only driver (Phase 0–3 결과물)

한 줄 정리

"환경 셋업 다 됐고, 자산 다 받았고, sim 동작 검증도 끝났다. 다음에 할 일은 mplib monkey-patch 적용 방식만 결정해서 두 터미널 띄우는 것."