Local AI

Ollama'yı Çok Kullanıcılı Eşzamanlı Çıkarım İçin Optimize Etme: Bağlam Pencerelerini ve VRAM Atamasını Yönetme

Gizlilik, düşük gecikme süresi ve maliyet verimliliği arayan geliştiriciler için Yerel Büyük Dil Modellerinin (LLM) dağıtımı standart bir uygulama haline gelmiştir. Ollama bu modellerin çalıştırılmasını kolaylaştırsa da, tek kullanıcılı bir geliştirme ortamından çok kullanıcılı bir üretim ortamına ölçeklendirme karmaşık kaynak yönetimi zorluklarını beraberinde getirir. Temel darboğazlar Video RAM (VRAM) parçalanması ve bağlam penceresi tükenmesidir. Bu rehber, çıkarım kalitesinden veya kararlılıktan ödün vermeden eşzamanlılığı en üst düzeye çıkarmak için stratejileri ele alır.

VRAM Rekabet Sorunu

Çıkarımın devasa kümeler arasında dağıtıldığı bulut API'lerinin aksine, yerel çıkarım donanımınızın ayrık GPU belleğine dayanır. Varsayılan olarak Ollama, model ağırlıklarını VRAM'e yükler. Birden fazla kullanıcı aynı anda çıkarım istediğinde, sistemin mevcut modelleri bellekte tutup tutmayacağına veya yeni modelleri yüklemek için bunları bellekten atıp atmayacağına karar vermesi gerekir. Bu "titreme" (thrashing), ağırlıkların sürekli olarak CPU RAM'i ile GPU VRAM'i arasında takas edilmesi nedeniyle önemli gecikme sıçramalarına yol açar.

Etkili VRAM yönetimi, bir modelin bellek ayak izini anlamayı gerektirir. Yaklaşık VRAM kullanım formülü şudur:

VRAM Kullanımı ≈ (Model Parametreleri × Ağırlık Başına Bayt) + (Bağlam Uzunluğu × Dikkat Başlıkları × Veri Tipi Boyutu)

4-bite (Q4_K_M) nicelleştirilmiş 7B parametreli bir model için temel ağırlık boyutu yaklaşık 4GB'dir. Ancak bağlam penceresi dinamik bir ek yük ekler. FP16 dikkat katmanında 4.096 jetonluk bir bağlam penceresi birkaç yüz MB ekleyebilir. Bunu azaltmak için, öngörülemez bellek sıçramalarını önlemek üzere dağıtımınız boyunca bağlam boyutlarını standartlaştırmalısınız.

Eşzamanlı Çıkarım İçin Stratejiler

Ollama'da çok kullanıcılı yükleri işlemek için üç temel yaklaşım vardır:

  1. Model Sabitleme: Popüler modelleri bellekte saklı tutun. Bu, sabit bir model setiyle yüksek verimlilik senaryoları için idealdir.
  2. Agresif Taşıma (Offloading): GPU'da kaç katmanın kalacağını kontrol etmek için Ollama'nın `num_gpu` bayrağını kullanın. Bu, daha küçük modellerin bir arada var olmasına olanak tanır ancak CPU çıkarım süresini artırır.
  3. İstek Kuyruklama: Donanımınız gerçek paralelliği destekleyemiyorsa, istekleri sıralamak için uygulama düzeyinde bir kuyruk uygulayın.

Stabilite İçin Ollama Yapılandırması

Ollama zamanlamayı dahili olarak yönetse de, ortam değişkenleri ve API parametreleri aracılığıyla davranışını etkileyebilirsiniz. Öncelikle VRAM sınırlarınızı açıkça tanımlayın. Bir NVIDIA GPU'nuz varsa, daha iyi bellek yönetimi için CUDA 12.0+ desteği sunan en son sürücülerin kullandığınızdan emin olun.

Ollama örneğinizi başlatırken, `OLLAMA_MAX_LOADED_MODELS` ortam değişkenini ayarlamayı düşünün. Bu, aynı anda yüklenebilecek model sayısını sınırlar ve yoğun yük altında OOM (Bellek Dışı) hatalarını önler.

export OLLAMA_MAX_LOADED_MODELS=2
export OLLAMA_GPU_OVERHEAD=1024 # MB
docker run -d \
  -e OLLAMA_MAX_LOADED_MODELS=$OLLAMA_MAX_LOADED_MODELS \
  -e OLLAMA_GPU_OVERHEAD=$OLLAMA_GPU_OVERHEAD \
  -p 11434:11434 \
  ollama/ollama:latest

Bağlam Pencerelerini Dinamik Olarak Yönetme

Tüm istekler aynı bağlam uzunluğunu gerektirmez. Kodlama yardımı genellikle uzun bağlamlardan faydalanırken, basit özetleme görevleri bunu gerektirmez. VRAM'i optimize etmek için API düzeyinde dinamik bağlam sınırları uygulamalısınız.

İşte belirli bir görev için daha sıkı bir bağlam penceresi (`num_ctx`) belirtmeyi ve modelin dikkat tamponları için gereksiz VRAM ayırmamasını sağlamayı gösteren `requests` kullanan bir Python örneği:

import requests

def generate_response(prompt, num_ctx=2048):
    response = requests.post(
        "http://localhost:11434/api/generate",
        json={
            "model": "llama3:8b",
            "prompt": prompt,
            "stream": False,
            "options": {
                "num_ctx": num_ctx,
                "temperature": 0.7
            }
        }
    )
    return response.json().get("response")

# Örnek: Hızlı S&S için kısa bağlam
quick_answer = generate_response("What is Python?", num_ctx=512)
print(quick_answer)

İzleme ve Uyarılar

Optimizasyon iteratif bir süreçtir. GPU kullanımınızı gerçek zamanlı olarak izlemelisiniz. `nvidia-smi` veya `nvtop` gibi araçlar vazgeçilmezdir. Aşağıdaki metrikleri arayın:

  • GPU Bellek Kullanımı: İşletim sistemi ek yüküne izin vermek için toplam VRAM'in %90'ının altında kalmalıdır.
  • GPU Kullanımı: Düşük gecikmeyle yüksek kullanım, iyi toplu işleme (batching) gösterir. Yüksek gecikmeyle yüksek kullanım, bellek titremesi (memory thrashing) göstergesi olabilir.

Bu metrikleri izleme yığınına (ör. `node_exporter` ile Prometheus) entegre edin ve VRAM kullanımı güvenli eşiklerin üzerine çıktığında uyarılar tetikleyin.

Sonuç

Ollama'yı çok kullanıcılı eşzamanlı çıkarım için optimize etmek, donanımı zorlamaktan ziyade akıllı kaynak ataması ile ilgilidir. Yüklenen model sayısını sınırlayarak, bağlam pencerelerini standartlaştırarak ve VRAM kullanımını izleyerek kararlı, düşük gecikmeli yerel AI hizmetleri elde edebilirsiniz. Muhafazakâr ayarlarla başlayın, iş yükünüzü analiz edin (profile) ve parametreleri ampirik verilere göre ayarlayın. Yerel AI modelleri küçülmeye ve daha verimli hale gelmeye devam ettikçe, bu stratejiler ölçeklenebilir, gizlilik odaklı uygulamalar oluşturmak için kritik önemini koruyacaktır.

Share: