2026-04-13에 구현한 HCPT (Height-Concat PointMap + ego Prior) 전체 경로 — training, validation, checkpoint — 가 실제로 동작하는지 검증이 필요했다. 동시에 사용자가 새로 추출한 prior-aligned PT 데이터의 품질/스케일 분포를 확인하고 outlier 필터 기준을 결정해야 했다.
_getitem_hcpt → VAE encode 5 stream → height×width concat → transformer 36ch 입력 → hcpt_ego_col_loss 까지의 경로가 아직 end-to-end 검증되지 않은 상태.또한 새로 뽑힌 PT 데이터 3761개 중 일부는 VGGT/ViPE reconstruction 실패로 인해 scale이 수백~수천 m 단위로 폭주한 clip이 포함되어 있어 필터링 기준 설정이 필요했다.
egoexo4d_vipe/ptmap_prior_aligned/ 내 clip별 norm_params.json에서 max|xyz| 분포를 산출했다. p99=1543m가 정상 outlier가 아니라 reconstruction 실패 clip의 군집임을 확인 — 상위 8개가 2300~2600m 범위에 집중. per-clip norm 유지를 결정(within-clip consistency만 있으면 충분, global norm은 실내/실외 장면 간 dynamic range 불균형 유발).
build_hcpt_manifest.py — --pt_max_abs 필터 추가| # | 버그 | 수정 |
|---|---|---|
| (a) | Args.validate_dataset_root가 hcpt_manifest만 쓸 때 validation 실패 | args.py:134 validator에 hcpt_manifest 조건 추가 |
| (b) | training_type: sft → 14B full param OOM (bf16 28G + fp32 56G + AdamW 112G ≈ 196GB > 178GB) | LoRA로 변경 (rank=256, target=to_{q,k,v,out.0}). Trainable params 838M, peak VRAM 81GB |
| (c) | Validation 후 scheduler state corrupt (set_timesteps(50)가 training 1000-step schedule 덮어씀) → .nonzero().item() index out of bounds | trainer.py:_maybe_run_validation에서 validation 전후 timesteps/sigmas 저장·복원 |
| (d) | worker-3에서 좀비 프로세스(PID 3682844)가 GPU 24GB 점유 → OOM | login node GPU 7 (182GB free)에서 직접 실행 |
| Step | Loss | Grad Norm | 이벤트 |
|---|---|---|---|
| 1 | 3.82 | 3.40 | 시작 |
| 2 | 3.34 | 2.54 | |
| 3 | 3.25 | 1.90 | |
| 4 | 3.04 | 3.60 | |
| 5 | 3.04 | 3.60 | Validation #1 실행 |
| 10 | 2.75 | 2.72 | Validation #2 + Checkpoint 저장 |
Validation 2회 모두 성공 (step 5, step 10). 각 50 inference steps × 2.97s/it = 약 2분 30초. step 6-10이 정상 진행된 사실이 scheduler 복원 fix 동작을 간접 증명.
Checkpoint: results/EgoExo4D_HCPT/checkpoint-10/pytorch_lora_weights.safetensors (3.3 GB), optimizer.bin (6.7 GB), scheduler/random_states/sampler 정상 저장.
약 9분 (prepare_dataset eager-precompute + 10 step 학습 + 2회 validation 포함). Full 3660-clip 기준 1 GPU precompute ~3시간, 8 GPU DDP ~25분 예상.
_getitem_hcpt → VAE encode 5개 stream (exo_rgb, ego_rgb, exo_pt, ego_pt, ego_prior) → 4DNeX post-norm → prepare_latents_hcpt 내 height×width concat + mask build → transformer 36ch 입력 → hcpt_ego_col_loss row split → backward → LoRA adapter update → validation pipeline HCPT 분기 → 영상 decode crop([..., :H, exo_W:]) → checkpoint safetensors 전 경로 확인.
특히 버그 (c) scheduler state corruption은 validation 후 training이 즉시 깨지는 심각한 버그였으나 timesteps/sigmas 저장·복원으로 완전 해결됨. SFT → LoRA 전환은 필수 결정 — full SFT는 B200 단일 카드로도 OOM.
sbm "bash scripts/finetune_egoexo4d_hcpt.sh" --gres=gpu:8 -c 192 --mem 1600GB --qos=core-extra -J hcpt_train. 첫 epoch에서 latent cache 빌드(~25분) + 본 학습 동시 진행.
1000 step 기준 loss 하강 범위 확인. rgb_loss / pt_loss 비율 모니터링 (현재 _last_rgb_loss, _last_pt_loss는 stash만 되고 logger에 미노출 — 추가 logging 필요). Validation 영상 ego RGB/PT quadrant 시각 체크.
첫 빌드 시 rank 간 동일 파일 쓰기 경합 보호 없음. prompt embedding 캐시(prompt hash 기반)가 특히 취약 → 첫 빌드는 1 GPU 권장 또는 파일 락 추가 고려.