AI Sözlüğü
Local AI
Production lideri

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

Sunucuyu başlatbash
# 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
Önemli parametrelerbash
--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
Speculative decoding (hız ×2-3)bash
# 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 2

Donanı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.

NVIDIACUDA 11.8+ — Compute capability ≥ 7.0 (Volta+)
AMDROCm 6.0+ (MI300X, MI250)
Apple Silicon (M1/M2/M3/M4)
CPU only
Multi-GPUTensor parallelism (TP) + pipeline parallelism (PP)
Multi-nodeRay 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 / BF16Varsayılan, en kaliteli, en çok VRAM
FP8H100+ donanım desteği gerek, ~%50 VRAM tasarruf
AWQ (Activation-aware Weight Quant)INT4, doğruluk korur, ~4× küçültme
GPTQINT4, 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

OpenAI uyumlu (Python)Python
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)
Batch offline inference (Python)Python
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 cachingSistem 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.

Kaynaklar