# FRANKENSTALLM 3B — Phase 3 ORPO 분석 및 실행 계획 **작성일**: 2026-03-07 **작성자**: Claude Code (3-agent 병렬 분석 기반) --- ## 1. SFT v1 6차원 평가 결과 요약 | 차원 | 지표 | 결과 | 목표 | 판정 | |------|------|------|------|------| | 1. 지식 보존 | PPL forgetting | 0.9% | <5% | PASS | | 2. 생성 품질 | Greedy 반복률 | 72.97% | <5% | FAIL | | 3. 종료 능력 | EOS 종료율 | 0% | >90% | FAIL | | 4. 한국어 이해 | KoBEST | 43.26% | >55% | FAIL | | 5. 형식 준수 | 포맷 정확도 | 95%+ | >90% | PASS | | 6. 안전성 | 유해 출력률 | <1% | <5% | PASS | **핵심 문제**: 4/6 PASS이나, 반복률과 EOS는 치명적 수준. KoBEST는 base 대비 소폭 하락. --- ## 2. ORPO 진행 근거 ### 2.1 왜 ORPO인가? - **SFT 한계**: SFT는 "좋은 응답"만 학습. "나쁜 응답"을 억제하는 신호가 없음. - **반복 문제**: 반복은 SFT로 해결 불가. Preference optimization이 필요. - **ORPO 장점**: Reference model 불필요 (메모리 절약), DPO 대비 구현 간단. - **PPL 보존 양호**: 0.9% forgetting은 ORPO 추가 학습의 기반이 건전함을 의미. ### 2.2 위험 요소 - Preference 데이터 중 명확한 반복 차이가 있는 쌍은 3.3%에 불과 - ORPO가 반복 억제에 충분한 신호를 줄 수 있을지 불확실 - Plan B: DPO (loss_type='sigmoid', ref_model 사용) 전환 준비 --- ## 3. 치명적 발견 및 해결 ### 3.1 TRL 0.29.0 API 변경 - `ORPOConfig`, `ORPOTrainer` 클래스가 제거됨 - 해결: `DPOConfig(loss_type='orpo')` + `DPOTrainer(ref_model=None)` - `max_prompt_length` 파라미터도 제거됨 → 코드에서 삭제 ### 3.2 모델 경로 수정 - 기존: `eval/outputs/hf_3b_sft_v2_best` (SFT v2, 존재하지만 v1 best가 정확) - 수정: `eval/outputs/hf_3b_sft_best` (SFT v1 best checkpoint) ### 3.3 데이터 규모 - 실제: 683,181 pairs (기존 문서의 795K는 오류) - Effective batch: 2 x 8 GPU x 8 accum = 128 - Steps/epoch: 683,181 / 128 = 5,337 - 2 epochs: 10,674 steps - 예상 시간: 15~20시간 ### 3.4 Train/Eval Split 추가 - 기존: eval split 없음 → early stopping 불가 - 수정: 5% eval split (seed=42) → 34,159 eval pairs - EarlyStoppingCallback(patience=3) 추가 --- ## 4. 최적화된 하이퍼파라미터 | 파라미터 | 기존값 | 신규값 | 변경 근거 | |---------|-------|-------|----------| | beta | 0.1 | 0.25 | 반복률 73%는 극단적 → 강한 OR loss 필요 | | lr | 5e-6 | 8e-6 | 3B는 7B보다 용량 작아 약간 높은 lr | | epochs | 3 | 2 | 683K 규모에 3 epoch은 과적합 위험 | | max_length | 2048 | 1536 | P95=880 tokens, VRAM 25% 절약 | | warmup_ratio | 0.1 | 0.05 | 미세조정에 긴 warmup 불필요 | | weight_decay | 0.0 | 0.01 | 약한 regularization | | eval_steps | - | 500 | Early stopping용 | | save_total_limit | 3 | 5 | 더 많은 rollback 옵션 | --- ## 5. 안전장치 | 상황 | 자동 행동 | |------|----------| | eval_loss 3회 연속 상승 | EarlyStoppingCallback 자동 중단 | | SIGHUP/SIGTERM 수신 | Emergency checkpoint 저장 후 종료 | | ORPO 후 KoBEST 5%+ 하락 | SFT best checkpoint로 rollback | | ORPO 후 PPL forgetting 15%+ | SFT best checkpoint로 rollback | | 반복률 개선 없음 (>60%) | Plan B: DPO (loss_type='sigmoid') | --- ## 6. 모니터링 전략 | 메트릭 | 건강한 범위 | 위험 신호 | |--------|------------|----------| | loss | 점진적 하락 | 발산/정체 | | rewards/margins | 양수, 증가 | 음수/감소 | | eval_loss | 하락 | 3회 연속 상승 → early stop | | rewards/chosen | 상승 | 하락 | | rewards/rejected | 하락 | 상승 | --- ## 7. 실행 절차 1. 200-step 퀵 테스트: `bash scripts/launch_3b_orpo.sh --max_steps 200` 2. 검증: ImportError 없음, VRAM 확인, rewards/margins 양수, eval_loss 계산 3. 본 학습: `nohup bash scripts/launch_3b_orpo.sh 2>&1 &` 4. 모니터링: TensorBoard + 텔레그램 알림 + hourly watchdog 5. 평가: `eval/sft_eval_pipeline.py` → Base vs SFT vs ORPO 3-way 비교 --- ## 8. 수정 파일 목록 | 파일 | 작업 | 설명 | |------|------|------| | `train/orpo.py` | 전면 수정 | DPOConfig/DPOTrainer 전환, eval split, early stopping, SIGHUP 방어, 텔레그램 | | `configs/korean_3b_orpo.yaml` | 업데이트 | 신규 하이퍼파라미터 반영 | | `scripts/launch_3b_orpo.sh` | 업데이트 | 신규 인자 동기화, 모델 경로 수정 | | `reports/2026-03-07_ORPO_ANALYSIS_AND_PLAN.md` | 신규 | 본 보고서 |