ChatGPT’ye, Claude’a veya herhangi bir LLM’e uzun bir metin yapıştırıp soru sorduğunuzda, ilk yanıt biraz geç gelse de ardından gelen her token’ın neredeyse anlık aktığını fark etmişsinizdir. Bu sihrin arkasında büyük ölçüde KV Cache yatıyor.
Teknik detaylara girmeden önce şunu söyleyeyim: KV Cache, büyük dil modellerini production’da gerçekten kullanılabilir kılan şeydir. Olmasa GPT-4’e uzun bir döküman gönderip cevap beklemek dakikalarca sürebilirdi.
Önce Transformer’ın Nasıl Çalıştığını Anlamak Gerekiyor
LLM’lerin temeli Transformer mimarisine dayanıyor. Transformer’da her token, diğer tüm token’larla bir Attention (dikkat) mekanizması aracılığıyla ilişki kuruyor. Bu mekanizma şöyle çalışıyor:
Her token için üç hesapalama yapılıyor: Query (Q), Key (K) ve Value (V).
Model bir sonraki token’ı üretirken şunu soruyor: “Bu Query, diğer hangi Key’lerle ne kadar alakalı? O Key’lere karşılık gelen Value’ları ne oranda kullanayım?”
İşte bu K ve V vektörlerini her adımda sıfırdan hesaplamak yerine bellekte saklayıp yeniden kullanmak KV Cache’in özü.
KV Cache Olmadan Ne Olur?
Diyelim ki modele 1000 token’lık bir prompt gönderdiniz. Model ilk yanıt token’ını üretmek için bu 1000 token’ın tamamının K ve V vektörlerini hesaplamak zorunda. Tamam, bu bir kere yapıldı.
Peki ya ikinci token? Model artık 1001 token’lı bir diziye bakıyor. KV Cache yoksa bu 1001 token’ın tamamını baştan hesaplıyor. Üçüncü token için 1002 token… Her adımda yeniden artan bir hesaplama yükü.
Bu durum hem son derece yavaş hem de GPU için ciddi bir kaynak israfı.
KV Cache ile Ne Değişiyor?
Model, bir kere hesapladığı K ve V vektörlerini bellekte (GPU VRAM’inde) saklıyor. Yeni bir token geldiğinde sadece o yeni token için K ve V hesaplıyor, eskilerini cache’den çekiyor.
Sonuç: Token üretimi yerine karmaşıklığına yaklaşıyor. Özellikle context window uzadıkça bu fark daha farkla artıyor.
Durum Her token için hesaplama KV Cache yok Tüm geçmiş token’lar yeniden hesaplanır KV Cache var ise sadece yeni token hesaplanır, geri kalanı cache’den gelir
Peki Bu Cache Nerede Duruyor?
GPU’nun VRAM’inde. Ve bu ciddi bir sorun.
Bir modelin KV Cache boyutu şuna bağlı: token sayısı × katman sayısı × kafa sayısı × vektör boyutu × 2 (K ve V için) × veri tipi boyutu.
GPT-3.5 seviyesi bir modelde, 4096 token’lık bir context için KV Cache birkaç GB VRAM tutabilir. Bunun üzerine bir de çok sayıda paralel kullanıcı isteği gelince inference altyapısı tasarımı gerçek bir mühendislik problemi haline geliyor. Anthropic, OpenAI ve Google’ın bu konuda yayımladığı teknik yazılar incelendiğinde, KV Cache yönetiminin inference maliyetlerinin belki de en kritik kalemi olduğu görülüyor.
Prompt Caching Ayrı Bir Şey Mi?
Burada bir ayrımı netleştirmek gerekiyor.
KV Cache: Model, tek bir istek içinde kendi ürettiği token’ların vektörlerini bellekte tutar. Bu her modern LLM’de varsayılan olarak çalışır.
Prompt Caching: Farklı istekler arasında aynı prompt prefix’inin cache’lenmesi. Mesela bir sistem promptu veya uzun bir döküman her seferinde yeniden işlenmek yerine cache’den servis edilir. Anthropic’in Claude API’sinde bu özellik açıkça sunuluyor. Aynı uzun system prompt’u defalarca gönderdiğinizde, ilk seferden sonra token maliyeti ve gecikme ciddi ölçüde düşüyor.
Neden Bu Kadar Önemli?
Şöyle düşünün: Claude’a 100 sayfalık bir PDF yükleyip üzerine 10 farklı soru sormak istiyorsunuz. KV Cache ve prompt caching olmadan her soru için o 100 sayfalık içerik baştan işlenmek zorunda kalır. Bu gereksiz yere token yakmak anlamına geliyor.
Bu teknoloji sayesinde uzun context window’larla çalışmak, yani gerçekten büyük dokümanlar, uzun konuşma geçmişleri, karmaşık system promptlar, gerçekçi bir maliyetle mümkün hale geliyor.
LLM’lerin bu kadar hızlı olmasının arkasında sadece daha hızlı GPU’lar yok. KV Cache gibi akıllı mühendislik kararları, bu modelleri günlük kullanıma uygun hale getiren asıl faktörler de önemli bir rol oynuyor.


Yorumlar