vLLM
Yüksek throughput production sunucusu
Genel bakış
vLLM, UC Berkeley'den çıkan production-grade LLM inference sunucusu. İki yenilikle ünlüdür: PagedAttention (sayfa hafızası — KV cache'i sayfalı yönetir, yer kaybını dramatik azaltır) ve continuous batching (sürekli batching — gelen istekleri tek mega-batch'te birleştirir, throughput'u 5-10× artırır).
Hugging Face Transformers modellerini direkt yükler, OpenAI uyumlu API açar. Apple Silicon desteklemez — sadece NVIDIA (CUDA) ve AMD (ROCm) GPU'larında çalışır. Multi-GPU + tensor parallelism out-of-the-box.
Kurulum
# Python 3.9-3.12, CUDA 12.1+
python -m venv .venv && source .venv/bin/activate
# pip ile (en hızlı)
pip install vllm
# uv ile (daha hızlı, önerilen)
uv pip install vllm
# Doğrula
vllm --version
nvidia-smi # GPU görünür olmalımacOS desteği yok. Mac'te denemek için Linux VM (UTM, OrbStack) ya da uzak GPU (RunPod, Lambda) kullan.
Yapılandırma
# Tek GPU
vllm serve meta-llama/Llama-3.1-8B-Instruct \
--port 8000 \
--max-model-len 8192 \
--gpu-memory-utilization 0.90 \
--dtype auto
# Multi-GPU (tensor parallel — 2× A100 ile 70B)
vllm serve meta-llama/Llama-3.1-70B-Instruct \
--tensor-parallel-size 2 \
--max-model-len 32768 \
--gpu-memory-utilization 0.90
# Quantized (AWQ ile 70B tek GPU'ya sığar)
vllm serve casperhansen/llama-3-70b-instruct-awq \
--quantization awq \
--max-model-len 8192--max-model-len 8192 # context window (KV cache rezervasyonu)
--max-num-seqs 256 # eşzamanlı sekans sayısı (batch genişliği)
--max-num-batched-tokens 8192 # bir batch'teki max token
--gpu-memory-utilization 0.90 # VRAM kullanım oranı (0.9 = %90)
--swap-space 4 # CPU swap (GB) — KV cache için
--enforce-eager # CUDA graph kapatır (debug için)
--enable-prefix-caching # tekrarlanan prefix'leri cache'le
--enable-chunked-prefill # uzun prompt'ları parçala (latency düşer)
--quantization awq|gptq|fp8 # quantize edilmiş modeli yükle
--dtype bfloat16|float16|auto # ağırlık tipi# Küçük "taslak" model + büyük doğrulayıcı
vllm serve meta-llama/Llama-3.1-70B-Instruct \
--speculative-model meta-llama/Llama-3.2-1B-Instruct \
--num-speculative-tokens 5 \
--tensor-parallel-size 2Donanım hızlandırma
vLLM tamamen GPU odaklıdır. CPU yedeği pratik değildir. NVIDIA hattında CUDA 11.8+ önerilir; H100/A100 ile en iyi performans, ama RTX 4090/3090 da çalışır. AMD tarafında ROCm 6.0+ ile MI300X gibi datacenter GPU'lar — RDNA tüketici GPU'larda kararsız.
| NVIDIA | CUDA 11.8+ — Compute capability ≥ 7.0 (Volta+) |
| AMD | ROCm 6.0+ (MI300X, MI250) |
| Apple Silicon (M1/M2/M3/M4) | — |
| CPU only | — |
| Multi-GPU | Tensor parallelism (TP) + pipeline parallelism (PP) |
| Multi-node | Ray ile (production cluster) |
Model formatları & quantization
Format: Hugging Face Transformers (safetensors). Modeli HF Hub'dan slug ile çeker (--model org/model). Lokal path da kabul eder. Quantization formatları farklı — GGUF kullanmaz.
| FP16 / BF16 | Varsayılan, en kaliteli, en çok VRAM |
| FP8 | H100+ donanım desteği gerek, ~%50 VRAM tasarruf |
| AWQ (Activation-aware Weight Quant) | INT4, doğruluk korur, ~4× küçültme |
| GPTQ | INT4, AWQ'dan biraz daha hızlı, kalite benzer |
| BitsAndBytes (NF4) | INT4, en yaygın, deneysel destek |
| GGUF | — |
Pratik: production'da AWQ ya da FP8 önerilir. Llama-3.1-70B-AWQ tek A100 80GB'a sığar; FP16 versiyonu için 2× A100 gerekir.
API
from openai import OpenAI
client = OpenAI(
base_url="http://localhost:8000/v1",
api_key="EMPTY", # vLLM auth varsayılan kapalı
)
resp = client.chat.completions.create(
model="meta-llama/Llama-3.1-8B-Instruct",
messages=[{"role": "user", "content": "Selam!"}],
max_tokens=256,
temperature=0.3,
)
print(resp.choices[0].message.content)from vllm import LLM, SamplingParams
llm = LLM(
model="meta-llama/Llama-3.1-8B-Instruct",
tensor_parallel_size=1,
max_model_len=4096,
)
prompts = ["Sorgu 1", "Sorgu 2", "Sorgu 3"]
params = SamplingParams(temperature=0.3, max_tokens=200)
# Tek seferde 1000 prompt'u batch'le → 5-10× hızlı
outputs = llm.generate(prompts, params)
for o in outputs:
print(o.outputs[0].text)Performans
| Tek-istek throughput (1× A100, Llama-3.1-8B FP16) | ~95 tok/s |
| Eşzamanlı throughput (32 stream, aynı setup) | ~2400 tok/s (toplam) |
| Ollama'ya göre throughput artışı (32 stream) | 5-10× |
| VRAM verimliliği (PagedAttention) | Klasik attention'a göre %25 daha az fragmant |
| Soğuk başlangıç | 30-90 sn (model yükleme + CUDA graph) |
| Prefix caching | Sistem prompt cache → %70 token tasarrufu |
Sık yapılan hatalar
- max-model-len = VRAM bloatmax-model-len yüksek tutarsan KV cache için baştan büyük blok ayrılır. 128K yazıp 'neden VRAM dolu?' deme. Gerçek ihtiyacını ayarla, prefix caching aç.
- GGUF kullanılmazvLLM HF safetensors yükler. Ollama/llama.cpp'den alıştığın GGUF burada çalışmaz. AWQ/GPTQ versiyonlarını HF'de aramak gerek.
- Apple Silicon yokMac'te denemek için Linux VM ya da uzak GPU (RunPod, Lambda, Modal). Üretim için zaten Linux + NVIDIA önerilir.
- Auth varsayılan kapalıvLLM serve port 8000'i her şeye açar. --api-key ile token koy ya da reverse proxy + auth katmanı ekle. İnternete açma!
- OOM zinciri (--enforce-eager)CUDA graph compile sırasında OOM yiyorsan --enforce-eager ile kapatabilirsin (yavaşlar ama belleği rahatlar). Üretimde değil, debug için.