Panduan Visual tentang Kuantisasi LLM
(newsletter.maartengrootendorst.com)- Model bahasa besar (LLM) terlalu besar untuk dijalankan di perangkat keras biasa, dan biasanya memiliki miliaran parameter sehingga memerlukan GPU dengan VRAM besar
- Karena itu, semakin banyak riset yang berfokus pada cara membuat model-model ini lebih kecil melalui pelatihan yang ditingkatkan, adapter, dan sebagainya, dan salah satu teknik utama di bidang ini adalah kuantisasi (Quantization)
Part 1: “Masalah” model bahasa besar
- LLM (Large Language Model) dinamai berdasarkan jumlah parameter yang dikandungnya
- Model seperti ini umumnya berisi miliaran parameter (sebagian besar berupa bobot), sehingga biaya penyimpanannya bisa sangat besar
- Selama inferensi, aktivasi dihasilkan dari perkalian input dan bobot, dan ukurannya juga bisa sangat besar
- Karena itu, upaya dilakukan untuk merepresentasikan miliaran nilai seefisien mungkin sambil meminimalkan ruang yang dibutuhkan untuk menyimpan nilai tertentu
Cara merepresentasikan nilai numerik
- Nilai tertentu sering direpresentasikan sebagai angka floating-point (bilangan riil)
- Nilai-nilai ini direpresentasikan dalam “bit”, dan standar IEEE-754 menjelaskan bagaimana bit menunjukkan salah satu fungsi untuk merepresentasikan nilai: tanda, eksponen, dan mantisa (fraction)
- Semakin banyak bit yang digunakan untuk merepresentasikan nilai, umumnya semakin tinggi presisinya
- Semakin banyak bit yang tersedia, semakin besar pula rentang nilai yang bisa direpresentasikan
Batasan memori
- Jika diasumsikan sebuah model dengan 70 miliar parameter, maka hanya untuk memuat model saja diperlukan 280GB memori bila menggunakan FP32 (full-precision)
- Karena itu, sangat penting untuk meminimalkan jumlah bit yang merepresentasikan parameter model, tetapi ketika presisi menurun, akurasi model juga umumnya ikut menurun
- Tujuannya adalah mengurangi jumlah bit untuk merepresentasikan nilai sambil mempertahankan akurasi, dan di sinilah kuantisasi masuk
Part 2: Pengantar kuantisasi
- Kuantisasi bertujuan menurunkan presisi parameter model dari lebar bit tinggi (misalnya floating-point 32-bit) ke lebar bit lebih rendah (misalnya integer 8-bit)
- Setiap kali jumlah bit dikurangi, dilakukan pemetaan untuk “mengompresi” parameter asli ke representasi bit rendah
Tipe data umum
FP16
- Saat berpindah dari FP32 ke FP16 (half precision), rentang nilai yang dapat diambil FP16 menjadi jauh lebih kecil dibanding FP32
BF16
- Untuk memperoleh rentang nilai yang mirip dengan FP32, diperkenalkan bfloat16, semacam “FP32 yang dipotong”
- BF16 menggunakan jumlah bit yang sama dengan FP16 tetapi dapat memiliki rentang nilai yang lebih luas, dan sering digunakan dalam aplikasi deep learning
INT8
- Jika jumlah bit dikurangi lebih jauh, representasinya menjadi lebih dekat ke representasi berbasis integer daripada floating-point
Kuantisasi simetris
- Rentang nilai floating-point asli dipetakan ke rentang simetris di sekitar 0 dalam ruang terkuantisasi
- Nilai terkuantisasi untuk 0 dalam ruang floating-point adalah tepat 0 dalam ruang terkuantisasi
Kuantisasi asimetris
- Berbeda dari kuantisasi simetris, ini tidak simetris terhadap 0
- Nilai minimum (β) dan maksimum (α) dipetakan dari rentang floating-point ke nilai minimum dan maksimum dari rentang terkuantisasi
- Salah satu metode ini disebut kuantisasi zero-point
Pemetaan rentang dan clipping
- Jika seluruh rentang vektor dipetakan, outlier dapat menyebabkan semua nilai kecil dipetakan ke representasi bit rendah yang sama sehingga kehilangan daya pembeda
- Sebagai gantinya, kita dapat memilih untuk melakukan clipping pada nilai tertentu
- Clipping menetapkan rentang dinamis lain dari nilai asli sehingga semua outlier memiliki nilai yang sama
- Error kuantisasi untuk nilai non-outlier berkurang besar, tetapi error kuantisasi untuk outlier meningkat
Kalibrasi (Calibration)
Bobot (dan bias)
- Bobot dan bias dapat dianggap sebagai nilai statis yang diketahui sebelum model dijalankan
- Karena jumlah bias jauh lebih sedikit daripada bobot, bias dipertahankan pada presisi yang lebih tinggi (misalnya INT16), dan upaya utama kuantisasi difokuskan pada bobot
- Teknik kalibrasi untuk bobot statis yang sudah diketahui ini mencakup memilih persentil rentang input secara manual, mengoptimalkan mean squared error (MSE) antara bobot asli dan bobot terkuantisasi, atau meminimalkan entropi (divergensi KL) antara nilai asli dan nilai terkuantisasi
Aktivasi
- Input terus diperbarui di seluruh LLM dan umumnya disebut “aktivasi”
- Nilai ini berubah setiap kali data input diberikan ke model selama inferensi, sehingga sulit dikuantisasi secara akurat
- Nilai ini diperbarui setelah setiap hidden layer, sehingga kita hanya bisa mengetahui nilainya selama inferensi ketika data input melewati model
Part 3: Kuantisasi pasca-pelatihan (PTQ - Post-Training Quantization)
Kuantisasi dinamis
- Aktivasi dikumpulkan setelah data melewati hidden layer
- Distribusi aktivasi ini digunakan untuk menghitung nilai zero-point (z) dan faktor skala (s) yang diperlukan untuk menguantisasi output
- Proses ini diulang setiap kali data melewati layer baru. Karena itu, setiap layer memiliki nilai z dan s sendiri serta skema kuantisasi yang berbeda
Kuantisasi statis
- Zero-point (z) dan faktor skala (s) dihitung sebelumnya, bukan saat inferensi
- Untuk menemukan nilai-nilai ini, dataset kalibrasi digunakan dan diberikan ke model guna mengumpulkan distribusi potensial tersebut
- Saat melakukan inferensi yang sebenarnya, nilai s dan z tidak dihitung ulang, melainkan digunakan secara global untuk semua aktivasi dalam kuantisasi
- Secara umum, kuantisasi dinamis sedikit lebih akurat karena mencoba menghitung nilai s dan z untuk setiap hidden layer, tetapi waktu komputasinya bisa lebih lama
- Sebaliknya, kuantisasi statis kurang akurat tetapi lebih cepat karena nilai s dan z sudah diketahui sebelumnya
Ranah kuantisasi 4-bit
- Turun ke bawah 8-bit terbukti sulit karena error kuantisasi meningkat setiap kali bit berkurang
- Menjelajahi dua metode yang umum dibagikan di HuggingFace: GPTQ dan GGUF
GPTQ
- Salah satu metode yang paling terkenal untuk melakukan kuantisasi ke 4-bit
- Menggunakan kuantisasi asimetris dan dilakukan per layer, di mana setiap layer diproses secara independen sebelum lanjut ke layer berikutnya
- Selama proses kuantisasi per layer, bobot layer terlebih dahulu ditransformasikan menggunakan inverse Hessian, yaitu turunan kedua dari fungsi loss model, yang menunjukkan seberapa sensitif output model terhadap perubahan pada setiap bobot
- Sederhananya, ini menunjukkan tingkat pentingnya tiap bobot dalam layer
- Bobot dengan nilai kecil dalam matriks Hessian lebih penting karena perubahan kecil pada bobot-bobot tersebut dapat menyebabkan perubahan besar pada performa model
GGUF
- GPTQ adalah metode kuantisasi yang baik untuk menjalankan seluruh LLM di GPU, tetapi kita tidak selalu memiliki kapasitas seperti itu
- Sebagai gantinya, GGUF dapat digunakan untuk meng-offload semua layer LLM ke CPU
- Ini memungkinkan penggunaan CPU dan GPU sekaligus ketika VRAM tidak mencukupi
Part 4: Pelatihan yang sadar kuantisasi (QAT - Quantization Aware Training)
- Pada bagian 3 kita melihat cara menguantisasi model setelah pelatihan, tetapi pendekatan ini memiliki kelemahan karena kuantisasi tersebut tidak mempertimbangkan proses pelatihan yang sebenarnya
- Di sinilah Quantization Aware Training (QAT) berperan. Berbeda dari PTQ, QAT bertujuan mempelajari prosedur kuantisasi selama pelatihan
- QAT cenderung lebih akurat daripada PTQ karena kuantisasi sudah dipertimbangkan selama pelatihan
Era LLM 1-bit: BitNet
- BitNet merepresentasikan bobot model sebagai satu bit tunggal, yaitu -1 atau 1
- Ini dilakukan dengan menyuntikkan proses kuantisasi langsung ke dalam arsitektur transformer
- Arsitektur transformer digunakan sebagai dasar sebagian besar LLM dan terdiri dari komputasi yang mencakup linear layer
- BitNet mengganti linear layer ini dengan sesuatu yang disebut BitLlinear
Kuantisasi bobot
- Selama pelatihan, bobot disimpan dalam INT8 lalu dikuantisasi ke 1-bit menggunakan strategi dasar berupa fungsi tanda
- Pada dasarnya, distribusi bobot digeser agar berpusat di 0, lalu semua yang berada di kiri 0 diberi nilai -1 dan semua yang berada di kanan 0 diberi nilai 1
Kuantisasi aktivasi
- Untuk menguantisasi aktivasi, BitLinear menggunakan kuantisasi absmax guna mengubah aktivasi dari FP16 ke INT8 karena perkalian matriks (×) memerlukan presisi lebih tinggi
Dequantization
- α (nilai absolut terbesar dari aktivasi) dan β (rata-rata nilai absolut dari bobot) dilacak, dan nilai-nilai ini nantinya membantu mengembalikan aktivasi ke FP16
- Aktivasi output diskalakan ulang dengan {α, γ} lalu didekuantisasi kembali ke presisi asli
Semua model bahasa besar adalah 1.58-bit
- BitNet 1.58b diperkenalkan untuk memperbaiki masalah penskalaan yang disebutkan sebelumnya
- Dalam metode baru ini, setiap bobot tunggal model tidak hanya dapat bernilai -1 atau 1, tetapi juga 0, sehingga menjadi ternary
- Menariknya, hanya dengan menambahkan 0 saja, BitNet meningkat secara signifikan dan kecepatan komputasinya menjadi jauh lebih tinggi
Kekuatan angka 0
- Mengapa menambahkan 0 menjadi peningkatan yang begitu besar? Ini berkaitan sepenuhnya dengan perkalian matriks
- Jika memiliki bobot yang dikuantisasi ke 1.58-bit, tidak hanya kecepatan komputasi bisa meningkat besar karena pada dasarnya cukup melakukan perkalian, tetapi juga memungkinkan penyaringan fitur
Kuantisasi
- Untuk melakukan kuantisasi bobot, BitNet 1.58b menggunakan kuantisasi absmean, yaitu variasi dari kuantisasi absmax yang telah kita lihat sebelumnya
- Ini pada dasarnya memampatkan distribusi bobot dan menggunakan rata-rata absolut (α) untuk menguantisasi nilai, yang kemudian dibulatkan menjadi -1, 0, atau 1
- Dibandingkan BitNet, kuantisasi aktivasi sama kecuali satu hal. Alih-alih menyesuaikan aktivasi ke rentang [0, 2ᵇ⁻¹], kini digunakan kuantisasi absmax untuk menyesuaikannya ke [-2ᵇ⁻¹, 2ᵇ⁻¹]
- Kuantisasi 1.58-bit memerlukan (terutama) dua trik:
- menambahkan 0 untuk membuat representasi ternary [-1, 0, 1]
- kuantisasi absmean untuk bobot
-
“13B BitNet b1.58 lebih efisien daripada 3B FP16 LLM dalam hal latensi, penggunaan memori, dan konsumsi energi”
- Karena itu, model ringan bisa diperoleh berkat kuantisasi 1.58-bit yang efisien secara komputasi
Belum ada komentar.