Linux Sunucularda vLLM ve PagedAttention ile Yüksek Performanslı Model Dağıtımı

Kişisel kullanımda llama.cpp ve Ollama fazlasıyla yeterli ve pratik çözümlerdir. Ancak bir şirkette, geliştirici ekibinde veya yüksek trafikli bir web uygulamasında aynı anda onlarca veya yüzlerce kullanıcının eşzamanlı olarak modelden yanıt beklediği bir senaryoda bu araçlar ciddi performans darboğazlarına girer. Standart motorlar istekleri çoğunlukla sırayla (sequential) işler veya statik gruplama nedeniyle GPU belleğini verimsiz kullanır.

UC Berkeley tarafından geliştirilen vLLM, işletim sistemlerindeki sanal bellek sayfalamasından esinlenen PagedAttention algoritmasıyla LLM sunuculuğunda endüstri standardı haline geldi.

Bu 5 bölümlük serinin son yazısında; vLLM’in mimarisini, KV Cache darboğazını nasıl çözdüğünü, Linux üzerinde kurulumunu ve Nginx arkasında yüksek verimli bir API servisine dönüştürülmesini ele alıyorum.


1. Darboğazın Nedeni: KV Cache ve Bellek Parçalanması

Bir LLM metin üretirken, önceki tüm kelimelerin (token) anahtar ve değer tensörlerini bellekte tutmak zorundadır (Key-Value Cache).

Standart çıkarım sistemlerinde her gelen istek için en kötü senaryoya göre (örneğin maksimum 4096 token) VRAM’de baştan bitişik (contiguous) bir bellek alanı rezerve edilir:

  • Eğer kullanıcı sadece 50 tokenlık kısa bir soru sorarsa, ayrılan belleğin %90’ından fazlası boşuna kilitlenir.
  • Farklı uzunluktaki istekler nedeniyle VRAM hızla parçalanır (internal/external fragmentation) ve sistem “Bellek yetersiz” (OOM) hatası verir.

PagedAttention Çözümü

vLLM, tıpkı Linux çekirdeğinin sanal belleği 4KB sayfalara (pages) bölmesi gibi, KV Cache belleğini küçük sabit bloklara böler:

  • Bloklar bellekte fiziksel olarak yan yana olmak zorunda değildir.
  • Bellek yalnızca yeni tokenlar üretildikçe dinamik olarak tahsis edilir.
  • Bellek israfı %60-80 oranından %4’ün altına iner.
  • Bu sayede aynı GPU üzerinde 2 ila 4 kat daha fazla eşzamanlı istek (concurrency) işlenebilir.

2. Sürekli Toplu İşleme (Continuous Batching)

Geleneksel toplu işlemede (batching), gruptaki en uzun yanıt tamamlanana kadar diğer tüm istekler GPU’yu beklemek zorundadır.

vLLM ise iterasyon seviyesinde planlama (iteration-level scheduling) yapar:

  • Bir istek tamamlandığı anda GPU’dan çıkarılır ve yerine sırada bekleyen yeni istek anında eklenir.
  • GPU çekirdekleri hiçbir zaman boşta beklemez ve toplam verim (throughput) saniyede yüzlerce tokene ulaşır.

3. Linux Üzerinde vLLM Kurulumu

vLLM doğrudan modern NVIDIA GPU’ları (CUDA) ve Python ortamını gerektirir:

# İzole bir sanal ortam oluşturalım
python3 -m venv vllm_env
source vllm_env/bin/activate

# vLLM kurulumu
pip install --upgrade pip
pip install vllm

4. Modeli Sunucu Olarak Başlatmak

vLLM doğrudan yerleşik bir OpenAI uyumlu REST API sunucusuyla birlikte gelir:

python3 -m vllm.entrypoints.openai.api_server \
    --model meta-llama/Llama-3.1-8B-Instruct \
    --port 8000 \
    --gpu-memory-utilization 0.90 \
    --max-model-len 8192 \
    --enforce-eager
  • --gpu-memory-utilization 0.90: Ekran kartı belleğinin %90’ını model ve PagedAttention havuzuna ayırır.
  • --max-model-len 8192: Maksimum bağlam uzunluğunu sınırlar.
  • --tensor-parallel-size 2: Birden fazla GPU’nuz varsa (örneğin 2 adet RTX 3090), modeli otomatik olarak iki kart arasında paylaştırır.

5. Nginx ile Üretim Seviyesinde Güvenlik ve Ters Vekil (Reverse Proxy)

Doğrudan 8000 portunu dış dünyaya açmak yerine, önüne Nginx koyarak SSL/TLS şifrelemesi ve hız sınırlandırması (rate limiting) eklemek gerekir:

/etc/nginx/sites-available/vllm.conf:

server {
    listen 80;
    server_name ai.ahakan.com;

    location / {
        proxy_pass http://127.0.0.1:8000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

        # LLM akışı (streaming - SSE) için kritik ayarlar:
        proxy_buffering off;
        proxy_cache off;
        proxy_read_timeout 600s;
    }
}

Bu yapılandırmada proxy_buffering off; satırı hayati önem taşır; aksi takdirde Nginx modelden gelen token akışını arabelleğe alır ve yanıt kullanıcıya daktilo efektiyle anlık olarak değil, topluca gecikmeli iletilir.


6. Serinin Genel Özeti

Bu 5 bölümlük seride Linux üzerinde yerel yapay zeka ekosistemini baştan sona inşa ettik:

  1. Donanım ve VRAM Planlaması: Doğru GPU ve kuantizasyon seçimi.
  2. llama.cpp: C++ ile saf, hafif ve sıfır bağımlılıklı çıkarım.
  3. Ollama: Tek komutla model çekme, çalıştırma ve systemd orkestrasyonu.
  4. Open WebUI & RAG: Web arayüzü ve yerel belgelerle çalışan akıllı asistan.
  5. vLLM: Eşzamanlı kurumsal trafik için yüksek verimli sunucu mimarisi.

Kendi donanımınız üzerinde çalışan bir yapay zeka altyapısına sahip olmak, yalnızca veri egemenliği sağlamakla kalmaz; aynı zamanda modern hesaplama mimarilerini en derin seviyede anlama fırsatı sunar.