Menguji batas VRAM 6 GiB di Nitro AN515-57
Benchmark AI lokal pada GPU laptop 6 GiB: LLM, ASR, TTS, embedding, reranking, konversi PDF, dan image-to-3D
Setelah Mac dan laptop Ubuntu saya terhubung melalui kabel USB-C, langkah berikutnya adalah menguji AI lokal di laptop Ubuntu tersebut.
Laptop ini saya pakai untuk mengembangkan aplikasi yang membutuhkan LLM, embedding, reranking, TTS, ASR, dan image-to-3D. Dengan VRAM 6 GiB, saya perlu menentukan model yang bisa menetap di GPU dan pekerjaan yang harus dijalankan bergantian. Tulisan ini merangkum hasil pengujiannya; data mentah dan skripnya ada di repositori benchmarks.
Perangkat dan metode pengujian#
| Komponen | Konfigurasi |
|---|---|
| Laptop | Acer Nitro AN515-57 |
| CPU | Intel Core i7-11800H, 8 core dan 16 thread |
| RAM | Sekitar 31 GiB, tanpa swap |
| GPU | RTX 3060 Laptop, VRAM fisik 6.144 MiB |
| Sistem | Ubuntu 24.04.5 LTS, driver NVIDIA 580.196.07 |
Untuk LLM, hanya satu server inference yang aktif pada satu waktu, dan setiap run menunggu GPU dingin lebih dulu karena pengaruh suhu besar pada laptop ini.
| Pengaturan | Nilai pada pengujian throughput |
|---|---|
| Runtime | Ollama 0.32.13, llama.cpp 8df332d, vLLM 0.30.0, SGLang 0.5.20 |
| Prompt | Sekitar 2.800 token, dengan prefix unik agar cache run sebelumnya tidak terpakai |
| Keluaran | 256 token, temperature 0 |
| Pengulangan | Tiga kali per konfigurasi; hasil berupa median; warmup tidak dihitung |
| Beban | Satu atau empat permintaan bersamaan |
| Suhu awal | Paling tinggi 55 °C; khusus SGLang 68 °C karena GPU tetap hangat saat idle |
Decode menunjukkan kecepatan setelah token pertama keluar. TTFT mengukur latensi dari pengiriman permintaan sampai chunk pertama diterima. Throughput gabungan menghitung seluruh token keluaran dibagi waktu kelompok permintaan, termasuk TTFT.
Qwen3.5-4B pada empat runtime#
Model kecil ini berjalan sepenuhnya di GPU. Kolom decode berasal dari satu permintaan, kolom total dari empat permintaan yang dikirim bersamaan. Semua kecepatan dalam token per detik.
| Runtime | Decode | Total, 4 |
|---|---|---|
| vLLM | 78,0 | 201,1 |
| SGLang | 77,8 | 116,8 |
| llama.cpp | 69,8 | 77,4 |
| Ollama | 73,6 | 64,1 |
vLLM menghasilkan throughput gabungan tertinggi pada beban ini. Angka 201,1 merupakan total kelompok permintaan; decode per permintaan vLLM pada beban empat permintaan sekitar 66,6 token/detik.
Konfigurasi tiap runtime berbeda, jadi selisihnya tidak dapat dikaitkan hanya dengan nama runtime:
| Runtime | Kondisi yang memengaruhi perbandingan |
|---|---|
| vLLM | AWQ 4-bit, KV cache 1,5 miliar byte, maksimum 16 request |
| SGLang | AWQ 4-bit, maksimum empat request, pool KV sekitar 11.549 token, graph prefill dimatikan |
| llama.cpp | Q4_K_M, ubatch 2048, empat slot dengan --parallel 4 dan --kv-unified |
| Ollama | Q4_K_M, OLLAMA_NUM_PARALLEL=1, sehingga empat request diproses berurutan |
Model besar dengan bantuan CPU#
Qwen3.6-35B-A3B Q4_K_M berukuran sekitar 20,7 GiB. Sebagian tensor expert perlu ditempatkan di CPU agar model dapat digunakan bersama GPU 6 GiB. vLLM dan SGLang tidak diuji untuk model ini karena bobotnya tidak muat di kartu.
Pada llama.cpp, konfigurasi berikut memakai --n-cpu-moe 36, ubatch 4096, tujuh thread CPU, dan context window 32.768 token. Decode dalam token per detik, TTFT dalam detik.
| Runtime | Decode | TTFT |
|---|---|---|
| llama.cpp | 36,8 | 4,4 |
| Ollama | 26,2 | 15,0 |
Kecepatan prompt llama.cpp sekitar 638 token/detik. Angka itu dihitung dari jumlah prompt token dibagi TTFT, sehingga mencakup overhead sebelum token pertama, bukan waktu kernel prefill tersendiri.
File Q4_K_M pada perbandingan ini tidak identik: llama.cpp memakai GGUF dari Bartowski karena metadata blob Ollama tidak kompatibel dengan llama.cpp yang diuji. Sebagai pembanding dengan file yang sama, Qwen3-Coder-30B-A3B memakai blob GGUF Ollama pada kedua runtime, dengan --n-cpu-moe 44 dan ubatch 4096 pada llama.cpp:
| Runtime | Decode | TTFT |
|---|---|---|
| llama.cpp | 24,6 | 3,7 |
| Ollama | 20,0 | 14,9 |
Pada kedua model, llama.cpp memulai keluaran jauh lebih cepat. Ini relevan untuk aplikasi yang membawa prompt panjang sebelum menghasilkan jawaban.
Simulasi sesi agent#
Pengujian delapan turn memakai riwayat sintetis yang bertambah hingga sekitar 10.300 token. Angka pada tabel menjumlahkan TTFT dari seluruh turn, tanpa waktu menghasilkan jawaban.
| Model dan runtime | Jumlah TTFT delapan turn |
|---|---|
| Qwen3.5-4B, SGLang | 4,4 detik |
| Qwen3.5-4B, vLLM | 5,2 detik |
| Qwen3.5-4B, llama.cpp ubatch 2048 | 6,1 detik |
| Qwen3.5-4B, Ollama | 10,3 detik |
| Qwen3-Coder-30B-A3B, llama.cpp | 27,9 detik |
| Qwen3.6-35B-A3B, llama.cpp | 32,3 detik |
| Qwen3-Coder-30B-A3B, Ollama | 65,0 detik |
| Qwen3.6-35B-A3B, Ollama | 84,3 detik |
SGLang mencatat jumlah TTFT terendah untuk model 4B, tetapi pool KV-nya membatasi panjang prompt: context 32.768 token tidak berarti pool tersebut mampu menampung permintaan sepanjang itu.
Seluruh konfigurasi mencatat tool call valid 5/5. Pengujian ini hanya memeriksa nama tool dan JSON arguments, bukan apakah model berhasil menyelesaikan tugas agent.
TTS, ASR, embedding, reranking, dan PDF#
Qwen3-ASR-1.7B membaca 100 klip pertama FLEURS berbahasa Indonesia (set dev), dengan reranker menetap di kartu. WER dan CER dihitung setelah tanda baca dihapus dan teks dijadikan huruf kecil.
| Metrik ASR | Hasil |
|---|---|
| WER | 6,52 % |
| CER | 2,81 % |
| Model load latency | 12,8 detik |
| Cold-start latency | 14,3 detik |
| Warm latency | Median 0,86 detik per klip |
| Puncak pemakaian kartu | 5.463 MiB |
Selisih cold-start dan warm latency ini ikut menentukan latensi saat aplikasi berganti layanan.
Untuk rekaman panjang, saya menggabungkan 26 klip dengan jeda setengah detik menjadi 324 detik audio. Server memotong rekaman sebelum ditranskripsi, dan proses selesai dalam 21,5 detik dengan WER 9,81 % serta puncak kartu 5.650 MiB. Klip yang digabung tidak saling berhubungan, sehingga WER-nya tidak dibandingkan langsung dengan hasil klip pendek.
| Pengujian lain | Hasil pada masukan yang dicatat |
|---|---|
| TTS OmniVoice | Kalimat 188 karakter pada empat frozen voice preset: 4,5–4,7 detik untuk 11,2–12,4 detik audio. Model load latency 7,3 detik. |
| Embedding bge-m3 di CPU | Query 40 karakter: 0,18 detik. Chunk 1.200 karakter: 0,28–0,54 detik pada 16 thread. |
| Reranker di GPU | 20 kandidat sepanjang 1.200 karakter: 313–344 milidetik. Masukan yang sama pada 16 thread CPU memerlukan 5,98 detik. |
| Konversi PDF | 19,4 detik, menghasilkan 274.794 karakter Markdown. |
Uji PDF memakai nist-sp800-73pt2.pdf dengan layout docling_layout_egret_xlarge.
Angka CPU reranker diukur dengan CUDA_VISIBLE_DEVICES dikosongkan. Binary llama.cpp yang dibangun dengan CUDA tetap menitipkan perkalian matriks batch ke GPU walaupun -ngl 0, sehingga tanpa langkah itu 20 kandidat tampak selesai dalam sekitar 1,6 detik.
Image-to-3D#
TRELLIS.2 berjalan melalui trellis2cpp dengan patch low-VRAM: SS flow dilepas setelah digunakan, lalu shape flow dimuat saat dibutuhkan. Dengan cara ini seluruh komponen model tidak perlu ditahan sekaligus di kartu.
Hasil berikut memakai potret yang dipotong menjadi 1.755 piksel di bagian kepala dan bahu:
| Tahap atau metrik | Hasil |
|---|---|
| Model load latency | 8,8 detik |
| Latensi end-to-end | 299 detik |
| Mesh generation | 152,5 detik |
| Texture bake | 135,8 detik |
| IoU siluet depan | 0,951 |
| Jumlah segitiga | 99.999 |
| Puncak pemakaian kartu | 4.673 MiB |
Skor siluet hanya menilai kecocokan dari depan; kualitas geometri dan tekstur dari sudut lain tetap perlu diperiksa. Pekerjaan selama lima menit juga menahan layanan lain yang menunggu giliran memakai GPU.
Berbagi satu GPU#
Layanan TTS, ASR, image-to-3D, dan konversi PDF bergantian memakai GPU. Model dimuat saat dibutuhkan dan dilepas ketika idle atau ketika layanan lain meminta ruang. Pada pengujian ini, permintaan TTS pertama membuat model ASR dilepas, lalu model TTS dimuat. Reranker tetap menetap di kartu, dan LLM melalui Ollama berjalan di luar mekanisme giliran tersebut.
Mekanisme ini mengatur giliran, tetapi belum menjamin bebas OOM untuk setiap kombinasi layanan. Latensi antrean lintas layanan juga belum diukur.
Kesimpulan#
vLLM unggul untuk beberapa permintaan model kecil, sedangkan llama.cpp dengan pembagian CPU dan GPU unggul untuk model besar yang diuji. Di aplikasi, pilihan itu masih perlu disesuaikan dengan layanan lain yang sedang aktif. Semua angka LLM di atas berasal dari pengujian singkat setelah GPU dingin; beban berkelanjutan memicu thermal slowdown, sehingga ruang model, latensi pemuatan ulang, latensi antrean, dan suhu menentukan apakah kecepatan pada tabel dapat dipertahankan.
Komentar
Belum ada komentar.