ML araştırması için GPU · KYC'siz kripto ödeme
IteraGPU
Çıkarım belleği · Bağlam ve eşzamanlılık

KV önbelleği için ne kadar bellek ayırmalı?

Tekdüze yoğun bir önbellek için, her katman, KV başı, saklanan konum ve eşzamanlı dizi için iki tensör, K ve V, sayın. Ağırlıkların formatını değil, önbelleğin gerçek formatını kullanın. Bu hesaplama bir bellek konumunun teorik hacmini verir; ne GPU'nun toplam zirvesini, ne gecikmeyi, ne de yanıtların kalitesini öngörür. Ardından ayırma stratejisini kendi yükünüzle doğrulayın.

01 /

Bellekte neyin kaldığını betimleyin

Otoregresif bir üretim sırasında, hâlihazırda işlenmiş token'ların anahtarları ve değerleri sonraki adımlar için saklanabilir. Bu önbellek dikkat katmanlarına aittir. Dolayısıyla hacmi yalnızca parametre sayısına değil, modele ve saklanan geçmişe bağlıdır. Bir konuşmanın bağlamı ayrıca talimatları, önceki mesajları ve uygulama tarafından eklenen belgeleri içerir.

İlk kararınız operasyoneldir: kaç dizi etkin kalmalı ve hangi uzunluğa kadar? İkisi eşzamanlı yürütülen yirmi istekten oluşan bir kuyruk, mutlaka yirmi yerleşik önbelleği temsil etmez. İsteklerin gerçek kabulünü ve üretim tarafından oluşturulan olası ek dizileri kaydedin.

Model revizyonu, dikkat katmanları, KV başları, anahtar ve değerlerin boyutu, dtype'ları ve önbellek stratejisini içeren bir föy hazırlayın. Token'ları tokenizer ve konuşma şablonundan sonra sayın. Karakter cinsinden bir sınır bu ayırmayı betimlemez.

Teknik kaynaklar: Hugging Face — önbelleklerin katman başına çalışması ve biçimi

02 /

KV başlarını kullanın, özellikle GQA ile

Sorgu başlarının Q sayısı ile KV başlarının sayısı farklı olabilir. Klasik çok başlı dikkatte bunlar örtüşür. MQA'da tek bir KV başı paylaşılır; GQA, birden çok Q başını bir KV başı etrafında gruplar. Bu alan mevcut olduğunda yapılandırmada num_key_value_heads değerini okuyun ve mimari açısından anlamını doğrulayın.

Örneğin kırk Q başlığı ve sekiz KV başlığı, KV grubu başına beş Q başlığı oluşturur. Saklanan önbelleğin formülü kırkı değil sekizi kullanır. Bu oran, dikkatin tüm belleğini tanımlamaz: işlemler veya dönüşümler geçici bellek üretebilir.

Halihazırda eğitilmiş bir modelin bellek ihtiyacını azaltmak için bu sayıyı öylece değiştirmeyin. Dikkat şeması, mimarisinin bir parçasıdır. Başlık sayıları farklı iki model, bir kapasite hesabıyla eşdeğer varyantlar haline gelmez; kaliteleri ayrı ayrı değerlendirilmelidir.

Teknik kaynaklar: Hugging Face — LlamaConfig alanları ve MHA, MQA, GQA ayrımı · PyTorch — Q/K/V boyutları ve GQA dikkat kısıtları

03 /

Formülü ve birimlerini ortaya koymak

Tekdüze durumda L katman sayısı, Hkv KV başlığı sayısı, D bunların boyutu, T dizi başına saklanan konum sayısı, B dizi sayısı ve q değer başına bayt sayısıdır. İki çarpanı K ve V'yi hesaba katar. Bu yaklaşım, anahtarların ve değerlerin aynı boyutta ve aynı formatta olduğunu, sıkıştırma veya önek paylaşımı olmadığını varsayar.

Yalnızca nihai sonucu dönüştürün: bir Gio 1.073.741.824 bayta eşittir; bir ondalık GB ise 1.000.000.000 bayta eşittir. Bir yuvarlamanın veya birim değişikliğinin bir farkı gizlemesini önlemek için bayt değerlerini notlarınızda saklayın.

Dolgu olmadan farklı uzunluklar için B × T'yi gerçekte saklanan konumların toplamıyla değiştirin. Heterojen katmanlar için katman katman toplayın. Dolgu içeren yoğun depolama, blok bazlı tahsis veya statik rezervasyon, faydalı token'ları aşabilecek ayrılmış konumların sayılmasını gerektirir.

Teorik KV (bayt) = 2 × L × Hkv × D × T × B × q ; KV (Gio) = KV (bayt) ÷ 1.073.741.824

Teknik kaynaklar: Hugging Face — önbellek tensörlerinin boyutları · NIST — ondalık birimler ve ikili önekler

04 /

İşlenmiş örnek: altı dizi, GPU ölçümü olmadan

Kırk katmanlı, sekiz KV başlıklı ve 128 boyutlu kurgusal bir mimari ele alalım. Değer başına iki baytlık tekdüze bir önbellek varsayalım. Her dizi en fazla 3.072 giriş token'ı ve 1.024 ek token için bir rezervasyon alır, yani 4.096 konumluk bir üst sınır. Bunlar eğitim amaçlı varsayımlardır, bir modelin doğrulanmış yapılandırması değildir.

Konum ve dizi başına hesaplanan maliyet 2 × 40 × 8 × 128 × 2 = 163.840 bayttır. 4.096 konumluk bir dizi bu durumda 671.088.640 bayt, yani 0,625 Gio'ya karşılık gelir. Altı dizi 4.026.531.840 bayt, yani yalnızca önbellek için 3,75 Gio verir.

Saklanan uzunluğu ikiye katlamak bu formülde bu kalemi ikiye katlar. Diğer tüm varsayımlar değişmeden sekiz KV başlığını kırkla değiştirmek bunu beşle çarpar. Bu oranlar gerçek bir modelde hiçbir hızlanma, kalite kaybı veya uyumluluk vaat etmez.

Yalnızca teorik aritmetik: L = 40, D = 128, q = 2 bayt ; ağırlıklar ve geçici bellek hariç.
Diziler BKonumlar TKV başlıklarıHesaplanan baytGiB
14 0968671 088 6400,625
64 09684 026 531 8403,75
68 19288 053 063 6807,5
64 0964020 132 659 20018,75
05 /

Bütçeyi önbellek stratejisine uyarlamak

Dinamik bir önbellek, saklanan konumlarla birlikte büyür. Statik bir önbellek azami bir kapasite ayırır: yalnızca başlangıçta gözlemlenen kısa isteği değil, bu rezervasyonu boyutlandırın. Kayan pencere dikkatinde bazı katmanlar geçmişlerini sınırlayabilir; tam dikkatli katmanlar ayrı bir hesap gerektirir.

Önbelleğin nicemlenmesi ve CPU'ya taşınması, modele ve yazılıma bağlı diğer stratejilerdir. Bunlar depolama, aktarım veya hesaplama kısıtlarını değiştirir. Ağırlıkları nicemlemek, önbelleğin aynı formatta olduğunu kanıtlamaz.

Önbellek sınıfını ve açık parametrelerini not edin. Bir isteğin bitmesi veya iptal edilmesinden sonra konumların serbest bırakıldığını da doğrulayın. Kısa ve uzun dizileri karıştıran bir yük için tekdüze azami rezervasyon, tek başına faydalı içeriklerin toplamından daha ağır olabilir.

Teknik kaynaklar: Hugging Face — dinamik, statik, nicemlenmiş ve taşınmış önbellekler

06 /

Temsili bir yükü adım adım doğrulamak

Üç durum oluşturun: olağan giriş, beklenen uzun giriş ve izin verilen azami eşzamanlı istek sayısı. Modeli, tokenizer'ı, şablonu, üretim sınırını ve bitiş kuralını sabitleyin. Aynı anda yalnızca bir boyutu değiştirin; kısaltılmış bir yanıt veya kırpılmış bir belge, yerine getirilen işi değiştirir.

Yüklemeyi, girdinin ilk işlenmesini ve üretimi ayrı ayrı ölçün. Cihazı zamanlanan aşamalar etrafında senkronize edin, başlangıçtaki bellek seviyelerini ve zirveleri saklayın. Bellek yöntemi, allocated ile reserved değerlerinin neden toplanmadığını ve maksimumlarının farkının neden önbelleği tek başına ayırmadığını açıklar.

Kontrolünüz test edilmiş bir üst sınıra ve kabul edilebilir çıktılara ulaşmalıdır: tamamlanan isteklerin kimlikleri, hatalar, üretilen uzunluk ve kalite kriteri. Kısa bir girdiyle tamamlanan bir çalıştırma, maksimum eşzamanlılığı doğrulamaz. Bitmeden önce oluşan bir bellek hatası, tam bir çalıştırmanın ihtiyacının ölçümü sayılmaz.

Teknik kaynaklar: PyTorch — seçilen cihazda işin senkronizasyonu · PyTorch — bellek sayaçlarının kapsamı

07 /

Seçimi saptıran hataları eleyin

Hesaplanan önbelleği toplam GPU kapasitesi olarak görmeyin. Ağırlıkların, geçici aktivasyonların, saklanan çıktıların ve yazılımın analizini de ekleyin. Bu hacmi otomatik olarak kart sayısına bölmeyin: katmanların veya başlıkların yerleşimi gerçekten yapılandırılmalı ve her cihazda doğrulanmalıdır.

IteraGPU Lab not defteri, dikkat içermeyen küçük bir yoğun ağ üzerinde bir enstrümantasyon alıştırmasıdır. Bellek aşamalarını okumaya yardımcı olur; context parametresi bu KV hesabını doğrulamaz. Kendi modelinizin denemesini hazırlamak için yük fiche'ini ve çıkarım klasörünü kullanın.

Tekliflerin kapasitelerini ancak aritmetik hacmi, gerçekte gözlenen maksimumu ve henüz test edilmemiş durumları ayırdıktan sonra karşılaştırın. Kiralama paketi çalışma pencerenizi düzenler; hiçbir bağlam uzunluğunu veya üretim hızını garanti etmez.

  • Q başlıkları ile KV başlıklarını karıştırmak: mimarinin yapılandırmasını yeniden ele alın.
  • Yalnızca prompt'u bütçelemek: üretimi ve fiili rezervasyonu dahil edin.
  • "4 bit ağırlık" ifadesini "4 bit önbellek" olarak okumak: her iki formatı da not edin.
  • Eşzamanlılığı unutmak: gerçekten yerleşik dizileri sayın.
  • Kartlar arasında ortak bellek vaat etmek: gerçek yerleşimi doğrulayın.

Pratik sorular

KV önbelleğini yalnızca parametre sayısından bilebilir miyim?

Hayır. Ayrıca dikkat katmanlarının mimarisi, KV başlıkları, boyutları, önbellek formatı, saklanan konumlar ve yerleşik diziler gerekir. Benzer büyüklükteki iki model farklı KV bütçeleri gerektirebilir.

Statik bir önbellek yalnızca sorgumun uzunluğu kadar mı tüketir?

Ayrılan kapasitesinin boyutlandırılması gerekir. Kısa bir sorgu bu maksimum tahsisin çıkarılmasına izin vermez. Önbellek parametrelerini not edin ve gerçekte oluşturulan yapılandırmayı ölçün.

Formülün sonucu bir kart seçmek için yeterli mi?

Yalnızca bildirilen varsayımlara göre önbelleği tahmin eder. Seçim ayrıca diğer bellek kalemlerini, yazılım uyumluluğunu ve temsili bağlam, eşzamanlılık ve kaliteyle tam bir denemeyi hesaba katmalıdır.