Index
2026-08-18 — Analysis / Bugfix

Phase 2 Mixture 학습 설정 버그: tyro 파싱으로 main+Color만 학습됨

MolmoBot | job 83196 잘못된 ablation → 원인 규명 → 84260 재제출

TL;DR

2/5
실제 로드된 데이터셋
~98
낭비 GPU-h (83196)
84260
수정 재제출 job
60GB
정리된 ckpt

1 배경 / 목적

Phase 2 aux mixture 학습(job 83196, main 0.35 / Pick 0.2 / PnP-p0 0.1 / NextTo 0.2 / Color 0.15, 20k step)이 12:19:53만에 COMPLETED로 종료되었고, 이어진 5종 rollout eval 결과 첫 배치가 나왔다. 그런데 10k Pick 3.5% / 20k NextTo 9.5%로, Phase 1(part1-only, 미학습 태스크) 수준인 Pick 7.5% / NextTo 10.5%보다 오히려 낮거나 비슷했다 — aux 데이터를 추가했는데 미학습 태스크 성능이 그대로인 것은 mixture가 의도대로 반영되지 않았을 가능성을 시사했다.

기존 한계: 학습 스크립트(train_pi05_mlspaces.sh)는 MolmoBot-Pi0 공식 README의 aux 레시피 표기를 그대로 따랐으나, 실제로 5종 데이터셋이 전부 로드되는지 검증하는 단계가 없었다. sacct COMPLETED가 성공을 보장하지 않는다는 기존 함정(§확립된 함정 목록 1번)과 유사하게, "학습이 끝까지 돌았다"와 "의도한 데이터로 돌았다"는 별개임이 이번에 드러남.

2 작업 내용

이상 eval 결과를 계기로 83196 학습 로그를 역추적했다.

진단

학습 로그에서 데이터 로더가 출력하는 "Using ... houses" 시그니처(로드된 데이터셋 소스를 나열)를 확인한 결과, main(38,789)과 Color(5,326) 두 종뿐이었다 — 원래 의도한 Pick / PnP-p0 / NextTo 3종이 로드되지 않은 상태로 20k step 전체가 학습된 것.

원인 실증

tyro CLI의 dict[str,float] 인자 파싱 방식을 직접 테스트로 확정했다:

# 반복형 (README 레시피 표기, 실제로는 마지막 항목만 남음) --data.auxiliary-dataset-paths /pick 0.2 \ --data.auxiliary-dataset-paths /pnp 0.1 \ --data.auxiliary-dataset-paths /nextto 0.2 \ --data.auxiliary-dataset-paths /color 0.15 → 파싱 결과: {'/color': 0.15} # 마지막 한 쌍만 남음 # 단일 플래그에 전 쌍 나열 (올바른 형식) --data.auxiliary-dataset-paths /pick 0.2 /pnp 0.1 /nextto 0.2 /color 0.15 → 파싱 결과: {'/pick': 0.2, '/pnp': 0.1, '/nextto': 0.2, '/color': 0.15} # 4개 전부

MolmoBot-Pi0 README의 레시피 표기(반복형)가 이 tyro 버전에서는 잘못된 형식이었다. 83196은 결과적으로 main 0.85 + Color 0.15만 학습한 셈 (Pick/PnP-p0/NextTo 3종 완전 누락).

조치

  1. train_pi05_mlspaces.sh를 단일 플래그 형식으로 수정 + 경고 주석 추가
  2. 파싱 검증: aux 4개 · 가중치 합 0.65 · Pick 포함 여부를 스크립트 내에서 확인하는 단계 추가
  3. 잘못된 모델을 대상으로 진행 중이던 eval job 전부 취소 (mx15kNext, mx10kPnP, mx10kNext, mx50kPick/PnP/Next, mx20kPick/PnP retry 등)
  4. ckpt 디렉토리를 pi05_mlspaces_mainColor_accidental로 개명, 15000/20000 스텝만 보존하고 나머지 삭제 (60GB 정리)
  5. mix v2 = job 84260 재제출 — 모니터에 "5종 데이터셋 로드 검증" 단계 추가 (재발 방지)

3 결과

Job실제 학습 데이터StateElapsed비고
83196 (pi05mix)main 0.85 + Color 0.15 2/5종만COMPLETED12:19:53의도치 않은 ablation, ~98 GPU-h 소모
84260 (pi05mix2)main 0.35 / Pick 0.2 / PnP-p0 0.1 / NextTo 0.2 / Color 0.15 5종 검증됨RUNNING02:25:03 (보고 시점)파싱 검증 로그 추가

83196(main+Color만) eval 성공률 — Phase 1(part1-only)과 비교

모델Pick (10k)NextTo (20k)비고
Phase 1 (part1-only)7.5%10.5%aux 미포함 baseline
83196 (main+Color 0.15)3.5%9.5%Color 추가에도 미학습 태스크 개선 없음
실패: 83196은 aux 4종을 반영한 mixture가 아니라 사실상 main+Color 2종 학습이었음. 원인은 tyro dict[str,float] 파싱이 반복 플래그의 마지막 값만 취하는 동작 때문 (README 레시피 표기 오류). 학습 자체는 정상 종료(sacct COMPLETED)라 결과 확인 전까지 문제를 알 수 없었음.
부산물(기록 가치): Color 15% 단독 추가만으로는 Pick/NextTo가 개선되지 않는다는 미니 ablation을 확보 — 해당 태스크 데이터가 없으므로 당연한 결과지만, mixture 가중치 설계에서 "관련 없는 aux를 늘려도 다른 태스크는 안 오른다"는 것을 실측으로 재확인.

4 Takeaway

의미

학습 설정 파싱 오류가 12시간 20분(8 GPU 기준 약 98 GPU-h) 규모의 학습을 통째로 무효화시켰다 — sacct COMPLETED나 loss 곡선만으로는 "의도한 설정대로 학습되었는지"를 보증하지 못한다는 것이 재확인됨(기존 함정 목록 1번의 연장선). 특히 tyro 같은 CLI 파서의 반복 플래그 dict 병합 동작은 라이브러리별로 다를 수 있어, README 레시피를 그대로 신뢰하기보다 실제 파싱 결과를 스크립트 실행 초입에 로그로 남겨 검증하는 습관이 필요함을 보여준 사례. 이번 조치(로드 데이터셋 검증 단계)로 동일 클래스의 설정 버그는 학습 시작 직후 조기에 잡을 수 있게 됨.

5 Next Steps

미해결 한계

84260 재제출 시점 기준 아직 학습 진행 중(2:25:03 경과, 20k step 목표) — 파싱 검증 단계가 실제로 5종 전부를 확인하는지는 로그 확보 후 재확인 필요. 또한 이번 사고로 잘못된 eval job들이 다수 취소되어 (mx15kNext/mx10kPnP/mx10kNext/mx50k*) 15k/50k 배수 ckpt에 대한 재현 가능한 비교 데이터가 비어 있음.

다음 실험

84260 완료 후 5k 배수 ckpt(5k/10k/15k/20k)에 Pick/PnP/NextTo/Color 4개 벤치 전체 rollout eval을 own 분할 잡으로 제출해 Phase 1(part1-only) 대비 진짜 mixture 효과 A/B 표를 완성한다. 가설: aux 4종이 모두 반영되면 Pick/NextTo/Color가 Phase 1 대비 유의하게 상승하되, main-heavy 태스크(PnP)는 48.5% 근처를 유지할 것으로 예상.