AI

LLM'leri Hızlandırma: 100ms Altı Çıktı İçin Tahmine Dayalı Çözümleme ve KV Önbelleği Optimizasyonu

Giriş

Büyük Dil Modelleri (LLM'ler) alanındaki hızla değişen ortamda, çıkarım gecikmesi genellikle etkileşimli kod asistanları veya düşük gecikmeli sohbet botları gibi gerçek zamanlı uygulamaların tam potansiyeline ulaşmasını engelleyen darboğazdır. Model quantizasyonu bellek kullanımını azaltsa da, 100ms altı yanıt süreleri için gereken dramatik hız artışlarını sağlamada genellikle zorlanır. İşte burada Tahmine Dayalı Çözümleme (Speculative Decoding) ve KV Önbelleği Optimizasyonu kombinasyonu ön plana çıkar. Token dizilerini akıllıca tahmin ederek ve bellek durumunu verimli bir şekilde yöneterek, geliştiriciler model çıktısının kalitesinden ödün vermeden doğrusal hız artışları elde edebilir.

KV Önbelleği: Performansın Göz Ardı Edilen Kahramanı

100ms altı çıkarımı nasıl elde ettiğimizi anlamak için önce Anahtar-Değer (KV) Önbelleğine değinmemiz gerekir. Metin üretimi sırasında, Transformer modeli önceki tokenlara dikkat eder. Her adımda tüm dizi için dikkat (attention) hesaplamalarını yeniden yapmak yerine, model önceki tokenların Anahtar ve Değer vektörlerini önbelleğe alır. Uzun bağlam uygulamaları için bu önbellek bir bellek darboğazına dönüşebilir. Verimli yönetilmezse, bu önbelleğin tahsis edilmesi ve yönetilmesiyle oluşan aşırı yük, paralel işlemenin avantajlarını etkisiz hale getirebilir.

Temel Optimizasyon Stratejisi: Sürekli Toplu İşleme (Continuous Batching) (Zamanlayıcı- Bilinir toplu işleme olarak da bilin) uygulayın. Statik toplu işlemenin aksine, sürekli toplu işleme, önceki bir istek tamamlandığında yeni isteklerin topluluğa eklenmesine olanak tanır; GPU kullanımını maksimize eder ve KV önbelleğini kompakt ve ilgili tutar.

# Verimli KV önbelleği yönetimini gösteren sahte kod
def generate_with_kv_cache(model, prompt, max_length):
    # KV önbelleğini önceden tahsis edilmiş bellekle başlat
    kv_cache = model.init_cache(max_length)
    
    # İstemi kodla ve başlangıç KV durumlarını hesapla
    inputs = tokenizer(prompt, return_tensors="pt")
    outputs = model(input_ids=inputs["input_ids"], past_key_values=kv_cache)
    
    next_token = outputs.logits[:, -1, :].argmax(dim=-1)
    
    for _ in range(max_length):
        # Önbelleği yalnızca yeni tokenın KV çiftleriyle güncelle
        # Bu, tüm dikkat matrisinin yeniden hesaplanmasını önler
        kv_cache = update_kv_cache(kv_cache, outputs)
        
        # Sonraki tokenı üret
        outputs = model(input_ids=next_token, past_key_values=kv_cache)
        next_token = outputs.logits[:, -1, :].argmax(dim=-1)
        
        if next_token == tokenizer.eos_token_id:
            break
            
    return tokenizer.decode(outputs)

Tahmine Dayalı Çözümleme: Sıralı Olanı Paralelleştirme

Geleneksel otoregresif çözümleme doğası gereği sıralıdır: Token $T_n$, $T_{n-1}$'e bağlıdır. Bu, hızı sınırlayan kritik bir yol oluşturur. Tahmine Dayalı Çözümleme, daha küçük ve hızlı bir "taslak" modeli kullanarak birden fazla token önermesini ve bunların daha büyük, otoriter "hedef" model tarafından paralel olarak doğrulanmasını sağlayarak bu engeli aşar. Süreç şu şekilde işler: 1. Taslak model $N$ aday token üretir. 2. Hedef model, istemi ve bu adayları aynı anda işler. 3. Hedef model, adayları kendi olasılık dağılımına karşı doğrular. 4. Uyuşmayan herhangi bir token geri sarılmaya neden olur ve üretim son doğrulanmış tokendan devam eder. Taslak model doğru olduğunda, hedef model tek bir ileri geçişte birden fazla tokenı doğrular ve bu da doğrusal hız artışlarına yol açar.

Pratik Uygulama Örneği

Hugging Face Transformers ve vLLM gibi modern kütüphaneler kullanılarak tahmine dayalı çözümlemenin uygulanması giderek daha erişilebilir hale geliyor. Aşağıda, bir hedef modeli (örneğin 70B'lik bir model) hızlandırmak için bir taslak model (örneğin distile edilmiş 7B'lik bir model) kullanan kavramsal bir uygulama bulunmaktadır.
from transformers import AutoModelForCausalLM, AutoTokenizer
import torch

# Hafif taslak modeli ve ağır hedef modeli yükle
draft_model = AutoModelForCausalLM.from_pretrained("draft-model-7b")
target_model = AutoModelForCausalLM.from_pretrained("target-model-70b")

draft_tokenizer = AutoTokenizer.from_pretrained("draft-model-7b")

def speculative_decode(prompt, draft_model, target_model, num_drafts=4):
    # 1. Taslak aşaması
    draft_inputs = draft_tokenizer(prompt, return_tensors="pt")
    draft_outputs = draft_model.generate(**draft_inputs, max_new_tokens=num_drafts)
    draft_tokens = draft_outputs[0]
    
    # 2. Doğrulama aşaması
    # Hedef modeli istem + taslak tokenlarını tek seferde işler
    target_inputs = target_tokenizer(prompt + draft_tokenizer.decode(draft_tokens), 
                                     return_tensors="pt")
    
    with torch.no_grad():
        target_outputs = target_model(**target_inputs)
    
    # 3. Kabul/Red mantığı
    # Taslak olasılıklarını hedef logit'leriyle karşılaştır
    # Kabul edilirse, diziye ekle. Reddedilirse, kısalt.
    accepted_tokens = verify_acceptance(draft_tokens, target_outputs)
    
    return accepted_tokens

100ms Altı Hedeflere Ulaşmak İçin Teknikleri Birleştirme

Tutarlı bir şekilde 100ms altı çıkarım sürelerine ulaşmak için yalnızca bir tekniğe güvenemezsiniz. Bunları birleştirmelisiniz:
  • Donanım Hızlandırma: Bellek bant genişliği kullanımını azaltmak için KV önbelleği için optimize edilmiş CUDA çekirdeklerini (FlashAttention gibi) kullanın.
  • Model Distilasyonu: Tahmine dayalı çözümlemede kabul oranını artırmak için daha büyük modelin çıktı dağılımını taklit etmesi amacıyla özel olarak eğitilmiş daha küçük bir taslak model eğitin.
  • Toplu İşleme Verimliliği: Dediğimiz gibi, GPU'nun her zaman veri işlediğinden ve boşta kalma süresini en aza indirdiğinden emin olmak için sürekli toplu işleme kullanın.

Sonuç

100ms altı LLM çıkarımı artık teorik bir egzersiz değil, pratik bir mühendislik meydan okumasıdır. KV Önbelleği optimizasyonunun bellek verimliliğinden ve Tahmine Dayalı Çözümlemenin paralel işleme gücünden yararlanarak, geliştiriciler insan benzeri hızda yanıt veren güçlü modelleri dağıtabilir. Donanım ve yazılım ekosistemleri olgunlaşmaya devam ettikçe, bu teknikler üretim seviyesindeki her AI uygulaması için standart uygulamalar haline gelecektir. Mevcut gecikme darboğazlarınızı profillemeye başlayın, verimli KV önbellekleme uygulayın ve LLM'lerinizin gerçek potansiyelini açığa çıkarmak için hafif taslak modellerle deney yapın.
Share: