Files
coorl-lost-cities/docs/plans/jax-ppo-model-size-ab.md
T

101 lines
4.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Plan: JAX PPO Model-Size A/B
**Status:** Ready to execute
**Priority:** Low — 진단상 용량은 병목이 아닐 가능성이 높다. 그러나 PPO 스택에서
한 번도 측정된 적이 없어 정황증거뿐이다. 이 A/B의 목적은 **스케일링 라인을 열지,
닫을지 확정**하는 것이다.
**Background:** [docs/reports/jax-ppo-model-capacity-2026-07-12.md](../reports/jax-ppo-model-capacity-2026-07-12.md)
> 이 계획은 은퇴한 Deep CFR/PyTorch 스택용
> [model_size_experiment.md](model_size_experiment.md)를 **대체하지 않는다** —
> 그쪽은 다른 스택(`input_dim=365`, `configs/deep_cfr/`) 이야기다. 서로 무관하다.
## 가설
`hidden_size=512, num_layers=3` (808K 파라미터)은 구 스택에서 복사돼 온 상속값이며
PPO에서 검증된 적이 없다. 셀프플레이 샘플:파라미터 비가 약 2,028:1이므로
용량을 키우면 **응수 품질(expert 앵커)은 오르지만, exploitability 바닥(~0.54)은
움직이지 않을 것**이다.
이 예측이 맞으면 → 병목은 용량이 아니라 셀프플레이 스킴이며, 스케일링 라인을
닫고 리그/착취 구조 쪽에 투자한다.
틀리면 (exploitability가 유의하게 내려가면) → 스케일링이 열린다.
## 실험 설계
**2점 A/B. 그리드 아님.** 그리드는 이 우선순위에 비해 과하다.
| 이름 | hidden_size | num_layers | 파라미터 |
| --- | ---: | ---: | ---: |
| `size-512x3` (baseline) | 512 | 3 | 808,033 |
| `size-1024x4` (treatment) | 1024 | 4 | 3,714,145 |
- 두 config는 `network` 블록과 `run.experiment_name`만 다르고 **나머지는
final candidate와 byte-identical**이어야 한다. 기준 config:
`/mnt/2tbhdd/coolrl-lost-cities-artifacts/final-cycles/2026-07-05/main_ppo_config.json`
- **같은 `run.seed`**, 순차 실행 (AGENTS.md "Comparing two runs" 규약).
같은 GPU에서 두 학습을 병렬로 돌리지 말 것.
- 리그 **1 사이클**, 500 updates.
## 판정 기준 (중요)
**H2H로 판정하지 말 것.** 더 큰 모델이 더 작은 모델을 이기는 건 거의 자명하고,
그건 우리가 알고 싶은 게 아니다. 두 축으로만 본다:
1. **Expert 앵커**`heuristic_expert` 상대 duplicate 평가
(shuffle bank seed 20260704, 2,000쌍). *응수 품질*을 본다.
2. **Exploitability** — 각 체크포인트에 대해 exploiter를 새로 학습시켜 승률 측정.
`long_random_shaping` 프로토콜(1200 updates, shaping anneal, warm start
`random`) 하나로 충분하다.
[diminishing-returns-2026-07-05.md](../reports/diminishing-returns-2026-07-05.md)의
기존 측정과 **같은 프로토콜 안에서만** 비교할 것 — 프로토콜이 다르면 섞지 않는다.
### 결정 트리
| Expert 앵커 | Exploiter 승률 | 결론 | 조치 |
| --- | --- | --- | --- |
| 유의하게 상승 | **변화 없음** (~0.54 유지) | **예측대로.** 용량은 병목이 아니다 | 스케일링 라인 종료. 리그/착취 구조로 이동. 1024×4를 default로 올릴지는 비용 대비 선택 사항 |
| 유의하게 상승 | **유의하게 하락** | 가설 기각. 용량이 실제로 제약이었다 | `network` default를 1024×4로 올리고, 2048×4까지 한 점 더 확장 |
| 변화 없음 | 변화 없음 | 용량 무관 확정 | 스케일링 라인 종료 |
| 하락 | — | 최적화 문제 (LR/KL 등이 큰 모델에 안 맞음) | default 유지. 스케일 재시도 전에 하이퍼파라미터 점검 |
"유의하게"는 Wilson CI(승률) / score CI(점수차) 비중첩 기준. 기존 리포트들이
쓰는 것과 동일하다.
## 비용
리포트 기준 리그 1사이클 ≈ 1.5시간 GPU (512×3). 1024×4는 파라미터 4.6배이나
병목이 롤아웃(엔진 시뮬)이라 학습 시간이 4.6배가 되지는 않는다.
exploiter 학습이 별도로 붙는다.
`.compute.lock`을 잡고 돌릴 것 (AGENTS.md "Compute Lock"):
```bash
flock -n .compute.lock <train command>
```
## Non-goals
- 그리드 스윕(768×4, 1536×8 등) — 2점으로 충분하다. 결과가 애매할 때만 확장.
- 아키텍처 변경 (residual, transformer, per-color 공유 인코더 등) — 별도 주제.
- 인코딩 변경 (`OBS_DIM=454` 고정).
- 하이퍼파라미터 동시 변경 — 한 번에 하나만 바꾼다.
## Definition of done
산출될 파일 (아직 존재하지 않음):
```text
configs/jax_ppo/size-512x3.yaml
configs/jax_ppo/size-1024x4.yaml
docs/reports/jax-ppo-model-size-ab-<YYYY-MM-DD>.md
```
- [ ] 위 두 config 추가 (final candidate config 기준, `network` /
`run.experiment_name`만 차이)
- [ ] 두 학습 순차 실행, 같은 seed, `.compute.lock` 사용
- [ ] 두 체크포인트 expert 앵커 duplicate 평가
- [ ] 두 체크포인트 exploiter 학습 + 승률 측정 (`long_random_shaping`)
- [ ] 결과표 + 결정 트리 적용 결과를 위 dated 리포트에 기록
- [ ] 결정 트리에 따라: `network` default 갱신 **또는** 스케일링 라인 종료를 문서화