2026년 5월, 로컬 LLM 런타임 생태계가 한꺼번에 움직였습니다. vLLM 0.21이 DeepSeek V4의 Blackwell 서빙을 안정화했고, MTP 투기적 디코딩이 추론 모델에서도 제대로 동작하기 시작했습니다. 무엇이 바뀌었고 실제로 어떻게 써야 하는지 정리합니다.
핵심 요약
→ 출시: vLLM v0.21.0, 2026년 5월 15일 (v0.20.0의 안정화 릴리스)
→ 핵심 1: TOKENSPEED_MLA — Blackwell GPU에서 DeepSeek-R1/Kimi-K2.5 프리필+디코드 전용 어텐션 백엔드
→ 핵심 2: MTP(Multi-Token Prediction) 스펙 디코딩 — Thinking budget 존중, 추론 모델 정확성 버그 수정
→ 핵심 3: KV Offload + HMA(Hybrid Memory Allocator) 통합 — 슬라이딩 윈도우 모델 KV 캐시 낭비 해소
→ MTP 지원 모델: DeepSeek V3/R1, Gemma 4, MiMo-V2.5, Qwen 계열
→ 브레이킹 체인지: C++20 컴파일러 필수, Transformers v4 deprecated → v5 마이그레이션
→ Blackwell 전용 추가: FP8 group-quant 패킹 커널, CUTLASS scaled mm, Thor/SM110 FP8
→ 새 아키텍처 추가: MiMo-V2.5, Laguna XS.2, Moondream3, Cohere MoE/Eagle
→ Docker 이미지 ~2.5 GB 경량화 (FlashInfer cubin 지연 다운로드)
→ 이전 버전에서 Thinking 모드 MTP 사용 시 correctness 버그 있었음 — 0.21 필수 업그레이드
실전 1 — MTP가 뭔가: 개념부터
vLLM 0.21의 핵심인 MTP를 먼저 이해해야 설정이 보입니다.
기존 자동회귀 디코딩의 한계
일반 LLM 토큰 생성:
입력 → 모델 전체 포워드패스 → 토큰 1개 → 다시 포워드패스 → 토큰 1개 → ...
문제: 토큰 하나마다 전체 모델을 돌려야 함
= 모델이 클수록 토큰당 레이턴시 증가
투기적 디코딩(Speculative Decoding)의 아이디어
작은 드래프트 모델이 토큰 N개를 미리 예측 →
큰 타겟 모델이 한 번의 포워드패스로 전부 검증 →
맞으면 N개 한꺼번에 수락, 틀리면 해당 위치부터 재생성
결과: 품질은 타겟 모델 그대로, 속도는 드래프트 수락률만큼 향상
MTP(Multi-Token Prediction)의 차이
기존 스펙 디코딩:
메인 모델 + 별도 드래프트 모델(작은 모델) 필요 → 메모리, 설정 복잡
MTP 방식:
메인 모델 학습 시 MTP 헤드를 함께 훈련
→ 별도 드래프트 모델 없음
→ 메인 모델 내부에 "다음 N개 토큰 예측" 헤드가 내장됨
→ 설정 간단, 메모리 효율 높음
DeepSeek V3 보고: MTP-1 수락률 80%+ → 추론 처리량 1.8배 향상. 별도 드래프트 모델 없이.
MTP 지원 모델 현황 (2026년 6월 기준)
모델 MTP 헤드 수 비고
| DeepSeek V3/V4 | 1 | 수락률 ~80% |
| DeepSeek R1 | 1 | Thinking budget 주의 |
| Gemma 4 (E2B/E4B/26B/31B) | 1 | assistant 체크포인트 필요 |
| MiMo-V2.5 | 1 | 0.21에서 추가 |
| Qwen3.6/3.5 | 1 | Mamba 하이브리드 지원 |
| Kimi K2.5 | 1 | TOKENSPEED_MLA와 병용 가능 |
실전 2 — MTP 실전 설정
DeepSeek V4 + MTP
vllm serve deepseek-ai/DeepSeek-V4 \
--tensor-parallel-size 8 \
--max-model-len 65536 \
--speculative-config '{
"method": "mtp",
"num_speculative_tokens": 1
}' \
--trust-remote-code
Gemma 4 + MTP (assistant 체크포인트 필수)
# ✅ 올바른 방법 — method: mtp 명시 필수
vllm serve google/gemma-4-26B-A4B-it \
--tensor-parallel-size 2 \
--max-model-len 32768 \
--speculative-config '{
"method": "mtp",
"model": "gg-hf-am/gemma-4-26B-A4B-it-assistant",
"num_speculative_tokens": 1
}'
# ❌ 잘못된 방법 — 구버전 vLLM에서 발생하던 패턴
# method 없이 assistant 체크포인트를 draft_model로 취급 → 초기화 실패
중요: Gemma 4 assistant 체크포인트는 generic draft model이 아닙니다. 이전 vLLM에서 SpeculativeConfig(method='draft_model', ...)로 로깅되면 잘못된 경로입니다. 0.21로 업그레이드하고 method: mtp 명시.
Python API로 MTP 사용
from vllm import LLM, SamplingParams
llm = LLM(
model="deepseek-ai/DeepSeek-V4",
tensor_parallel_size=8,
speculative_config={
"method": "mtp",
"num_speculative_tokens": 1,
# 0.21부터 rejection sampling 옵션 명시 가능
"rejection_sample_method": "rejection_sampling",
"draft_sample_method": "greedy"
}
)
sampling_params = SamplingParams(
temperature=0.6,
max_tokens=2048
)
outputs = llm.generate(["Rust로 비동기 HTTP 서버를 구현해줘"], sampling_params)
print(outputs[0].outputs[0].text)
실전 3 — Thinking Budget + MTP: 0.21 이전의 버그
이게 0.21 업그레이드의 가장 중요한 이유입니다.
문제 (0.20 이전)
추론 모델(DeepSeek R1, Kimi K2.6-thinking 등)에
MTP 스펙 디코딩을 활성화하면:
→ 모델의 Thinking budget(최대 추론 토큰 수)을 무시
→ 투기적으로 생성된 토큰이 budget 계산에서 누락
→ 실제 thinking 토큰이 budget을 초과해도 멈추지 않음
→ 또는 budget 내에서 잘려야 할 추론이 잘리지 않음
= correctness 버그
0.21에서 수정
# 이제 Thinking budget이 있는 추론 모델에서도 MTP 안전하게 사용 가능
llm = LLM(
model="deepseek-ai/DeepSeek-R1",
tensor_parallel_size=8,
speculative_config={
"method": "mtp",
"num_speculative_tokens": 1
}
)
sampling_params = SamplingParams(
temperature=1.0, # R1 Thinking 모드
max_tokens=16384,
thinking={"budget_tokens": 8192} # ← 이제 MTP와 함께 올바르게 동작
)
추론 모델에 MTP를 쓰고 있었다면 0.21 이전 버전에서는 결과가 미묘하게 잘못됐을 수 있습니다.
실전 4 — TOKENSPEED_MLA: Blackwell에서 MLA 모델 최적화
MLA(Multi-head Latent Attention) 복습
Kimi K2.6, DeepSeek R1/V3/V4가 모두 쓰는 어텐션 방식. KV 캐시를 저차원 잠재 벡터로 압축해 메모리를 아낍니다. 문제는 일반 FlashAttention 백엔드가 이 압축 구조에 최적화되어 있지 않다는 점.
TOKENSPEED_MLA 백엔드 동작 방식
기존 FlashAttention 백엔드:
MLA 압축 벡터 → 압축 해제 → 일반 attention 연산
= Blackwell의 FP8 텐서 코어 활용 비효율
TOKENSPEED_MLA:
MLA 잠재 벡터를 압축 해제 없이 직접 처리하는 커스텀 커널
= Blackwell SM100/SM103 텐서 코어 구조에 맞게 최적화
= 프리필 + 디코드 양쪽 모두 적용
설정 방법
# Blackwell GPU (B200, B300) + DeepSeek R1/Kimi K2.5
vllm serve deepseek-ai/DeepSeek-R1 \
--tensor-parallel-size 8 \
--attention-backend TOKENSPEED_MLA \ # ← 핵심
--max-model-len 65536 \
--speculative-config '{
"method": "mtp",
"num_speculative_tokens": 1
}' \
--trust-remote-code
# 환경변수로도 설정 가능
export VLLM_ATTENTION_BACKEND=TOKENSPEED_MLA
적용 대상
✅ TOKENSPEED_MLA 지원:
- DeepSeek R1, V3, V4 (MLA 아키텍처)
- Kimi K2.5 (MLA 아키텍처)
- Blackwell (SM100/SM103) GPU 필수
⚠️ 적용 안 됨:
- Llama, Mistral (일반 MHA 아키텍처)
- Hopper(H100)/Ampere(A100) GPU
실전 5 — KV Offload + HMA: 긴 컨텍스트 메모리 최적화
문제: 슬라이딩 윈도우 모델의 KV 캐시 낭비
이전 vLLM에서 슬라이딩 윈도우 어텐션을 사용하는 모델은 KV 캐시를 비효율적으로 썼습니다.
mllama 모델: KV 캐시 용량의 최대 79.6% 낭비
Ministral: KV 캐시 용량의 최대 56.25% 낭비
이유: 슬라이딩 윈도우 밖의 KV는 필요 없는데도
메모리에 계속 잡고 있었음
HMA(Hybrid Memory Allocator) 통합 후
# vLLM 0.21 — KV offload + HMA 설정
vllm serve model-name \
--kv-transfer-config '{
"kv_connector": "SharedStorageConnector",
"kv_role": "kv_both"
}' \
--max-model-len 131072 \
--enable-chunked-prefill \
# HMA는 자동 활성화됨 (슬라이딩 윈도우 감지 시)
슬라이딩 윈도우 밖으로 나간 KV 블록을 스케줄러가 판단해 오프로드 → VRAM 확보 → 더 긴 컨텍스트 또는 더 많은 동시 요청 처리 가능.
실전 6 — 브레이킹 체인지 마이그레이션 체크리스트
0.21로 업그레이드 전 반드시 확인해야 합니다.
1. C++20 컴파일러 필수
# 확인
g++ --version # GCC 10+ 필요
# Ubuntu 22.04 이하라면 업그레이드
sudo apt install g++-11
export CXX=g++-11
# 또는 Clang 10+
sudo apt install clang-10
export CXX=clang++-10
2. Transformers v4 → v5 마이그레이션
# ❌ v4 (deprecated, 0.22에서 제거 예정)
pip install transformers==4.x.x
# ✅ v5로 업그레이드
pip install "transformers>=5.0.0"
# 호환성 문제 있으면 환경변수로 임시 우회
export VLLM_SKIP_MODEL_NAME_VALIDATION=1
3. Gemma 4 MTP 설정 변경
# ❌ 구버전 패턴 (0.20 이하)
--speculative-config '{"model": "...-assistant", "num_speculative_tokens": 1}'
# ✅ 0.21 이후 올바른 패턴
--speculative-config '{"method": "mtp", "model": "...-assistant", "num_speculative_tokens": 1}'
전체 업그레이드 커맨드
pip install "vllm>=0.21.0" "transformers>=5.0.0"
# Docker 쓴다면 (2.5 GB 가벼워짐)
docker pull vllm/vllm-openai:v0.21.0
실전 7 — 전체 생태계 업데이트 요약 (2026년 5월)
vLLM만 업데이트된 게 아닙니다.
런타임 주요 업데이트
| vLLM 0.21 | TOKENSPEED_MLA, MTP Thinking budget 수정, HMA |
| llama.cpp b9196 | Qwen 3.6 MTP 지원(PR #22673), Windows CUDA 13.1 prebuild |
| Ollama 0.24 | Codex App 지원, Gemma 4 MTP via MLX, 샘플러 리워크 |
| MLX 0.31 | macOS 26.2 + M5 Neural Accelerator → TTFT 4배 향상 |
| LM Studio 0.4.14 | MTP 스펙 디코딩 stable로 승격, 병렬 비전 예측 |
로컬 LLM 스택을 통째로 올리는 타이밍입니다.
마무리
항목 평가
| ✅ TOKENSPEED_MLA — Blackwell MLA 모델 최적화 | DeepSeek/Kimi 서빙 성능 실질적 향상 |
| ✅ MTP Thinking budget 버그 수정 | 추론 모델 + MTP 조합 이제 신뢰 가능 |
| ✅ KV Offload + HMA — 슬라이딩 윈도우 낭비 제거 | 긴 컨텍스트 모델 VRAM 효율 향상 |
| ✅ Gemma 4, MiMo-V2.5 MTP 추가 | 지원 모델 확대 |
| ✅ Docker 이미지 2.5 GB 경량화 | CI/CD 파이프라인 빌드 시간 단축 |
| ❌ C++20 필수 → 구버전 Ubuntu 빌드 환경 수정 필요 | 브레이킹 체인지 주의 |
| ❌ Transformers v4 deprecated | v5 호환성 테스트 필요 |
| ❌ TOKENSPEED_MLA Blackwell 전용 | H100/A100 환경은 해당 없음 |
추론 모델(R1, Kimi-thinking 등)에 MTP를 쓰고 있었다면 0.21 업그레이드는 선택이 아니라 필수입니다. correctness 버그가 있었습니다.