Büyük dil modelleri ve devasa bilgisayarlı görü sistemleri çağında, darboğaz eğitimden çıkarıma kaydı. Eğitim hesaplama ağırlıklı, çevrimdışı bir süreçken, çıkarım gecikmeye duyarlıdır ve gerçek zamanlı olarak binlerce eşzamanlı isteği yönetmek zorundadır. Orta seviyeden ileri seviyeye mühendisler için, çıkarım yüklerini dağıtmayı anlamak artık bir seçenek değil; üretim seviyesinde AI uygulamaları oluşturmak için kritik öneme sahiptir. Bu yazı, dağıtık çıkarımın mimari desenlerini, zorluklarını ve pratik uygulamalarını incelemektedir.
Neden Dağıtık Çıkarım? Ölçekleme Sorunu
Bir tek GPU, hatta yüksek uç bir A100 veya H100 bile sınırlı bellek ve hesaplama kapasitesine sahiptir. Llama-3-70B veya DALL-E 3 gibi modelleri dağıttığınızda, tek bir cihaz ağırlıkları yüklerken bile bellek yetersizliği yaşayabilir, çoktan toplu istekleri (batched requests) yönetmeyi düşünmeyin. Dağıtık çıkarım, iş yükünü birden fazla düğüm veya GPU arasında bölütleme yoluyla bu sorunu çözer. İki temel strateji Tensor Paralelizmi ve Yığın (Pipeline) Paralelizmi'dir.
Tensor Paralelizmi, bireysel matris çarpımlarını cihazlar arasında böler. Bir katman [4096, 4096] boyutunda bir ağırlık matrisine sahipse, tensor paralelizmi bunu paralel olarak işlenecek iki [2048, 4096] boyutlu matrise bölebilir. Bu, cihaz başına bellek kullanımını azaltır ve çok büyük katmanlar için verimliliği artırır.
Yığın (Pipeline) Paralelizmi, model katmanlarını cihazlar arasında böler. 1. katman GPU 0'da, 2. katman GPU 1'de ve böyle devam eder. Bu, paralelleştirme tekniğinden bağımsız olarak modelin tek bir cihazın belleğine sığmadığı durumlarda kullanışlıdır. Ancak, GPU'ların önceki aşamalardan veri gelmesini beklerken boşta kalmasına neden olan "balon" (bubble) aşırı yüklemesi getirir.
vLLM ve Ray ile Uygulama Stratejileri
Sıfırdan dağıtık çıkarım sistemleri oluşturmak karmaşıktır. Mühendisler genellikle bu karmaşıklıkları (ağırlıkların parçalanması, KV önbelleğinin yönetilmesi ve işçi süreçleri arasında yük dengeleme) yönetmek için vLLM (LLM'ler için) veya Ray Serve gibi çerçevelere güvenirler.
Temel Bileşen: KV Önbelleği
Transformer modellerinde, Key-Value (KV) önbelleği yeniden hesaplamayı önlemek için önceki dikkat (attention) durumlarını saklar. Dağıtık bir ortamda, bu önbelleğin verimli bir şekilde yönetilmesi hayati önem taşır. Dağıtık çıkarım motorları, daha uzun bağlam pencereleri ve daha yüksek toplu boyutlar (batch sizes) sağlamak için KV önbelleğini işçiler arasında parçalar.
Pratik Örnek: Ray Serve ile Dağıtma
Ray Serve, ML modelleri için ölçeklenebilir bir sunum kütüphanesidir. Bir modeli bir Python sınıfı olarak tanımlamanıza ve ölçeklendirmeyi ile dağıtımı otomatik olarak yönetmesine olanak tanır. Aşağıda, dağıtık bir sunum uç noktasını nasıl yapılandırabileceğinize dair kavramsal bir örnek bulunmaktadır.
import ray
from ray import serve
import torch
@serve.deployment(num_replicas=2, ray_actor_options={"num_gpus": 1})
class LargeModelDeployer:
def __init__(self):
# Her replika için modeli bir kez yükle
self.model = torch.load("large-model.pth")
self.model.eval()
self.tokenizer = AutoTokenizer.from_pretrained("model-name")
def __call__(self, request_data: dict):
# İsteği işle
inputs = self.tokenizer(request_data["text"], return_tensors="pt")
with torch.no_grad():
outputs = self.model.generate(**inputs, max_length=150)
return {"generated_text": self.tokenizer.decode(outputs[0])}
# Servisi başlat
serve.run(LargeModelDeployer.bind())
Bu örnekte, num_replicas=2 Ray'a modelin iki örneğini (potansiyel olarak farklı düğümlerde) başlatmasını söyler. Yük dengeleyici, gelen HTTP isteklerini bu replikalar arasında dağıtır. 2 replikanın ötesinde ölçeklendirme ihtiyacı duyarsanız, Ray CPU/GPU kaynak kullanılabilirliğine göre otomatik olarak yeni aktörler (actors) oluşturur.
Zorluklar: Ağ Bant Genişliği ve Yavaş Çalışanlar (Stragglers)
Dağıtık sistemler, yeni bir değişken olarak ağ gecikmesini getirir. Eşzamanlı dağıtık eğitim veya çıkarım sırasında, yavaş çalışan işçiler (stragglers) tüm toplu işi (batch) bekletir. Bağlantıyı optimize etmek (örneğin, düğüm içi iletişim için NVLink ve düğümler arası iletişim için InfiniBand kullanmak) hayati önem taşır.
Ayrıca, dinamik toplu işleme (dynamic batching) dağıtık ortamlarda daha karmaşık hale gelir. Bir düğümün darboğaz haline gelmesini önlemek için toplu işlerin bölütlere dengeli bir şekilde dağıldığından emin olmalısınız. "Sürekli toplu işleme" (continuous batching) gibi teknikler, istek geliş zamanları düzensiz olsa bile yüksek GPU kullanım oranlarını korumaya yardımcı olabilir.
Sonuç
Dağıtık çıkarım, modern AI altyapısının omurgasıdır. Tensor ve yığın paralelizminden yararlanarak ve Ray veya vLLM gibi sağlam çerçeveleri kullanarak geliştiriciler, düşük gecikme süresi ve yüksek verimlilikle devasa modelleri sunabilir. Modeller boyut olarak büyümeye devam ettikçe, bu dağıtık desenleri ustalaşmak AI mühendisleri için temel bir yetkinlik olmaya devam edecektir. AI'nın geleceği sadece daha iyi algoritmalar hakkında değil, aynı zamanda daha akıllı ve daha ölçeklenebilir altyapı hakkında da olacaktır.