1 poin oleh GN⁺ 2023-10-03 | 1 komentar | Bagikan ke WhatsApp
  • 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

 
GN⁺ 2023-10-03
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 seperti Q 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

    • Para penulis menambahkan FAQ di README yang langsung membahas bagian ini: https://github.com/mit-han-lab/streaming-llm#faq
      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.3 menjawab dalam bahasa Inggris
      https://gist.github.com/bluecoconut/9cae9e91fe3b1616ed650a96...
    • Itu benar, tetapi ungkapan “input dengan panjang tak terbatas” mudah menimbulkan salah paham bagi pembaca
      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 batasan

    • Mungkin ujung sekuens bisa di-padding dengan “nilai netral” yang konstan
  • Ini 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

    • Tampaknya mereka sebenarnya menguji sesuatu yang mirip dengan usulan itu
      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
    • Saya memang pertama melihatnya di HN lewat tulisan itu, tetapi seperti juga disebutkan di tulisan tersebut, Softmax + 1 bukan pertama kali diusulkan di sana
      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

    • Ini tampak menarik sebagai titik untuk memasukkan unit tambahan ke model yang sudah dilatih lalu melanjutkan pelatihan atau fine-tuning
      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...

    • Pembaruannya bagus, dan khususnya pertanyaan nomor 3 merangkum banyak poin inti
      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

    • Dalam konteks serupa, akan bagus jika LLM bisa mencerna semua makalah riset yang dapat dibaca dan diaksesnya, meninggalkan “catatan” dalam format yang sesuai untuk indeks, lalu menjawab pertanyaan seolah-olah seseorang telah mempelajari korpus yang terbatas
      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
    • Salah satu caranya adalah, mirip dengan function calling, memungkinkan LLM menghasilkan output yang mengubah cara konteks diurai
      Ini lebih seperti lapisan yang diletakkan di atas LLM daripada mengubah perilaku LLM itu sendiri
    • Bahkan pada context window biasa, yakni non-sliding, saya bertanya-tanya apakah LLM perlu kembali untuk membaca ulang input
      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
    • Rasanya tidak begitu sulit meminta pengguna menaruh instruksi di awal
      Claude 100K meminta pengguna menaruh instruksi di akhir
      Atau bisa memakai model cepat untuk memeriksa apakah ada instruksi di akhir dan memindahkannya ke depan
    • Contoh ini tampak seperti kasus pinggiran yang agak aneh
      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

    • RNN adalah solusi yang benar, tetapi biaya eksekusinya begitu besar hingga sulit ditanggung
      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
    • Salah satu proyek semacam itu adalah RWKV
      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
    • Banyak orang tampaknya percaya demikian
      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
    • Banyak hal yang kita pelajari selama 30 tahun terakhir dari jaringan saraf yang lebih kecil—dengan istilah sekarang, “sangat kecil”—sedang ditinjau kembali pada model-model besar ini
  • Terkait hal ini, Prof. Han dari MIT sedang mengadakan kuliah TinyML terbuka
    https://news.ycombinator.com/item?id=37620507
    https://efficientml.ai