Model bahasa besar (LLM) seperti GPT-4, LLaMA, dan PaLM memperluas batas kemampuan pemrosesan bahasa alami. Namun, menerapkan model-model besar ini ke lingkungan produksi menyajikan tantangan signifikan dalam hal persyaratan komputasi, penggunaan memori, latensi, dan biaya. Ketika LLM terus tumbuh lebih besar dan lebih kuat, mengoptimalkan kinerja inferensi mereka sangat penting untuk aplikasi dunia nyata.
Dalam penelitian teknis ini, kita akan menjelajahi teknik-teknik mutakhir untuk mempercepat inferensi LLM, memungkinkan waktu respons yang lebih cepat, throughput yang lebih tinggi, dan utilitas sumber daya perangkat keras yang lebih efisien. Kita akan membahas metode yang berkisar dari teknik presisi numerik dan mekanisme perhatian novel hingga inovasi arsitektur yang dirancang secara eksplisit untuk generasi teks yang efisien.
Mari kita mulai dengan memahami mengapa inferensi LLM sangat menantang dibandingkan dengan model NLP tradisional.
Tantangan Inferensi dengan Model Bahasa Besar
Sebelum munculnya LLM, pemrosesan bahasa alami bergantung pada model yang lebih kecil yang fokus pada tugas-tugas spesifik seperti klasifikasi teks, pengenalan entitas bernama, dan analisis sentimen. Meskipun masih intensif komputasi, model-model ini dapat diterapkan pada perangkat keras yang sederhana dan mengikuti proses inferensi yang relatif sederhana.
LLM, di sisi lain, mewakili pergeseran paradigma. Model-model ini dilatih pada dataset yang luas menggunakan miliaran parameter, memungkinkan mereka untuk melakukan berbagai tugas bahasa dengan kemampuan luar biasa. Namun, kekuatan ini datang dengan biaya â permintaan komputasi yang dramatis meningkat selama pelatihan dan inferensi.
Salah satu tantangan utama adalah sifat autoregresif dari generasi teks dengan LLM. Untuk menghasilkan teks yang mirip manusia, model-model ini memprediksi satu token (kata atau subkata) pada satu waktu, dengan setiap token baru bergantung pada output yang dihasilkan sebelumnya. Ketergantungan berurutan ini mencegah paralelisasi yang efisien dan menghasilkan persyaratan komputasi yang meningkat secara polinomial dengan panjang urutan.
Selain itu, LLM sering memerlukan urutan input yang panjang (prompt) untuk membangun konteks yang diperlukan untuk generasi teks berkualitas tinggi. Panjang input yang lebih panjang memerlukan lebih banyak memori untuk menyimpan keadaan antara dan matriks perhatian, lebih lanjut membebani sumber daya perangkat keras.
Dengan tantangan unik ini, teknik optimasi tradisional seperti kuantisasi dan grafik komputasi statis dapat gagal, bergelut untuk mempertahankan kinerja LLM sambil memberikan percepatan yang signifikan. Mari kita jelajahi beberapa strategi kunci yang dirancang secara eksplisit untuk mempercepat inferensi LLM.
Teknik Presisi Numerik
Dari 32-Bit ke 16-Bit Presisi
Salah satu jalur untuk mempercepat inferensi LLM adalah dengan menggunakan presisi numerik yang berkurang untuk bobot model dan aktivasi. Kerangka kerja pembelajaran dalam yang modern seperti PyTorch dan TensorFlow biasanya menggunakan presisi titik mengambang 32-bit (FP32) secara default. Namun, penelitian telah menunjukkan bahwa LLM dapat mempertahankan akurasi tinggi bahkan ketika beroperasi pada presisi yang lebih rendah, seperti 16-bit (FP16), 8-bit integer (INT8), atau bahkan 4-bit integer (INT4).
Mengurangi presisi numerik menawarkan beberapa keuntungan:
Jejak Memori yang Berkurang: Representasi presisi yang lebih rendah memerlukan lebih sedikit memori, memungkinkan model yang lebih besar atau ukuran batch untuk sesuai dengan keterbatasan perangkat keras yang sama.
Perhitungan yang Lebih Cepat: Banyak CPU dan GPU modern menyediakan instruksi khusus dan percepatan perangkat keras untuk aritmatika presisi yang lebih rendah, memungkinkan percepatan yang signifikan.
Efisiensi Energi yang Ditingkatkan: Dengan kebutuhan memori yang lebih kecil dan perhitungan yang lebih cepat, inferensi presisi yang lebih rendah dapat diterjemahkan ke dalam konsumsi energi yang berkurang â keuntungan penting untuk penerapan edge dan mobile.
Meskipun kuat, teknik presisi numerik memperkenalkan beberapa kehilangan akurasi dibandingkan dengan operasi FP32. Kunci adalah mengevaluasi secara hati-hati trade-off antara keuntungan komputasi dan degradasi kinerja potensial untuk kasus penggunaan spesifik Anda.
Terdapat dua pendekatan utama untuk kuantisasi dengan LLM:
Kuantisasi Pasca-Pelatihan (PTQ): Dalam metode ini, LLM pertama kali dilatih menggunakan presisi FP32 standar. Setelah pelatihan, bobot model dikuantisasi (diubah) ke format presisi yang lebih rendah seperti INT8 atau INT4. PTQ mudah diimplementasikan tetapi dapat menyebabkan penurunan akurasi yang lebih besar.
Kuantisasi-Aware Pelatihan (QAT): Dengan QAT, proses kuantisasi disimulasikan selama fase pelatihan itu sendiri. Ini memungkinkan model untuk belajar mengkompensasi kesalahan kuantisasi, meminimalkan degradasi akurasi ketika model kuantisasi akhir diterapkan. QAT lebih terlibat tetapi sering menghasilkan hasil yang lebih baik dibandingkan dengan PTQ.
Untuk aplikasi praktis, seseorang mungkin menggunakan model pra-kuantisasi yang tersedia di platform seperti Hugging Face, yang menyimpan berbagai model yang dioptimalkan melalui metode kuantisasi yang berbeda. Misalnya, jika model yang dikuantisasi menggunakan Auto-GPTQ diinginkan, pengguna dapat dengan mudah memuatnya menggunakan perpustakaan transformer Hugging Face. Selain itu, untuk menguantisasi model, alat seperti AutoGPTQ dapat digunakan, yang terintegrasi dengan perpustakaan yang ada untuk mengompresi model dengan efisien.
Contoh memuat model Llama-2-7b pra-kuantisasi menggunakan perpustakaan transformer Hugging Face:
from transformers import AutoModelForCausalLM, AutoTokenizer
<p>model_id = "TheBloke/Llama-2-7b-Chat-GPTQ"
tokenizer = AutoTokenizer.from_pretrained(model_id)
model = AutoModelForCausalLM.from_pretrained(model_id)
Dan untuk kuantisasi kustom, seseorang mungkin mengikuti langkah-langkah ini menggunakan toolkit AutoGPTQ:</p>
<p>from transformers import AutoModelForCausalLM, AutoTokenizer, GPTQConfig</p>
<p>model_id = "llama-2-7b-original"
tokenizer = AutoTokenizer.from_pretrained(model_id)
konfigurasi_kuantisasi = GPTQConfig(bits=4, dataset="dataset_anda", tokenizer=tokenizer)
model = AutoModelForCausalLM.from_pretrained(model_id, konfigurasi_kuantisasi=konfigurasi_kuantisasi)</p>
Ingat bahwa kuantisasi mungkin memerlukan fine-tuning pasca-kuantisasi atau rekayasa prompt untuk mempertahankan kualitas model. Untuk kuantisasi baru, Anda dapat berkontribusi kembali ke komunitas dengan mendorong model kuantisasi Anda ke platform seperti Hugging Face.
Pastikan untuk selalu menyeimbangkan antara ukuran model, persyaratan komputasi, dan kinerja saat memilih strategi kuantisasi untuk kasus penggunaan spesifik Anda.
Â
Algoritma Perhatian Flash
Mekanisme perhatian multi-kepala adalah komponen inti dari LLM berbasis transformer, memungkinkan model untuk menangkap ketergantungan jangka panjang dan representasi kontekstual. Namun, operasi perhatian ini tidak efisien secara komputasi untuk generasi teks autoregresif, karena memerlukan penghitungan ulang banyak nilai yang sama untuk setiap token baru.
Algoritma Perhatian Flash, yang diperkenalkan dalam makalah FlashAttention, menyediakan pendekatan yang lebih efisien memori dan ramah paralelisasi untuk operasi perhatian. Sebagai gantinya untuk menghitung ulang nilai perhatian untuk setiap token, Perhatian Flash menyimpan dan menggunaan kembali matriks kunci/nilai antara, menghindari perhitungan berlebihan.
Optimasi ini tidak hanya mengurangi overhead komputasi tetapi juga meningkatkan pola akses memori, mengarah ke utilitas yang lebih baik dari bandwidth memori GPU dan paralelisasi.
Meskipun detail Perhatian Flash cukup terlibat, ide utamanya adalah untuk memecah operasi perhatian menjadi dua fase:
Penanaman Prefix Sum: Fase ini menghitung dan menyimpan penanaman kunci/nilai untuk semua token input, memungkinkan penggunaan kembali yang efisien selama generasi.
Perhatian Kausal: Operasi perhatian sebenarnya, sekarang dioptimalkan untuk menggunakan penanaman kunci/nilai yang disimpan dari fase pertama.
Dengan memisahkan fase-fase ini, Perhatian Flash dapat memanfaatkan operasi paralel GPU yang sangat paralel, mempercepat secara signifikan bottleneck perhatian dalam inferensi LLM.
Berikut adalah ilustrasi konseptual singkat tentang implementasi Perhatian Flash dengan LLM:
from transformers import AutoModelForCausalLM
import torch
from flash_attention import flash_attention
<p># Muat LLM seperti OctoCoder
model = AutoModelForCausalLM.from_pretrained("bigcode/octocoder")</p>
<p># Prompt sistem contoh yang memandu model untuk menjadi asisten coding yang lebih baik
prompt_sistem = """... (detail prompt sistem) ..."""</p>
<p># Menyiapkan input yang lebih panjang dengan prompt sistem
prompt_panjang = prompt_sistem + "Pertanyaan: Silakan tulis fungsi dalam Python yang mengubah byte menjadi Gigabyte."</p>
<p># Mengubah model untuk Optimasi Perhatian Flash
model.to_bettertransformer()</p>
<p># Menjalankan model dengan Perhatian Flash
waktu_mulai = waktu.sekarang()
dengan torch.backends.cuda.sdp_kernel(enable_flash=True):
hasil = model.generate(prompt_panjang, max_new_tokens=60)
print(f"Dibuat dalam {waktu.sekarang() - waktu_mulai} detik.")
Meskipun Perhatian Flash menawarkan percepatan kinerja yang mengesankan, itu bekerja dalam arsitektur transformer yang ada. Untuk membebaskan potensi inferensi LLM yang dipercepat sepenuhnya, kita perlu menjelajahi inovasi arsitektur yang dirancang secara khusus untuk tugas ini.
Pemangkasan LLM
Pemangkasan LLM adalah teknik untuk mengurangi ukuran model sambil mempertahankan fungsionalitas. Ini menggunakan estimator kepentingan bobot yang bergantung pada data berdasarkan aproksimasi matriks Hessian. Dalam pemangkasan, kelompok bobot yang kurang penting dihilangkan, lalu model difine-tune untuk memulihkan akurasi. Paket LLM-Pruner menawarkan skrip untuk pemangkasan dengan berbagai strategi yang didukung. Pemangkasan termasuk menemukan ketergantungan, memperkirakan kontribusi kelompok, dan tahap pemulihan yang melibatkan pelatihan pasca-pemangkasan yang singkat.
Contoh kode Python sederhana yang menunjukkan penggunaan LLM-Pruner untuk model LLaMa:
from transformers import AutoModelForSequenceClassification
from pruning import LLMPruner
<p># Muat model LLaMa pra-latih
model = AutoModelForSequenceClassification.from_pretrained("llama-base")</p>
<p># Inisialisasi pruner dengan konfigurasi yang diinginkan
pruner = LLMPruner(
model,
rasio_pemangkasan=0,25,
blok_lapisan_mlp=(4, 30),
blok_lapisan_perhatian=(4, 30),
jenis_pruner='taylor'
)</p>
<p># Jalankan pemangkasan
model_pemangkasan = pruner.pangkas()</p>
<p># Fine-tune model yang dipangkas
model_pemangkasan.fine_tune(data_pelatihan)
Ini adalah sketsa kode yang mewakili memuat model LLaMa pra-latih, mengatur pruner dengan konfigurasi spesifik (seperti lapisan mana yang dipangkas dan jenis pruner), menjalankan proses pemangkasan, dan akhirnya fine-tune model yang dipangkas.
Perlu diingat bahwa untuk implementasi yang sebenarnya, Anda perlu mengisi detail seperti nama model spesifik, jalur ke data, dan parameter tambahan untuk proses fine-tuning. Selain itu, perlu disadari bahwa kode ini adalah representasi konseptual, dan sintaks yang sebenarnya mungkin berbeda tergantung pada perpustakaan dan versi yang digunakan.
Inovasi Arsitektur untuk Generasi Teks yang Efisien
Arsitektur transformer, meskipun sangat efektif untuk tugas pemodelan bahasa, dirancang sebagai model urutan-ke-urutan yang umum. Ketika menerapkan LLM untuk tugas generasi teks dengan konteks input yang panjang, peneliti menemukan bahwa arsitektur yang lebih khusus dapat meningkatkan secara signifikan efisiensi inferensi tanpa mengorbankan kualitas.
Berikut beberapa inovasi arsitektur kunci yang memungkinkan inferensi LLM yang lebih cepat:
Alibi: Arsitektur Alibi, yang diperkenalkan dalam makalah PAL-Instruction, memisahkan pemodelan konteks input yang panjang dari proses generasi teks itu sendiri. Ini menggunakan representasi terkompresi dari konteks input (yang disebut âalibiâ) untuk menginisialisasi proses generasi, menghindari kebutuhan untuk memproses urutan input secara berulang selama generasi autoregresif.
Penanaman Rotary: Sebagai gantinya untuk menggunakan penanaman posisi standar, teknik penanaman rotary menggunakan matriks rotasi untuk mengkodekan informasi posisi dengan lebih efisien. Pendekatan ini telah terbukti meningkatkan kinerja dan memungkinkan pemrosesan urutan input yang lebih panjang.
Perhatian Multi-Query (MQA): Dalam perhatian tradisional, setiap token output memperhatikan seluruh urutan input, menghasilkan komputasi berlebihan. MQA mereformulasikan operasi perhatian untuk berbagi komputasi di antara beberapa token output, mengurangi kompleksitas secara keseluruhan.
Perhatian Multi-Query
Perhatian Group-Query (GQA): Membangun atas MQA, GQA mengelompokkan token output ke dalam klaster dan menghitung perhatian secara bersamaan untuk setiap klaster. Pendekatan ini lebih lanjut mengurangi persyaratan komputasi sambil mempertahankan generasi teks berkualitas tinggi.
Meskipun masih dalam penelitian dan pengembangan aktif, inovasi arsitektur ini telah menunjukkan percepatan yang mengesankan untuk tugas inferensi LLM, terutama ketika digabungkan dengan teknik seperti Perhatian Flash dan optimasi presisi numerik.
Pertimbangan Penerapan Dunia Nyata
Di luar algoritma dan arsitektur inti, ada beberapa pertimbangan praktis dan trade-off yang perlu dinavigasi ketika menerapkan LLM ke lingkungan produksi:
Percepatan Perangkat Keras: Meskipun CPU dapat menangani inferensi LLM, GPU dan akselerator lain seperti TPU Google (GOOGL ) sangat penting untuk mencapai throughput yang tinggi dan latensi yang rendah. Memilih perangkat keras yang tepat dan mengoptimalkan penggunaan memori sangat kritis.
Pengelompokan dan Paralelisasi: Untuk memanfaatkan paralelisasi perangkat keras sepenuhnya, strategi seperti inferensi batch (memproses beberapa input secara bersamaan) dan paralelisasi model (mendistribusikan LLM di seluruh perangkat) dapat secara signifikan meningkatkan throughput.
Trade-Off Kuantisasi vs. Kualitas: Tingkat kuantisasi (8-bit, 4-bit, dll.) akan langsung memengaruhi kecepatan inferensi dan penggunaan memori, tetapi juga memengaruhi kualitas output. Trade-off ini harus dievaluasi secara hati-hati untuk setiap kasus penggunaan.
Destilasi Model: Sebagai alternatif untuk kuantisasi, teknik destilasi model dapat mengompresi LLM besar menjadi model siswa yang lebih kecil dan efisien sambil mempertahankan akurasi yang tinggi.
Caching dan Runtime yang Dioptimalkan: Runtime pembelajaran dalam yang dioptimalkan seperti TensorRT NVIDIA (NVDA ) dan kerangka kerja yang dirancang untuk penerapan LLM (misalnya, Suite Inferensi Komposisi MosaicML) dapat memberikan percepatan kinerja yang signifikan melalui teknik seperti fusi operator, optimasi kernel, dan strategi caching yang cerdas.
Jalan menuju penerapan LLM yang optimal sering melibatkan menggabungkan beberapa teknik sambil mempertimbangkan secara hati-hati kebutuhan spesifik aplikasi, keterbatasan infrastruktur, dan target kinerja.
Kesimpulan
Ketika model bahasa besar terus berevolusi dengan cepat, mempercepat kinerja inferensi mereka menjadi semakin penting untuk memungkinkan aplikasi dunia nyata dan mendemokratisasikan akses ke kemampuan AI yang kuat ini.
Dalam panduan teknis ini, kita menjelajahi teknik-teknik mutakhir yang mencakup optimasi presisi numerik, algoritma perhatian novel seperti Perhatian Flash, dan inovasi arsitektur yang dirancang untuk generasi teks yang efisien. Meskipun setiap pendekatan menawarkan keuntungan tersendiri, kekuatan sebenarnya sering terletak pada menggabungkan beberapa strategi sambil menavigasi trade-off yang kompleks antara kecepatan, penggunaan memori, dan kualitas output.
Menghadap ke depan, kita dapat mengharapkan penelitian dan pengembangan terus-menerus dalam domain ini, didorong oleh permintaan yang tidak terpuaskan untuk LLM yang lebih kuat dan lebih mudah diakses. Dari percepatan perangkat keras hingga kompresi model sepenuhnya, pencarian inferensi LLM yang efisien tetap menjadi frontir yang menarik dalam dunia pemrosesan bahasa alami dan kecerdasan buatan.
Saya telah menghabiskan lima tahun terakhir dengan membenamkan diri dalam dunia Machine Learning dan Deep Learning yang menarik. Minat dan keahlian saya telah memimpin saya untuk berkontribusi pada lebih dari 50 proyek rekayasa perangkat lunak yang beragam, dengan fokus khusus pada AI/ML. Rasa ingin tahu saya yang terus-menerus juga telah menarik saya ke arah Natural Language Processing, sebuah bidang yang saya ingin jelajahi lebih lanjut.