StreamingLLM - attention sink ile verimli akış tabanlı dil modeli uygulaması
(github.com/mit-han-lab)- StreamingLLM, verimlilikten ve performanstan ödün vermeden LLM'leri sonsuz uzunlukta girdi akışı uygulamalarına dağıtmak için bir framework
- Uzun etkileşim gerektiren çok turlu diyaloglarda önceki token'ların Key/Value durumlarını önbelleğe almanın büyük bellek tüketmesine ve genel LLM'lerin eğitim dizi uzunluğundan daha uzun metinlere genelleme yapamaması sorunlarına odaklanıyor
- Yalnızca son KV'leri önbelleğe alan güncel window attention yaklaşımları, metin uzunluğu önbellek boyutunu aştığında başarısız olurken StreamingLLM, başlangıç token'larının KV'sini koruyan bir attention sink ile window attention performansını büyük ölçüde geri kazanıyor
- Sonlu uzunlukta attention window ile eğitilmiş LLM'lerin fine-tuning olmadan sonsuz dizi uzunluğuna genelleme yapmasını sağlıyor; Llama-2, MPT, Falcon ve Pythia üzerinde 4 milyon token'ın üzerinde kararlı ve verimli dil modelleme gerçekleştiriyor
- Akış senaryosunda sliding window recomputation baseline'a kıyasla en fazla 22.2 kat hızlanma sağlıyor
- Context window'u genişletmiyor; yalnızca en yeni token'ları ve attention sink'i tutup ortadaki token'ları atıyor
- Llama-2, 4096 token context window ile önceden eğitildiyse StreamingLLM'deki Llama-2 için azami önbellek boyutu da 4096 oluyor
- Uzun bir kitap girdi olarak verilirse model yalnızca en yeni token'ları bildiğinden sadece sonuç bölümünü özetleyebilir
- Uygun kullanım senaryoları, sürekli çalışması gereken ve geçmiş veriye bağımlılığı veya yüksek bellek kullanımını kaçınması gereken akış uygulamaları; örnek olarak çok turlu diyaloglar ve LLM tabanlı günlük asistanlar veriliyor
- Son dönem context extension yöntemleriyle ortogonal ve entegre edilebilir; StreamingLLM bağlamında context extension, daha büyük önbellek boyutuyla daha fazla yeni token saklama olasılığı anlamına geliyor
- Çalıştırma örneği
examples/run_streaming_llama.py --enable_streaming; ortam kurulumu için Python 3.8,torch,transformers==4.33.0,accelerate,datasets,evaluate,wandb,scikit-learn,scipy,sentencepiecekullanılıyor - Temel kodlar Llama-2, MPT, Falcon ve Pythia dahil yayımlanmış durumda; perplexity değerlendirme kodu ve Streaming Llama Chatbot demosu da açık, StreamEval veri kümesi ile değerlendirme kodu ise henüz yayımlanmadı
1 yorum
Hacker News yorumları
Bu çalışmanın tam yoğun attention gibi bir şey sanıldığı görülüyor.
Burada anlatılan, uzaktaki içeriği görebilmek değil; kayan pencereyi her seferinde yeniden hesaplayıp L² maliyetini T kez ödemek yerine önbelleği yeniden kullanarak perplexity değerini koruyan bir verimlilik iyileştirmesine daha yakın.
Test de
Q A Q A Q A Q A...şeklinde peş peşe ekleyerek ölçülmüş;Q Q Q Q A A A A...gibi çok sonra gelen yanıtı buldurmaya çalışılmamış.Perplexity ölçümü, “okunabilir metin”, yani yerel olarak makul cümleler ürettiği anlamına gelir; attention’ın ulaşmadığı büyük üçgen boşluktan bir şey “çıkardığının” kanıtı değildir.
Bir kitap verip her paragrafın ilk kelimesini yazmasını ya da her bölümü tek cümleyle özetlemesini isterseniz muhtemelen başarısız olur.
Kendim test ettiğimde bağlam uzunluğu genişletmesi sağlıyor gibi görünmedi; çalışması ise oldukça hızlıydı.
A100 belleğinde yaklaşık 35 GB kullandı ve kullanım çalışma boyunca sabit kaldı.
Project Gutenberg’den bir kitap alıp paragraf bazında böldüm, her birini tek tek verip her paragrafta “okay” diye yanıtlamasını istedim; en sonda soru sorduğumda yanıtı tamamen halüsinasyondu.
Bu arada, yaklaşık 10 dakika kurcalarken varsayılan model olan
lmsys/vicuna-13b-v1.3’ün İngilizce yanıt vermesini sağlamakta bile pek başarılı olamadım.https://gist.github.com/bluecoconut/9cae9e91fe3b1616ed650a96...
Yine de ilginç bir çalışma ve asıl nokta Figure 2’deki keşif gibi görünüyor.
İlk iki katman, yeni token’lara daha çok odaklanan yerel bir desen gösteriyor; ancak daha aşağıdan geçtikten sonra model, tüm katmanlarda ve head’lerde başlangıç token’larına güçlü biçimde dikkat ediyor.
Yazarlar bunlara “attention sinks” diyor; anlamsal olarak önemli olmasalar bile Softmax nedeniyle attention puanlarının toplamı 1 olmak zorunda olduğundan, artan attention’ın bir yere gitmesi gerektiğini düşünüyorlar.
Açıklamaya göre, otoregresif dil modellerinde başlangıç token’ları neredeyse tüm sonraki token’lar tarafından görülebildiği için bu sink rolünü üstlenmek üzere öğrenilmeleri kolaylaşıyor.
StreamingLLM, LLM’in attention penceresi kesilip kullanıldığında ortaya çıkan bu garip davranışı düzelten bir “hack”e daha yakın; Softmax kullanımındaki bir çatlağın ortaya çıktığı bir örnek olduğu için, bağlam uzunluğu konusunda esnek LLM’ler isteniyorsa başka bir fonksiyon daha iyi olabilir diye düşündürüyor.
İlk bakışta gerçek olamayacak kadar iyi görünüyor, ama çalışmanın kalitesi fena değil ve teknik de şaşırtıcı derecede basit.
Fikir, her katmanda yalnızca ilk token ile kayan bağlam penceresine attention uygulamak, aradaki token’ları ise yok saymak.
Bu, her katmanın ilgili bilgiyi dizinin arka tarafına doğru azar azar iterek en üst katmanın sonundaki kayan attention penceresinin onu görebilmesini sağladığı anlamına geliyor gibi.
Ancak tüm kayan pencerelerin kapsadığı aralık, tüm diziyi birbirine bağlamaya yetmezse önemli bilgilerin tamamı öne aktarılamayabilir.
Örneğin tüm pencere uzunlukları aynı olduğunda
model derinliği × pencere uzunluğu < dizi uzunluğuise bir sınır ortaya çıkar.Bu, Softmax’ın toplamı 1 yapmak zorunda olduğu gözlemi sayesinde mümkün olmuş gibi görünüyor.
Hızlıca bakınca modelin önceki token’lara dikkat etmesi gerekmediğinde ilk token’ı yer tutucu gibi kullanma eğiliminde olduğu görülüyor.
Bu sorunu ilk kez Evan Miller’ın HN yazısında görmüştüm; attention head’lerini önceki token’lara tüm attention’ı dağıtmak zorunda bırakmanın yanlış olduğu, Softmax paydasına 1 ekleyerek “dikkat etmemeyi” mümkün kılmak gerektiği anlatılıyordu.
Bu gözlemi yeniden eğitim yapmadan kullanmaları güzel; Evan’ın önerisini izleselerdi modelin nasıl farklılaşacağını da merak ediyorum.
[2] https://news.ycombinator.com/item?id=36851494
Tüm değerleri 0 olan özel bir sink token’ı ile modeli eğitmişler; buna rağmen diğer başlangıç token’ları da sink olarak kullanılmaya başladığı için, özel bir sink token’ının olmasının daha iyi olduğu sonucuna varmış görünüyorlar.
Bildiğim kadarıyla pratikte performansı daha iyi yaptığı olmadı.
Eğitim sonrası attention penceresini manipüle ederken Softmax + 1 daha uygun olabilir, ama bunu büyük ölçekte deneyen biri var mı bilmiyorum.
Attention önbelleği belleği eklemek bu sorun için çok ilginç bir çözüm.
Birkaç gün önce Vision Transformer’da ilgili bir gözlem yapan bir makale de çıktı.
Transformer modelleri küresel bilgiyi saklayacak token’ı seçiyor gibi görünüyor ve bir tür “düşünme token’ı”na ihtiyaç duyuyor gibi.
Bu amaç için belirli bir token sağlamak performansı biraz artırıyor ve açıklama amaçlı görselleştirmeler de oldukça ilginç çıkıyor.
[0] https://arxiv.org/pdf/2309.16588.pdf
İnce ayarda orijinal model parametreleri dondurulup yalnızca yeni “tuning” önbellek birimlerine giren ve çıkan parametreler ayarlanabilir.
Böylece farklı tuning birimi setleri değiştirilebilir veya birlikte kullanılabilir.
Argo kaçınma birimi + belirli terminoloji birimi + kısa yazma birimi gibi, bir tür süper prompt’u karıştırıp kullanma yöntemi.
Yeni parametre sayısı yeterince azsa bellek daha çok kullanılır, ama yüksek mertebeli optimizasyon ile hızlı ve etkili tuning de mümkün olabilir.
Eğitim sırasında dizi uzunluğunu ve birim sayısını birlikte artırma yöntemi de düşünülebilir.
Kısa dizilerde yalnızca birkaç birim kullanıp, eğitim dizisi uzunluğunu artırırken birimler eklemek ve eğitime devam etmek gibi.
Rastgele bir program yerine performans veya gradyan analiziyle önbellek genişletmeyi kontrol etmek de mümkün olabilir.
Yazarlar bir SSS yayımladı; kafa karışıklığını bir ölçüde giderebilir: https://github.com/mit-han-lab/streaming-llm/blob/main/READM...
“Kitap gibi uzun bir metni StreamingLLM'e verip özetletebilir miyiz?” sorusuna, uzun metin verilebileceğini ama model yalnızca en yeni token'ları algıladığı için bir kitap verildiğinde sadece son paragrafları özetleyebileceğini ve bunun pek faydalı olmayabileceğini söylüyor
Yani bu, LLM'in context window'unu genişletmek ya da uzun süreli belleği güçlendirmek değil; StreamingLLM'in güçlü yanı, cache'i yenilemeden son token'lardan akıcı metin üretebilmesinde
Yanılıyor olabilirim ama bu, insanların düşündüğü gibi LLM'in eğitimde gördüğü uzunluğun ötesindeki içeriğe başvurmasını sağlayan bir teknik gibi görünmüyor
Daha çok uzun metinlerde model performansını koruma sorununa, daha doğrusu hâlâ context window içinde bulunan içerik üzerindeki performansa benziyor
Açıklamaya göre model, metnin ilk token'larının attention'ına bir tür yük koyacak şekilde eğitiliyor ve bu token'lar pencerenin dışına çıkınca bozuluyor; ama bunun neden böyle olduğundan emin değilim
Bir komut girdisi değilse, orta kısımdaki metin de başlangıç metni kadar iyi değil midir diye düşünüyorum
Bu tür sliding window tekniklerinin, beklenmedik bir komut yalnızca sonda gelirse bunu nasıl ele aldığını merak ediyorum
Örneğin modele bir kitap verdiğimizi ve son cümlede “önceki girdide m harfinin sayısını döndür” komutu olduğunu varsayalım; insan iç çekip yeniden okuyarak sayar, ama LLM'in girdiye geri dönüp yeniden okuma yeteneği yok
Bu örnekte harf saymanın kendisinin LLM sınırlarını görmezden gelsek bile, gerçekten çözmek için LLM'in keyfi olarak döngü kurup atlayabilmesi gerekiyor gibi
Elbette bu da tamamen yeni sorunlar doğurur ve belki de baştan yeni bir mimari gerektirir
Soru ilgili anahtar kelimelere çevrilir, arama yapılır, sonra ilgili bilgiyi bulmak için içerik yeniden gözden geçirilir
Gerekli ön işleme varsa, “git yeterince araştır, sonra cevap ver” şeklinde çalışan bir LLM çok güçlü olabilir
Yaklaşık son 10 bin yıldır bireysel beynin kapasitesini ve zamanını aşmak için bilgi yönetimi tekniklerini geliştiriyoruz; dolayısıyla dil modellerinin de basit bir Bing araması değil, gerçek araştırma yöntemlerinden ve ön sindirimden yararlanmasını sağlamalıyız
Kısa süreli belleğin hangi kod parçasının ne yaptığını hatırlamasına gerek yok; okurken etiket koyup ölçeklenebilir, paylaşımlı bir etiket dizinine dayanabilir
Ancak düşündükçe bu, genel LLM ön eğitimine benziyor ve bilgi dizini de dev bir LLM ağırlıkları yığınıymış gibi hissettiriyor
Bu, LLM'in kendi davranışını değiştirmekten ziyade onun üstüne konan bir katmana daha yakın
Yanlış anlamış olabilirim ama bu durumda hidden state arama sorununu çözmüyor mu?
Yanıtlamadan önce zaten tüm girdiyi özümsemesi gerektiği için, komutun başta mı sonda mı olduğunun attention dışında büyük bir etkisi yok gibi görünüyor
Claude 100K kullanıcıdan komutu sona koymasını istiyor
Ya da hızlı bir modelle sonda komut olup olmadığı kontrol edilip başa taşınabilir
Mevcut modelin bunu kısa girdilerde bile yapıp yapamadığından pek emin değilim
Biraz şaka yollu söylersek, LLM'ler RNN'i yeniden icat etmek için gerçekten çok uğraşıyor ve araçlar verilirse sonunda bunu yapacaklar gibi
Başka bir açıdan bakarsak Transformer modelleri, kaynak kısıtları varken bir RNN ağının hangi kısmının “korunmaya değer” olduğunu tahmin etmeye çalışıyor
Mevcut Transformer basit bir sezgisel yöntem kullanıyor ve bu sonuç o sezgiyi daha iyi hâle getiriyor
Pek çok NP-complete problemde olduğu gibi, mükemmel isabetli olmasa da işe yarar yaklaşımlar olabilir; Transformer da bunun sinir ağlarında mümkün olduğunu gösteriyor
Açık kaynak liderlik tablolarında bir süre orta sıralarda yer aldı; dolayısıyla oldukça meşru bir yaklaşım, sadece popüler değil
[1]: https://huggingface.co/blog/rwkv
Transformer'ın RNN'e göre başlıca avantajı eğitimin paralelleştirilebilmesi
RNN'lerde eğitim sırasında gradient kaybolması yaşanıyor; ayrıca genel kullanım oranını yükseltmek de zor olduğundan büyük batch'ler gerekiyor, bu da işleri zorlaştırıyor
RWKV gibi modellerin varlığı, Transformer gibi eğitilip RNN gibi çıkarım yapan bir geleceğin mümkün olabileceğini gösteriyor
Bununla bağlantılı olarak MIT'den Prof. Han herkese açık bir TinyML dersi yürütüyor
https://news.ycombinator.com/item?id=37620507
https://efficientml.ai