MTPLX | 2.24x faster TPS | The native MTP inference engine for Apple Silicon
요약
MTPLX는 LLM의 디코딩 속도를 최대 2.25배까지 향상시키는 새로운 추론 엔진입니다. 이 엔진은 모델 자체에 내장된 MTP(Multi-Token Prediction) 헤드를 활용하여 외부 드래프터나 추가 메모리 없이 작동하며, 기존의 그리디(greedy) 방식이 아닌 정확한 온도 샘플링과 거부 샘플링을 지원합니다. 이를 통해 Qwen 3.6 27B 모델에서 실제 코딩 작업에 필요한 높은 품질을 유지하면서도 뛰어난 속도 향상을 달성했습니다.
핵심 포인트
- MTPLX는 LLM의 디코딩 속도를 최대 2.25배까지 증가시키며, 추론 품질 저하 없이 작동합니다.
- 모델 자체의 MTP 헤드를 활용하여 외부 드래프터나 추가 메모리 사용이 필요 없습니다.
- 그리디 방식에 국한되지 않고, 정확한 온도 샘플링 및 거부 샘플링을 지원하여 높은 출력 품질을 유지합니다.
- 패치된 MLX 포크와 커스텀 Metal 커널을 사용하여 최적화되었으며, 다양한 사용자 경험(CLI, UI)을 제공하는 완전한 서비스 스택을 갖추고 있습니다.
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 를 실행할 수 있습니다.
CLI 는 설정과 다운로드를 쉽게 만듭니다.
MLX 양자화를 게시하는 경우, MTP 헤드를 유지해 주세요. 27B 모델에서 약 200MB 로, 메모리 비용은 거의 없으며, 현재 2.25 배 속도 향상을 제공합니다.
이 프로젝트에 대한 모든 사람의 의견과 기여를 진심으로 기대합니다. MLX 로 로컬 LLM 을 더 빠르고 실행 가능하게 만듭니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 Reddit AI Engineering의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기