Yerel AI çıkarımının yükselişi, geliştiricilerin büyük dil modellerini (LLM) ve üretken AI hizmetlerini dağıtma şeklini dönüştürdü. Ancak, paylaşılan bir GPU kümesinde heterojen iş yüklerini yönetmek önemli bir mühendislik zorluğu oluşturur. Statik kaynak ataması genellikle ciddi verimsizliğe veya daha da kötüsü, sisteme yayılan Bellek Dışı (OOM) hatalarına yol açar. Sağlam bir yerel AI altyapısı oluşturmak için, basit süreç izolasyonunun ötesine geçmeli ve gerçek zamanlı iş yükü taleplerine uyum sağlayan dinamik VRAM atama stratejileri uygulamanız gerekir.
Yerel Kümelelerde Statik Atamanın Zorluğu
Tipik bir yerel kurulumda, iki veya dört GPU'ya (ör. RTX 4090 veya A100) sahip tek bir üst düzey iş istasyonu olabilir. Yüksek verimli sunum (toplu çıkarım) ve düşük gecikmeli etkileşimli görevlerin (sohbet tamamlamaları) bir karışımını çalıştırıyor olabilirsiniz. VRAM'in %80'ini sunum motoruna ve %20'sini deneysel betiklere statik olarak atarsanız, iki kritik arıza modu riskiyle karşı karşıya kalırsınız. Birincisi, sunum motoru trafik sıçraması görürse, boşta olan deneysel yuvadan bellek ödünç alamaz. İkincisi, deneysel betik belleği düzgün bir şekilde serbest bırakamazsa, üretim hizmetini aç bırakabilir ve bu da gecikme sıçramalarına veya çökmelere neden olabilir.
Dinamik Bellek Havuzlarının Uygulanması
Çözüm, bellek rezervasyonunu fiili kullanımdan ayırmakta yatar. Süreçlere sert sınırlar koymak yerine, CUDA'nın bellek yönetimi yeteneklerini kullanarak dinamik havuzlar oluşturabiliriz. NVIDIA MPS (Multi-Process Service) gibi araçlar, birden fazla CUDA bağlamının tek bir GPU'yu paylaşmasına olanak tanır, ancak VRAM sınırlarını doğrudan yönetmez. Daha ince kontrol için, konteynerize ortamlarda (Kubernetes veya Docker gibi) cihaz eklentilerini veya nvidia-smi çıktılarını gerçek zamanlı olarak izleyen özel zamanlayıcıları kullanmanızı öneririz.
Yeni çıkarım görevlerini başlatmadan önce kullanılabilir VRAM'i izleyen hafif bir Python zamanlayıcısını düşünün:
import subprocess
import time
def get_available_vram(gpu_id: int) -> int:
"""
Belirli bir GPU'da kullanılabilir belleği nvidia-smi ile sorgular.
Kullanılabilir belleği MB cinsinden döndürür.
"""
cmd = [
"nvidia-smi",
f"--gpu-id={gpu_id}",
"--query-gpu=memory.free",
"--format=csv,noheader,nounits"
]
try:
output = subprocess.check_output(cmd, stderr=subprocess.STDOUT)
return int(output.strip())
except subprocess.CalledProcessError as e:
print(f"GPU {gpu_id} sorgulama hatası: {e}")
return 0
class DynamicScheduler:
def __init__(self, min_vram_threshold_mb=2000):
self.min_vram_threshold_mb = min_vram_threshold_mb
self.active_tasks = {}
def can_launch_task(self, gpu_id: int, required_vram_mb: int) -> bool:
available = get_available_vram(gpu_id)
# İşletim sistemi ve diğer süreçler için bir tampon bırakılmasını sağla
return available > (required_vram_mb + self.min_vram_threshold_mb)
# Örnek Kullanım
scheduler = DynamicScheduler()
if scheduler.can_launch_task(gpu_id=0, required_vram_mb=12000):
print("GPU 0 üzerinde yeni LLM çıkarım görevi zamanlanıyor...")
# Çıkarım işçinizi burada başlatın
else:
print("GPU 0 üzerinde yetersiz VRAM. Görev kuyruğa alınıyor...")
Gelişmiş Strateji: Önceliğe Dayalı Boğulma Kontrolü (Throttling)
Karma iş yüklerinde tüm görevler eşit değildir. Etkileşimli kullanıcı istekleri genellikle arka plan veri üretiminden daha düşük gecikme gerektirir. İleri düzey bir zamanlayıcı önceliğe dayalı boğulma kontrolü (throttling) uygulamasımalıdır. Toplam küme VRAM kullanımı kritik bir eşiğin (ör. %85) üzerine çıktığında, zamanlayıcı OOM'yi önlemek için yüksek öncelikli görevlerin parti boyutunu dinamik olarak ayarlayabilirken, düşük öncelikli arka plan işlerinin duraklatılmasına veya bellek tutamaçlarını serbest bırakmasına izin verebilir.
vLLM veya TGI (Text Generation Inference) gibi çerçeveler dinamik partilemeyi (batching) destekler, ancak bunları harici bir VRAM-farkında orkestratörle entegre etmek, tüm kümenizin uyumlu bir şekilde çalışmasını sağlar. Prometheus ve Grafana aracılığıyla GPU kullanımını ve bellek baskısını izleyerek, sert bir çökme gerçekleşmeden önce kritik olmayan iş yüklerini otomatik olarak ölçeklendiren geri bildirim döngüleri oluşturabilirsiniz.
Sonuç
Dinamik VRAM ataması, verimli yerel AI kümeleri için artık bir lüks değil, bir zorunluluktur. Statik sınırlardan uzaklaşarak gerçek zamanlı izleme ve uyumlu zamanlamayı benimseyerek, donanım kullanımını en üst düzeye çıkarabilir ve kararlılığı sağlayabilirsiniz. Çıkarım görevleriniz için basit bellek kontrolleri uygulayarak başlayın, ardından tam teşekküllü bir önceliğe dayalı zamanlayıcıya evrilin. Bu yaklaşım yalnızca OOM hatalarınızı azaltmakla kalmayacak, aynı zamanda yerel AI uygulamalarınızın kullanıcı deneyimini önemli ölçüde iyileştirecektir.