안녕하세요, 여러분! Qwen3-27B 의 양자화 GGUF 와 함께 Multi-Token Prediction (MTP) 를 구현해 왔으며, 결과는 매우 인상적입니다. 제가 만든 것은 다음과 같습니다: https://huggingface.co/havenoammo/Qwen3.6-27B-MTP-UD-GGUF
이것은 Qwen3-27B 의 Unsloth UD XL 양자화이며, MTP draft heads 를 위에 grafting 하여 Q8_0 로 적용했습니다. 기본 모델은 여전히 낮은 비트 양자화를 유지하고, 3 개의 MTP 레이어는 추측적 정확도를 보존하기 위해 Q8 으로 유지됩니다.
grafted GGUF 파일 (UD XL base + Q8 MTP), 추출한 원본 MTP 레이어 소스 (MTP_Q8_0.gguf), 그리고 convert.py 를 포함했습니다. 또한, 다른 모델에도 적용할 경우 참고용으로 이 gist 에서 수정한 grafting 스크립트도 포함되어 있습니다. 또한 커스텀 llama.cpp 의 전체 빌드 지침도 포함되어 있습니다.
Qwen3 는 3 개의 MTP 단계를 사용하여 훈련되었으며, 이는 각 forward pass 가 한 번에 4 개의 토큰을 예측한다는 것을 의미합니다. llama.cpp 의 메인 브랜치는 아직 MTP 를 지원하지 않으므로, 여전히 오픈된 PR #22673 에서의 speculative decoding 지원 기능을 가져와 master 위에 merge 하고, 이를 바탕으로 llama-server 를 빌드했습니다. 다음 명령어로 실행하세요: --spec-type mtp --spec-draft-n-max 3
결과: MTP 가 없는 동일한 UD XL GGUF 와 비교하여 약 2.5 배의 토큰 처리량이며, 대부분의 draft 토큰이 유지되는 높은 acceptance rate 를 보입니다. 이는 MTP heads 가 실제로 유용하며 단순히 계산만 소모하는 것이 아님을 의미합니다. Q8 MTP 레이어는 전체 모델에 비해 매우 작은 비율이기 때문에 VRAM 오버헤드도 거의 없습니다.
MTP 는 speculative decoding 에 있어 가장 큰 효율성 개선 중 하나이지만, 공식적인 Qwen3 배포 (SGLang 와 vLLM) 외에는 기본적으로 지원되지 않습니다. 이를 GGUF 와 llama.cpp 로 가져와서, 이미 사용하고 있는 도구로 로컬에서 실행할 수 있게 되었습니다. PR #22673 이 곧 출시될 것이며, 모든 것이 자동으로 작동할 것입니다. meantime, merge 과정은 간단합니다 (3 개의 git 명령어).
질문이나 실행에 도움이 필요하시면 언제든지 말씀해 주세요. 시도해 보시고 어떤 속도를 확인하셨는지 알려주세요!
Full step by step instructions 은 HuggingFace repo 에 있지만, 여기에는 간단한 버전이 있습니다:
# 1. MTP 지원으로 llama.cpp 빌드
git clone https://github.com/ggml-org/llama.cpp.git
cd llama.cpp
git fetch origin
git fetch origin pull/22673/head:pr-22673
git checkout master
git reset --hard origin/master
git merge --no-ff pr-22673 -m "Merge PR #22673: llama + spec: MTP Support"
cmake -B build -DGGML_CUDA=ON
cmake --build build --config Release --target llama-server
# 2. GGUF 를 HF 에서 가져오기
# https://huggingface.co/havenoammo/Qwen3.6-27B-MTP-UD-GGUF
# 3. MTP 로 실행
./build/bin/llama-server -m your-model.gguf --spec-type mtp --spec-draft-n-max 3
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17