TLDR: Qwen3.6-27B 모델에서 MacBook Pro M5 Max 에서 28 tok/s → 63 tok/s 로 개선됨. 실제 온도 0.6 에서 2.24 배 더 빠른 TPS.
-
코딩, 창작 글쓰기, 채팅에 모두 적용 가능
-
어떤 MTP 모델에도 적용: 외부 drafter 필요 없음. 추가 메모리 사용량 없음. 모델 자체의 내장 MTP heads 활용. 해당 heads 를 탑재한 모든 모델에서 작동함.
-
greedy 가 아님: 유사한 speculative decoding 프로젝트들과 달리, 수학적으로 정확한 temperature sampling 과 rejection sampling 을 사용. 모든 작업에 대해 조정 가능한 온도 설정. Apple Silicon 의 다른 모든 speculative decode 프로젝트는 greedy-only 만 지원함.
-
커스텀 kernel: 패치된 MLX fork 기반, 커스텀 Metal kernels, compiled verify graphs, innovation-tape GDN rollback, draft-only requantised LM head 사용.
-
전부 CLI: mtplx start wizard, 모델 다운로드, 4 단계 MTP 호환성 검출을 포함한 모델 검사, 설정 가능한 깊이 2-7+, OpenAI/Anthropic API 서버, 브라우저 채팅, 터미널 채팅, 벤치마크 스위트, 건강 진단, idleness-aware auto-restore 를 포함한 crash-safe fan control, 그리고 562-test 스위트.
-
전부 serving stack: OpenAI + Anthropic 호환 API, 브라우저 채팅 UI, 터미널 채팅. 에디터가 localhost 를 가리키면 바로 시작.
MTPLX 는 무엇인가?
MTPLX 는 LLM 의 decode 속도를 최대 2.25 배까지 증가시키면서 모델의 기본 inference 설정을 유지하고, 코딩이나 창작 글쓰기 작업을 할 수 있도록 모델을 내장 MTP heads 를 speculative drafters 로 사용합니다.
QWEN 3.6 27B @ 63 TPS on a MacBook Pro M5 Max
MacBook Pro M5 Max 에서 온도 0.6, top_p 0.95, top_k 20 설정으로 Qwen 3.6 27B 4-bit MLX 의 decode 속도를 MTPLX 를 사용하여 28 tok/s → 63 tok/s 로 개선함.
Qwen 3.6 27B 는 최대 깊이 5 까지 지원하는 내장 MTP heads 를 탑재함. 이 모델과 하드웨어에 대한 최적의 깊이를 찾기 위해 D2, D3, D4, D5 를 스윙으로 실행함:
D3 는 최적의 위치로, 높은 acceptance 와 verify time ratio 를 유지하면서 TPS 가 가장 많이 증가함. D4 와 D5 는 초기 위치에서 좋은 acceptance 를 가지지만, 더 깊은 위치에서는 accept된 토큰을 절약하는 것보다 verify time 에 더 많은 비용이 발생함.
이 결과는 실제 온도 0.6 에서 exact probability-ratio rejection sampling 과 residual correction 을 사용함.
이는 Qwen 3.6 27B 를 실제 코딩 작업에 사용할 수 있으며, 출력 품질을 희생하지 않고 2.25 배 속도 증가를 얻을 수 있음을 의미함.
How Is This Different From DFlash / DDTree?
DFlash MLX 가 절대적인 속도는 더 빠르지만, 탐사 (sampling) 는 오직 탐욕적 (greedy, temp 0) 만으로 제한되어 있어 실제 사용 사례를 심각하게 제한합니다. 또한 외부 drafter 모델을 필요로 하며, 이는 추가 메모리를 필요로 하고, 각 모델이 출시될 때마다 생성되어야 합니다.
DDTree 는 DFlash 위에 트리 기반 검증 (tree-based verification) 을 추가하므로 동일한 한계점을 상속받습니다: 오직 탐욕적 (greedy only), 외부 drafter 필요.
이 이유는 각 시스템이 어떻게 탐사 (drafts) 하는지에 달려있습니다. MTP heads 는 순차적으로 탐사합니다. 각 토큰은 이전 탐사 토큰을 보며, 모든 위치는 실제 확률 분포를 생성합니다. DFlash 는 병렬 확산 패스 (parallel diffusion pass) 에서 16 개의 토큰을 동시에 탐사합니다. 토큰 8 은 토큰 7 을 모릅니다. 그 순차적 의존성 (sequential dependency) 이 없으면, 토큰별 확률 분포가 없으며, 이는 온도를 작동하게 하는 거부 샘플링 수학 (rejection sampling maths) 을 할 수 없습니다.
MTPLX 는 MTP heads 를 유지하는 모든 모델과 함께 작동하며, 사용자에게 MTP heads 의 수를 선택하고 로컬 저장된 또는 HuggingFace 모델을 실행할 수 있는 완전한 커스터마이징을 제공합니다.
Architecture
Layer 0: MLX Runtime
MTPLX 는 패치된 MLX 포크 (fork) 상에서 실행됩니다. 스톡 MLX 의 양자화 행렬-벡터 커널은 큰 M (prefill) 을 위해 튜닝되었습니다. MTP verify 중에는 M 은 3 에서 6 으로, 각 탐사 토큰당 한 위치입니다. 스톡은 이러한 형태에서 멈춥니다. 패치: 더 넓은 simdgroups, 루프 언롤링, Metal 의 10 줄. 정확도, 스톡과 0.0 차이.
포크 위에 네 개의 커스텀 Metal 커널이 MLX primitives 로 등록됩니다:
- Innovation-tape GDN capture: draft 단계에서 (token, gate, state-delta) 튜플을 KB 규모로 기록합니다. 거부 시에는 전체 반복적 상태를 복원하는 대신 tape 에서 재실행합니다. 수백 MB 의 상태 스냅샷을 작은 델타로 대체합니다. 참조와 비트 정확도 일치.
- GraphBank: (suffix_length, depth, profile) 로 키워진 mx.compile-compiled verify graphs 의 캐시입니다. 각 verify shape 은 모든 사이클에 걸쳐 재사용되는 하나의 컴파일된 그래프를 받습니다. Capture-commit 오버헤드: 사이클당 0.073 ms versus 사이클당 47 ms verify.
- Draft-only requantised LM head: 목표의 lm_head 는 모델 정밀도를 유지합니다. 별도의 4-bit LM head 는 메모리에 구축되어 draft 전용으로 사용됩니다. 타겟 정확도 변경 없이 draft 시간을 29% 절감합니다.
- Small-M verify qmv: dflash-mlx 의 M=16 접근법의 직접 후계자입니다, MTPLX 의 M=3 to 6 verify shapes 에 맞춰 재튜닝되었습니다.
Layer 1: Single-model runtime
한 체크포인트. 목표 모델과 drafter 는 동일한 모델입니다. Qwen3.6-27B 은 네이티브 MTP heads 를 탑재하고 MTPLX 는 이를 사용합니다. 두 번째 모델용 RAM 없음. 트렁크의 KV cache 는 vLLM CUDA 참조와 cos > 0.9998 을 통해 깊이 5 까지 cosine > 0.9998 로 검증된 committed-history contract 을 사용합니다.
Layer 2: Speculative cycle (the hot loop)
사이클당: MTP head 는 K 토큰을 draft 합니다, 각 토큰은 이전 draft 를 봅니다. 목표는 GraphBank 경로로 컴파일된 바치드 포워드를 통해 모든 K 를 한 번에 verify 합니다. Probability-ratio acceptance (Leviathan-Chen) 은 fp32 에서 위치마다 결정합니다. Residual correction (p - q)+ 는 거부 시 깨끗한 대체를 방출합니다. 모든 K 가 accept 할 때 보너스 토큰이 자유롭게 떨어집니다. Innovation tape 는 accept 된 GDN state deltas 를 commit 하고 reject 된 ones 을 rollback 합니다.
Layer 3: Serving stack
실제 API 서버입니다. OpenAI-compatible /v1/chat/completions 와 /v1/completions 과 streaming SSE 를 지원합니다. Anthropic-compatible /v1/messages, /v1/models, /health, /metrics 을 제공합니다. Engine sessions 와 per-chat KV state 를 포함합니다. Session Bank 는 turns 에 걸쳐 warm-prefix exact state 를 보존하며, logits max_abs_diff = 0.0 으로 fresh forwards 와 검증합니다. 브라우저 chat UI 는 localhost 에서 live tok/s, markdown 렌더링, code-block 복사, stop button 을 제공합니다. Terminal chat 은 mtplx chat 을 통해 수행됩니다.
What I Had To Solve
네이티브 MTP 는 Apple Silicon 에서 기본으로 작동하지 않았습니다. 네 가지 쌓인 문제가 있었습니다.
- Recursive depth collapse
MTP 를 재귀적으로 실행하면, 정확도는 깊이 1 이후에 붕괴합니다: 91% → 63% → 44% → 27% → 17%.
원문(rawText)을 읽고 한국어로 번역합니다.
규칙:
- 원문에 없는 내용 추가 금지
- 외국어 원문은 충실하게 한국어로 번역 (정보량 100% 보존, 요약/압축/확장 금지)
- 전문용어는 영문 병기 (예: "강화학습 (RL)")
- 숫자·고유명사는 원문과 일치
- 원문 구조(서론/본론/결론) 그대로 유지
- 원문이 이미 한국어면 그대로 사용 (다듬기 금지)
제목(title) 규칙 — 매우 중요:
- 원제(원제 필드)가 버전 태그(v1.2.3, b9038), 리포명(org/repo), 한 단어면:
→ 그대로 유지. 설명을 붙이지 마세요. 예: "b9038" → "b9038"
- 원제가 완전한 문장/구문이면: 한국어로 번역
- 절대로 본문 내용을 제목에 요약해서 넣지 마세요
맞춤법 주의:
- "됬" (×) → "됐" (○)
- "~것 입니다" (×) → "~것입니다" (○) — 띄어쓰기 붙여쓰기
JSON 형식으로만 응답:
{"title": "한국어 제목", "content": "한국어 번역 본문"}
16 시간의 커널 디버깅, 팬 컨트롤러로 해결.
주의사항
- 63 TPS(Throughput Per Second) 수치는 160 토큰의 고수용성 프롬프트에서 달성되었습니다. M5 Max 의 실제 워크플로우에서는 가장 유망하게 50-55 TPS 를 볼 가능성이 높습니다.
- 현재 저는 커널 최적화를 통해 열 문제를 해결하고 있습니다. MAX 모드 (100% 팬 모드) 를 실행하지 않으면 긴 프롬프트에서 열 제한으로 인해 상당한 TPS 감소가 발생할 것입니다.
- 예상대로, 대부분의 MLX 양자화는 MTP 헤드가 제거되어 있으며, 이는 과거에 MLX 에서 무의미했기 때문입니다. 많은 MLX 모델은 현재 MTPLX 와 호환되지 않습니다. 저는 MTPLX 작업이 MTP 헤드가 포함된 MLX 양자화를 생성하고 추론을 위해 최적화하는 데 더 많은 사람들이 참여하도록 유도할 것이라 기대합니다.
그동안 공식 Qwen 3.6 27B MTPLX Optimised 를 실행할 수 있습니다.
HuggingFace
CLI 는 설정과 다운로드를 쉽게 만듭니다.
MLX 양자화를 게시하는 경우, MTP 헤드를 유지해 주세요. 27B 모델에서 약 200MB 로, 메모리 비용은 거의 없으며, 현재 2.25 배 속도 향상을 제공합니다.
이 프로젝트에 대한 모든 사람의 의견과 기여를 진심으로 기대합니다. MLX 로 로컬 LLM 을 더 빠르고 실행 가능하게 만듭니다.