English | 한국어
고지. 이 저장소는 개인 연구입니다. EXAONE의 공식 파생물이 아니며, LG AI연구원 및 작성자의 소속 기관과 관계가 없습니다. EXAONE 가중치, 생성 데이터, AI Hub 데이터는 들어 있지 않습니다.
EXAONE-4.5-33B의 MTP(multi-token prediction) 헤드는 추론 모드에서는 수용률이 30% 안팎이지만, 추론을 끈 요청에서는 1% 아래로 떨어집니다. 그래서 비추론 요청에 MTP 추측 디코딩을 켜면 오히려 느려집니다. 이 저장소는 본체를 고정하고 MTP 헤드만 모델 자신의 답변으로 다시 학습해 이 문제를 고친 과정을 재현하는 코드입니다.
분석 과정과 결과는 블로그 글 EXAONE 4.5 MTP 수용률을 뜯어보았다에 정리했습니다.
vLLM v0.31.0, EXAONE-4.5-33B-FP8, MTP 드래프트 3개, 자연 프롬프트 5개 × 2회 평균, 최대 400토큰입니다.
| RTX PRO 6000 | MTP 없음 | 원래 MTP | 새 MTP |
|---|---|---|---|
| 비추론 tok/s (배수) | 36.7 | 31.0 (0.85×) | 61.3 (1.67×) |
| 비추론 수용률 | - | 0.8% | 33.7% |
| 추론 tok/s (배수) | 36.7 | 55.4 (1.51×) | 54.5 (1.49×) |
| 추론 수용률 | - | 28.3% | 27.2% |
비추론 요청은 원래 MTP보다 약 2배, MTP 없음보다 1.67배 빨라졌습니다. 추론 요청은 원래 MTP와 거의 같고, 수용률은 1.1%p 낮습니다. GB10에서 세 구성을 같은 날 같은 조건으로 다시 잰 결과도 같은 경향이었습니다(비추론 0.85× → 1.64×, 추론 수용률 29.7% → 29.2%, 검증 기록).
측정 원자료는 results/에 있습니다. GB10에서의 값과 오프라인 지표는 재현 절차에 있습니다.
- 공개 대화·지시 데이터셋과 AI Hub 271에서 프롬프트 14,737개를 고정된 규칙으로 뽑습니다.
- EXAONE 본체(vLLM 서빙)로 그중 4,464개에 답하게 하고 토큰 id를 저장합니다. 추론 모드 약 20%, 시스템 프롬프트를 일부 섞습니다.
- 본체 33B를 고정한 채 MTP 모듈(디코더 레이어 1개와 입력 projection, 약 5.4억 파라미터)만 학습합니다. 손실은 본체의 다음 토큰 분포와 MTP 예측 사이의 KL입니다. vLLM이 드래프트 3개를 재귀로 만드는 것과 같은 방식으로 3단계를 이어서 학습합니다.
- 원본 체크포인트에서
mtp.*텐서만 바꿔 넣은 서빙 디렉터리를 만듭니다. vLLM 코드는 바꾸지 않습니다. - 같은 프롬프트로 MTP 없음 / 원래 MTP / 새 MTP를 측정합니다.
git clone https://github.com/gnu-gnu/exaone45-mtp-selfdistill && cd exaone45-mtp-selfdistill
cp .env.example .env && chmod 600 .env # 경로, AI Hub 키, GPU·서버 연결 정보 입력
scripts/00_check.sh
scripts/01_download.sh # 원본 데이터 (고정 리비전, 체크섬 확인)
scripts/02_prompts.sh # 프롬프트 (게시한 실행과 바이트 단위로 같은지 확인)
scripts/03_generate.sh all # 자기 생성 답변
scripts/04_train.sh stage1 && scripts/04_train.sh stage2
scripts/05_overlay.sh stage2
scripts/serve.sh up mtp work/serve/stage2 && scripts/bench.sh stage2 all- 설정 가이드:
.env에 넣는 값. AI Hub 신청과 키, GPU 지정, 원격 vLLM 서버 연결, GB10 메모리 설정이 있습니다. - 재현 절차: 단계별 소요 시간과 각 단계에서 기대하는 결과가 있습니다.
- 공개 전 검증 기록: 깨끗한 클론에서 무엇을 어디까지 확인했는지 적었습니다.
| 경로 | 내용 |
|---|---|
src/build_prompts.py, src/add_ko_prompts.py, src/emodial_to_jsonl.py |
프롬프트 선별 |
src/gen_client.py |
vLLM OpenAI 호환 API로 답변 토큰 id 수집 (이어서 실행 가능) |
src/train_mtp.py |
MTP 헤드 학습·평가. --regime(추론/비추론 대조), --diag, --simulate 분석 포함 |
src/build_overlay.py |
mtp.* 텐서만 교체한 서빙 디렉터리 생성 |
scripts/ |
단계별 실행 스크립트. 설정은 모두 .env에서 읽습니다. |
bench/ |
측정 프롬프트와 입력 문서 |
data/SHA256SUMS.* |
원본 데이터와 프롬프트 파일의 기대 체크섬 |
results/ |
블로그 글에 실은 측정 원자료 (CSV) |
- 이 저장소의 코드는 Apache License 2.0입니다. 제3자 자료는 NOTICE를 참고해 주세요.
- EXAONE 모델은 포함하지 않습니다. 사용하려면 EXAONE AI Model License Agreement 1.2 - NC에 따라 각자 받아야 합니다.
- 이 코드로 만든 MTP 가중치는 그 라이선스의 파생물(Derivatives)에 해당합니다. 연구·교육 목적으로만 쓸 수 있고, 배포할 때는 라이선스 사본을 함께 두고 이름을 "EXAONE"으로 시작해야 합니다.
- 생성한 답변 데이터는 라이선스의 Output에 해당합니다. 상업적 목적이나 LG의 모델과 경쟁하는 모델을 개발·개선하는 데 쓸 수 없습니다(3.1조).
- 프롬프트 원본은 각 데이터셋의 라이선스를 따릅니다. AI Hub 데이터는 재배포할 수 없어 각자 신청해 받아야 합니다.
결과를 인용할 때는 사용한 모델을 함께 밝혀 주세요: EXAONE-4.5-33B-FP8, LG AI Research.
Generated by Geunwoo Shim ([email protected])