VLM-only Phase 0–3 (260427) 에서 MemER LoRA (Yinpei/vlm_subgoal_predictor /
memer/grounded_subgoal/checkpoint-1300) 가 RoboMME BinFill 데이터에 in-domain
subtask + grounded <x, y> 좌표를 출력함을 검증했음. 다음 단계는
closed-loop full pipeline:
sim env (sapien/ManiSkill BinFill) → MemER LoRA (subtask)
→ MME-VLA (symbolic-grounded-subgoal/79999, pi05 + memory-aware action expert)
→ action chunk → sim step → ...
검증 목표: (a) 환경 셋업과 wrapper 가 의도대로 동작 (b) ep0 single episode 가 완주되고 success/failure flag 가 찍히는지 (c) VLM 의 subtask 가 sim 의 실제 task progression 과 일치하는지.
scripts/run_eval_with_mplib_patch.py원본 examples/robomme/eval.py 와 examples/robomme/subgoal_prediction/qwenvl/api_memer.py
둘 다 무수정 (git clean) 유지. driver 에 다음 3개 monkey-patch 만 적용:
set_base_pose: ManiSkill 3.0.0b21 이 numpy array 넘기는데
mplib 0.2.1 은 mplib.pymp.Pose 만 받음 → driver 시작 시 변환 wrapper.swift.llm.PtEngine attn_impl=sdpa: api_memer.py 의 hard-coded
flash_attention_2 회피 (robomme env 에 flash-attn 없음, sdpa 와 수치
동일).Qwen3VLModelMemER.merge_key_frame_paths empty-dict guard: 첫 호출
시 key_frame_paths={} 면 nums[0] 에서 IndexError → empty 시 early
return.추가로 --only-ep0 플래그: progress.json 에 ep1..49 = False 미리 채워
넣어 eval.py 의 setup_log_dict 가 이들을 skip 하게 → ep0 만 실행.
이전 세션에서 uv sync 가 mujoco 2.3.7 build 실패 (MUJOCO_PATH 미설정)
때문에 부분 설치 상태였음. policy server 실행에 필요한 누락 deps 를 직접
설치:
VIRTUAL_ENV=$(pwd)/.venv uv pip install --no-deps chex==0.1.89 \
'jax==0.5.3' 'jaxlib==0.5.3' 'numpy==1.26.4' 'ml_dtypes'
VIRTUAL_ENV=$(pwd)/.venv uv pip install pytest # → pluggy, iniconfig
VIRTUAL_ENV=$(pwd)/.venv uv pip uninstall opencv-python
VIRTUAL_ENV=$(pwd)/.venv uv pip install --no-deps opencv-python-headless
history_config.txt 복구runs/ckpts/mme_vla_suite/symbolic-grounded-subgoal/history_config.txt 를
zip 압축 해제 시 빠뜨림 (handoff doc 의 zip nesting 이슈로 home/ 정리할 때
실수). policy_config.create_trained_policy 가 이 파일 없으면
history_config=None 으로 폴백 → HistoryPi0.__init__ 에서
config.history_config.integration_type AttributeError. fix:
echo -n "symbolic-grounded-subgoal.yaml" \
> runs/ckpts/mme_vla_suite/symbolic-grounded-subgoal/history_config.txt
(MODEL_TYPE 디렉토리명과 yaml 파일명이 일치하는 명명 규칙)
# Terminal A — VLA policy server (GPU 0)
CUDA_VISIBLE_DEVICES=0 OPENPI_DATA_HOME=~/openpi_data timeout 5400 \
.venv/bin/python scripts/serve_policy.py \
--seed=7 --port=8011 \
policy:checkpoint \
--policy.dir=runs/ckpts/mme_vla_suite/symbolic-grounded-subgoal/79999 \
--policy.config=mme_vla_suite
# Terminal B — sim + VLM client (GPU 1)
ROBOMME=~/conda_envs/envs/robomme
CUDA_VISIBLE_DEVICES=1 LD_LIBRARY_PATH=$ROBOMME/lib:$LD_LIBRARY_PATH \
VK_ICD_FILENAMES=/etc/vulkan/icd.d/nvidia_icd.json USE_HF=1 timeout 5400 \
$ROBOMME/bin/python scripts/run_eval_with_mplib_patch.py \
--args.model_seed=7 --args.port=8011 \
--args.policy_name=symbolic-grounded-subgoal --args.model_ckpt_id=79999 \
--args.use-memer --args.subgoal-type=grounded_subgoal \
--args.memer_adapter_path=~/ckpts/robomme-memer-lora-checkpoint-1300/checkpoint-1300 \
--args.only_tasks=BinFill --only-ep0
GPU 0 (VLA): JAX init + Orbax restore 9 s, 첫 inference cuDNN autotune ~20 s, 이후 fast. GPU 1 (VLM): Qwen3-VL-4B-Instruct shard load 9 s + LoRA adapter 즉시.
runs/evaluation/symbolic-grounded-subgoal/ckpt79999/seed7/memer/:
progress.json {"BinFill": {"0": true, "1": false, ..., "49": false}}
videos/BinFill_ep0_success_put one red cube into the bin, then press the button to stop_easy.mp4
995 KB
ep0 = success ✅ (task: "put one red cube into the bin, then press
the button to stop", difficulty=easy).
VLM 호출 통계 (subgoal_keep_period=1, obs_horizon=16):
| 항목 | 값 |
|---|---|
| 총 VLM 호출 | 20 |
| Distinct subtask | 3 (pick up first red cube → put it into the bin → press the button) |
| Subtask 좌표 | (293,344)→(289,344) cube, (457,582) bin, (238,465)→(230,469) button |
| 첫 keyframe insert | call 1 (keyframe_positions=[1]) |
| Keyframe 추가 | call 8 ([7]), call 12 ([5]) — 다른 subtask 시작 |
VLM 출력은 task progress 와 정확히 align 됨: 1. Frames 0–7: "pick up the first red cube at <289–293, 344>" (cube grasping phase) 2. Frames ~8–11: "put it into the bin at <457, 582>" (bin location 일관) 3. Frames 12–19: "press the button at <230–238, 465–469>" (button press phase)
GT VLM-only Phase 3 (260427) 의 108 calls vs 여기 20 calls — closed-loop 가 GT 보다 빠르게 수렴 (=18-step action chunk 한 번이 GT replay 의 5-frame subsample 18스텝과 다른 sim-time 흐름).
VLM-only 와 비교해 좌표 미세 변화 (e.g. cube (289,344) vs Phase 3 의
(293,344)) — closed-loop 의 actual rollout 에서 보는 frame 이 GT 와 다른
시점이라 픽셀 단위 좌표가 달라진 것. semantic 은 동일.
260428/setup-robomme_b200_cluster.md) + 3개 monkey-patch 가 reproducible.checkpoint_dir.parent / history_config.txt 존재 확인 필요.uv sync 회피로도 .venv 운영 가능: gym-aloha 의 mujoco 2.3.7 빌드
가 cluster 환경에서 실패하므로, 필요한 모듈만 --no-deps 로 추가하는
방식이 실용적.(a)→(b) 50 episode: BinFill 전체 50 ep success rate. login 90 분 cap
으로 부족 (~5h 예상) → sbm SLURM 제출.
bash
conda activate robomme # client side
sbm "bash scripts/run_binfill_50ep.sh" --gres=gpu:2 -c 36 --mem=400GB --qos=core-extra
(run_binfill_50ep.sh 작성 필요 — policy server + eval client 같은 노드에서
띄우기, 또는 두 1-GPU job dependency.)
(b)→(c) 16 task × 50 ep = 800 ep: --args.only_tasks 빼고 전체.
~80 시간 wall-clock → 멀티 sbatch (각 task = 1 job + 같이 묶어 병렬 8 job).
try/except in eval.py:322: episode error 가 silent 로 "error" 로 찍힘. 디버깅 필요할 때 임시 제거 (사용자의 no-try-except 선호도와 충돌 하니 상시 제거는 X).
ep0/step_*_image.png 가 video 만들고 0개로 비어있는 듯 — eval.py 가
RolloutRecorder 로 frame 수집해 videos/ 에 저장 후 cleanup 하나 봄
(아니면 BinFill/ep0/ 디렉토리는 VLM 호출용 임시 → 내가 본 시점에 정리됨).
closed-loop trace 추가 분석이 필요하면 RolloutRecorder 의 frame keep
옵션 검토.
claude/260428/setup-robomme_b200_cluster.mdclaude/260428/handoff-closed_loop_ready.mdclaude/260427/exp-memer_lora_binfill_ep0.mdscripts/run_eval_with_mplib_patch.pyruns/evaluation/symbolic-grounded-subgoal/ckpt79999/seed7/memer/