Index
2026-07-10 — Engineering

Cosmos-norm 학습 launcher 버그 7건 수정

VGGRPO | LGM 학습 인프라 — exp dir 명명, checkpoint 저장/정리 로직

TL;DR

7
버그 수정
2.5TB→110GB
디스크 회수
2
잘못된 exp 삭제

1 배경 / 목적

260709 latent normalization 진단(claude/260708/research-cosmos_latent_normalization.md) 이후, fp32 재전처리 + latent normalize + 재산출된 Conv3d init을 적용한 Cosmos-norm 학습을 새로 launch하는 과정에서, train_lgm_robocasa_vggt_v0.sh launcher와 robocasa_dataset.py 데이터로더에 누적돼 있던 문제들이 잇따라 드러났다. 이 버그들은 대부분 크래시를 내지 않고 조용히 잘못된 결과를 만들어내는 유형이라, 방치했다면 GPU-hour를 들여 무효한 실험을 계속 쌓을 위험이 있었다.

기존 한계: launcher의 exp dir 탐색 로직이 재개(resume) 대상을 substring grep으로 찾았는데, VAE 종류나 백업 suffix를 구분하지 않아 다른 VAE/이전 실험의 디렉토리를 잘못 재사용하는 경로가 여러 곳에서 열려 있었다.

2 작업 내용

발생 순서대로 원인을 추적해 각각 launcher 스크립트(bash) 또는 학습 스크립트(python)에 patch를 적용했다.

#버그원인수정
133146/33147 exp dir 공유launcher grep이 ${VAE_TYPE} 없이 lgm_robocasa_vggt_v0_${STITCH_TAG}_만 매칭 → Cosmos job이 Wan dir를 재개해 두 job이 동시에 같은 파일에 writegrep 패턴에 ${VAE_TYPE} 포함
233146/33147이 실제로는 Wan으로 학습됨launcher가 --vae_type $VAE_TYPE을 python에 전달하지 않아 default(wan)로 fallbackSTITCH_ARGS--vae_type $VAE_TYPE 추가
337231/37232이 renamed 백업 dir을 재개 시도grep이 substring 매칭이라 _nonorm_fp16depth suffix가 붙은 완주 백업 dir도 여전히 매칭grep -E '_[0-9]{4}_[0-9]{4}$'로 strict anchor 적용
4fp16 depth quantizationHDF5에 depth가 float16 저장 → OpenGL z-buffer 0.99 근방에서 metric 변환 시 ~0.4m 계단식 오차사용자가 fp32로 재전처리 완료 (본 세션 이전)
537234 IndexError (step 3950)fp32 재전처리 후 일부 demo의 attrs["num_samples"]가 실제 저장 frame 수보다 커서 linspace가 OOB index 생성robocasa_dataset.py에서 T_stored = depth.shape[0]로 clamp
6phaseB_50000.pt 미저장save_every 조건이 step % 500 == 0인데 max_steps 도달 시점이 이 조건을 안 맞고 루프가 종료돼 최종 ckpt 누락max_steps 도달 시 phaseB_{max_steps}.pt 강제 저장 로직 추가
7디스크 2.5TB 방치ckpt cleanup 로직 부재 — 500 step 간격 × 최대 100회 × 5.2GB/파일이 그대로 누적_prune_ckpts(keep_last_n=3, milestone_every=10000)를 매 save 후 자동 호출
수정 파일: - scripts/train_lgm_robocasa_vggt_v0.py — 강제 최종 저장, _prune_ckpts 자동 호출 - scripts/train_lgm_robocasa_vggt_v0.sh — VAE_TYPE 전달 + exp dir grep 패턴 수정 - src/data/robocasa_dataset.py — T_stored 클램프 (num_samples overreport 방어)
핵심 발견: 버그 #1~#2는 조합되어 33146/33147 두 job이 각각 GPU를 점유하며 여러 시간 동안 "Cosmos ablation"이라는 이름으로 실제로는 Wan VAE를 학습하고 있었다 — 명명 규칙 하나의 결함이 실험 전체의 taxonomy를 무효화할 수 있음을 보여준다.

3 결과

항목BeforeAfter
exp dir 재사용 오탐substring 매칭, VAE 구분 없음${VAE_TYPE} + strict anchor로 정확 매칭
33146/33147 상태Cosmos 태그로 Wan 학습 중 (오염)exp dir 삭제, launcher 수정 후 재제출
37234 IndexErrorstep 3950에서 크래시clamp 적용 후 37399로 재개, step 3500까지 재발 없음
최종 ckpt 저장50000 step 도달해도 미저장 사례 발생(완주 3개 run이 phaseB_45000이 실질 최종)max_steps 강제 저장 로직 적용
디스크 사용량~2.5TB (500 step × 100 checkpoint × 5.2GB)~110GB (milestone {10K,20K,30K,40K,45K} + 최근 3개만 유지)
부작용: ckpt pruning 도입 시점에 완주된 3개 run에서 phaseB_49500.pt가 함께 삭제되어, 완주 run들의 실질 최종 체크포인트는 phaseB_45000.pt가 되었다 (5K step 차이는 eval에는 무시 가능한 수준으로 판단).

4 Takeaway

의미

버그 #1~#3은 전부 "크래시 없이 조용히 틀린 데이터/설정으로 학습이 진행되는" 유형이었다 — 에러 로그를 봐서는 절대 발견할 수 없고, exp dir 이름과 실제 로드된 VAE weight를 교차 검증해야만 드러난다. 향후 VAE/backbone/stitch 등 여러 축을 조합하는 ablation launcher는 exp dir naming에 모든 축을 명시적으로 포함하고, 재개 시 assert로 config 일치 여부를 검증하는 방어 로직이 필요하다는 교훈을 남겼다.

디스크 회수(2.5TB→110GB)는 단기적으로 여러 ablation을 동시에 돌릴 수 있는 여유를 확보했다는 점에서, 이번 주 진행 중인 Cosmos-norm 2-run 외에 추가 축(예: Wan fp32 재학습)을 병행할 물리적 여유가 생겼다.

5 Next Steps

미해결 한계

attrs["num_samples"] overreport의 근본 원인(fp32 재전처리 스크립트 자체의 버그)은 아직 확인되지 않았다 — 현재는 dataset loader에서 clamp로 방어만 하고 있어, 다른 방식으로 overreport가 나타나면 다시 드러나지 않을 위험이 있다.

다음 실험

37399(_0709_0341/) 로그를 slurms/taewoongkang_37399.out에서 계속 모니터링해 IndexError 재발 여부 확인. 재발하지 않으면 clamp가 충분한 방어로 확정, 재발하면 fp32 전처리 스크립트 자체를 재점검해 근본 원인 수정.