큰 모델 API로 잘 돌아가는 기능을 작은 모델로 옮기고 싶은데, 어떤 증류 방식을 써야 할지, 돈은 얼마나 드는지 막막하시죠? 결론부터 말하면 교사가 API로만 열려 있으면 시퀀스 KD(교사 답변으로 SFT)밖에 길이 없고, 교사 가중치를 직접 돌릴 수 있고 토크나이저까지 같을 때만 로짓 KD·온폴리시 KD가 선택지에 올라와요. 비용은 학습보다 운영에서 갈려요. 아래 예시 계산에서 증류 학습 자체는 수백 달러 안쪽이지만, 작은 모델을 띄워 두는 GPU 월세는 한 달에 약 3,132달러예요.
이 글은 원리보다 고르는 데 필요한 숫자를 다뤄요. GPU 단가는 Lambda, 교사 API 단가는 DeepSeek 공식 가격표에서 2026-10-26에 확인했고, 나머지는 공식에 넣어 직접 계산했어요. 모델 성능 수치는 각 모델 카드·논문 원문 값이에요.
증류가 필요한 경우와 아닌 경우 먼저 가르기
증류는 "큰 모델이 이미 잘하는 특정 작업을 작은 모델에게 시키고 싶을 때" 쓰는 방법이에요. 다음 중 하나라도 해당하면 검토할 가치가 있어요.
- 요청량이 많아 API 비용이 커질 때. 몇 달 뒤 월 수백만 건이 예상되는 분류·추출·요약 같은 반복 작업이 대표적이에요.
- 데이터를 밖으로 보낼 수 없을 때. 사내망이나 온디바이스처럼 모델을 직접 들고 있어야 하는 환경이에요.
- 지연이 빡빡할 때. 토큰 하나를 만들 때 가중치를 한 번씩 읽어야 하니, H100 SXM 대역폭 3.35TB/s(NVIDIA H100 사양) 기준으로 72.7B 모델(bf16 약 145GB)은 동시 요청 1개일 때 초당 약 23토큰이 상한이고, 7.6B 모델(약 15GB)은 약 220토큰이 상한이에요. 약 10배 차이예요.
반대로 이런 경우는 증류부터 하지 않는 게 나아요.
- 작업 범위가 넓고 계속 바뀔 때. 증류한 학생은 학습 데이터에 있던 작업만 교사만큼 해요. 범용 비서를 통째로 옮기려면 교사급 데이터 규모가 필요해요.
- 이미 공개 증류 모델이 있을 때. 추론 작업이라면 DeepSeek-R1을 증류한 Qwen·Llama 기반 모델이 이미 있어요. 이런 모델과 작은 API 점수를 먼저 재 보세요.
- 요청량이 적을 때. 아래 손익분기 계산처럼 월 수십만 건 수준이면 작은 API 모델이 GPU 월세보다 싸요.
세 가지 증류 방식, 필요한 것과 얻는 것
실무에서 고르는 대상은 사실상 세 가지예요. 이름보다 교사에게 무엇을 받아 오느냐로 구분하면 쉬워요.
| 방식 | 교사에게 받는 것 | 교사 접근 | 토크나이저 | 학생 학습 데이터 | 구현 난이도 |
|---|---|---|---|---|---|
| 시퀀스 KD | 답변 텍스트 | API로 충분 | 달라도 됨 | 교사가 쓴 답변 | 낮음 (평범한 SFT) |
| 로짓 KD | 토큰마다 확률 분포 | 가중치 필요 | 같아야 함 | 기존 데이터 + 교사 분포 | 중간 (손실 함수·캐시) |
| 온폴리시 KD | 학생 답변에 대한 토큰별 분포 | 가중치 필요 | 같아야 함 | 학생이 매번 새로 생성 | 높음 (생성 루프 포함) |
시퀀스 KD는 교사에게 프롬프트를 보내 답변을 모으고, 그 답변으로 학생을 SFT하는 방식이에요. 기계 번역에서 제안된 Kim·Rush의 시퀀스 단위 KD 논문이 출발점이고, DeepSeek-R1의 증류 모델도 이 방식이에요. DeepSeek-R1 모델 카드는 R1으로 고른 80만 개 샘플로 Qwen2.5·Llama 계열 모델을 파인튜닝했다고 적어요.
로짓 KD는 교사가 위치마다 내는 확률 분포 전체(또는 상위 일부)를 학생이 따라 하게 해요. 정답 한 개보다 정보가 많아 같은 데이터에서 더 많이 배우는 대신, 교사를 직접 돌려야 하고 두 모델의 어휘가 같아야 해요. Gemma 2 기술 보고서는 2B·9B 모델을 이 방식으로 학습했다고 적어요.
온폴리시 KD는 학생이 직접 답변을 쓰고, 교사가 그 답변의 토큰마다 분포를 매겨 줘요. 학생이 실제로 저지르는 실수 위에서 배우니, 긴 생성에서 한 번 엇나가면 계속 엇나가는 문제를 줄여요. GKD 논문이 이 방식을 정리했어요.
학습 비용 직접 계산 — 10만 건 예시
같은 작업을 세 방식으로 했을 때 비용이 얼마나 다른지 계산해 볼게요. 가정은 이래요.
- 데이터 10만 건, 건당 입력 600토큰·출력 800토큰. 한 바퀴(에폭)에 1억 4,000만 토큰, 그중 응답 8,000만 토큰
- 학생: Qwen2.5-7B-Instruct(7.6B), 3에폭 전체 파인튜닝
- 로짓·온폴리시 KD 교사: Qwen2.5-72B-Instruct(72.7B). 두 모델 모두
vocab_size152,064라 로짓 칸이 맞아요 - 시퀀스 KD 교사: DeepSeek API
deepseek-v4-pro. DeepSeek 가격표 기준 100만 토큰당 피크 입력(캐시 미스) 1.32달러·출력 3.96달러, 비피크는 절반 - GPU: Lambda 가격표의 H100 SXM 80GB 8장 인스턴스 장당 시간당 3.99달러(1장 인스턴스는 4.29달러)
- 연산량: 학습은 토큰당 6×파라미터, 순전파는 2×파라미터 FLOP. H100 bf16 밀집 연산은 사양표의 1,979TFLOPS가 희소성 기준이라 절반인 약 990TFLOPS로 보고, 실제 활용률(MFU)은 40%로 가정했어요
토큰 하나를 학습할 때 드는 연산을 방식별로 나누면 이렇게 돼요(3에폭 평균, 단위 GFLOP).
시퀀스 KD의 교사 비용은 GPU 대신 API 요금으로 따로 나가요. 온폴리시의 학생 생성은 실제로는 연산량보다 훨씬 오래 걸려요.
표로 보기
| 구분 | 학생 학습 | 교사 순전파 | 학생 생성 |
|---|---|---|---|
| 시퀀스 KD | 45.6 | 0 | 0 |
| 로짓 KD (교사 캐시) | 45.6 | 48.5 | 0 |
| 로짓 KD (매번 교사) | 45.6 | 145 | 0 |
| 온폴리시 KD | 45.6 | 145 | 8.7 |
이걸 GPU 시간과 돈으로 바꾸면 이래요.
| 방식 | GPU 시간 (H100) | GPU 비용 | 교사 API 비용 | 합계 |
|---|---|---|---|---|
| 시퀀스 KD | 13.4 | 약 54달러 | 396달러 (비피크 198달러) | 약 450달러 (비피크 약 252달러) |
| 로짓 KD, 교사 출력 캐시 | 27.7 | 약 111달러 | 없음 | 약 111달러 + 저장소 |
| 로짓 KD, 매 스텝 교사 실행 | 56.3 | 약 225달러 | 없음 | 약 225달러 |
| 온폴리시 KD | 58.9 이상 | 약 235달러 이상 | 없음 | 약 235달러 이상 |
여기서 읽을 점이 세 가지 있어요.
- 어느 방식이든 학습비는 운영비보다 작아요. 가장 비싼 줄도 H100 한 장 월세(약 3,132달러)의 7분의 1 수준이라, 방식은 비용보다 접근 권한과 품질로 정해요.
- 로짓 KD는 교사 출력을 한 번만 계산해 두면 절반으로 줄어요. 매 스텝 교사를 다시 돌리면 3에폭 동안 같은 계산을 세 번 해요. 다만 아래처럼 저장 용량 문제가 생겨요.
- 온폴리시 KD의 표 숫자는 하한이에요. 학생이 한 토큰씩 생성하는 동안 GPU는 메모리 대역폭에 묶여 연산을 거의 못 써요. 생성이 학습 루프 안에 있으니 실제 시간은 작은 데이터로 재서 곱하는 게 정확해요.
MFU 40%는 가정이지만, 방식 사이의 비율은 파라미터·토큰 수로 정해지니 순서는 크게 바뀌지 않아요. 한국어 데이터라면 같은 글자 수라도 토크나이저에 따라 토큰 수가 꽤 달라지니, 입력·출력 토큰을 먼저 세어 보는 게 좋아요. 세는 법은 한국어 LLM 토큰 비용 비교에 정리해 두었어요.
로짓 KD 저장 용량 — top-k를 몇으로 둘까
교사 출력을 캐시하려면 응답 토큰마다 분포를 디스크에 써야 해요. 전체 어휘를 bf16으로 저장하면 토큰 하나에 152,064 × 2바이트 = 약 304KB예요. 응답 8,000만 토큰이면 약 24,330TB, 24PB가 넘어요. 현실적으로 불가능하니 상위 k개 토큰의 ID(4바이트)와 로그 확률(2바이트)만 남겨요.
top-20이면 10GB 아래라 한 서버 디스크에 충분히 들어가요. 남은 확률(1 − top-k 합)은 버리거나 "나머지" 한 칸으로 묶어 손실을 계산해요. k를 얼마로 둘지는 데이터에서 top-k 확률 합이 평균 얼마인지 찍어 보고 정해요. 상위 몇 개에 확률이 몰려 있는 작업(분류·추출)은 작은 k로 충분하고, 창작처럼 분포가 넓은 작업일수록 k를 키워야 정보가 남아요. GB·GiB 단위가 섞여 헷갈리면 데이터 용량 변환기로 맞춰 보면 돼요.
캐시 없이 교사를 함께 돌리면 저장은 필요 없지만, 72.7B 교사 가중치만 bf16 약 145GB라 H100 두 장을 교사가 차지해요.
품질은 얼마나 남나 — 원문이 보고한 숫자
증류한 학생이 교사를 얼마나 따라잡는지는 작업마다 다르니, 남의 숫자는 감을 잡는 용도로만 써요. DeepSeek-R1 모델 카드의 증류 모델 AIME 2024 pass@1은 Qwen-7B 기반 55.5, Qwen-14B 기반 69.7, Qwen-32B 기반 72.6, Llama-70B 기반 70.0이에요. 모두 같은 80만 샘플로 SFT만 한 결과예요.
여기서 볼 점은 학생 크기의 효과예요. 7B→14B는 14.2점이 올랐지만 14B→32B는 2.9점이었어요. 70B Llama 기반도 32B Qwen 기반과 비슷했어요. "클수록 낫다"는 맞지만, 일정 크기를 넘으면 늘어난 서빙 비용만큼 품질이 오르지 않을 수 있어요. 학생은 2~3개 크기로 작게 돌려 보고 곡선이 꺾이는 곳을 고르는 게 안전해요.
Gemma 2 기술 보고서의 비교도 참고할 만해요. 2B 모델을 5,000억 토큰으로 처음부터 학습하면 벤치마크 3개 평균 60.3, 같은 조건에서 7B 교사로 증류하면 67.7이었어요. 같은 데이터·같은 크기라면 교사 분포를 쓰는 쪽이 정답 토큰만 쓰는 쪽보다 나았다는 뜻이에요. 반면 DeepSeek-R1 논문은 증류가 교사의 능력을 옮길 뿐 넘지는 못한다는 점도 함께 적어요(DeepSeek-R1 논문).
직접 띄울까, 작은 API를 쓸까 — 월 요청 수 손익분기
증류한 학생은 결국 어딘가에 띄워야 해요. 같은 작업을 큰 API, 작은 API, 자체 호스팅 학생으로 처리할 때 한 달 비용을 비교해 볼게요. 요청당 입력 600·출력 800토큰, API는 피크 단가, 자체 호스팅은 H100 1장 인스턴스(시간당 4.29달러 × 730시간 = 약 3,132달러)예요.
deepseek-v4-pro: 요청당 0.00396달러deepseek-flash(가격표 기준 DeepSeek-V4.1-Flash-1017, 피크 입력 0.3·출력 1.2달러): 요청당 0.00114달러
자체 호스팅 선은 GPU 한 장이 그 요청량을 다 처리한다는 가정이에요. 넘치면 장수만큼 계단식으로 올라가요.
표로 보기
| 구분 | V4-Pro API (피크) | V4-Flash API (피크) | 학생 자체 호스팅 (H100 1장) |
|---|---|---|---|
| 50만 | 1,980 | 570 | 3,132 |
| 100만 | 3,960 | 1,140 | 3,132 |
| 200만 | 7,920 | 2,280 | 3,132 |
| 300만 | 11,880 | 3,420 | 3,132 |
| 500만 | 19,800 | 5,700 | 3,132 |
손익분기는 GPU 월세 ÷ 요청당 API 비용이에요. V4-Pro 대비 월 약 79만 요청, V4-Flash 대비 약 275만 요청이에요. 비피크 시간에만 몰리는 배치 작업이라면 API 단가가 절반이라 손익분기가 두 배로 멀어져요.
275만 요청이면 출력만 월 22억 토큰, 하루 종일 고르게 와도 초당 약 836토큰이에요. 7.6B 모델이 H100 한 장에서 이 정도를 감당하는지는 동시 요청 수와 KV 캐시 여유로 정해지니 직접 재야 해요. 계산 방법은 vLLM KV 캐시 용량 계산에 있어요. 트래픽이 출렁이면 피크 기준으로 장수를 잡아야 해서 손익분기가 더 멀어져요.
정리하면 증류의 돈 이득은 "작은 API보다 싸게 굴릴 만큼 요청이 많을 때" 나와요. 요청이 그보다 적은데도 증류가 필요하다면 이유는 비용이 아니라 데이터 반출 금지나 지연이어야 해요.
상황별 추천
| 상황 | 추천 | 이유 |
|---|---|---|
| 교사가 상용 API뿐 | 시퀀스 KD (약관 허용 시) | 받을 수 있는 게 텍스트뿐이에요 |
| 교사와 학생이 다른 회사 모델 | 시퀀스 KD | 어휘가 달라 로짓 칸이 안 맞아요 |
| 같은 계열 큰·작은 모델, 데이터 이미 있음 | 로짓 KD + top-k 캐시 | 같은 데이터에서 더 많이 배우고 비용도 낮아요 |
| 학생이 교사보다 10배 이상 작고 답변이 김 | 1차 시퀀스·로짓 KD 후 온폴리시로 추가 학습 | 엇나간 뒤 복구하는 법을 배워요 |
| 짧은 분류·추출 | 시퀀스 KD로 충분한 경우가 많음 | 출력이 짧아 분포 이탈이 쌓일 틈이 적어요 |
온폴리시 KD를 TRL로 할 때 GKDConfig의 lmbda(학생 생성 비율), beta(순방향↔역방향 KL 보간), seq_kd(교사 생성문 사용) 세 값이 방식을 정해요. TRL GKD Trainer 문서 기준 기본값은 0.5·0.5·False이고, 현재 trl.experimental.gkd 아래에 있어요. 문서는 저자들이 lmbda를 높게 둘 때 결과가 좋았고, 최적 beta는 작업마다 달랐다고 적어요. 실험적 모듈이라 버전을 올릴 때 경로나 인자가 바뀔 수 있으니 버전을 고정해 두세요. 한 가지 함정은 temperature(기본 0.9)가 손실 계산의 온도가 아니라 학생이 답변을 생성할 때의 샘플링 온도라는 점이에요. 샘플링 온도를 어떻게 다룰지는 LLM temperature 설정 고르기에 따로 정리했어요.
도입 체크리스트
- 교사 약관과 라이선스부터 읽어요. 기술보다 먼저 막히는 곳이에요. DeepSeek-R1 모델 카드는 상업적 사용과 "다른 LLM 학습을 위한 증류"를 명시적으로 허용해요. Llama 3.1 라이선스는 Llama 출력으로 다른 모델을 학습해 배포하면 모델 이름 앞에 "Llama"를 붙이라고 요구해요. OpenAI 이용약관은 출력으로 OpenAI와 경쟁하는 모델을 개발하는 것을 금지 사항에 넣고 있어요. 쓰려는 교사의 최신 약관을 직접 확인하세요.
- 평가셋을 먼저 떼어 둬요. 실제 요청에서 수백 건을 뽑아 학습 데이터와 섞이지 않게 보관해요. 교사, 증류 전 학생, 기성 소형 모델 점수를 이 평가셋으로 먼저 재요. 기성 모델이 이미 목표를 넘으면 증류할 이유가 없어요.
- 토크나이저는 숫자 말고 내용으로 비교해요. 같은 계열이어도
vocab_size가 다를 수 있어요. 예를 들어 Qwen2.5-1.5B-Instruct는 151,936, Qwen2.5-32B-Instruct는 152,064예요. 실제 토큰 목록은 같고 임베딩 행렬만 여분 칸을 덧붙인 경우라면 공통 길이로 잘라 쓰면 되지만, 그걸 확인하지 않고 모양만 맞추면 엉뚱한 칸끼리 비교해요. - 교사 답변을 걸러요. 시퀀스 KD에서 학생은 교사의 실수까지 그대로 배워요. 형식 검사(JSON이면 파싱 성공 여부), 정답이 있는 작업은 정답 대조, 너무 긴 답변 제거 정도는 기본으로 해 둬요.
- 응답 토큰에만 손실을 걸어요. 프롬프트 토큰까지 손실에 넣으면 학생이 질문을 외우는 데 용량을 써요. TRL의 SFT 계열 설정에도
completion_only_loss·assistant_only_loss같은 옵션이 있어요. - 소규모로 방식을 비교한 뒤 키워요. 1만 건으로 시퀀스 KD와 로짓 KD를 같은 평가셋에서 비교하고, GPU 시간을 기록해 위 표의 MFU 가정을 실제 값으로 바꿔요.
- 배포 전엔 지연과 넘김 기준을 정해요. 학생의 p50·p99 지연을 실제 부하로 재고, 학생이 자신 없는 요청(형식 오류, 낮은 점수)은 교사 API로 넘기는 경로를 두면 품질 하한을 지킬 수 있어요.
- 재증류 주기를 정해요. 교사나 요청 유형이 바뀌어도 학생은 그대로예요. 분기마다 평가셋 점수를 다시 재요.
자주 묻는 질문
지식 증류와 그냥 파인튜닝은 뭐가 다른가요?
학습 코드만 보면 시퀀스 KD는 평범한 SFT와 같아요. 차이는 정답을 사람이 아니라 교사 모델이 만든다는 점이에요. 로짓 KD·온폴리시 KD는 정답 토큰 하나 대신 교사의 확률 분포를 따라 하게 해서, 같은 데이터 양에서 정보를 더 많이 받아요.
상용 API 답변으로 작은 모델을 학습해도 되나요?
제공사 약관에 달려 있어요. OpenAI 이용약관은 출력으로 경쟁 모델을 개발하는 것을 금지하고, DeepSeek-R1 모델 카드는 증류를 명시적으로 허용해요. Llama 3.1 라이선스는 결과 모델을 배포할 때 이름에 "Llama"를 붙이라는 조건이 있어요. 법무 검토가 필요한 회사라면 이 부분을 가장 먼저 확인하세요.
데이터는 몇 건이나 있어야 하나요?
정해진 숫자는 없어요. DeepSeek-R1 증류 모델은 80만 건을 썼지만 범위가 넓은 추론 작업이었어요. 좁은 분류·추출이라면 수천~수만 건부터 시작해 평가셋 점수가 멈출 때까지 늘려요. 위 예시로 10만 건 시퀀스 KD도 약 450달러예요.
학생 모델 크기는 어떻게 고르나요?
서빙 예산에서 거꾸로 정해요. GPU 한 장에 올려야 한다면 가중치와 KV 캐시가 함께 들어가는 크기가 상한이에요. 그 안에서 2~3개 크기를 작게 증류해 보고 점수가 꺾이는 곳을 고르세요. DeepSeek-R1 증류 결과에서도 7B→14B 상승폭이 14B→32B보다 훨씬 컸어요.
토크나이저가 다른 모델끼리는 로짓 증류가 정말 안 되나요?
기본 형태로는 안 돼요. 로짓 벡터의 같은 번호 칸이 서로 다른 토큰이라 비교가 의미 없어요. 이럴 때는 교사 답변 텍스트로 학습하는 시퀀스 KD를 쓰는 게 가장 간단하고, DeepSeek-R1(어휘 129,280)을 Qwen2.5·Llama 계열로 옮긴 증류도 이 방식이었어요.
정리
- 방식은 접근 권한이 정해요. API 교사면 시퀀스 KD, 같은 토크나이저의 공개 가중치 교사면 로짓 KD, 긴 생성에서 학생이 엇나가면 온폴리시 KD를 더해요.
- 10만 건 예시에서 학습비는 약 111~450달러로, H100 한 장 월세(약 3,132달러)보다 훨씬 작아요. 로짓 KD는 top-20 캐시면 저장 10GB 안쪽이에요.
- 돈 이득은 요청량이 정해요. 이 예시에선 작은 API 대비 월 약 275만 요청을 넘어야 자체 호스팅 학생이 싸요.
- 시작 전 약관·평가셋·토크나이저, 배포 전 지연·넘김 경로를 체크리스트로 확인하세요. 생성 속도를 더 줄이고 싶다면 학생 위에 투기적 디코딩을 겹치는 방법도 있어요.
더 깊이 읽기
이 글은 실무에서 판단할 때 필요한 것 위주로 정리했어요. 같은 주제의 내부 동작 원리는 devboi 기술 블로그의 지식 증류 원리 — 소프트 타깃·온도·T²와 LLM 온폴리시 증류에서 도식과 코드로 단계별로 풀었어요.