<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Quantization on kenji.blog</title><link>http://kenji.blog/id/tags/quantization/</link><description>Recent content in Quantization on kenji.blog</description><generator>Hugo -- gohugo.io</generator><language>id</language><copyright>kenjinote</copyright><lastBuildDate>Fri, 11 Sep 2026 00:00:00 +0900</lastBuildDate><atom:link href="http://kenji.blog/id/tags/quantization/index.xml" rel="self" type="application/rss+xml"/><item><title>Menjelaskan Mekanisme Teknologi Kuantisasi (GGUF) llama.cpp</title><link>http://kenji.blog/id/p/llama-cpp-quantization-gguf/</link><pubDate>Fri, 11 Sep 2026 00:00:00 +0900</pubDate><guid>http://kenji.blog/id/p/llama-cpp-quantization-gguf/</guid><description>&lt;img src="http://kenji.blog/p/llama-cpp-quantization-gguf/img/eyecatch.jpg" alt="Featured image of post Menjelaskan Mekanisme Teknologi Kuantisasi (GGUF) llama.cpp" />&lt;h2 id="1-pendahuluan-mengapa-llm-membutuhkan-kuantisasi">1. Pendahuluan: Mengapa LLM Membutuhkan Kuantisasi?
&lt;/h2>&lt;p>Perkembangan Large Language Models (LLM) dalam beberapa tahun terakhir sangat luar biasa, namun di balik itu muncul masalah serius berupa &amp;ldquo;penipisan sumber daya komputasi&amp;rdquo; dan &amp;ldquo;bottleneck bandwidth memori&amp;rdquo;. Misalnya, jika kita memuat model dengan 70B (70 miliar) parameter seperti Llama 3 ke dalam memori menggunakan presisi 16-bit floating-point (FP16) standar, parameternya saja akan mengonsumsi sekitar 140GB VRAM/RAM. Jika ditambah dengan konteks saat inferensi (KV cache), model ini tidak akan berjalan tanpa mengelompokkan beberapa GPU high-end untuk pusat data (NVIDIA A100 80GB atau H100 80GB).&lt;/p>
&lt;p>Sebagai penyelamat untuk menjalankan LLM bagi pengembang individu dan perangkat edge (MacBook dan PC gaming umum), muncullah &lt;strong>llama.cpp&lt;/strong> dan teknologi intinya yaitu &lt;strong>Kuantisasi (Quantization)&lt;/strong>. Secara khusus, format file yang disebut &lt;strong>GGUF (GPT-Generated Unified Format)&lt;/strong> dan algoritma kuantisasi berbasis blok tingkat lanjut yang disebut &lt;strong>k-quants&lt;/strong>, merupakan metode revolusioner yang menekan penurunan akurasi model (Perplexity) seminimal mungkin sambil mengompresi ukuran model menjadi sebagian kecil saja.&lt;/p>
&lt;p>Artikel ini akan membahas secara menyeluruh tentang llama.cpp, mulai dari latar belakang matematika dari kuantisasinya, perbedaannya dengan format GGML, struktur detail dari format GGUF, hingga mekanisme internal dari k-quants.&lt;/p>
&lt;hr>
&lt;h2 id="2-dasar-matematika-dari-kuantisasi-quantization">2. Dasar Matematika dari Kuantisasi (Quantization)
&lt;/h2>&lt;p>Kuantisasi dalam konteks LLM merujuk pada operasi memetakan nilai kontinu (atau angka floating-point berpresisi tinggi) ke nilai diskrit dengan jumlah bit yang lebih sedikit (INT8, INT4, INT3, dll.).&lt;/p>
&lt;h3 id="21-rumus-dasar-kuantisasi-linear">2.1. Rumus Dasar Kuantisasi Linear
&lt;/h3>&lt;p>Pendekatan paling sederhana adalah kuantisasi linear (Min-Max Quantization). Misalkan tensor bobot berpresisi tinggi asli adalah $W$, dan tensor bilangan bulat terkuantisasi adalah $W_q$.&lt;/p>
$$ W_q = \text{round}\left( \frac{W}{S} \right) + Z $$
&lt;p>Di mana,&lt;/p>
&lt;ul>
&lt;li>$S$ adalah &lt;strong>Faktor Skala (Scale Factor)&lt;/strong>, yang menentukan ukuran langkah (resolusi) kuantisasi.&lt;/li>
&lt;li>$Z$ adalah &lt;strong>Zero-point&lt;/strong>, yang merupakan nilai bias untuk menggeser ke nilai bilangan bulat mana bilangan real $0.0$ dipetakan setelah kuantisasi.&lt;/li>
&lt;li>$\text{round}(\cdot)$ adalah fungsi pembulatan ke bilangan bulat terdekat.&lt;/li>
&lt;/ul>
&lt;p>Melalui dekuantisasi (Dequantization), perkiraan bobot bilangan real $\tilde{W}$ dipulihkan selama inferensi.&lt;/p>
$$ \tilde{W} = S \times (W_q - Z) $$
&lt;h3 id="22-kuantisasi-simetris-vs-kuantisasi-asimetris">2.2. Kuantisasi Simetris vs Kuantisasi Asimetris
&lt;/h3>&lt;p>Berdasarkan cara menangani Zero-point $Z$, ini sebagian besar dibagi menjadi dua metode.&lt;/p>
&lt;ol>
&lt;li>
&lt;p>&lt;strong>Kuantisasi Asimetris (Asymmetric Quantization)&lt;/strong>
Memetakan menggunakan nilai minimum $W_{\min}$ dan nilai maksimum $W_{\max}$ dari data.
&lt;/p>
$$ S = \frac{W_{\max} - W_{\min}}{2^b - 1}, \quad Z = \text{round}\left(-\frac{W_{\min}}{S}\right) $$
&lt;p>
Di mana $b$ adalah jumlah bit kuantisasi (contoh: jika 4 bit, $2^4-1 = 15$). Karena perlu menyimpan $Z$, komputasi dan overhead memori akan sedikit meningkat.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>Kuantisasi Simetris (Symmetric Quantization)&lt;/strong>
Menggunakan nilai maksimum absolut dari data, dan memetakan dengan titik nol sebagai pusat ($Z=0$).
&lt;/p>
$$ S = \frac{\max(|W_{\max}|, |W_{\min}|)}{2^{b-1} - 1}, \quad Z = 0 $$
&lt;p>
Kuantisasi awal di llama.cpp (misalnya Q4_0 warisan) menggunakan kuantisasi simetris, dan karena tidak ada istilah $Z$, ia memiliki keuntungan berupa penghitungan produk titik (dot product) yang sangat cepat dengan instruksi SIMD.&lt;/p>
&lt;/li>
&lt;/ol>
&lt;hr>
&lt;h2 id="3-evolusi-dari-ggml-ke-gguf-dan-struktur-file">3. Evolusi dari GGML ke GGUF dan Struktur File
&lt;/h2>&lt;p>Saat membahas llama.cpp, kita tidak boleh melupakan &lt;strong>GGML&lt;/strong>, sebuah pustaka operasi tensor yang ditulis dalam C++, dan &lt;strong>GGUF&lt;/strong>, format file turunan darinya.&lt;/p>
&lt;h3 id="31-tantangan-ggml">3.1. Tantangan GGML
&lt;/h3>&lt;p>llama.cpp versi awal menggunakan format &lt;code>ggml&lt;/code> (dan variannya seperti &lt;code>ggjt&lt;/code>). Namun, ada beberapa masalah dengan ini.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Kurangnya Ekstensibilitas:&lt;/strong> Magic number dan hyperparameter dikodekan secara statis (hardcoded) dengan panjang dan urutan tetap, sehingga setiap kali arsitektur model baru (misal: Llama, Falcon, Mixtral, dll.) atau tokenizer baru ditambahkan, akan terjadi perubahan yang merusak kompatibilitas.&lt;/li>
&lt;li>&lt;strong>Hilangnya Kompatibilitas Mundur (Backward Compatibility):&lt;/strong> Format sering diperbarui, sehingga sering terjadi situasi di mana file model lama tidak dapat dibaca oleh llama.cpp versi terbaru.&lt;/li>
&lt;/ul>
&lt;h3 id="32-lahirnya-format-gguf">3.2. Lahirnya Format GGUF
&lt;/h3>&lt;p>&lt;strong>GGUF&lt;/strong>, yang diperkenalkan pada Agustus 2023, adalah format sangat serbaguna yang dirancang untuk memecahkan masalah ini. Fitur terbesarnya adalah adopsi &lt;strong>struktur metadata berbasis Key-Value&lt;/strong>.&lt;/p>
&lt;p>Diagram Mermaid di bawah ini mengabstraksikan struktur file GGUF.&lt;/p>
&lt;div class="mermaid">graph TD
A["File GGUF"] --> B["Header (Magic, Versi)"]
A --> C["Metadata (Pasangan Key-Value)"]
A --> D["Info Tensor (Nama, Bentuk, Offset)"]
A --> E["Data Tensor (Payload Biner)"]
C --> C1["general.architecture: llama"]
C --> C2["llama.context_length: 4096"]
C --> C3["tokenizer.ggml.tokens: [...]"]
E --> E1["Bobot Layer 0"]
E --> E2["Bobot Layer 1"]
E --> E3["..."]&lt;/div>
&lt;p>&lt;strong>Keuntungan Utama GGUF:&lt;/strong>&lt;/p>
&lt;ol>
&lt;li>&lt;strong>Fleksibilitas:&lt;/strong> Hyperparameter model, pengaturan RoPE (Rotary Positional Embedding), data kosakata tokenizer, dll. semuanya disimpan sebagai pasangan Key-Value bernama. Karena kunci yang tidak dikenal diabaikan, fitur baru mudah ditambahkan.&lt;/li>
&lt;li>&lt;strong>Independen Endianness:&lt;/strong> GGUF menggunakan little-endian secara default, namun portabel secara aman antar arsitektur yang berbeda karena memiliki flag secara eksplisit.&lt;/li>
&lt;li>&lt;strong>Optimalisasi untuk mmap (Memory Mapping):&lt;/strong> Data tensor diselaraskan (padding) pada batas tertentu, dan dapat dipetakan langsung dari disk ke ruang memori menggunakan sistem panggilan &lt;code>mmap()&lt;/code> dari OS. Hal ini membuat waktu inisialisasi pemuatan model pada dasarnya menjadi nol.&lt;/li>
&lt;/ol>
&lt;hr>
&lt;h2 id="4-kedalaman-k-quants-kuantisasi-berbasis-blok-tingkat-lanjut">4. Kedalaman k-quants: Kuantisasi Berbasis Blok Tingkat Lanjut
&lt;/h2>&lt;p>Nilai sesungguhnya dari format GGUF adalah &lt;strong>k-quants (K-quantization)&lt;/strong>, yaitu mekanisme yang bertanggung jawab atas kompresi bobot model.&lt;/p>
&lt;p>Bobot pada jaringan saraf biasa (neural networks) memiliki bentuk yang mendekati distribusi normal saat dilihat secara keseluruhan pada satu lapisan, tetapi ada nilai pencilan (Outliers) secara lokal. Jika bobot seluruh lapisan dikuantisasi dengan faktor skala $S$ yang seragam, informasi dari bobot kecil akan sepenuhnya hilang karena tertarik oleh pencilan.&lt;/p>
&lt;p>Untuk mencegah hal ini, llama.cpp melakukan &lt;strong>Kuantisasi Berbasis Blok (Block-wise Quantization)&lt;/strong>. Tensor bobot dibagi menjadi blok-blok kecil (misalnya 32 elemen atau 256 elemen), dan setiap blok diberikan faktor skala (serta zero-point) yang unik.&lt;/p>
&lt;h3 id="41-keterbatasan-kuantisasi-warisan-q4_0-q4_1">4.1. Keterbatasan Kuantisasi Warisan (Q4_0, Q4_1)
&lt;/h3>&lt;p>&lt;code>Q4_0&lt;/code> awal menjadikan 32 bobot FP16 sebagai satu blok dan berbagi satu faktor skala FP16.&lt;/p>
&lt;ul>
&lt;li>Ukuran blok: 32&lt;/li>
&lt;li>Memori: 1 skala (16-bit) + 32 bobot 4-bit (128-bit) = 144 bit&lt;/li>
&lt;li>Bit efektif per elemen (bpw: bits per weight): $144 / 32 = 4,5$ bpw&lt;/li>
&lt;/ul>
&lt;p>Meskipun ini sudah cukup baik, batasan akurasi dan rasio kompresi mulai terlihat. Untuk mengatasi itu, hadirlah &lt;strong>k-quants&lt;/strong>, yang memiliki struktur hierarkis yang lebih kompleks dan halus.&lt;/p>
&lt;h3 id="42-struktur-hierarkis-super-blok-dan-sub-blok-contoh-q4_k_m">4.2. Struktur Hierarkis Super-blok dan Sub-blok (Contoh Q4_K_M)
&lt;/h3>&lt;p>k-quants memiliki struktur hierarkis yang terdiri dari &amp;ldquo;Super-blok (Super-block)&amp;rdquo; berukuran besar, dan &amp;ldquo;Sub-blok (Sub-block)&amp;rdquo; berukuran kecil yang tercakup di dalamnya. Dengan ini, kuantisasi juga dilakukan pada metadata itu sendiri (seperti nilai skala), untuk menurunkan bpw seminimal mungkin sambil mempertahankan akurasi.&lt;/p>
&lt;p>Mari kita lihat struktur dari pengaturan yang paling populer, yaitu &lt;strong>Q4_K_M&lt;/strong>. Pada Q4_K_M, super-blok dengan 256 elemen digunakan.&lt;/p>
&lt;div class="mermaid">graph TD
A["Super-blok (256 bobot)"] --> B["Metadata Skala (FP16/INT8)"]
A --> C["Sub-blok 0 (32 bobot, 4-bit)"]
A --> D["Sub-blok 1 (32 bobot, 4-bit)"]
A --> E["..."]
A --> F["Sub-blok 7 (32 bobot, 4-bit)"]
B --> B1["Skala-Super (FP16)"]
B --> B2["Skala-Sub (8 x 6-bit)"]
B --> B3["Minimum-Sub (8 x 6-bit)"]&lt;/div>
&lt;p>Struktur aktual dalam C++ (GGML) didefinisikan secara konseptual seperti berikut ini.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;span class="lnt">5
&lt;/span>&lt;span class="lnt">6
&lt;/span>&lt;span class="lnt">7
&lt;/span>&lt;span class="lnt">8
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-cpp" data-lang="cpp">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// Struktur konseptual dari block_q4_K dalam llama.cpp
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="cp">#define QK_K 256
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">struct&lt;/span> &lt;span class="nc">block_q4_K&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kt">uint8_t&lt;/span> &lt;span class="n">d&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">];&lt;/span> &lt;span class="c1">// Skala-super untuk seluruh super-blok (contoh FP16 x 2)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="kt">uint8_t&lt;/span> &lt;span class="n">scales&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">12&lt;/span>&lt;span class="p">];&lt;/span> &lt;span class="c1">// Data gabungan dari skala 6-bit dan nilai minimum (zero-point) 6-bit untuk 8 sub-blok (masing-masing 32 elemen)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="kt">uint8_t&lt;/span> &lt;span class="n">qs&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="n">QK_K&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">];&lt;/span> &lt;span class="c1">// Data bobot yang dikuantisasi dalam 4-bit (256 elemen / 2 = 128 byte)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="p">};&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>&lt;strong>Proses Dekuantisasi Matematika:&lt;/strong>&lt;/p>
&lt;p>Nilai perkiraan bilangan real $\tilde{W}_{i, j}$ untuk elemen $j$ ($0 \le j &lt; 32$) dalam sub-blok $i$ ($0 \le i &lt; 8$) dihitung sebagai berikut.&lt;/p>
$$ \tilde{W}_{i, j} = S_{\text{super}} \times s_i \times (w_{i, j} - m_i) $$
&lt;ul>
&lt;li>$S_{\text{super}}$: Skala floating-point untuk seluruh super-blok&lt;/li>
&lt;li>$s_i$: Skala 6-bit yang dikuantisasi untuk sub-blok $i$&lt;/li>
&lt;li>$m_i$: Nilai minimum (zero-point) 6-bit yang dikuantisasi untuk sub-blok $i$&lt;/li>
&lt;li>$w_{i, j}$: Bobot kuantisasi 4-bit ($0 \dots 15$)&lt;/li>
&lt;/ul>
&lt;p>Berkat struktur hierarkis ini, memori yang ditempati oleh faktor skala itu sendiri berkurang drastis sekaligus mempertahankan kemampuan beradaptasi terhadap nilai pencilan. Q4_K_M secara keseluruhan mencapai sekitar &lt;strong>4,8 bpw&lt;/strong>.&lt;/p>
&lt;h3 id="43-beragam-opsi-k-quants">4.3. Beragam Opsi k-quants
&lt;/h3>&lt;p>llama.cpp menyediakan banyak variasi tergantung pada tujuannya. Akhiran setelah &amp;ldquo;K&amp;rdquo; (S, M, L) menunjukkan seberapa besar ukurannya.&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th style="text-align:left">Format&lt;/th>
&lt;th style="text-align:center">BPW (Bits per Weight)&lt;/th>
&lt;th style="text-align:left">Ringkasan dan Fitur&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Q2_K&lt;/strong>&lt;/td>
&lt;td style="text-align:center">2,5～3,3&lt;/td>
&lt;td style="text-align:left">Kompresi ekstrem. Akurasi menurun drastis, tetapi ditujukan untuk lingkungan dengan VRAM yang sangat minim.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Q3_K_M&lt;/strong>&lt;/td>
&lt;td style="text-align:center">3,3&lt;/td>
&lt;td style="text-align:left">Standar kuantisasi 3-bit. Lebih menurun dibanding Q4, namun seringkali masih dalam batas yang bisa ditoleransi.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Q4_K_M&lt;/strong>&lt;/td>
&lt;td style="text-align:center">4,8&lt;/td>
&lt;td style="text-align:left">&lt;strong>Sweet spot yang direkomendasikan&lt;/strong>. Menyeimbangkan separuh ukuran model dan mempertahankan akurasi.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Q5_K_M&lt;/strong>&lt;/td>
&lt;td style="text-align:center">5,5&lt;/td>
&lt;td style="text-align:left">Ketika akurasi yang lebih tinggi dibutuhkan. Berada di posisi menengah antara Q4 dan FP16.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Q6_K&lt;/strong>&lt;/td>
&lt;td style="text-align:center">6,6&lt;/td>
&lt;td style="text-align:left">Mempertahankan Perplexity yang hampir setara dengan FP16, tetapi ukuran file sedikit lebih besar.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Q8_0&lt;/strong>&lt;/td>
&lt;td style="text-align:center">8,5&lt;/td>
&lt;td style="text-align:left">Setara dengan INT8. Terutama digunakan untuk tensor perantara perhitungan saat inferensi, atau hanya pada lapisan terakhir.&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>※BPW aktual dirata-ratakan pada seluruh model, karena kuantisasi campuran (Mixed Quantization) dilakukan bergantung pada tensor model (misalnya proyeksi Q/K/V pada Attention, atau bobot FFN). Optimalisasi internal dilakukan dengan mengkuantisasi tensor penting dengan Q6 dan yang lainnya dengan Q4.&lt;/p>
&lt;hr>
&lt;h2 id="5-optimalisasi-performa-inferensi-arsitektur-simd-dan-cuda">5. Optimalisasi Performa Inferensi: Arsitektur SIMD dan CUDA
&lt;/h2>&lt;p>Sekadar memuat model GGUF ke dalam memori tidak membuat inferensi menjadi cepat. Sebagian besar inferensi LLM adalah &amp;ldquo;Perkalian Matriks (Matrix-Vector Multiplication, disingkat GEMV, atau Matrix-Matrix, GEMM)&amp;rdquo;. Kuncinya adalah bagaimana mempercepat operasi penjumlahan-perkalian (multiply-accumulate) dari bobot terkuantisasi dan aktivasi (data input) yang dipertahankan dalam FP16 (atau FP32).&lt;/p>
&lt;h3 id="51-pemanfaatan-instruksi-simd-pada-lingkungan-cpu">5.1. Pemanfaatan Instruksi SIMD pada Lingkungan CPU
&lt;/h3>&lt;p>Kecepatan luar biasa llama.cpp pada inferensi CPU disebabkan oleh optimalisasi &lt;strong>SIMD (Single Instruction, Multiple Data)&lt;/strong> di level assembly.
Misalnya, instruksi &lt;strong>AVX2&lt;/strong> dan &lt;strong>AVX-512&lt;/strong> sepenuhnya dimanfaatkan pada CPU Intel/AMD, serta &lt;strong>ARM NEON&lt;/strong> pada Apple Silicon.&lt;/p>
&lt;p>Selama inferensi, perkalian tidak dilakukan dengan sengaja mengembalikan $W_q$ ke FP32 (Dequantize) terlebih dahulu.
Aktivasi juga dikuantisasi secara dinamis per blok (Dynamic Quantization, biasanya menjadi INT8), dan perhitungan integer &lt;strong>INT8 $\times$ INT4&lt;/strong> dihitung sekaligus menggunakan instruksi dot product khusus pada SIMD (contoh: &lt;code>vdpaddd&lt;/code> atau &lt;code>_mm256_madd_epi16&lt;/code>). Throughput yang luar biasa dicapai dengan mengembalikannya ke FP32 dan mengalikannya dengan faktor skala di akumulator akhir.&lt;/p>
&lt;h3 id="52-offload-di-lingkungan-gpu-cublas--cuda">5.2. Offload di Lingkungan GPU (cuBLAS / CUDA)
&lt;/h3>&lt;p>llama.cpp baru-baru ini juga memiliki dukungan kuat untuk GPU NVIDIA (CUBLAS / CUDA), tidak hanya untuk CPU.
Sebagian atau seluruh layer file GGUF dapat di-offload ke VRAM (opsi &lt;code>--n-gpu-layers&lt;/code>).&lt;/p>
&lt;div class="mermaid">sequenceDiagram
participant User
participant CPU_RAM as CPU &amp; RAM (mmap)
participant VRAM as GPU VRAM
participant Compute as Tensor Cores
User->>CPU_RAM: Muat GGUF (mmap)
CPU_RAM->>VRAM: Offload Lapisan (mis. 30/32 lapisan)
Note over CPU_RAM, VRAM: Data tetap terkuantisasi di VRAM
User->>Compute: Forward Pass (Token Input)
Compute->>VRAM: Ambil Bobot Terkuantisasi
Compute->>Compute: Dekuantisasi ke FP16 secara on-the-fly di SRAM
Compute->>Compute: Perkalian Matriks (cuBLAS / Kernel Kustom)
Compute->>User: Output Logit&lt;/div>
&lt;p>Saat melakukan komputasi pada GPU, bandwidth VRAM (Memory Bandwidth) menjadi bottleneck utama. Karena bobot dikompresi menggunakan k-quants, jumlah transfer data dari VRAM ke unit komputasi GPU (SM: Streaming Multiprocessor atau Tensor Cores) berkurang hingga 1/3 ~ 1/4. Begitu bobot tiba di unit komputasi, ia didekuantisasi (diekstrak) menjadi FP16 secara &lt;em>on-the-fly&lt;/em>, dan perkalian matriks dieksekusi dalam kecepatan sangat tinggi menggunakan Tensor Core.
Dengan kata lain, kuantisasi dilakukan &lt;strong>&amp;ldquo;bukan untuk mengurangi jumlah komputasi&amp;rdquo;, melainkan &amp;ldquo;untuk mengurangi jumlah transfer memori&amp;rdquo;&lt;/strong>.&lt;/p>
&lt;hr>
&lt;h2 id="6-contoh-nyata-trade-off-penggunaan-memori-dan-performa">6. Contoh Nyata: Trade-off Penggunaan Memori dan Performa
&lt;/h2>&lt;p>Di sini, mari kita lihat spesifikasi yang dibutuhkan berdasarkan tingkat kuantisasi GGUF menggunakan contoh model Llama 3 8B. (Angka merupakan perkiraan umum)&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th style="text-align:left">Model/Kuantisasi&lt;/th>
&lt;th style="text-align:left">Ukuran File&lt;/th>
&lt;th style="text-align:left">VRAM/RAM yang Dibutuhkan&lt;/th>
&lt;th style="text-align:left">Kecepatan Inferensi (Perkiraan)&lt;/th>
&lt;th style="text-align:left">Penurunan Perplexity&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Llama-3-8B (FP16)&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Sekitar 16 GB&lt;/td>
&lt;td style="text-align:left">Lebih dari 18 GB&lt;/td>
&lt;td style="text-align:left">Standar&lt;/td>
&lt;td style="text-align:left">Tidak ada (Base)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Llama-3-8B (Q8_0)&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Sekitar 8,5 GB&lt;/td>
&lt;td style="text-align:left">Lebih dari 10 GB&lt;/td>
&lt;td style="text-align:left">Cepat&lt;/td>
&lt;td style="text-align:left">Hampir nol&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Llama-3-8B (Q6_K)&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Sekitar 6,6 GB&lt;/td>
&lt;td style="text-align:left">Lebih dari 8 GB&lt;/td>
&lt;td style="text-align:left">Sangat cepat&lt;/td>
&lt;td style="text-align:left">Sangat kecil&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Llama-3-8B (Q4_K_M)&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Sekitar 4,9 GB&lt;/td>
&lt;td style="text-align:left">Lebih dari 6,5 GB&lt;/td>
&lt;td style="text-align:left">Paling cepat・Optimal&lt;/td>
&lt;td style="text-align:left">Dalam batas toleransi・Kecil&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Llama-3-8B (Q3_K_M)&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Sekitar 3,9 GB&lt;/td>
&lt;td style="text-align:left">Lebih dari 5,5 GB&lt;/td>
&lt;td style="text-align:left">Paling cepat&lt;/td>
&lt;td style="text-align:left">Agak menonjol&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Llama-3-8B (Q2_K)&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Sekitar 3,0 GB&lt;/td>
&lt;td style="text-align:left">Lebih dari 4,5 GB&lt;/td>
&lt;td style="text-align:left">Cepat&lt;/td>
&lt;td style="text-align:left">Penurunan yang jelas&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>&lt;strong>Catatan Penting (Pengaruh KV Cache):&lt;/strong>
Pada inferensi LLM, jika panjang konteks (jumlah token dari prompt) semakin panjang, tidak hanya bobot model, tetapi juga konsumsi memori untuk &lt;strong>KV Cache&lt;/strong>, yang menyimpan kondisi Attention masa lalu, akan meledak secara drastis.
Sebagai contoh, dengan konteks sepanjang 8192 token, ia bisa menghabiskan beberapa GB hanya untuk KV Cache. Oleh karena itu, dalam penerapan sebenarnya, batas aman (Headroom) sekitar &lt;code>Ukuran file model + sekitar 1,5GB~3GB&lt;/code> harus disisihkan. Alasan utama mengapa Q4_K_M direkomendasikan adalah karena meskipun KV cache ini diamankan, ia tetap menjadi titik keseimbangan yang pas dan aman berjalan pada GPU dengan memori VRAM 8GB umum (seperti RTX 3060 / 4060).&lt;/p>
&lt;p>Dalam llama.cpp versi terbaru, fitur untuk &lt;strong>mengkuantisasi KV cache itu sendiri menjadi Q8_0 atau Q4_0&lt;/strong> juga telah ditambahkan, sehingga selalu ada upaya tanpa henti untuk lebih memperpanjang panjang konteks.&lt;/p>
&lt;hr>
&lt;h2 id="7-kesimpulan">7. Kesimpulan
&lt;/h2>&lt;p>Pada artikel ini, kita telah menggali lebih dalam dan menjelaskan tentang struktur internal dari format GGUF dan teknologi kuantisasi k-quants, yang merupakan jantung dari llama.cpp.&lt;/p>
&lt;ol>
&lt;li>&lt;strong>Fleksibilitas GGUF:&lt;/strong> Melalui struktur metadata berbasis Key-Value, ekosistem yang tangguh telah dibangun sehingga dapat mengikuti perkembangan pesat LLM (seperti kemunculan arsitektur model baru) tanpa menyebabkan perubahan yang merusak kompatibilitas.&lt;/li>
&lt;li>&lt;strong>Kompresi Ekstrem oleh k-quants:&lt;/strong> Dengan manajemen faktor skala hierarkis dari super-blok dan sub-blok, llama.cpp berhasil mempertahankan informasi nilai pencilan, sambil mencapai rasio kompresi menakjubkan dengan rata-rata 4,8 bit per bobot (Q4_K_M).&lt;/li>
&lt;li>&lt;strong>Mengatasi Bottleneck Bandwidth Memori:&lt;/strong> Penerapan kernel canggih untuk SIMD dan CUDA yang melakukan komputasi serentak dengan dekuantisasi on-the-fly, dapat mengurangi jumlah transfer dari VRAM dan secara dramatis meningkatkan kecepatan inferensi.&lt;/li>
&lt;/ol>
&lt;p>Kemampuan teknologi dari llama.cpp dalam mendorong demokratisasi AI bukan sekadar alat bantu biasa, tidak berlebihan jika dikatakan bahwa ini adalah salah satu pencapaian tertinggi dalam rekayasa perangkat lunak modern. Memahami algoritma kuantisasi dan mekanisme format GGUF akan membantu Anda memilih model paling sesuai untuk lingkungan Anda sendiri dan menjalankan penyesuaian performa (performance tuning) yang lebih akurat.&lt;/p>
&lt;h3 id="tautan-referensi">Tautan Referensi
&lt;/h3>&lt;ul>
&lt;li>&lt;a class="link" href="https://github.com/ggerganov/llama.cpp" target="_blank" rel="noopener"
>Repositori GitHub llama.cpp&lt;/a>&lt;/li>
&lt;li>&lt;a class="link" href="https://github.com/ggerganov/ggml/blob/master/docs/gguf.md" target="_blank" rel="noopener"
>Spesifikasi Format GGUF&lt;/a>&lt;/li>
&lt;li>&lt;a class="link" href="https://github.com/ggerganov/llama.cpp/pull/1684" target="_blank" rel="noopener"
>PR Implementasi K-quants&lt;/a>&lt;/li>
&lt;/ul>
&lt;p>(Selesai)&lt;/p></description></item></channel></rss>