이 가이드를 요청받았으니 여기 있습니다. 어제 누군가의 글과 일부 중복됩니다. YMMV! 업무로 인해 직접 작성하기 바쁘니 Opus에게 부탁했습니다 (내용을 검증했습니다!).
q4 blah blah 사용에 대해 논쟁이 있을 거라고 확신합니다. 내 모델과 잘 작동하니 만족스럽습니다. 요청하면 하드웨어가 허용하는 한 더 높은 q 모델을 만들 수 있습니다!
########
NextN MTP 는 Qwen3.5/3.6 가문과 vanilla 대비 ~2.9× decode 를 제공하며, quality loss 없음 (head 는 모델에 포함됨). 35B-A3B 같은 Heavy MoE 아키텍처는 3090 Ti 에서 ~150 tok/s 를 달성합니다. 단점: 현재 작성 시점에 upstream 으로 통합되지 않았습니다 — open PRs 를 가져와야 합니다.
Required PRs (cherry-pick 또는 해당 브랜치에서 빌드)
2026 년 5 월 현재 두 개 모두 오픈됨 — ship 시 track + rebuild 하세요:
-
#22400 — llama: allow partial seq_rm for GDN models for speculative decoding
https://github.com/ggml-org/llama.cpp/pull/22400
필수 조건입니다. GDN/SSM 모델에 spec-decode 가 rollback 할 수 있도록 keep_intermediates 경로를 추가합니다. 이 없으면 hybrid-attn 모델 (27B) 에서 MTP 는 작동하지 않습니다.
-
#22673 — llama + spec: MTP Support
https://github.com/ggml-org/llama.cpp/pull/22673
메인 코스입니다. qwen35_mtp + qwen35moe_mtp 아키텍처 로더, NextN graph forward, --spec-type mtp 플래그, speculative state machine 를 추가합니다.
두 개 모두 현재 upstream master 에 rebase 하거나 am17an 의 브랜치를 직접 가져오세요.
https://github.com/nickstx/llama.cpp 브랜치 crucible
#22400 + #22673 과 qwen3moe_mtp 아키텍처 (Qwen3-Coder 기반 — coder-30B MTP head training 의 work-in-progress, Qwen3.5/3.6 릴리스 모델에는 필요 없음) 포함. 빌드 가능한 것은 가장 간단한 pull 입니다. 또한 cross-PID slot resumes 를 추가하는 unmerged slot PRs 도 포함되어 있습니다.
Build (CUDA)
git clone https://github.com/nickstx/llama.cpp.git
cd llama.cpp
git checkout crucible
...
Get a working GGUF
Q8nextn 변형 — NextN block override 가 적용된 것 (대부분의 public quants 은 nextn 을 strip 하거나 Q4 →s 로 quantize 하여 acceptance 를 줄입니다).
또는 bf16 소스에서 roll your own 하세요.
선택 사항: imatrix 보정 (5-8% PPL 개선)
./build/bin/llama-imatrix -m model-bf16.gguf -f calibration.txt -ngl 999 \
--chunks 200 -o imatrix.dat
...
--tensor-type nextn=q8_0 는 nextn과 일치하는 모든 텐서의 양자화를 덮어씁니다. 이를 사용하지 않으면: //////// 출력.
실행
./build/bin/llama-server \
-m Qwen3.6-35B-A3B-MTP-IMAT-Q4_K_M-Q8nextn.gguf \
--port 8080 -ngl 999 -fa on --parallel 1 \
...
주요 플래그:
--spec-type mtp — NextN 초안 경로를 활성화합니다 (이것은 #22673 에서 새로 추가된 플래그입니다).
--spec-draft-n-max 4 — 단계당 토큰 4 개를 제안합니다. 채팅을 위해 6 으로 높여주세요 (더 긴 컨텍스트, 예측 가능). 코드를 위한 경우 2 로 낮춰주세요. 기본값은 4 입니다.
-ctk q8_0 -ctv q8_0 — KV 를 q8 로 저장하면 약 절반의 VRAM 을 절약하며, 이 계열에서는 품질 비용이 없습니다.
--kv-unified — spec-decode 에 필수적입니다.
속도 (3090 Ti, 350W/1700MHz, q8 KV, ~50-tok 프롬프트 → 1600-tok 디코딩)
| 모델 | tps |
|---|
| 4B-MTP IMAT-IQ4_XS | 181 |
| ... | |
| 35B-A3B 는 27B 를 3 배 능가합니다 (A3B = 3B 활성 파라미터, MoE 가 승리). 27B 는 dense+SSM 하이브리드 → 느린 링크. | |
전력 튜닝 (3090 Ti)
지속적인 MTP 워크로드를 위해 350W + 1700MHz 잠금이 토큰/W 최적점입니다:
sudo nvidia-smi -pl 350
sudo nvidia-smi -lgc 0,1700
기본값인 300W 는 MTP 초안 패스를 통해 클럭이 약 1080MHz 로 붕괴되게 합니다 — tps 에 약 17% 손실. 280W 보다 낮게 떨어뜨리지 마세요. 재부팅을 넘어 지속하려면 systemd 를 사용하세요.
주의사항
//// 출력 = nextn 블록이 Q4-양자화되었습니다. --tensor-type nextn=q8_0 로 재양화하세요.
- 속도 개선 없음 =
--spec-type mtp 가 켜져 있지 않거나, 모델에 nextn 텐서가 없습니다. 확인: llama-gguf model.gguf r | grep nextn.
- OOM 긴 컨텍스트 = KV f16→q8 로 낮추고, 컨텍스트 축소, 부분 오프로드.
- 27B
bf16 덤프가 inf 를 가집니다 blk.18.ffn_up. IQ4 커널은 이를 처리합니다; Q4_K_M 검증이 중단됩니다. Q4 가 실패하면 27B 에는 IQ4_XS 를 사용하세요.
- Spec 초안 수용률:
/metrics 엔드포인트 — spec_decode_*_total 을 확인하세요. 코드: 약 50-65%. 채팅: 70% 이상.
크레딧
- am17an / Aman Gupta 에 대한 두 개의 업스트림 PR
- Qwen 팀에 NextN 훈련된 헤드를 제공한 것
- ggml-org 에 런타임