- StreamingLLM adalah framework untuk menerapkan LLM pada aplikasi streaming input berdurasi tak terbatas tanpa mengorbankan efisiensi dan performa
- Menangani masalah pada percakapan multi-putaran yang membutuhkan interaksi panjang, di mana cache status Key/Value token sebelumnya memakai memori besar, dan LLM umum gagal menggeneralisasi ke teks yang lebih panjang daripada panjang sekuens pelatihannya
- Window attention yang hanya melakukan cache pada KV belakangan ini gagal ketika panjang teks melebihi ukuran cache, dan StreamingLLM secara signifikan memulihkan performa window attention melalui attention sink yang mempertahankan KV token awal
- Memungkinkan LLM yang dilatih dengan attention window berdimensi terbatas untuk menggeneralisasi ke panjang sekuens tak terbatas tanpa fine-tuning, serta melakukan language modeling yang stabil dan efisien hingga lebih dari 4 juta token pada Llama-2, MPT, Falcon, dan Pythia
- Dalam pengaturan streaming, menunjukkan speedup hingga 22,2x dibanding baseline sliding window recomputation
- Tidak memperluas context window; hanya mempertahankan token terbaru dan attention sink, sementara token di tengah dibuang
- Jika Llama-2 dipra-latih dengan context window 4096 token, maka ukuran cache maksimum Llama-2 pada StreamingLLM juga 4096
- Jika buku panjang diberikan sebagai input, model hanya mengenali token terbaru sehingga hanya dapat merangkum bagian kesimpulan
- Kasus penggunaan yang cocok adalah aplikasi streaming yang perlu terus berjalan dan harus menghindari ketergantungan pada data masa lalu atau penggunaan memori besar, dengan contoh seperti percakapan multi-putaran dan asisten harian berbasis LLM
- Bersifat ortogonal terhadap metode perluasan konteks terbaru dan dapat diintegrasikan, dan context extension dalam konteks StreamingLLM berarti kemungkinan menyimpan lebih banyak token terbaru dengan ukuran cache yang lebih besar
- Contoh eksekusi adalah
examples/run_streaming_llama.py --enable_streaming, dan pengaturan lingkungan menggunakan Python 3.8,torch,transformers==4.33.0,accelerate,datasets,evaluate,wandb,scikit-learn,scipy,sentencepiece - Kode inti untuk Llama-2, MPT, Falcon, dan Pythia sudah tersedia secara publik, begitu juga kode evaluasi perplexity dan demo Streaming Llama Chatbot, sementara dataset StreamEval dan kode evaluasinya belum dipublikasikan
1 komentar
Pendapat Hacker News
Sepertinya pekerjaan ini disalahpahami sebagai sesuatu seperti full dense attention
Yang dibahas di sini bukan membuat model bisa melihat konten yang jauh, melainkan lebih ke peningkatan efisiensi: mempertahankan perplexity dengan memakai ulang cache, alih-alih menghitung ulang sliding window setiap kali dan membayar biaya L² sebanyak T kali
Pengujiannya juga diukur dengan menyambung seperti
Q A Q A Q A Q A..., bukan membuatnya mencari jawaban yang muncul jauh kemudian sepertiQ Q Q Q A A A A...Pengukuran perplexity berarti menghasilkan “teks yang layak dibaca”, yaitu kalimat yang masuk akal secara lokal; itu bukan bukti bahwa model “mengekstrak” sesuatu dari celah segitiga besar yang tidak terjangkau attention
Jika diberi sebuah buku lalu diminta menuliskan kata pertama tiap paragraf, atau merangkum tiap bab menjadi satu kalimat, sepertinya akan gagal
Setelah saya uji sendiri, tampaknya ini tidak memperluas panjang konteks, dan eksekusinya memang cukup cepat
Memakai sekitar 35GB memori A100, dan penggunaan memorinya tetap konstan sepanjang eksekusi
Saya mengambil sebuah buku dari Project Gutenberg, membaginya per paragraf, memasukkannya satu per satu, meminta model menjawab “okay” untuk tiap paragraf, lalu bertanya di akhir; jawabannya sepenuhnya berhalusinasi
Sebagai catatan, selama sekitar 10 menit mengutak-atiknya, saya juga kesulitan membuat model default
lmsys/vicuna-13b-v1.3menjawab dalam bahasa Inggrishttps://gist.github.com/bluecoconut/9cae9e91fe3b1616ed650a96...
Meski begitu ini pekerjaan yang menarik, dan intinya tampak pada temuan di Figure 2
Dua layer pertama menunjukkan pola lokal yang lebih memperhatikan token terbaru, tetapi setelah melewati bagian di bawahnya, model memberi perhatian kuat pada token awal di semua layer dan head
Para penulis menyebutnya “attention sinks”; karena Softmax membuat jumlah skor attention harus menjadi 1 meskipun token itu tidak penting secara semantik, sisa attention harus pergi ke suatu tempat
Penjelasannya, dalam model bahasa autoregresif, token awal terlihat oleh hampir semua token setelahnya, sehingga mudah dipelajari untuk berperan sebagai sink seperti ini
StreamingLLM lebih mirip “hack” untuk mengoreksi perilaku aneh yang muncul saat memotong attention window LLM, dan karena ini contoh retakan dalam penggunaan Softmax, saya jadi berpikir fungsi lain mungkin lebih baik jika kita menginginkan LLM yang fleksibel terhadap panjang konteks
Sekilas, ini tampak terlalu bagus sampai-sampai meragukan apakah benar, tetapi kualitas pekerjaannya terlihat cukup baik dan tekniknya juga mengejutkan sederhana
Idenya adalah menerapkan attention di setiap layer hanya pada token pertama dan sliding context window, lalu mengabaikan token di antaranya
Ini tampaknya berarti tiap layer mendorong informasi relevan sedikit demi sedikit ke bagian belakang sekuens, agar sliding attention window di ujung layer teratas bisa melihatnya
Namun jika cakupan semua sliding window tidak cukup untuk menyambungkan seluruh sekuens, informasi penting mungkin tidak bisa semuanya diteruskan ke depan
Misalnya, jika semua window memiliki panjang yang sama dan
kedalaman model × panjang window < panjang sekuens, akan muncul batasanIni tampaknya dimungkinkan oleh pengamatan bahwa Softmax harus membuat jumlahnya menjadi 1
Dari pandangan cepat, model cenderung memakai token pertama sebagai placeholder ketika tidak perlu memperhatikan token sebelumnya
Pertama kali saya melihat masalah ini adalah dalam tulisan HN Evan Miller, yang mengatakan bahwa memaksa head attention untuk selalu membagi seluruh attention ke token-token sebelumnya itu keliru, dan seharusnya menambahkan 1 pada penyebut Softmax agar memungkinkan “tidak memperhatikan”
Bagus bahwa mereka memanfaatkan pengamatan ini tanpa retraining, dan saya juga penasaran bagaimana model akan berbeda jika mengikuti usulan Evan
[2] https://news.ycombinator.com/item?id=36851494
Mereka melatih model dengan token sink khusus yang semua nilainya 0, tetapi karena token-token awal lain tetap dipakai sebagai sink, kesimpulannya tampak bahwa memiliki token sink khusus lebih baik
Sejauh yang saya tahu, itu belum pernah benar-benar membuat performa menjadi lebih baik
Saat memanipulasi attention window setelah pelatihan, Softmax + 1 mungkin lebih cocok, tetapi saya tidak tahu apakah ada yang sudah mengujinya dalam skala besar
Menambahkan memori cache attention adalah solusi yang sangat menarik untuk masalah ini
Beberapa hari lalu juga muncul paper yang membuat pengamatan terkait pada Vision Transformer
Model Transformer tampaknya memilih token untuk menyimpan informasi global, dan terlihat membutuhkan semacam “token untuk berpikir”
Jika token tertentu untuk tujuan ini disediakan, performa sedikit meningkat, dan visualisasi untuk penjelasannya juga cukup menarik
[0] https://arxiv.org/pdf/2309.16588.pdf
Dalam fine-tuning, parameter model asli bisa dibekukan, dan hanya parameter yang masuk dan keluar dari unit cache “tuning” baru yang disesuaikan
Dengan begitu, set unit tuning yang berbeda bisa ditukar atau dipakai bersama
Semacam mencampur super-prompt, seperti unit penghindar kata kasar + unit istilah tertentu + unit menulis ringkas
Jika jumlah parameter baru cukup kecil, meski membutuhkan lebih banyak memori, tuning yang cepat dan efektif lewat optimisasi orde tinggi juga mungkin dilakukan
Kita juga bisa memikirkan cara menambah panjang sekuens dan jumlah unit bersama-sama selama pelatihan
Untuk sekuens pendek hanya memakai beberapa unit, lalu saat panjang sekuens pelatihan bertambah, unit ditambahkan dan pelatihan dilanjutkan
Alih-alih jadwal arbitrer, perluasan cache mungkin juga bisa dikendalikan dengan analisis performa atau gradien
Para penulis telah mengunggah FAQ, yang bisa membantu merapikan sebagian kebingungan: https://github.com/mit-han-lab/streaming-llm/blob/main/READM...
Untuk pertanyaan “Bisakah teks panjang seperti buku dimasukkan ke StreamingLLM untuk diringkas?”, mereka menjawab bahwa teks panjang memang bisa dimasukkan, tetapi karena model hanya mengenali token terbaru, jika sebuah buku dimasukkan, model hanya dapat merangkum paragraf-paragraf terakhir, sehingga mungkin tidak terlalu berguna
Dengan kata lain, ini bukan memperluas context window LLM atau memperkuat memori jangka panjang; kekuatan StreamingLLM ada pada menghasilkan teks yang lancar dari token terbaru tanpa menyegarkan cache
Saya bisa saja keliru, tetapi sepertinya ini bukan teknologi yang membuat LLM dapat merujuk ke konten di luar panjang yang dilatih, seperti yang dibayangkan orang-orang
Kemungkinan ini lebih dekat ke masalah mempertahankan performa model pada teks panjang, tepatnya performa untuk konten yang masih berada di dalam context window
Penjelasannya adalah model dilatih untuk menaruh semacam beban pada attention token-token awal teks, dan ketika itu menghilang keluar dari window, model menjadi rusak; tetapi saya tidak benar-benar yakin mengapa demikian
Kalau bukan input instruksi, rasanya teks di tengah juga sama baiknya dengan teks awal
Saya penasaran bagaimana teknik sliding window seperti ini menangani kasus ketika instruksi yang tidak terduga hanya muncul di bagian akhir
Misalnya, bayangkan sebuah buku dimasukkan ke model dan kalimat terakhirnya berisi instruksi “kembalikan jumlah huruf m pada input sebelumnya”; manusia akan menghela napas lalu membaca ulang sambil menghitung, tetapi LLM tidak punya kemampuan untuk kembali dan membaca ulang input
Dalam contoh ini, meskipun kita mengabaikan keterbatasan LLM dalam menghitung huruf itu sendiri, agar benar-benar menyelesaikannya tampaknya LLM harus bisa melakukan loop dan jump secara arbitrer
Tentu saja itu akan memunculkan masalah-masalah yang sepenuhnya baru, dan mungkin membutuhkan arsitektur yang sama sekali baru
Caranya adalah mengubah pertanyaan menjadi kata kunci terkait, mencari, lalu menelusuri kembali isinya untuk menemukan informasi relevan
Jika ada prapemrosesan yang diperlukan, LLM yang dapat “pergi meneliti secukupnya lalu menjawab” bisa sangat kuat
Selama kurang lebih 10.000 tahun terakhir, kita telah memperbaiki teknologi pengelolaan pengetahuan agar melampaui kapasitas dan waktu otak individu, jadi model bahasa juga seharusnya memanfaatkan metode riset nyata dan pencernaan awal, bukan sekadar pencarian Bing sederhana
Memori jangka pendek tidak perlu mengingat potongan kode tertentu melakukan apa; cukup memberi tag saat membaca, lalu bergantung pada indeks tag bersama yang dapat diskalakan
Namun semakin dipikirkan, ini terasa mirip dengan pretraining LLM pada umumnya, dan indeks pengetahuannya terasa seperti bongkahan besar bobot LLM
Ini lebih seperti lapisan yang diletakkan di atas LLM daripada mengubah perilaku LLM itu sendiri
Mungkin saya salah paham, tetapi dalam kasus ini bukankah hidden state menyelesaikan masalah pencarian?
Karena seluruh input bagaimanapun harus diserap sebelum menjawab, tampaknya selain attention tidak banyak pengaruh apakah instruksi berada di depan atau di akhir
Claude 100K meminta pengguna menaruh instruksi di akhir
Atau bisa memakai model cepat untuk memeriksa apakah ada instruksi di akhir dan memindahkannya ke depan
Saya tidak yakin model saat ini pun bisa melakukan ini pada input pendek
Dengan sedikit bercanda, LLM benar-benar berusaha keras menemukan kembali RNN, dan jika diberi alatnya, saya rasa pada akhirnya mereka akan melakukannya
Dilihat dari sisi lain, model Transformer mencoba memprediksi bagian mana dari jaringan RNN yang “layak dipertahankan” ketika ada keterbatasan sumber daya
Transformer saat ini menggunakan heuristik sederhana, dan hasil ini membuat heuristik tersebut lebih baik
Seperti banyak masalah NP-complete, mungkin ada aproksimasi yang berguna meskipun tidak sempurna, dan Transformer menunjukkan bahwa hal itu juga mungkin pada jaringan saraf
Untuk sementara waktu posisinya berada di sekitar tengah pada leaderboard open source, jadi ini pendekatan yang cukup sah, hanya saja tidak sedang tren
[1]: https://huggingface.co/blog/rwkv
Keunggulan utama Transformer dibanding RNN adalah paralelisasi pelatihan
RNN mengalami vanishing gradient selama pelatihan, dan juga sulit meningkatkan utilisasi keseluruhan sehingga membutuhkan batch besar, membuatnya rumit
Keberadaan model seperti RWKV menunjukkan bahwa mungkin ada masa depan di mana model dilatih seperti Transformer dan melakukan inferensi seperti RNN
Terkait hal ini, Prof. Han dari MIT sedang mengadakan kuliah TinyML terbuka
https://news.ycombinator.com/item?id=37620507
https://efficientml.ai