광고
~ / posts / developer
💻 개발자

지식 증류 방식 고르기, 시퀀스·로짓·온폴리시 KD 비용과 체크리스트

큰 모델 API로 잘 돌아가는 기능을 작은 모델로 옮기고 싶은데, 어떤 증류 방식을 써야 할지, 돈은 얼마나 드는지 막막하시죠? 결론부터 말하면 교사가 API로만 열려 있으면 시퀀스 KD(교사 답변으로 SFT)밖에 길이 없고, 교사 가중치를 직접 돌릴 수 있고 토크나이저까지 같을 때만 로짓 KD·온폴리시 KD가 선택지에 올라와요. 비용은 학습보다 운영에서 갈려요. 아래 예시 계산에서 증류 학습 자체는 수백 달러 안쪽이지만, 작은 모델을 띄워 두는 GPU 월세는 한 달에 약 3,132달러예요.

이 글은 원리보다 고르는 데 필요한 숫자를 다뤄요. GPU 단가는 Lambda, 교사 API 단가는 DeepSeek 공식 가격표에서 2026-10-26에 확인했고, 나머지는 공식에 넣어 직접 계산했어요. 모델 성능 수치는 각 모델 카드·논문 원문 값이에요.

광고

증류가 필요한 경우와 아닌 경우 먼저 가르기

증류는 "큰 모델이 이미 잘하는 특정 작업을 작은 모델에게 시키고 싶을 때" 쓰는 방법이에요. 다음 중 하나라도 해당하면 검토할 가치가 있어요.

반대로 이런 경우는 증류부터 하지 않는 게 나아요.

세 가지 증류 방식, 필요한 것과 얻는 것

실무에서 고르는 대상은 사실상 세 가지예요. 이름보다 교사에게 무엇을 받아 오느냐로 구분하면 쉬워요.

방식교사에게 받는 것교사 접근토크나이저학생 학습 데이터구현 난이도
시퀀스 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만 건 예시

같은 작업을 세 방식으로 했을 때 비용이 얼마나 다른지 계산해 볼게요. 가정은 이래요.

토큰 하나를 학습할 때 드는 연산을 방식별로 나누면 이렇게 돼요(3에폭 평균, 단위 GFLOP).

학습 토큰 하나당 연산량 (학생 7.6B · 교사 72.7B)
학생 학습교사 순전파학생 생성
050100150200시퀀스 KD · 학생 학습 45.6GFLOP시퀀스 KD · 교사 순전파 0GFLOP시퀀스 KD · 학생 생성 0GFLOP시퀀스 KD로짓 KD (교사 캐시) · 학생 학습 45.6GFLOP로짓 KD (교사 캐시) · 교사 순전파 48.5GFLOP로짓 KD (교사 캐시) · 학생 생성 0GFLOP로짓 KD (교사 캐시)로짓 KD (매번 교사) · 학생 학습 45.6GFLOP로짓 KD (매번 교사) · 교사 순전파 145GFLOP로짓 KD (매번 교사) · 학생 생성 0GFLOP로짓 KD (매번 교사)온폴리시 KD · 학생 학습 45.6GFLOP온폴리시 KD · 교사 순전파 145GFLOP온폴리시 KD · 학생 생성 8.7GFLOP온폴리시 KD

시퀀스 KD의 교사 비용은 GPU 대신 API 요금으로 따로 나가요. 온폴리시의 학생 생성은 실제로는 연산량보다 훨씬 오래 걸려요.

단위: GFLOP · 자료: 6N·2N FLOP 근사로 직접 계산. 교사 캐시는 1회 순전파를 3에폭에 나눈 값
표로 보기
구분학생 학습교사 순전파학생 생성
시퀀스 KD45.600
로짓 KD (교사 캐시)45.648.50
로짓 KD (매번 교사)45.61450
온폴리시 KD45.61458.7

이걸 GPU 시간과 돈으로 바꾸면 이래요.

방식GPU 시간 (H100)GPU 비용교사 API 비용합계
시퀀스 KD13.4약 54달러396달러 (비피크 198달러)약 450달러 (비피크 약 252달러)
로짓 KD, 교사 출력 캐시27.7약 111달러없음약 111달러 + 저장소
로짓 KD, 매 스텝 교사 실행56.3약 225달러없음약 225달러
온폴리시 KD58.9 이상약 235달러 이상없음약 235달러 이상

여기서 읽을 점이 세 가지 있어요.

  1. 어느 방식이든 학습비는 운영비보다 작아요. 가장 비싼 줄도 H100 한 장 월세(약 3,132달러)의 7분의 1 수준이라, 방식은 비용보다 접근 권한과 품질로 정해요.
  2. 로짓 KD는 교사 출력을 한 번만 계산해 두면 절반으로 줄어요. 매 스텝 교사를 다시 돌리면 3에폭 동안 같은 계산을 세 번 해요. 다만 아래처럼 저장 용량 문제가 생겨요.
  3. 온폴리시 KD의 표 숫자는 하한이에요. 학생이 한 토큰씩 생성하는 동안 GPU는 메모리 대역폭에 묶여 연산을 거의 못 써요. 생성이 학습 루프 안에 있으니 실제 시간은 작은 데이터로 재서 곱하는 게 정확해요.

MFU 40%는 가정이지만, 방식 사이의 비율은 파라미터·토큰 수로 정해지니 순서는 크게 바뀌지 않아요. 한국어 데이터라면 같은 글자 수라도 토크나이저에 따라 토큰 수가 꽤 달라지니, 입력·출력 토큰을 먼저 세어 보는 게 좋아요. 세는 법은 한국어 LLM 토큰 비용 비교에 정리해 두었어요.

로짓 KD 저장 용량 — top-k를 몇으로 둘까

교사 출력을 캐시하려면 응답 토큰마다 분포를 디스크에 써야 해요. 전체 어휘를 bf16으로 저장하면 토큰 하나에 152,064 × 2바이트 = 약 304KB예요. 응답 8,000만 토큰이면 약 24,330TB, 24PB가 넘어요. 현실적으로 불가능하니 상위 k개 토큰의 ID(4바이트)와 로그 확률(2바이트)만 남겨요.

응답 8,000만 토큰의 교사 분포 저장 용량 (top-k별)
top-1000top-1000 · 480GB480GBtop-100top-100 · 48GB48GBtop-20top-20 · 9.6GB9.6GBtop-5top-5 · 2.4GB2.4GB텍스트만 (토큰 ID)텍스트만 (토큰 ID) · 0.32GB0.32GB

전체 어휘(152,064칸) bf16 저장은 약 24,330TB라 차트에서 뺐어요.

단위: GB · 자료: 토큰당 k × 6바이트(ID int32 + 로그 확률 bf16)로 직접 계산
표로 보기
구분저장 용량
top-1000480
top-10048
top-209.6
top-52.4
텍스트만 (토큰 ID)0.32

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달러)예요.

월 요청 수별 한 달 비용 (요청당 입력 600·출력 800토큰)
V4-Pro API (피크)V4-Flash API (피크)학생 자체 호스팅 (H100 1장)
05,00010,00015,00020,00050만100만200만300만500만50만 · V4-Pro API (피크) 1,980달러100만 · V4-Pro API (피크) 3,960달러200만 · V4-Pro API (피크) 7,920달러300만 · V4-Pro API (피크) 11,880달러500만 · V4-Pro API (피크) 19,800달러19,80050만 · V4-Flash API (피크) 570달러100만 · V4-Flash API (피크) 1,140달러200만 · V4-Flash API (피크) 2,280달러300만 · V4-Flash API (피크) 3,420달러500만 · V4-Flash API (피크) 5,700달러5,70050만 · 학생 자체 호스팅 (H100 1장) 3,132달러100만 · 학생 자체 호스팅 (H100 1장) 3,132달러200만 · 학생 자체 호스팅 (H100 1장) 3,132달러300만 · 학생 자체 호스팅 (H100 1장) 3,132달러500만 · 학생 자체 호스팅 (H100 1장) 3,132달러3,132

자체 호스팅 선은 GPU 한 장이 그 요청량을 다 처리한다는 가정이에요. 넘치면 장수만큼 계단식으로 올라가요.

단위: 달러 · 자료: DeepSeek·Lambda 공식 가격표(2026-10-26)로 직접 계산
표로 보기
구분V4-Pro API (피크)V4-Flash API (피크)학생 자체 호스팅 (H100 1장)
50만1,9805703,132
100만3,9601,1403,132
200만7,9202,2803,132
300만11,8803,4203,132
500만19,8005,7003,132

손익분기는 GPU 월세 ÷ 요청당 API 비용이에요. V4-Pro 대비 월 약 79만 요청, V4-Flash 대비 약 275만 요청이에요. 비피크 시간에만 몰리는 배치 작업이라면 API 단가가 절반이라 손익분기가 두 배로 멀어져요.

275만 요청이면 출력만 월 22억 토큰, 하루 종일 고르게 와도 초당 약 836토큰이에요. 7.6B 모델이 H100 한 장에서 이 정도를 감당하는지는 동시 요청 수와 KV 캐시 여유로 정해지니 직접 재야 해요. 계산 방법은 vLLM KV 캐시 용량 계산에 있어요. 트래픽이 출렁이면 피크 기준으로 장수를 잡아야 해서 손익분기가 더 멀어져요.

정리하면 증류의 돈 이득은 "작은 API보다 싸게 굴릴 만큼 요청이 많을 때" 나와요. 요청이 그보다 적은데도 증류가 필요하다면 이유는 비용이 아니라 데이터 반출 금지나 지연이어야 해요.

상황별 추천

교사 출력 사용 허가, 교사 가중치 접근, 토크나이저 일치, 학생의 긴 답변 이탈 여부를 차례로 물어 기성 모델·시퀀스 KD·온폴리시 KD·로짓 KD 중 출발점을 고르는 순서도
위에서부터 답하고 처음 걸리는 오른쪽 칸에서 시작해요
상황추천이유
교사가 상용 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 설정 고르기에 따로 정리했어요.

도입 체크리스트

시작 전 교사 약관·평가셋·손익분기·토크나이저, 학습 중 답변 필터링·top-k 용량·GPU 시간 기록, 배포 전 교사 대비 점수·지연 측정·모델 이름 표기를 세 칸으로 나눈 체크리스트
왼쪽 칸부터 순서대로 확인해요
  1. 교사 약관과 라이선스부터 읽어요. 기술보다 먼저 막히는 곳이에요. DeepSeek-R1 모델 카드는 상업적 사용과 "다른 LLM 학습을 위한 증류"를 명시적으로 허용해요. Llama 3.1 라이선스는 Llama 출력으로 다른 모델을 학습해 배포하면 모델 이름 앞에 "Llama"를 붙이라고 요구해요. OpenAI 이용약관은 출력으로 OpenAI와 경쟁하는 모델을 개발하는 것을 금지 사항에 넣고 있어요. 쓰려는 교사의 최신 약관을 직접 확인하세요.
  2. 평가셋을 먼저 떼어 둬요. 실제 요청에서 수백 건을 뽑아 학습 데이터와 섞이지 않게 보관해요. 교사, 증류 전 학생, 기성 소형 모델 점수를 이 평가셋으로 먼저 재요. 기성 모델이 이미 목표를 넘으면 증류할 이유가 없어요.
  3. 토크나이저는 숫자 말고 내용으로 비교해요. 같은 계열이어도 vocab_size가 다를 수 있어요. 예를 들어 Qwen2.5-1.5B-Instruct는 151,936, Qwen2.5-32B-Instruct는 152,064예요. 실제 토큰 목록은 같고 임베딩 행렬만 여분 칸을 덧붙인 경우라면 공통 길이로 잘라 쓰면 되지만, 그걸 확인하지 않고 모양만 맞추면 엉뚱한 칸끼리 비교해요.
  4. 교사 답변을 걸러요. 시퀀스 KD에서 학생은 교사의 실수까지 그대로 배워요. 형식 검사(JSON이면 파싱 성공 여부), 정답이 있는 작업은 정답 대조, 너무 긴 답변 제거 정도는 기본으로 해 둬요.
  5. 응답 토큰에만 손실을 걸어요. 프롬프트 토큰까지 손실에 넣으면 학생이 질문을 외우는 데 용량을 써요. TRL의 SFT 계열 설정에도 completion_only_loss·assistant_only_loss 같은 옵션이 있어요.
  6. 소규모로 방식을 비교한 뒤 키워요. 1만 건으로 시퀀스 KD와 로짓 KD를 같은 평가셋에서 비교하고, GPU 시간을 기록해 위 표의 MFU 가정을 실제 값으로 바꿔요.
  7. 배포 전엔 지연과 넘김 기준을 정해요. 학생의 p50·p99 지연을 실제 부하로 재고, 학생이 자신 없는 요청(형식 오류, 낮은 점수)은 교사 API로 넘기는 경로를 두면 품질 하한을 지킬 수 있어요.
  8. 재증류 주기를 정해요. 교사나 요청 유형이 바뀌어도 학생은 그대로예요. 분기마다 평가셋 점수를 다시 재요.
광고
광고

자주 묻는 질문

지식 증류와 그냥 파인튜닝은 뭐가 다른가요?

학습 코드만 보면 시퀀스 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 계열로 옮긴 증류도 이 방식이었어요.

정리

더 깊이 읽기

이 글은 실무에서 판단할 때 필요한 것 위주로 정리했어요. 같은 주제의 내부 동작 원리는 devboi 기술 블로그의 지식 증류 원리 — 소프트 타깃·온도·T²와 LLM 온폴리시 증류에서 도식과 코드로 단계별로 풀었어요.

참고한 자료

#지식 증류 방법 선택#LLM 증류 비용#시퀀스 KD#로짓 증류 top-k#온폴리시 증류 GKD#소형 모델 파인튜닝#자체 호스팅 손익분기#증류 라이선스
← 이전 글플러터 성능 판단표, const·키·RepaintBoundary 언제 쓰나다음 글 →LLM 양자화 형식 고르기, FP8·AWQ·GGUF 메모리·속도·GPU 비용 비교
광고

더 둘러보기

💻 개발자 다른 도구

🔥 많이 찾는 도구

🔮 재미로 한 번 더

📝 읽어 볼 만한 글

글 전체 보기 →