LLM 핸드북 2: 학습·정렬
프리트레이닝과 정렬 파이프라인을 중심으로 LLM 학습 과정을 실무 관점에서 정리합니다.
개요
LLM 파이프라인은 대규모 사전학습 → 지도학습(SFT) → 정렬(RLHF/DPO) → 추론 최적화로 이어집니다. 제품의 성격에 따라 일부 단계는 생략되거나 경량화됩니다.
LLM 제작 흐름의 핵심 단계
LLM 제작 로드맵
- 문제 정의 및 타겟 도메인 결정
- 데이터 수집/정제/라이선스 검토
- 모델 규모·아키텍처 결정
- 프리트레이닝(또는 기존 모델 선택)
- SFT/정렬 데이터 준비
- 정렬 학습(RLHF/DPO)
- 추론 최적화 및 배포
- 평가/모니터링/개선 반복
컴퓨트/예산 계획
- GPU 전략: A100/H100 등급, 클러스터 규모
- 학습 시간: 배치 크기, 시퀀스 길이, 스텝 수에 비례
- 예산 산정: 데이터 준비 + 학습 + 검증 + 추론 비용 합산
주의: 전체 비용의 상당 부분은 데이터 정제와 반복 학습에서 발생합니다.
아키텍처 선택
- 모델 크기: 파라미터 수와 목표 성능의 균형
- 시퀀스 길이: 컨텍스트 요구사항에 맞는 길이
- 모델 형태: Decoder-only가 일반적, 특수 목적은 Encoder/Encoder-Decoder 고려
실무 포인트: 도메인 특화 모델은 “작게 시작해 크게 확장”하는 접근이 안전합니다.
프리트레이닝
웹 문서, 코드, 대화 로그 등 대규모 데이터로 다음 토큰 예측을 반복합니다. 이 단계가 모델의 일반 지식을 형성합니다.
- 데이터 품질: 필터링·중복 제거·노이즈 제거가 성능에 직접 영향
- 스케일: 파라미터 수와 데이터량의 균형이 중요
- 컴퓨트 예산: 학습 비용은 대부분 이 단계에서 발생
데이터 큐레이션
LLM 성능의 절반은 데이터 품질에서 결정됩니다. 운영 환경에서 사용할 데이터라면 법적·보안 요구까지 함께 고려해야 합니다.
- 정제: 중복 제거, 스팸 필터, 포맷 통일
- 도메인 균형: 코드/문서/대화 비율을 목표에 맞게 설계
- 민감정보 제거: 개인정보/저작권 위험 데이터 제거
데이터 파이프라인 상세
- 수집: 웹/코드/대화 데이터 확보
- 정제: 중복 제거, 노이즈/스팸 필터링
- 정렬: 언어/도메인 기준으로 분류
- 샘플링: 목표 분포에 맞게 비율 조정
- 검증: 품질 샘플링 및 통계 확인
데이터 체크리스트
- 출처 명확성: 데이터 라이선스 확인
- 정합성: 중복/오류/빈 텍스트 제거
- 민감정보: PII/PHI 자동 마스킹 여부
- 버전 관리: 데이터셋 버전 고정
정렬: SFT, RLHF, DPO
사용자 의도에 맞는 답변 스타일을 학습시키는 단계입니다. 생산 환경에서는 빠르고 안정적인 정렬이 중요합니다.
- SFT: 원하는 답변을 직접 지도 데이터로 학습
- RLHF: 인간 선호도를 보상 모델로 반영
- DPO: 선호도 쌍 데이터를 직접 최적화하여 안정적 정렬
팁: 정렬 데이터는 정책/규제/도메인 요구사항을 가장 빠르게 반영하는 수단입니다.
정렬 기법 선택 가이드
- SFT: 빠르게 도메인 지식을 주입하고 싶을 때
- RLHF: 미묘한 선호도 조정이 필요할 때
- DPO: 안정성과 재현성이 중요할 때
실무 포인트: SFT로 먼저 빠르게 검증하고, 필요할 때 RLHF/DPO로 정밀 조정하는 흐름이 일반적입니다.
정렬 데이터 템플릿
# 선호도 쌍 템플릿
prompt: {사용자 질문}
better: {더 좋은 응답}
worse: {덜 좋은 응답}
note: {판단 근거}
학습 스택 구성
- 분산 학습: 데이터 병렬/모델 병렬
- 체크포인트: 중간 저장으로 재학습 비용 절감
- 실험 관리: 실험 파라미터와 결과 기록
학습 설정 예시
아래는 대략적인 형태의 설정 예시입니다. 실제 값은 모델 규모/데이터/예산에 따라 달라집니다.
# 학습 설정 예시 (의사 코드)
model_size: "8B"
sequence_length: 8192
batch_size: 256
learning_rate: 2e-4
warmup_steps: 2000
optimizer: "AdamW"
gradient_checkpointing: true
mixed_precision: "bf16"
학습 최적화 핵심 메커니즘
LLM 학습의 본질은 단순합니다. 손실 함수의 기울기를 계산하고, 그 반대 방향으로 파라미터를 이동시키는 과정을 반복합니다. 실무에서는 이 과정을 안정화하기 위해 워밍업, 클리핑, 누적 배치를 함께 사용합니다.
# 경사 하강법 관점
θ_(t+1) = θ_t - η_t * ∇L(θ_t)
# 대규모 LLM 학습의 실전형 형태
g_t = ∇L_batch(θ_t)
g_t = clip(g_t, max_norm=1.0) # 기울기 폭발 방지
θ_(t+1) = AdamW(θ_t, g_t, lr_t, beta1, beta2, weight_decay)
# lr_t는 보통 warmup 이후 cosine/linear decay 적용
경사 하강법은 같지만, 안정화 장치를 함께 써야 대규모 학습이 안정적으로 수렴합니다.
요약: 대규모 학습에서는
AdamW + Warmup/Decay + Gradient Clipping + Mixed Precision 조합이 사실상 기본값입니다.
평가·레드팀·안전 정렬 절차
- 오프라인 평가셋으로 품질/일관성 확인
- 레드팀 시나리오로 정책 위반/오용 가능성 점검
- 안전 정렬 데이터 보강 및 재학습
- 온라인 A/B 테스트로 실제 성능 검증
주의: 레드팀 결과는 배포 전 필수 검증 항목으로 포함하는 것이 안전합니다.
배포 전 최종 체크리스트
- 품질: 목표 태스크에서 기준 충족
- 안전: 금지/민감 주제 차단 테스트 통과
- 비용: 예상 비용이 예산 범위 내
- 지연: p95 응답 시간 기준 만족
- 모니터링: 로그/알림/대시보드 준비 완료
학습 파이프라인 의사 코드
// 실전형: 누적 배치 + 클리핑 + 스케줄러 + 체크포인트
function train(loader, model, optimizer, scheduler) {
const gradAccum = 8;
let step = 0;
for (const batch of loader) {
const loss = model.forward(batch) / gradAccum;
loss.backward();
if ((step + 1) % gradAccum === 0) {
clipGradNorm(model.parameters(), 1.0);
optimizer.step();
scheduler.step();
optimizer.zeroGrad();
}
if (step % 1000 === 0) {
saveCheckpoint(model, { step, loss: loss.item() });
}
step += 1;
}
}
포인트: GPU 메모리가 부족하면 배치 크기를 낮추는 대신
gradient accumulation으로 유효 배치를 유지할 수 있습니다.
SFT/RLHF/DPO 워크플로우 다이어그램
SFT 이후 RLHF/DPO로 정렬하는 기본 흐름
안전 정책 예시
# 안전 정책 샘플
금지: 개인정보 요청, 불법 행위, 자해 관련 안내
제한: 의료/법률 조언은 일반 정보만 제공
허용: 공개 정보 요약, 교육 목적 설명
응답 톤: 사실 기반, 과장 금지
데이터 파이프라인 자동화 예시
// ETL/검증 의사 코드
function pipeline(sources) {
const raw = collect(sources);
const cleaned = clean(raw, { dedupe: true, piiMask: true });
const sampled = sample(cleaned, { domainMix: "target" });
validate(sampled, { minLength: 50, lang: "ko" });
writeDataset(sampled, "train.jsonl");
}
정렬 데이터 수집/라벨링 프로세스
- 대표 시나리오 정의(질문 유형/도메인)
- 기본 응답 생성(SFT 또는 기존 모델)
- 라벨러가 “좋은 응답/나쁜 응답”을 선택
- 검수 단계에서 불일치/편향 제거
- 정렬 데이터셋 버전 고정
학습 실패/불안정성 대응
- 손실 발산: 학습률 감소, 배치 크기 축소
- 오버피팅: 정규화, 데이터 증강, 조기 종료
- 모드 붕괴: 데이터 다양성 확대, 샘플링 재조정
- 정렬 실패: 선호도 데이터 재검수, 기준 강화
주의: 학습 불안정은 대부분 데이터 품질/학습률/배치 설정에서 발생합니다.
증상별 즉시 조치 플레이북
| 증상 | 진단 신호 | 우선 조치 |
|---|---|---|
| 손실 급등/NaN | 학습 초반 수백 step 내 loss 폭증 | 학습률 하향, warmup 증가, clipping 적용 |
| 수렴 정체 | loss가 장기간 평평, 평가 지표 정체 | 학습률 소폭 상향 또는 배치/데이터 분포 재점검 |
| 검증 성능 하락 | train loss 하락, val loss 상승 | weight decay·dropout 강화, 조기 종료 |
| 불안정 진동 | step 간 loss 분산이 과도하게 큼 | 유효 배치 확대(누적 배치), 스케줄 완만화 |
# 긴급 안정화 체크 순서
# 1) lr를 30~50% 줄이고 warmup_steps 증가
# 2) clip_grad_norm(max_norm=1.0) 적용
# 3) 배치 축소 + gradient accumulation 증가
# 4) 데이터 이상치(초장문/깨진 토큰) 제거
실험 추적 템플릿
# 실험 카드
실험명: sft-v2-kr
데이터 버전: v1.3
모델 크기: 8B
학습 설정: lr=2e-4, seq=8k
평가 결과: 정확도 0.82, p95 1.4s
결론: 채택/보류/폐기
안전 정렬 데이터셋 설계 가이드
- 금지: 불법 행위, 자해/폭력 조장, 개인정보 요청
- 제한: 의료/법률/금융 조언은 일반 정보 수준
- 허용: 교육 목적 설명, 공개 정보 요약
- 엣지 케이스: 우회 요청, 모호한 질문 포함
포인트: 금지/제한/허용의 경계 샘플을 충분히 포함해야 모델이 안정적으로 학습합니다.
품질 회귀 테스트 스위트
정기적으로 실행해 품질 저하를 조기에 감지합니다.
- 기본 세트: 요약, 번역, 분류, 질의응답
- 도메인 세트: 코드 리뷰, 정책 문서, 고객지원
- 안전 세트: 금칙어/유해 요청 대응
평가 자동화 파이프라인 예시
// 배치 평가 → 리포트 생성
function runEval(model, evalSet) {
const results = [];
for (const sample of evalSet) {
const output = model.generate(sample.input);
results.push({ id: sample.id, score: score(output, sample.gold) });
}
writeReport(results, "eval-report.json");
}
RLHF/DPO 구체 단계
- 기본 모델로 후보 응답 생성
- 사람이 선호도 쌍 라벨링
- 보상 모델 학습(RLHF)
- 정책 모델 업데이트(RLHF) 또는 DPO 최적화
- 평가셋으로 품질 검증
참고: DPO는 보상 모델 학습 없이 직접 선호도 쌍을 최적화합니다.
선호도 데이터 포맷 예시
{"prompt": "이 기능을 설명해줘", "chosen": "명확한 요약", "rejected": "모호한 설명"}
스케일링 법칙과 목표 설정
- 모델 크기 vs 데이터: 균형이 깨지면 수렴이 느려짐
- 목표 지표: 도메인별 정확도/지연/비용의 최적점
- 반복 학습: 작은 모델에서 검증 후 확장
아키텍처별 학습 차이
- Decoder-only: 대화/생성에 강점, 대부분의 LLM 표준
- Encoder-Decoder: 입력-출력 변환에 강점(번역/요약)
- Encoder: 분류/검색에서 효율적
포인트: 서비스 목적이 생성 중심이라면 Decoder-only가 기본 선택입니다.
추론 서빙 최적화 심화
- 캐시 전략: KV 캐시 + 응답 캐시를 병행
- 스케줄링: 요청 큐 우선순위와 배치 최적화
- 멀티 GPU: 텐서 병렬/파이프라인 병렬 조합
레드팀 시나리오 템플릿
# 레드팀 시나리오
목표: 금칙어 우회 요청 탐지
시나리오: 단계적 질문으로 민감정보 유도
성공 기준: 정책 위반 응답 차단
실패 기준: 금지 정보 제공
학습 인프라/데브옵스 구성 예시
- 스토리지: 대용량 객체 스토리지 + 데이터 캐시
- 실험 추적: 실험 로그와 체크포인트 관리
- GPU 오케스트레이션: 스케줄러로 학습 자원 관리
- 모니터링: 학습 손실/성능 지표 대시보드
포인트: 학습 환경은 “재현성”과 “비용 통제”를 함께 목표로 설계해야 합니다.
멀티모달 학습/추론
- 비전-언어: 이미지 캡션, 문서 OCR, 멀티모달 QA
- 오디오-언어: 음성 전사, 음성 요약
- 데이터 준비: 이미지/오디오 정제와 메타데이터 정렬
모델 라이프사이클 운영
- 모델 버전 관리 및 배포 기록
- 사용량/품질 분석 후 개선 계획 수립
- 신규 데이터 확보 및 재학습
- 구버전 모델 폐기/마이그레이션
LLM 제작 비용 산정 상세
- 데이터 비용: 수집, 정제, 라벨링, 검수
- 학습 비용: GPU, 스토리지, 전력
- 검증 비용: 평가셋 구축, 레드팀
- 서빙 비용: 추론 서버, 캐시, 관찰성
- 인건비: 연구, 엔지니어링, 운영
파인튜닝 vs LoRA/어댑터
- 전체 파인튜닝: 최고 성능, 높은 비용
- LoRA/어댑터: 적은 비용, 빠른 실험
- 선택 기준: 데이터 규모, 운영 비용, 유지보수 용이성
포인트: 초기에는 LoRA로 검증 후 전체 파인튜닝으로 확장하는 방식이 일반적입니다.
운영 리포트 템플릿
# 월간 운영 리포트
요약: 품질/비용/안전 요약
품질: 정확도, 사용자 만족도
비용: 총 토큰 비용, 캐시 히트율
안전: 정책 위반 건수, 차단율
개선 계획: 다음 달 개선 항목
데이터 저작권/라이선스 리스크
- 출처 불명 데이터: 법적 리스크가 가장 큼
- 오픈소스 코드: 라이선스 의무(상업 사용 제한 등) 확인
- 사용자 데이터: 이용약관/개인정보보호법 준수
주의: 데이터 출처·라이선스는 학습 시작 전에 반드시 문서화해야 합니다.
모델 검증 벤치마크 설계
- 기본 벤치마크: 요약, 분류, 질문응답
- 도메인 벤치마크: 실제 고객 데이터 기반 테스트
- 안전 벤치마크: 금지 요청, 우회 시도
포인트: 서비스 목적과 무관한 벤치마크는 과도한 최적화를 유발할 수 있습니다.
모델 폐기 및 데이터 삭제 절차
- 폐기 대상 모델 버전 고정 및 백업
- 데이터 보존 정책에 따른 삭제
- 운영 시스템에서 모델 엔드포인트 제거
- 감사 로그에 폐기 기록 남김
도메인별 파인튜닝 데이터 예시
- 코딩: 코드 리뷰 코멘트, 리팩터링 전/후 쌍
- 문서: 정책 요약, 표준 문서 Q&A
- 지원: 티켓 요약, FAQ 응답 템플릿
모델 성능 드리프트 감지
- 지표 모니터링: 정확도, 안전 위반율, 재질문 비율
- 데이터 분포: 입력 길이/도메인 분포 변화 감지
- 경보: 임계값 초과 시 재평가 트리거
SLA/SLO 템플릿
# 서비스 수준 목표
가용성: 99.9%
지연: p95 < 2.0s
품질: 평가셋 정확도 0.8 이상
안전: 정책 위반율 < 0.1%
모델/데이터 윤리 가이드라인
- 공정성: 편향된 데이터 분포 감시
- 투명성: 모델 한계/오류 가능성 명시
- 책임성: 피해 발생 시 대응 절차 마련
- 프라이버시: 개인 정보 최소 수집
예산 계산 사례
| 항목 | 가정 | 비용 |
|---|---|---|
| 데이터 정제 | 1TB, 인력 2명 | $XX,XXX |
| 학습 | GPU 32장, 2주 | $XXX,XXX |
| 평가/레드팀 | 전문가 3명, 2주 | $XX,XXX |
| 서빙 | 월간 1M 요청 | $X,XXX/월 |
조직 내 역할 분담
- 리서치: 모델/학습 전략 수립
- ML 엔지니어: 학습 파이프라인 구현
- 플랫폼: 서빙/인프라 운영
- 보안/법무: 데이터/정책 검토
추론·RAG·도구 사용 분리 안내
학습·정렬 이후 단계인 추론 최적화, RAG 파이프라인, 도구 사용 패턴, 제공자별 API 연동 내용은 LLM 핸드북 4: 추론·RAG·도구사용으로 분리했습니다.
학습 동선: 1) 개념·구조·평가 → 2) 학습·정렬 → 3) 배포·운영·안전 → 4) 추론·RAG·도구사용 순서로 읽으면 전체 파이프라인이 자연스럽게 연결됩니다.