Teknik Tingkat Lanjut untuk Meningkatkan Throughput LLM

Diterbitkan: 2024-04-02
Daftar Isi ditampilkan
Tantangan dalam Mencapai Throughput Lebih Tinggi untuk LLM
Persyaratan Memori
Regresi otomatis & operasi terikat memori
Solusi Inovatif untuk Mengatasi Tantangan Throughput
Pengelompokan terus menerus
Perhatian Halaman
Perhatian kilat
Fitur Utama Perhatian Flash:
Studi Kasus – Mengoptimalkan Inferensi dengan Decoding Spekulatif
Kesimpulan

Di dunia teknologi yang serba cepat, Large Language Model (LLM) telah menjadi pemain kunci dalam cara kita berinteraksi dengan informasi digital. Alat canggih ini dapat menulis artikel, menjawab pertanyaan, dan bahkan mengadakan percakapan, namun alat-alat tersebut bukannya tanpa tantangan. Karena kami menuntut lebih banyak dari model-model ini, kami menghadapi rintangan, terutama ketika membuat model-model tersebut bekerja lebih cepat dan efisien. Blog ini berisi tentang mengatasi rintangan tersebut secara langsung.

Kami mempelajari beberapa strategi cerdas yang dirancang untuk meningkatkan kecepatan pengoperasian model ini, tanpa kehilangan kualitas keluarannya. Bayangkan mencoba meningkatkan kecepatan mobil balap sambil memastikan mobil tersebut tetap dapat melewati tikungan sempit dengan sempurna—itulah yang ingin kami capai dengan model bahasa besar. Kita akan melihat metode seperti Continuous Batching, yang membantu memproses informasi dengan lebih lancar, dan pendekatan inovatif seperti Paged dan Flash Attention, yang membuat LLM lebih penuh perhatian dan lebih cepat dalam penalaran digitalnya.

Jadi, jika Anda penasaran untuk melampaui batas kemampuan raksasa AI ini, Anda berada di tempat yang tepat. Mari kita jelajahi bersama bagaimana teknik-teknik canggih ini membentuk masa depan LLM, menjadikannya lebih cepat dan lebih baik dari sebelumnya.

Tantangan dalam Mencapai Throughput Lebih Tinggi untuk LLM

Mencapai throughput yang lebih tinggi dalam Model Bahasa Besar (LLM) menghadapi beberapa tantangan besar, yang masing-masing menjadi hambatan bagi kecepatan dan efisiensi pengoperasian model ini. Salah satu kendala utama adalah kebutuhan memori yang diperlukan untuk memproses dan menyimpan sejumlah besar data yang digunakan oleh model ini. Ketika LLM tumbuh dalam kompleksitas dan ukuran, permintaan akan sumber daya komputasi semakin meningkat, sehingga sulit untuk mempertahankan, apalagi meningkatkan, kecepatan pemrosesan.

Tantangan besar lainnya adalah sifat auto-regresif LLM, terutama pada model yang digunakan untuk menghasilkan teks. Artinya, keluaran pada setiap langkah bergantung pada langkah sebelumnya, sehingga menciptakan persyaratan pemrosesan berurutan yang secara inheren membatasi seberapa cepat tugas dapat dijalankan. Ketergantungan berurutan ini sering kali mengakibatkan kemacetan, karena setiap langkah harus menunggu hingga langkah sebelumnya selesai sebelum dapat dilanjutkan, sehingga menghambat upaya untuk mencapai throughput yang lebih tinggi.

Selain itu, keseimbangan antara akurasi dan kecepatan juga sangat rumit. Meningkatkan throughput tanpa mengorbankan kualitas output adalah hal yang sulit, memerlukan solusi inovatif yang dapat menavigasi lanskap kompleks efisiensi komputasi dan efektivitas model.

Tantangan-tantangan ini menjadi latar belakang kemajuan dalam pengoptimalan LLM, mendorong batas-batas dari apa yang mungkin dilakukan dalam bidang pemrosesan bahasa alami dan seterusnya.

Persyaratan Memori

Fase dekode menghasilkan satu token pada setiap langkah waktu, namun setiap token bergantung pada tensor kunci dan nilai dari semua token sebelumnya (termasuk tensor KV token masukan yang dihitung pada pra-pengisian, dan setiap tensor KV baru yang dihitung hingga langkah waktu saat ini) .

Oleh karena itu, untuk meminimalkan penghitungan yang berlebihan setiap saat dan untuk menghindari penghitungan ulang semua tensor ini untuk semua token pada setiap langkah waktu, dimungkinkan untuk menyimpannya dalam cache di memori GPU. Setiap iterasi, ketika elemen baru dihitung, elemen tersebut ditambahkan ke cache yang sedang berjalan untuk digunakan pada iterasi berikutnya. Ini pada dasarnya dikenal sebagai cache KV.

Hal ini sangat mengurangi kebutuhan komputasi namun menimbulkan kebutuhan memori serta kebutuhan memori yang sudah lebih tinggi untuk model bahasa besar sehingga sulit dijalankan pada GPU komoditas. Dengan bertambahnya ukuran parameter model (7B hingga 33B) dan presisi yang lebih tinggi (fp16 hingga fp32), kebutuhan memori juga meningkat. Mari kita lihat contoh kapasitas memori yang dibutuhkan,

Seperti yang kita ketahui, dua penghuni memori utama adalah

  1. Bobot model sendiri dalam memori, ini hadir tanpa. parameter seperti 7B dan tipe data setiap parameter misalnya, 7B di fp16(2 byte) ~= 14GB di memori
  2. Cache KV: Cache yang digunakan untuk nilai kunci tahap perhatian mandiri untuk menghindari perhitungan yang berlebihan.

Ukuran cache KV per token dalam byte = 2 * (num_layers) * (hidden_size) * Precision_in_bytes

Faktor pertama 2 menjelaskan matriks K dan V. Hidden_size dan dim_head ini dapat diperoleh dari kartu model atau file konfigurasi.

Rumus di atas adalah per token, jadi untuk urutan inputnya adalah seq_len * size_of_kv_per_token. Jadi rumus di atas akan berubah menjadi,

Ukuran total cache KV dalam byte = (sequence_length) * 2 * (num_layers) * (hidden_size) * Precision_in_bytes

Misalnya, dengan LLAMA 2 di fp16, ukurannya akan menjadi (4096) * 2 * (32) * (4096) * 2, yaitu ~2GB.

Hal di atas adalah untuk satu masukan, dengan banyak masukan, hal ini akan berkembang dengan cepat, sehingga alokasi dan pengelolaan memori dalam penerbangan ini menjadi langkah penting untuk mencapai kinerja optimal, jika tidak mengakibatkan Kehabisan Memori dan masalah fragmentasi.

Terkadang, kebutuhan memori lebih dari kapasitas GPU kita, dalam hal ini, kita perlu melihat paralelisme model, paralelisme tensor yang tidak dibahas di sini tetapi Anda dapat menelusuri ke arah itu.

Regresi otomatis & operasi terikat memori

Seperti yang bisa kita lihat, bagian pembangkitan keluaran dari model bahasa besar bersifat auto-regresif. Menunjukkan token baru apa pun yang akan dihasilkan, itu bergantung pada semua token sebelumnya dan status perantaranya. Karena pada tahap keluaran tidak semua token tersedia untuk melakukan perhitungan lebih lanjut, dan hanya memiliki satu vektor (untuk token berikutnya) dan blok tahap sebelumnya, ini menjadi seperti operasi matriks-vektor yang kurang memanfaatkan kemampuan komputasi GPU ketika dibandingkan dengan fase prefill. Kecepatan transfer data (bobot, kunci, nilai, aktivasi) ke GPU dari memori mendominasi latensi, bukan seberapa cepat komputasi sebenarnya terjadi. Dengan kata lain, ini adalah operasi yang terikat memori .

Solusi Inovatif untuk Mengatasi Tantangan Throughput

Pengelompokan terus menerus

Langkah paling sederhana untuk mengurangi sifat terikat memori pada tahap dekode adalah dengan mengelompokkan masukan dan melakukan komputasi untuk beberapa masukan sekaligus. Namun pengelompokan konstan yang sederhana telah menghasilkan kinerja yang buruk karena sifat panjang urutan yang bervariasi dan di sini latensi suatu kumpulan bergantung pada urutan terpanjang yang dihasilkan dalam suatu kumpulan dan juga dengan kebutuhan memori yang terus bertambah karena banyak masukan yang dihasilkan. sekarang diproses sekaligus.

Oleh karena itu, pengelompokan statis sederhana tidak efektif dan terjadilah pengelompokan berkelanjutan. Esensinya terletak pada pengumpulan batch permintaan masuk secara dinamis, beradaptasi dengan tingkat kedatangan yang berfluktuasi, dan memanfaatkan peluang untuk pemrosesan paralel bila memungkinkan. Hal ini juga mengoptimalkan pemanfaatan memori dengan mengelompokkan rangkaian dengan panjang yang sama dalam setiap batch sehingga meminimalkan jumlah padding yang diperlukan untuk rangkaian yang lebih pendek dan menghindari pemborosan sumber daya komputasi pada padding yang berlebihan.

Ini secara adaptif menyesuaikan ukuran batch berdasarkan faktor-faktor seperti kapasitas memori saat ini, sumber daya komputasi, dan panjang urutan input. Hal ini memastikan bahwa model beroperasi secara optimal dalam berbagai kondisi tanpa melebihi batasan memori. Ini dalam bantuan dengan perhatian halaman (dijelaskan di bawah) membantu mengurangi latensi dan meningkatkan throughput.

Bacaan lebih lanjut: Bagaimana pengelompokan berkelanjutan memungkinkan throughput 23x dalam inferensi LLM sekaligus mengurangi latensi p50

Perhatian Halaman

Saat kami melakukan batching untuk meningkatkan throughput, hal ini juga mengakibatkan peningkatan kebutuhan memori cache KV, karena kami sekarang memproses banyak input sekaligus. Urutan ini dapat melebihi kapasitas memori sumber daya komputasi yang tersedia, sehingga tidak praktis untuk memprosesnya secara keseluruhan.

Juga diamati bahwa alokasi memori naif dari cache KV menghasilkan banyak fragmentasi memori seperti yang kita amati di sistem komputer karena alokasi memori yang tidak merata. vLLM memperkenalkan Paged Attention yang merupakan teknik manajemen memori yang terinspirasi dari konsep sistem operasi paging dan memori virtual untuk secara efisien menangani kebutuhan cache KV yang terus meningkat.

Paged Attention mengatasi kendala memori dengan membagi mekanisme perhatian menjadi halaman atau segmen yang lebih kecil, masing-masing mencakup subset dari urutan masukan. Daripada menghitung skor perhatian untuk seluruh rangkaian masukan sekaligus, model ini berfokus pada satu halaman pada satu waktu, memprosesnya secara berurutan.

Selama inferensi atau pelatihan, model melakukan iterasi melalui setiap halaman urutan masukan, menghitung skor perhatian dan menghasilkan keluaran yang sesuai. Setelah halaman diproses, hasilnya disimpan, dan model berpindah ke halaman berikutnya.

Dengan membagi mekanisme perhatian menjadi beberapa halaman, Paged Attention memungkinkan model bahasa besar menangani urutan masukan dengan panjang sewenang-wenang tanpa melebihi batasan memori. Ini secara efektif mengurangi jejak memori yang diperlukan untuk memproses urutan yang panjang, sehingga memungkinkan untuk bekerja dengan dokumen dan batch yang besar.

Bacaan lebih lanjut: Pelayanan LLM Cepat dengan vLLM dan PagedAttention

Perhatian kilat

Karena mekanisme perhatian sangat penting untuk model transformator yang menjadi dasar model bahasa besar, mekanisme ini membantu model fokus pada bagian teks masukan yang relevan saat membuat prediksi. Namun, ketika model berbasis transformator menjadi lebih besar dan kompleks, mekanisme perhatian diri menjadi semakin lambat dan intensif memori, yang menyebabkan masalah kemacetan memori seperti yang disebutkan sebelumnya. Flash Attention adalah teknik pengoptimalan lain yang bertujuan untuk mengurangi masalah ini dengan mengoptimalkan operasi perhatian, memungkinkan pelatihan dan inferensi lebih cepat.

Fitur Utama Perhatian Flash:

Kernel Fusion: Penting untuk tidak hanya memaksimalkan penggunaan komputasi GPU, namun juga menjadikannya operasi seefisien mungkin. Flash Attention menggabungkan beberapa langkah komputasi menjadi satu operasi, sehingga mengurangi kebutuhan transfer data yang berulang. Pendekatan yang disederhanakan ini menyederhanakan proses implementasi dan meningkatkan efisiensi komputasi.

Ubin: Flash Attention membagi data yang dimuat menjadi blok-blok yang lebih kecil, membantu pemrosesan paralel. Strategi ini mengoptimalkan penggunaan memori, memungkinkan solusi terukur untuk model dengan ukuran masukan lebih besar.

(Kernel CUDA yang menyatu menggambarkan bagaimana ubin dan fusi mengurangi waktu yang diperlukan untuk perhitungan, Sumber gambar: FlashAttention: Perhatian Tepat yang Cepat dan Hemat Memori dengan IO-Awareness)

Optimasi Memori: Flash Attention memuat parameter hanya untuk beberapa token terakhir, menggunakan kembali aktivasi dari token yang baru dihitung. Pendekatan jendela geser ini mengurangi jumlah permintaan IO untuk memuat bobot dan memaksimalkan throughput memori flash.

Mengurangi Transfer Data: Flash Attention meminimalkan transfer data bolak-balik antar jenis memori, seperti High Bandwidth Memory (HBM) dan SRAM (Static Random-Access Memory). Dengan memuat semua data (kueri, kunci, dan nilai) sekali saja, hal ini mengurangi overhead transfer data yang berulang.

Studi Kasus – Mengoptimalkan Inferensi dengan Decoding Spekulatif

Metode lain yang digunakan untuk mempercepat pembuatan teks dalam model bahasa autoregresif adalah decoding spekulatif. Tujuan utama dari decoding spekulatif adalah untuk mempercepat pembuatan teks sambil menjaga kualitas teks yang dihasilkan pada tingkat yang sebanding dengan distribusi target.

Penguraian kode spekulatif memperkenalkan model kecil/draf yang memprediksi token berikutnya dalam urutan, yang kemudian diterima/ditolak oleh model utama berdasarkan kriteria yang telah ditentukan. Mengintegrasikan model draf yang lebih kecil dengan model target secara signifikan meningkatkan kecepatan pembuatan teks, hal ini disebabkan oleh sifat kebutuhan memori. Karena rancangan modelnya kecil, maka dibutuhkan lebih sedikit no. bobot neuron yang akan dimuat dan no. Komputasinya kini juga lebih sedikit dibandingkan model utama, sehingga mengurangi latensi dan mempercepat proses pembuatan keluaran. Model utama kemudian mengevaluasi hasil yang dihasilkan dan memastikannya sesuai dengan distribusi target dari kemungkinan token berikutnya.

Intinya, penguraian kode spekulatif menyederhanakan proses pembuatan teks dengan memanfaatkan model draf yang lebih kecil dan lebih cepat untuk memprediksi token berikutnya, sehingga mempercepat kecepatan pembuatan teks secara keseluruhan sambil menjaga kualitas konten yang dihasilkan mendekati distribusi target.

Sangat penting bahwa token yang dihasilkan oleh model yang lebih kecil tidak selalu ditolak secara terus-menerus, hal ini menyebabkan penurunan kinerja, bukan peningkatan. Melalui eksperimen dan sifat kasus penggunaan, kita dapat memilih model yang lebih kecil/ memperkenalkan decoding spekulatif ke dalam proses inferensi.

Kesimpulan

Perjalanan melalui teknik-teknik canggih untuk meningkatkan keluaran Model Bahasa Besar (LLM) menerangi jalan ke depan dalam bidang pemrosesan bahasa alami, tidak hanya menampilkan tantangan namun juga solusi inovatif yang dapat menghadapinya secara langsung. Teknik-teknik ini, mulai dari Continuous Batching hingga Paged dan Flash Attention, serta pendekatan Spekulatif Decoding yang menarik, lebih dari sekadar peningkatan bertahap. Hal ini mewakili lompatan maju yang signifikan dalam kemampuan kami untuk membuat model bahasa besar menjadi lebih cepat, lebih efisien, dan pada akhirnya lebih mudah diakses untuk berbagai aplikasi.

Pentingnya kemajuan ini tidak dapat dilebih-lebihkan. Dalam mengoptimalkan throughput LLM dan meningkatkan kinerja, kami tidak hanya mengubah mesin model canggih ini; kami mendefinisikan ulang apa yang mungkin dilakukan dalam hal kecepatan dan efisiensi pemrosesan. Hal ini, pada gilirannya, membuka cakrawala baru untuk penerapan model bahasa besar, mulai dari layanan terjemahan bahasa real-time yang dapat beroperasi dengan kecepatan percakapan, hingga alat analisis canggih yang mampu memproses kumpulan data besar dengan kecepatan yang belum pernah terjadi sebelumnya.

Selain itu, teknik-teknik ini menggarisbawahi pentingnya pendekatan yang seimbang terhadap pengoptimalan model bahasa besar – pendekatan yang secara cermat mempertimbangkan interaksi antara kecepatan, akurasi, dan sumber daya komputasi. Saat kami mendorong batasan kemampuan LLM, menjaga keseimbangan ini sangat penting untuk memastikan bahwa model ini dapat terus berfungsi sebagai alat yang serbaguna dan andal di berbagai industri.

Teknik-teknik canggih untuk meningkatkan keluaran model bahasa yang besar lebih dari sekadar pencapaian teknis; ini adalah tonggak sejarah dalam evolusi kecerdasan buatan yang sedang berlangsung. Mereka berjanji untuk menjadikan LLM lebih mudah beradaptasi, lebih efisien, dan lebih kuat, membuka jalan bagi inovasi masa depan yang akan terus mengubah lanskap digital kita.

Baca selengkapnya tentang Arsitektur GPU untuk Optimasi Inferensi model bahasa besar di postingan blog terbaru kami