Kembali ke blog

Pemecahan masalahPanduan

Pemrosesan prompt llama.cpp 35x lebih lambat? Perbaiki KV cache q5_1

Flash attention plus KV cache q5_1 dapat mendorong attention ke CPU. Cara memastikannya, memperbaikinya dengan q8_0, dan kapan API lebih sederhana.

Oleh CheapTokens TeamDiterbitkan 5 menit baca

Terminal menunjukkan GPU di 0 persen dan CPU di 930 persen selama pemrosesan prompt llama.cpp
Di halaman ini
  1. Tampilannya di layar
  2. Mengapa cache yang lebih kecil membuatnya jauh lebih lambat
  3. Periksa dalam dua menit
  4. Perbaikan 1: gunakan q8_0 (atau build ulang)
  5. Kapan tuning tidak lagi sepadan
  6. Urutan yang harus dikerjakan

Model lokal Anda menjawab dengan baik, tetapi setiap prompt panjang kini tertahan selama satu setengah menit sementara GPU tidak melakukan apa-apa. Jika Anda menjalankan llama.cpp dengan -fa on dan KV cache q5_1, kemungkinan besar itulah penyebabnya: build CUDA bawaan tidak memiliki kernel flash-attention untuk tipe cache tersebut, sehingga langkah attention diam-diam berjalan di CPU. Mengganti cache ke q8_0 membawa salah satu pelapor dari 38 ke 1348 token/detik pada pemrosesan prompt.

Angka-angka di bawah berasal dari issue llama.cpp #28455 (dibuka 5 September 2026, build 10791, diperiksa 28 Oktober 2026). Satu pelapor, satu RTX 4080, satu model 27B, jadi bacalah sebagai contoh kasus, bukan hukum. Analisis akar masalahnya juga milik mereka: seorang maintainer menyebutnya "masalah yang diketahui" dan menutup issue tersebut keesokan harinya.

Tampilannya di layar#

Pengaturannya biasa saja. Seseorang ingin konteks 131072 token pada satu kartu 16 GB, jadi mereka mengecilkan KV cache ke q5_1:

bash
llama-server -m model.gguf -ngl 99 -fa on -c 131072 -np 4 \
  --cache-type-k q5_1 --cache-type-v q5_1

Lalu mereka mengirim prompt 3,6K token. Pemrosesan prompt berjalan pada 38,4 token/detik dan decoding pada 6,5 token/detik. Bagi saja: 3.600 ÷ 38,4 = 93,75, jadi sekitar 94 detik sebelum kata pertama. Dengan q8_0 prompt yang sama berjalan pada 1348 token/detik: 3.600 ÷ 1.348 = 2,67, di bawah tiga detik.

Petunjuknya ada di task manager. Selama proses lambat, GPU berada di sekitar 0% sementara CPU menunjukkan sekitar 930% (sembilan atau sepuluh core sibuk). GPU yang menganggur saat Anda "menjalankan di GPU" adalah gejala yang harus dicari.

Kecepatan pemrosesan prompt dengan KV cache q5_1 dan q8_0
Prompt eval pada prompt 3,6K token, RTX 4080, issue llama.cpp #28455 (5 September 2026)

Mengapa cache yang lebih kecil membuatnya jauh lebih lambat#

Flash attention adalah kernel GPU yang terfusi. Build CUDA bawaan hanya menyertakannya untuk beberapa pasangan tipe KV cache. Untuk q4_0, q4_1, q5_0 dan q5_1 tidak ada kernel, jadi llama.cpp tidak berhenti dengan error. Ia memindahkan operasi itu ke CPU dan melanjutkan. Semuanya tetap berjalan, hanya sekitar 35 kali lebih lambat pada pemrosesan prompt (1348 ÷ 38,4 = 35,1).

Kata "diam-diam" itulah seluruh masalahnya. Tidak ada apa pun dalam jawaban yang memberi tahu Anda. Pemrosesan prompt turun paling banyak (sekitar 35×), dan generasi juga melambat: 6,5 token/detik dibandingkan 30,1 dengan q8_0 pada issue yang sama.

Periksa dalam dua menit#

Jalankan llama-bench dengan tipe cache yang sama seperti yang Anda gunakan di server, sekali per varian, dan pantau GPU di terminal lain:

bash
llama-bench -m model.gguf -ngl 99 -fa 1 -ctk q8_0 -ctv q8_0 -p 512 -n 0
llama-bench -m model.gguf -ngl 99 -fa 1 -ctk q5_1 -ctv q5_1 -p 512 -n 0
nvidia-smi -l 1

Hasil pp512 pelapor pada Qwen 27B Q5_K_XL: 1511,92 token/detik untuk q8_0/q8_0, sekitar 197 untuk q5_1/q5_1 pada build bawaan. Jika kedua baris Anda menunjukkan selisih seperti itu dan nvidia-smi menunjukkan GPU menganggur selama baris kedua, Anda telah menemukannya.

Sebelum memperbaiki apa pun, cocokkan apa yang Anda lihat dengan kemungkinan penyebabnya:

Cocokkan pasangan

Cocokkan setiap gejala dengan penyebabnya

  • GPU di ~0%, CPU di ~930% selama prompt panjangAttention berjalan di CPU
  • Decoding turun ke ~6,5 token/detik dibandingkan 30,1 dengan q8_0Generasi juga melambat, bukan hanya pemrosesan prompt
  • Flag yang sama cepat dengan q8_0Pasangan tipe cache ini tidak memiliki kernel flash-attention GPU pada build bawaan

Perbaikan 1: gunakan q8_0 (atau build ulang)#

Perbaikan tercepat adalah mengubah dua flag dan mempertahankan sisanya:

bash
llama-server -m model.gguf -ngl 99 -fa on -c 131072 -np 4 \
  --cache-type-k q8_0 --cache-type-v q8_0

Pada issue ini, hasilnya 1348 token/detik pada pemrosesan prompt dan 30,1 token/detik pada decoding (naik dari 6,5). Harganya adalah memori: cache q8_0 lebih besar daripada q5_1, jadi periksa apakah panjang konteks Anda masih muat di VRAM.

Jika Anda harus mempertahankan q5_1 karena alasan memori, build ulang dengan semua kombinasi cache flash-attention dikompilasi:

bash
cmake -B build -DGGML_CUDA=ON -DGGML_CUDA_FA_ALL_QUANTS=ON
cmake --build build --config Release -j

Build tersebut menjalankan q5_1 pada 1509,70 token/detik pada pp512 dan 1162 token/detik pada prompt 3,6K token, dengan decoding pada 38,5 token/detik. Seorang komentator pada issue tersebut menunjukkan bahwa memindahkan pekerjaan antar backend dapat sedikit mengubah hasil numerik dan menyarankan perbandingan perplexity antar build. Jika Anda peduli pada output yang persis, jalankanlah satu.

Bandingkan

Perbaikan mana yang cocok untuk kartu Anda?

Cache q8_0

Ubah --cache-type-k dan --cache-type-v menjadi q8_0. Tanpa build ulang. Menggunakan VRAM lebih banyak daripada q5_1, jadi periksa ulang ukuran konteks yang bisa Anda muat.

Build ulang dengan FA_ALL_QUANTS

Pertahankan q5_1 dan build dengan -DGGML_CUDA_FA_ALL_QUANTS=ON. VRAM sama seperti sebelumnya, tetapi Anda harus memelihara build sendiri dan kompilasinya lebih lama.

Balasan "masalah yang diketahui" dari maintainer tidak menyebut apakah versi llama.cpp saat ini telah mengubah ini. Pemeriksaan yang jujur adalah pasangan llama-bench di atas: jika kedua baris berdekatan, Anda aman.

Kapan tuning tidak lagi sepadan#

Katakanlah Anda berhasil menerapkan perbaikan, dan sekarang Anda mempertimbangkan putaran berikutnya: lebih banyak flag, GPU kedua, kuantisasi lebih kecil. Jika pekerjaannya adalah ringkasan, tinjauan kode, atau ekstraksi pada prompt beberapa ribu token, tanyakan berapa biaya satu permintaan dalam waktu dan usaha, bukan hanya dalam watt.

Berikut beban kerja yang dinyatakan untuk dibandingkan. Katakanlah sebuah pekerjaan peringkasan mengirim 3.600 token input dan menerima 500 kembali, 1.000 kali. Di CheapTokens itu sekitar $0.104 pada DeepSeek-V4-Flash (konteks 380K, hingga 32.768 token output per jawaban, satu harga kapan pun) dan sekitar $0.092 pada GLM-5.3-Flash (konteks 390K). Tabel menghitung input dan output bersama-sama, dengan kolom OpenRouter untuk perbandingan:

Model Per permintaan 1.000 permintaan OpenRouter, 1.000 permintaan
GLM-5.3-Flash $0.000092 $0.092 $0.187
DeepSeek-V4-Flash $0.0001 $0.104 $0.249
MiniMax-M2.7 $0.00026 $0.255 $1.68

3.600 token input dan 500 token output per permintaan. Harga per 1 juta token adalah harga saat ini dan berubah seiring tarif kami; kolom OpenRouter menunjukkan harga referensi untuk beban kerja yang sama.

API tidak peduli pada tipe cache, VRAM, atau flag build Anda; tidak ada yang perlu dialihkan ke CPU. Kirim beberapa prompt asli Anda terlebih dahulu dan nilai jawabannya sendiri. Langkahnya kecil: endpoint tersebut berbicara dalam format OpenAI Chat Completions, jadi sebagian besar klien lokal hanya perlu base URL baru.

bash
curl https://api.cheaptokens.dev/v1/chat/completions \
  -H "Authorization: Bearer $CHEAPTOKENS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"model": "deepseek-ai/DeepSeek-V4-Flash-0731", "messages": [{"role": "user", "content": "Summarize the text below in 5 bullets: ..."}], "max_tokens": 500}'

Pengaturan lengkapnya ada di dokumentasi CheapTokens, dan harga per model terkini ada di halaman harga. Untuk pembahasan lebih panjang tentang perangkat keras versus API, lihat Jalankan DeepSeek secara lokal atau gunakan API. Jika Anda ingin melihat bagaimana input dan output ditagih secara terpisah, token input vs output membahasnya.

Urutan yang harus dikerjakan#

Urutkan

Susun langkah-langkah pemecahan masalah secara berurutan

  1. Jalankan llama-bench untuk q8_0 dan q5_1 dan pantau nvidia-smi
  2. Ganti kedua tipe cache ke q8_0
  3. Periksa apakah panjang konteks masih muat di VRAM
  4. Build ulang dengan GGML_CUDA_FA_ALL_QUANTS=ON hanya jika Anda memerlukan q5_1
  5. Bandingkan prompt yang sama pada API jika pengaturan lokal masih belum sepadan dengan usahanya

Satu peringatan lagi tentang sumber: seluruh diagnosis bertumpu pada satu issue publik dan satu GPU. Anggap 1348 dan 38,4 sebagai apa yang terjadi di sana, dan ukur kartu Anda sendiri sebelum mempercayai keduanya.