vLLM, SGLang ve llama.cpp: Local LLM Serving için Teknik Karşılaştırma

LLM’leri local çalıştırırken üç isim sürekli karşımıza çıkıyor:

  • vLLM
  • SGLang
  • llama.cpp

Üçü de aynı işi yapıyor gibi görünüyor: modeli yükle, API aç, prompt gönder, cevap al.

Ama teknik olarak çok farklı felsefeleri var. Özellikle büyük modeller, MoE modeller, uzun context, tool calling, GPU/CPU offload ve local workstation kullanımı söz konusu olduğunda aralarındaki fark ciddi hale geliyor.

Bu yazıda özellikle şu soruya odaklanıyorum:

Tek GPU’lu veya ev/ofis tipi güçlü bir makinede, hangisi ne zaman daha mantıklı?


Kısa Özet

Benim pratik gözlemim şöyle:

vLLM      = daha olgun, daha stabil, daha geniş model/quant desteği
SGLang    = daha agresif, agent/structured generation ve prefix-cache işlerinde güçlü
llama.cpp = GGUF, CPU offload ve “olmayan VRAM’i RAM ile telafi etme” tarafında özel

Eğer model VRAM’e rahat sığıyorsa, vLLM veya SGLang daha hızlı ve server olarak daha profesyonel.

Ama model VRAM’e sığmıyorsa, özellikle de MoE bir modelse, llama.cpp hâlâ çok özel bir yerde duruyor.


1. vLLM Nedir?

vLLM temel olarak bir LLM inference serving engine.

Ana hedefi:

yüksek throughput
düşük latency
OpenAI-compatible API
iyi batching
iyi KV cache yönetimi
çok kullanıcı / çok istek senaryosu

vLLM’in meşhur tarafı PagedAttention. Bu sistem KV cache’i GPU belleğinde daha esnek yönetiyor. Basitçe, KV cache’i büyük tek parça bir alan gibi değil, sayfalara/bloklara bölünmüş bir memory sistemi gibi düşünüyor.

Bu sayede:

daha az memory fragmentation
daha çok eş zamanlı request
uzun context’lerde daha iyi memory kullanımı
continuous batching

mümkün oluyor.

vLLM ayrıca OpenAI-compatible API tarafında çok olgun. Yani birçok client, agent framework, UI veya backend için drop-in replacement gibi çalışabiliyor.


2. SGLang Nedir?

SGLang de bir inference server ama biraz farklı bir felsefeye sahip.

Sadece “model serve edeyim” değil, aynı zamanda:

structured generation
agentic workflows
prefix reuse
branching generation
tool use
multi-step LLM programs

gibi işlerde daha iddialı.

SGLang’in en önemli teknik fikri RadixAttention.

Bunu şöyle düşünebiliriz:

vLLM KV cache’i iyi yönetir.
SGLang ise özellikle tekrar eden prompt prefix’lerini daha akıllı kullanmaya çalışır.

Mesela her request şu yapıya sahipse:

uzun system prompt
aynı tool schema
aynı browser state
aynı agent kuralları
farklı küçük user instruction

SGLang bu ortak prefix’leri tekrar tekrar hesaplamak yerine cache’ten daha agresif faydalanabilir.

Bu yüzden browser agent, coding agent, tool-heavy agent gibi işlerde SGLang ilginç hale geliyor.


3. llama.cpp Nedir?

llama.cpp bambaşka bir dünya.

vLLM ve SGLang daha çok:

Python
PyTorch
CUDA
Triton
server/inference framework

tarafında dururken, llama.cpp daha düşük seviyeli ve portable bir runtime.

Ana avantajları:

GGUF formatı
CPU + GPU hybrid çalışma
çok geniş platform desteği
Windows’ta daha rahat kullanım
quantized model çalıştırmada esneklik
VRAM yetmeyince RAM’e yaslanabilme

Özellikle consumer hardware kullananlar için llama.cpp çok değerli.

Çünkü her zaman ideal datacenter setup yok. Bazen elde şunlar var:

1 adet RTX 3090 / 4090 / 5090
128GB veya 256GB sistem RAM’i
Windows veya WSL
garip quantized GGUF model
çok büyük MoE model

Bu durumda llama.cpp çok pratik olabiliyor.


4. En Kritik Fark: CPU Expert Offload

Bence local kullanıcı için en önemli teknik farklardan biri bu.

Özellikle MoE modellerde.

MoE, yani Mixture of Experts, modelin tamamının her token’da aktif olmadığı mimari. Modelde birçok expert var ama her token için bunların sadece bazıları kullanılıyor.

Örnek:

Toplam model: 100B parametre
Aktif parametre: 10B-20B civarı
Her token’da sadece bazı expert’ler kullanılıyor

Teoride bu çok güzel. Ama pratikte modelin bütün expert ağırlıkları bellekte durmak zorunda olduğu için VRAM ihtiyacı devasa olabiliyor.

İşte burada llama.cpp’in avantajı çıkıyor.


5. llama.cpp’in MoE CPU Offload Avantajı

llama.cpp’te bazı MoE modeller için şuna benzer kullanım mümkün:

-ngl 999 --n-cpu-moe 20

Kabaca anlamı:

mümkün olduğunca çok layer’ı GPU’ya koy
ama bazı MoE expert kısımlarını CPU RAM’de tut

Bu çok önemli.

Çünkü consumer GPU’larda VRAM sınırlı:

RTX 3090 = 24GB
RTX 4090 = 24GB
RTX 5090 = 32GB civarı

Ama sistem RAM’i çok daha yüksek olabilir:

128GB
192GB
256GB
512GB

llama.cpp bu RAM’i gerçekten işe yarar şekilde kullanabiliyor.

Sonuç:

Model tam VRAM’e sığmasa bile çalışabilir.
Hız düşer.
Ama çalışır.

Bence ev tipi LLM rig’lerinde bu çok büyük fark.

Çünkü “yavaş ama çalışıyor” ile “hiç yüklenmiyor” arasında uçurum var.


6. vLLM’de CPU Offload Var mı?

Evet, var.

vLLM’de şöyle bir parametre var:

--cpu-offload-gb 16

Bu GPU belleğini sanal olarak büyütmek gibi düşünülebilir. Mesela 24GB VRAM’li bir kartta 16GB CPU offload kullanırsanız, model bazı ağırlıkları CPU RAM’de tutup forward sırasında GPU’ya taşıyabilir.

Ama bu, llama.cpp’teki MoE expert offload kadar zarif değil.

vLLM’in CPU offload’u daha genel bir weight offload sistemi gibi:

modelin bazı parçaları CPU’da
ihtiyaç oldukça GPU’ya taşınıyor

Ama llama.cpp tarafındaki gibi:

özellikle MoE expert’lerini CPU’da tut
aktif/shared kısımları GPU’da tut
routing’e göre çalıştır

mantığı kadar pratik ve granular değil.

Kısaca:

vLLM CPU offload yapabilir.
Ama llama.cpp gibi MoE expert offload konusunda özel ve pratik değildir.

7. SGLang’de CPU Expert Offload Var mı?

SGLang’de de CPU offload parametreleri var.

Örneğin şuna benzer ayarlar bulunuyor:

--cpu-offload-gb
--offload-group-size
--offload-num-in-group
--offload-prefetch-step
--offload-mode cpu

Ama yine aynı durum var.

Bu ayarlar daha çok layer/group seviyesinde offload için.

Yani pratikte SGLang de şu noktada llama.cpp gibi değil:

MoE expert’lerinin belirli kısmını CPU’da tutayım,
shared/dense kısımlar GPU’da kalsın,
model büyük de olsa tek GPU + bol RAM ile çalışsın.

Bu konuda llama.cpp hâlâ özel.

Benim pratik sıralamam şöyle:

Çok büyük MoE + tek GPU + bol RAM:
  llama.cpp

Model VRAM’e sığıyor + hızlı OpenAI API lazım:
  vLLM veya SGLang

Agent/prefix reuse/structured output önemli:
  SGLang

Garip quantized HF model / maksimum uyumluluk:
  vLLM

GGUF ve CPU-RAM destekli deney:
  llama.cpp

8. KV Cache Karşılaştırması

LLM inference’ta sadece model ağırlıkları değil, KV cache de çok önemli.

Özellikle uzun context’te.

Bir model 32K, 64K, 128K context ile çalışıyorsa, KV cache ciddi VRAM yer.

vLLM: PagedAttention

vLLM’in PagedAttention sistemi KV cache’i bloklar halinde yönetir.

Avantaj:

daha iyi bellek kullanımı
çok request senaryosunda daha az fragmentation
continuous batching için uygunluk

Bu yüzden vLLM production serving için çok güçlü.

SGLang: RadixAttention

SGLang’in RadixAttention yaklaşımı ise ortak prompt prefix’lerini yeniden kullanmaya daha odaklı.

Örneğin:

aynı system prompt
aynı tool listesi
aynı web page state’i
aynı browser instruction
farklı küçük user mesajları

Bu tip workload’larda SGLang ciddi avantaj sağlayabilir.

llama.cpp

llama.cpp de KV cache kullanıyor ama vLLM/SGLang kadar server-scale batching ve multi-request optimizasyonu için tasarlanmış değil.

llama.cpp daha çok:

tek kullanıcı
local inference
GGUF
CPU/GPU hybrid
VRAM yetmeyince RAM desteği

tarafında parlıyor.


9. Batching ve Scheduler

vLLM

vLLM’in scheduler’ı çok olgun.

Şunları iyi yapıyor:

continuous batching
prefill/decode karışımı
chunked prefill
çok eş zamanlı kullanıcı
OpenAI API uyumu

Eğer bir modeli API olarak servis edecekseniz ve farklı client’lardan request gelecekse, vLLM güvenli seçim.

SGLang

SGLang’in scheduler’ı daha çok cache reuse ve structured generation tarafında avantajlı.

Özellikle agent loop’larında:

düşün
tool çağır
sonucu oku
tekrar düşün
başka tool çağır
aynı context’i tekrar kullan

gibi akışlarda SGLang’in prefix reuse mantığı anlamlı olabilir.

llama.cpp

llama.cpp de server modunda çalışabilir ama vLLM/SGLang gibi high-throughput serving motoru değildir.

Bana göre llama.cpp server olabilir ama asıl gücü:

local model çalıştırma
GGUF deneme
CPU/GPU karışık inference
çok büyük modeli bir şekilde ayağa kaldırma

10. Quantization Desteği

vLLM

vLLM bu konuda genellikle daha güvenli.

Desteklediği quantization formatları oldukça geniş:

GPTQ
AWQ
FP8
INT4
INT8
ModelOpt
Marlin
GGUF tarafında bazı destekler
compressed-tensors

Özellikle Hugging Face’ten gelen quantized modellerde vLLM çoğu zaman ilk denenmesi gereken seçenek.

Mesela:

AutoRound
GPTQ-Marlin
AWQ
NVFP4
ModelOpt

gibi formatlarda vLLM genellikle daha olgun hissettiriyor.

SGLang

SGLang de quantization destekliyor ama bazı kombinasyonlarda daha seçici olabilir.

Eğer model tam destekleniyorsa çok hızlı olabilir. Ama “bu garip quant acaba çalışır mı?” sorusunda vLLM daha güvenli.

llama.cpp

llama.cpp tarafında dünya daha çok GGUF etrafında dönüyor.

Burada avantaj:

çok farklı quant seviyeleri
Q4_K_M
Q5_K_M
Q6_K
IQ quant’lar
CPU/GPU hybrid

Dezavantaj:

HF modelini doğrudan çalıştırmak yerine GGUF dönüştürülmüş model gerekir

11. Tool Calling ve Reasoning Parser

Bu özellikle Qwen, DeepSeek, tool-use modelleri için önemli.

vLLM

vLLM OpenAI-compatible tool calling tarafında daha olgun.

Örneğin Qwen tarzı modeller için:

--reasoning-parser qwen3
--enable-auto-tool-choice
--tool-call-parser qwen3_xml

gibi ayarlar kullanılabiliyor.

OpenAI API uyumluluğu önemliyse vLLM daha az sürpriz çıkarır.

SGLang

SGLang’de de parser seçenekleri var:

--reasoning-parser qwen3
--tool-call-parser qwen

Ama parser isimleri ve çıktı formatları birebir vLLM ile aynı değil.

Bu yüzden agent kullanıyorsanız mutlaka şu testleri yapmak lazım:

tool call JSON doğru geliyor mu?
arguments parse edilebiliyor mu?
streaming sırasında tool call bozuluyor mu?
reasoning text ayrı geliyor mu?
client bunu OpenAI gibi okuyabiliyor mu?

llama.cpp

llama.cpp tool calling tarafında daha manuel kalabilir.

Bazı server/client kombinasyonları destek verse de vLLM ve SGLang kadar “OpenAI-compatible tool server” mantığında değildir.


12. Multimodal / Vision

vLLM ve SGLang multimodal modelleri çalıştırabiliyor.

vLLM tarafında şu tarz ayarlar görebiliyoruz:

--limit-mm-per-prompt '{"image": 4, "video": 1}'

SGLang de multimodal destekliyor ama modelden modele ayarlar değişebilir.

llama.cpp tarafında ise genellikle:

GGUF model
mmproj dosyası
vision projector

mantığı var.

Vision model denemelerinde llama.cpp çok pratik olabilir ama production API için vLLM/SGLang daha düzenli.


13. Windows Desteği

Bu da local kullanıcı için önemli.

llama.cpp

Windows’ta en rahat çalışan seçenek genellikle llama.cpp.

Native binary, CUDA build, ROCm/Metal/CPU build gibi birçok varyasyon var.

Windows kullanıyorsanız ve “hemen çalışsın” diyorsanız llama.cpp çok pratik.

vLLM

vLLM native Windows desteklemez denebilir.

Pratik yol:

Windows 11
WSL2 Ubuntu
NVIDIA driver
CUDA
vLLM

veya Docker + WSL2.

SGLang

SGLang de native Windows-first değil.

En mantıklı yol yine:

WSL2 Ubuntu
Docker
Linux environment

Kısaca:

Windows native:
  llama.cpp daha rahat

Windows + WSL2:
  vLLM ve SGLang mantıklı

Native Windows Python:
  vLLM/SGLang için uğraşmaya değmez

14. Hangi Dilde Yazılmışlar?

vLLM

vLLM büyük ölçüde:

Python
PyTorch
C++
CUDA
Triton

ile yazılmıştır.

Python tarafı:

server
scheduler
API
model integration
config
orchestration

işlerini yapar.

C++/CUDA/Triton tarafı:

attention kernels
custom ops
fast path inference
memory operations

gibi performans kritik işleri yapar.

SGLang

SGLang de benzer şekilde:

Python
PyTorch
CUDA
C++
Triton

kullanır.

Ayrıca SGLang tarafında bazı router / non-GPU infra bileşenlerinde Rust’a doğru ilgi veya geçiş çalışmaları da var.

Ama ana runtime hâlâ Python + CUDA/Triton/PyTorch dünyasında.

llama.cpp

llama.cpp ise çok farklı:

C
C++
CUDA / Metal / HIP / Vulkan backend’leri

Bence llama.cpp’in pratik gücü de burada.

Daha düşük seviyeli, daha taşınabilir, daha az Python/PyTorch bağımlı.

Bu yüzden:

Windows’ta daha rahat
CPU’da çalışabilir
GPU ile hybrid çalışabilir
çok değişik cihazlarda koşabilir

15. 5090 / 3090 / Consumer Rig için Pratik Tavsiye

Eğer elinizde şuna benzer bir makine varsa:

RTX 5090
128GB-256GB RAM
Windows 11 + WSL2
tek GPU veya birkaç consumer GPU

benim tavsiyem şu olur:

vLLM’i ana server olarak tut

Özellikle:

Qwen
Gemma
Llama
AutoRound
GPTQ-Marlin
AWQ
OpenAI-compatible API
tool calling

için.

vLLM daha güvenli default.

SGLang’i benchmark ve agent workload için dene

Özellikle:

browser agent
WebBrain tarzı workflow
aynı uzun system prompt’un tekrar kullanılması
tool schema reuse
structured output
Qwen/DeepSeek hot-path

için.

SGLang bazı işlerde vLLM’den daha iyi sonuç verebilir.

llama.cpp’i mutlaka kenarda tut

Özellikle:

GGUF modeller
çok büyük MoE modeller
CPU expert offload
VRAM yetmediği durumlar
Windows-native kullanım
hız değil “çalışsın yeter” senaryosu

için.

llama.cpp local LLM dünyasının İsviçre çakısı gibi.


16. En Net Karar Tablosu

Senaryo En Mantıklı Seçenek
OpenAI-compatible stabil API vLLM
Çok farklı HF quant model denemek vLLM
Agent / browser automation / prefix reuse SGLang
Structured generation / constrained output SGLang veya vLLM
Büyük GGUF model llama.cpp
Model VRAM’e sığmıyor ama RAM çok llama.cpp
MoE expert CPU offload llama.cpp
Çok kullanıcı production serving vLLM
DeepSeek/Qwen MoE performans denemeleri SGLang + vLLM benchmark
Windows native kullanım llama.cpp
WSL2/Linux server vLLM veya SGLang

Sonuç

vLLM, SGLang ve llama.cpp aynı kategoride görünse de aslında farklı ihtiyaçlara cevap veriyorlar.

Benim güncel teknik kanaatim:

vLLM = güvenli, olgun, production-friendly inference server

SGLang = daha deneysel/agresif, agent ve prefix-cache workload’larında çok ilginç

llama.cpp = local hacker tool’u; GGUF, CPU offload ve büyük modeli bir şekilde çalıştırma kralı

Özellikle son nokta önemli:

vLLM ve SGLang CPU offload yapabilir, ama llama.cpp’in MoE expert offload yaklaşımı local consumer hardware için hâlâ çok özel.

Bir model VRAM’e tam sığıyorsa vLLM/SGLang kullanmak daha mantıklı.

Ama model çok büyükse, MoE ise ve elinizde bol sistem RAM’i varsa, llama.cpp hâlâ oyunu değiştiriyor.

Bence ideal setup tek bir runtime seçmek değil.

İdeal setup şu:

vLLM      -> ana OpenAI-compatible server
SGLang    -> agent/prefix-cache/structured output benchmark server
llama.cpp -> GGUF, MoE CPU offload ve “bunu bir şekilde çalıştıralım” fallback’i

Local LLM işi biraz böyle:
bazen en hızlı motor kazanır, bazen en uyumlu motor kazanır, bazen de sadece modeli yükleyebilen motor kazanır.

Comments

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir