Index
2026-05-07 — Experiment

Hybrid πHL: ApiMem mt + LoRA Coord Swap — 설계 & 첫 Job 제출

memer / robomme_policy_learning  |  BinFill · 가설 (b) Coord Precision Isolation

TL;DR

8 %
API baseline SR
64 %
LoRA upper bound
≥30 %?
coord 가설 확정 임계
FAILED
Job 9951 상태

1 배경/목적 (왜)

8-run 종합 분석(260505-apimem_binfill_8run_summary.html)에서 확인된 사실:

가설 (b)만 단독 검증하려면 좌표만 in-distribution(LoRA)으로 바꾸고 나머지(mt, 의도 텍스트)는 ApiMem에 맡기는 minimal hybrid가 필요하다. SR 변화로 coord 기여도를 정량화한다.

기대 결과 해석 키: SR ≥ 30 % → coord 단독 bottleneck 확정 · SR 8~30 % → coord 부분 기여 · SR ≈ 8 % → wording/timing 가설로 이동

2 작업 내용 (어떻게)

설계 — Verb-match Coord Swap

매 K=48 step API tick마다 다음 흐름으로 동작:

  1. ApiMemModel.get_subgoal(image)subgoal_API (text + 256-rescaled coord)
  2. Qwen3VLModelMemER.call()subgoal_LoRA (text + 256-rescaled coord)
  3. verb+object Jaccard ≥ 0.5 매칭 시 → API coord를 LoRA coord로 swap
  4. mismatch 또는 한쪽 coord 없으면 → API subgoal as-is 사용

LoRA의 add_execution_frame()은 매 step 호출(keyframe buffer 유지), call()은 K마다 한 번만 (compute 절약).

구현 파일

파일변경 내용
examples/robomme/eval.pyArgs에 api_mem_use_lora_coord: bool = False 추가
examples/robomme/subgoal_predictor.pyHybridApiMemLoRACoordPredictor 클래스 추가 + builder dispatch
scripts/run_api_mem_one_episode.sh5번째 인자 LORA_COORD (0/1) 추가

핵심 로직 — _merge_coord

DROP_TOKENS = {"the", "a", "an", "first", "second", "third", "it", "into"} JACCARD_THRESHOLD = 0.5 def _merge_coord(self, api_sg, lora_sg): api_coord = self._extract_coord(api_sg) lora_coord = self._extract_coord(lora_sg) if api_coord is None or lora_coord is None: return api_sg, "no_coord_either_side" api_vo = self._extract_verb_obj(api_sg) lora_vo = self._extract_verb_obj(lora_sg) if not self._verb_match(api_vo, lora_vo): return api_sg, "verb_mismatch" merged = re.sub(r"<\s*\d+\s*,\s*\d+\s*>", f"<{lora_coord[0]}, {lora_coord[1]}>", api_sg, count=1) return merged, "swapped"

검증 (login-node, ≤100 steps 이내)

제출 명령

conda activate robomme sbmr 10 "bash scripts/run_api_mem_one_episode.sh BinFill gemini-2.5-flash-lite flashlite_loracoord 0 1" \ --gres=gpu:2 -c 28 --mem=400GB --partition=sub --qos=core-on-sub \ -J apimem-BinFill-flashlite-loracoord

flash-lite부터 시작한 이유: 비용(~$0.10/sweep)이 낮아 hybrid 로직 자체 검증에 적합 + run 4429(flash-lite rescaled, SR 8 %)와 직접 비교 가능. 결과 유의미하면 pro로 확장.

3 결과 (수치)

Job 9951 FAILED — elapsed 00:02:13. 제출 직후 2분여 만에 종료. sweep 결과 없음, 재제출 필요.

대조군 (기존 완료 runs, BinFill 50 ep)

RunModelModeSR비고
4429flash-lite1-call rescaled8.0 %직접 비교 baseline
5092flash-lite1-call bbox-first16.7 %27 ep abort (hallucinate loop)
5652flash-lite2-step separate det6.4 %robust ↑, detection ceiling 도달
6056pro2-step separate det4.3 %robustness 만점, SR 불변
LoRA (대조)Qwen3-VL-4B LoRAfull pipeline64.0 %upper bound
9951flash-litehybrid (LoRA coord)FAILED, TBD

Job 실패 원인 미파악. 가능한 원인: sbmr restart loop 내 script 인자 파싱 오류, conda env 미활성화, Vulkan 서버 초기화 실패 등. slurms/apimem-BinFill-flashlite-loracoord_9951.out 로그 확인 필요.

4 Takeaway

이번 단계의 의미는 구현 자체에 있다:

분석 의견

SR ≥ 30 %가 나오면 coord precision이 진짜 bottleneck임이 확정되어 ApiMem 방향 전환(pro + coord focus)이 의미 있어진다. SR ≈ 8 %이면 좌표가 아닌 wording/timing 문제이므로 PatternLock(LoRA 16 %)처럼 API의 long-horizon mt 강점이 부각될 task로 전환하는 것이 더 빠른 경로다. 어느 쪽이든 이번 실험으로 탐색 공간이 크게 줄어든다.

5 Next Steps