- Mesin inferensi lokal khusus DeepSeek V4 Flash yang dioptimalkan untuk Apple Metal GPU, berupa implementasi native C yang berfokus pada satu model, bukan runner GGUF serbaguna
- DeepSeek V4 Flash memiliki jumlah parameter aktif yang sedikit sehingga memberikan kecepatan tinggi, dan dalam mode thinking menghasilkan segmen penalaran yang hanya sekitar 1/5 panjang model lain
- Mendukung inferensi konteks panjang bahkan di lingkungan lokal melalui jendela konteks 1 juta token dan KV cache yang sangat terkompresi, serta mendukung persistensi KV cache ke disk
- Menyertakan server HTTP API yang kompatibel dengan OpenAI dan Anthropic, sehingga bisa langsung dihubungkan dengan berbagai coding agent seperti Claude Code, opencode, dan Pi
- Dibangun di atas fondasi ekosistem llama.cpp dan GGML, serta merupakan proyek yang dikembangkan dengan dukungan coding yang kuat dari GPT 5.5
Gambaran proyek dan filosofi desain
ds4.c adalah mesin inferensi native kecil khusus untuk DeepSeek V4 Flash, bukan runner GGUF serbaguna atau wrapper untuk runtime lain
- Jalur inti adalah eksekutor graf Metal yang dikhususkan untuk DeepSeek V4 Flash, dan mencakup loading khusus DS4, rendering prompt, status KV, serta kode perekat API server
- Ada banyak proyek unggulan di ranah inferensi lokal, tetapi perhatian sering terpecah karena model baru terus bermunculan
- Proyek ini sengaja fokus pada satu model pada satu waktu, dan juga melakukan verifikasi vektor resmi (logits), pengujian konteks panjang, hingga integrasi agent
- Visi inferensi lokal: A) mesin inferensi dengan HTTP API + B) GGUF yang dioptimalkan untuk mesin tertentu + C) pengujian dan verifikasi melalui implementasi coding agent; ketiganya harus bekerja bersama
- Khusus untuk Metal, dengan kemungkinan dukungan CUDA di masa depan tetapi belum dipastikan
- Jalur CPU hanya ada untuk verifikasi akurasi, dan saat ini menjalankan kode CPU dapat memicu kernel crash karena bug implementasi memori virtual pada versi macOS sekarang
- Dikembangkan dengan dukungan kuat dari GPT 5.5, sementara manusia memimpin ide, pengujian, dan debugging
Mengapa DeepSeek V4 Flash dibuat sebagai mesin terpisah
- Jumlah parameter aktifnya sedikit sehingga memberi kecepatan inferensi lebih tinggi
- Dalam mode thinking, model ini menghasilkan segmen penalaran sekitar 1/5 lebih pendek dibanding model lain, dan panjang segmen penalaran sebanding dengan kompleksitas masalah
- Bahkan dalam situasi ketika model lain praktis tidak dapat dipakai dalam mode thinking, DeepSeek V4 Flash masih bisa digunakan
- Mendukung jendela konteks 1 juta token
- Dengan skala 284B parameter, model ini mengetahui lebih banyak informasi di batas pengetahuan dibanding model 27B dan 35B
- Perbedaannya dapat dilihat pada pertanyaan tentang acara TV Italia, politik, dan sebagainya
- Kualitas penulisan bahasa Inggris dan Italia berada pada tingkat model quasi-frontier
- KV cache sangat terkompresi sehingga inferensi konteks panjang bisa dilakukan di komputer lokal, serta mendukung persistensi KV cache ke disk
- Dengan kuantisasi khusus, model ini tetap bekerja baik bahkan pada kuantisasi 2-bit, sehingga dapat dijalankan di MacBook RAM 128GB
- Diperkirakan DeepSeek akan merilis versi pembaruan V4 Flash di masa mendatang
Ucapan terima kasih untuk llama.cpp dan GGML
- ds4.c tidak melakukan link ke GGML, tetapi hadir di atas jalur yang dibuka proyek llama.cpp
- Kernel, format kuantisasi, ekosistem GGUF, dan pengetahuan engineering hard-won dari llama.cpp menjadi referensi penting
- Sebagian kode level sumber dipertahankan atau diterapkan di bawah lisensi MIT: layout dan tabel quant GGUF, logika quant/dot CPU, kernel Metal tertentu, dan lain-lain
- Berkas LICENSE mempertahankan atribusi hak cipta penulis GGML
Bobot model
- Hanya DeepSeek V4 Flash GGUF yang dipublikasikan khusus untuk proyek ini yang dapat digunakan; berkas DeepSeek/GGUF sembarang tidak kompatibel
- Kuantisasi 2-bit menggunakan metode kuantisasi asimetris
- Hanya expert MoE yang dikuantisasi: up/gate memakai
IQ2_XXS, down memakai Q2_K
- Komponen lain seperti shared expert, proyeksi, routing, dan sebagainya tidak dikuantisasi demi menjaga kualitas
./download_model.sh q2 untuk mesin RAM 128GB, dan ./download_model.sh q4 untuk mesin dengan RAM 256GB atau lebih
- Diunduh dari Hugging Face (
antirez/deepseek-v4-gguf) dan mendukung resume unduhan parsial dengan curl -C -
./download_model.sh mtp dapat mengunduh GGUF dengan dukungan opsional speculative decoding
- Jalur MTP/speculative decoding masih eksperimental dan saat ini hanya memberi sedikit peningkatan kecepatan
Benchmark kecepatan
- Angka CLI Metal dari satu kali eksekusi dengan pengaturan
--ctx 32768, --nothink, decoding greedy, dan -n 256
- MacBook Pro M3 Max, 128GB (q2)
- Prompt pendek: prefill 58.52 t/s, generasi 26.68 t/s
- Prompt 11709 token: prefill 250.11 t/s, generasi 21.47 t/s
- q4: N/A karena kekurangan memori
- Mac Studio M3 Ultra, 512GB (q2)
- Prompt pendek: prefill 84.43 t/s, generasi 36.86 t/s
- Prompt 11709 token: prefill 468.03 t/s, generasi 27.39 t/s
- Mac Studio M3 Ultra, 512GB (q4)
- Prompt pendek: prefill 78.95 t/s, generasi 35.50 t/s
- Prompt 12018 token: prefill 448.82 t/s, generasi 26.62 t/s
Cara penggunaan CLI
- Gunakan opsi
-p untuk menjalankan prompt one-shot; jika dijalankan tanpa -p, akan masuk ke mode chat interaktif multi-turn
- CLI interaktif mempertahankan transkrip chat yang sudah dirender dan checkpoint Metal KV live, sehingga setiap turn memperluas percakapan sebelumnya
- Perintah yang berguna:
/help, /think, /think-max, /nothink, /ctx N, /read FILE, /quit
- Gunakan Ctrl+C untuk menghentikan generasi saat ini lalu kembali ke prompt
- Nilai default adalah mode thinking, dan bisa diubah ke mode respons langsung dengan
/nothink atau --nothink
--mtp MTP.gguf --mtp-draft 2 dapat mengaktifkan jalur MTP spekulatif opsional
- Hanya berguna untuk decoding greedy, dan memakai confidence gate (
--mtp-margin) agar tidak menerima bagian lambat
Server
- Dapat menjalankan server HTTP lokal yang kompatibel dengan OpenAI/Anthropic
- Khusus Metal, dan menyimpan satu graf/checkpoint KV yang dapat diubah di memori
- Jika klien stateless mengirim ulang versi prompt yang lebih panjang dari prompt yang sama, prefix bersama dapat digunakan ulang
- Parsing request dan socket berjalan di thread klien, tetapi inferensinya sendiri diserialkan melalui satu worker Metal
- Saat ini server tidak melakukan batching pada beberapa request independen; request bersamaan akan menunggu sesuai urutan
-
Endpoint yang didukung
GET /v1/models, GET /v1/models/deepseek-v4-flash
POST /v1/chat/completions, POST /v1/completions, POST /v1/messages
-
/v1/chat/completions (kompatibel OpenAI)
- Mendukung
messages, max_tokens/max_completion_tokens, temperature, top_p, top_k, min_p, seed, stream, stream_options.include_usage, tools, tool_choice
- Skema tool dirender dalam format tool DSML milik DeepSeek, dan pemanggilan tool DSML yang dihasilkan dikonversi kembali menjadi pemanggilan tool OpenAI
-
/v1/messages (kompatibel Anthropic)
- Endpoint untuk klien bergaya Claude Code
- Mendukung
system, messages, tools, tool_choice, max_tokens, temperature, top_p, top_k, stream, stop_sequences, serta kontrol thinking
- Penggunaan tool dikembalikan sebagai blok
tool_use Anthropic
- Kedua API mendukung streaming SSE, dan dalam mode thinking proses penalaran di-stream dalam bentuk API native
Integrasi klien agent
- ds4-server dapat diintegrasikan dengan coding agent lokal yang menggunakan chat completions kompatibel OpenAI
- Saat menjalankan quant 2-bit (81GB) pada RAM 128GB, jendela konteks 100k~300k token adalah rentang yang sesuai
- Konteks penuh 1M token memakai sekitar 26GB memori (compress indexer saja sekitar 22GB)
- Dengan pengaturan batas output
384000, pembatasan token dapat dihindari (model dapat menghasilkan hingga 384k token)
-
Integrasi opencode
- Tambahkan item provider dan agent ke
~/.config/opencode/opencode.json untuk konfigurasi
- Setel
baseURL ke http://127.0.0.1:8000/v1
-
Integrasi Pi
- Tambahkan konfigurasi provider ke
~/.pi/agent/models.json
- Mencakup opsi kompatibilitas seperti format thinking DeepSeek, dukungan reasoning effort, dan dukungan usage streaming
- Dapat ditetapkan sebagai model default di
~/.pi/agent/settings.json
-
Integrasi Claude Code
- Menggunakan endpoint kompatibel Anthropic, dan mengatur variabel lingkungan dengan skrip wrapper
~/bin/claude-ds4
- Arahkan
ANTHROPIC_BASE_URL ke server lokal dan setel semua variabel model ke deepseek-v4-flash
- Claude Code pada awalnya mengirim prompt besar sekitar 25k token, sehingga wajib mengaktifkan
--kv-disk-dir
- Setelah prefill pertama yang mahal, disk KV cache menggunakan ulang prefix yang disimpan sehingga sesi berikutnya tidak perlu memproses ulang seluruh prompt
Mode thinking
- DeepSeek V4 Flash mendukung tiga mode: non-thinking, thinking, dan Think Max
- Default server adalah mode thinking
- Think Max dapat diminta dengan
reasoning_effort=max, tetapi hanya berlaku jika ukuran konteks cukup besar sesuai rekomendasi model card
- Pada konteks kecil, akan fallback ke thinking biasa
- OpenAI
reasoning_effort=xhigh dipetakan ke thinking biasa, bukan Think Max
- Jika membutuhkan respons langsung, gunakan
thinking: {"type":"disabled"}, think:false, atau alias model non-thinking seperti deepseek-chat
Disk KV cache
- API chat/completion bersifat stateless, jadi klien agent akan mengirim ulang seluruh percakapan pada setiap request
- ds4-server memprosesnya dengan membandingkan aliran token yang sudah dirender dengan prefix token yang di-cache
- Checkpoint live di memori menangani sesi saat ini
- Disk KV cache adalah mekanisme untuk mempertahankan prefix yang berguna saat berpindah sesi maupun setelah server restart
- Saat ini hanya ada satu KV cache live di memori; jika sesi baru yang tidak terkait menggantikannya, sesi sebelumnya hanya bisa dilanjutkan tanpa pemrosesan ulang jika telah ditulis ke disk KV cache
- Aktifkan dengan
--kv-disk-dir dan --kv-disk-space-mb
-
Kunci cache dan struktur berkas
- Kunci cache adalah hash SHA1 dari token ID yang persis sama, bukan teks mentah
- Setiap token ID di-hash sebagai integer 32-bit little-endian, dan nama berkasnya adalah
<sha1>.kv
- Ditulis dengan I/O
read/write biasa tanpa mmap (untuk menghindari penambahan VM mapping pada proses yang sudah memetakan model)
-
Layout berkas disk cache
- Header tetap KVC 48 byte: magic("KVC"), versi, bit quant routed expert, alasan penyimpanan, jumlah token yang di-cache, hit count, ukuran konteks, waktu Unix pembuatan/penggunaan terakhir, jumlah byte payload sesi DS4
- Teks yang dirender: hasil decoding tokenizer dari prefix token yang di-cache (untuk observasi, bukan dipakai sebagai kunci)
- Payload sesi DS4: diawali 13 field u32 little-endian, termasuk magic("DSV4"), versi payload, ukuran konteks, ukuran chunk prefill, kapasitas ring KV, dan lain-lain
- Menyimpan token ID checkpoint, logits float32 untuk token berikutnya, jumlah baris attention terkompresi per layer, baris KV sliding window mentah yang live, baris KV layer terkompresi, tensor compressor frontier, dan sebagainya
-
Waktu penyimpanan checkpoint
cold: setelah prompt awal yang panjang mencapai prefix stabil, sebelum generasi
continued: saat prefill atau generasi telah berjalan sejauh interval yang ditentukan
evict: sebelum request tak terkait menggantikan sesi live di memori
shutdown: saat server dimatikan secara normal
- Saat penyimpanan cold, suffix token kecil dipangkas dan disejajarkan ke batas chunk prefill untuk mencegah miss akibat retokenisasi pada batas BPE di request mendatang
- Default: prefix minimum 512 token, maksimum 30000 token untuk penyimpanan cold, memangkas 32 token di ekor, dan alignment chunk 2048 token
- Secara default, checkpoint dapat digunakan ulang antar varian routed-expert 2-bit dan 4-bit jika prefix tokennya cocok
--kv-cache-reject-different-quant dapat dipakai untuk membatasi reuse hanya pada kuantisasi yang sama
Backend
- Backend default adalah Metal (
--metal)
- Jalur referensi/debug CPU juga ada (
--cpu), tetapi bukan target produksi
- Server khusus Metal, dan implementasi yang dioptimalkan ada di jalur graf Metal
- Lisensi MIT, implementasi C/Objective-C/Metal
1 komentar
Komentar Hacker News
Saya mencobanya bersama Claude Code pada codebase yang sudah ada, dan tampaknya cukup bisa menjalankan tugasnya meski modelnya dikuantisasi 2-bit
Pemrosesan prompt memang memakan beberapa menit, tetapi pengeditan aktual cukup cepat, lebih dari 20 token/detik
Untuk tugas kecil, ini berhasil menelusuri kode, menerapkan perubahan, dan menulis tes, tetapi gagal memperbaiki satu hal sepele yang saya tunjukkan
Yang lebih buruk, saat memecahkan masalah lain, ia berhalusinasi dengan membawa percakapan tentang “The Duck” yang sedang berlangsung secara bersamaan. Mungkin itu salah satu contoh prompt awal Claude Code
Dulu saya pernah membuat sesuatu yang sangat mirip untuk model Qwen3. Hanya menjalankan Qwen3, hanya mendukung sebagian kuantisasi, memuat dari GGUF, dan memakai inferensi yang dioptimalkan Claude secara iteratif
Semuanya kecil, hanya beberapa file dan mudah dipahami, jadi proyek ini dibuat agar mahasiswa bisa belajar dengan bereksperimen menambahkan strategi decoding atau hal seperti abliteration. Framework terkenal terlalu besar dan rumit untuk di-hack, sementara proyek pendidikan sering berhenti di hal lama seperti GPT-2
Awalnya memang untuk pendidikan, tetapi ada ide yang terus terngiang di kepala saya. Bagaimana kalau membuat mesin inferensi yang sangat dioptimalkan khusus untuk kombinasi GPU+model tertentu? GPU mahal dan makin sulit didapat, jadi jika abstraksinya cukup banyak dibuang dan disesuaikan langsung dengan hardware/model yang tepat, sepertinya optimasinya bisa besar
Masalahnya, kalau modelnya usang, semuanya harus diulang dari nol
Pada platform yang kurang populer memang masih ada ruang peningkatan performa yang mudah didapat, tetapi tidak banyak ruang untuk membuat runner model super-optimal khusus keluarga GPU tertentu dan mendapat performa yang jauh lebih baik. Perhitungan inti sudah ditangani kernel yang sangat dioptimalkan untuk masing-masing GPU
Ada juga fork llama.cpp yang dioptimalkan agar berjalan lebih baik di arsitektur CPU, tetapi kecuali para maintainer benar-benar tidak sepakat, waktu akan lebih berguna dipakai untuk menggabungkan perbaikan seperti itu ke upstream daripada membuat runner terpisah untuk model+GPU tertentu
https://codegolf.stackexchange.com/questions/215216/high-thr...
Apakah perkalian matriks yang berat itu bisa ditangani dengan op-amp? Dan mungkinkah pendekatan analog seperti ini jauh lebih efisien daripada batas representasi berbasis bit?
Sekarang AI modern bahkan bisa melakukan optimasi kernel, jadi menurut saya lebih banyak orang seharusnya mencoba membuat inferensi yang lebih baik untuk hardware mereka sendiri
Saya punya W7900 lama (RDNA3), dan selain 48GB VRAM, metrik seperti 123 FP16 TFLOPS/INT8 TOPS dan bandwidth memori 864GB/s sebenarnya cukup bagus. Tetapi dukungan ROCm dari AMD maupun dukungan llama.cpp terkenal sangat buruk
Belakangan saya mulai men-tuning model W8A8-INT8 agar kartu ini bisa dipakai sebagai endpoint agen/koding khusus. Selama beberapa hari saya menjalankan sekitar 800 iterasi otomatis dan mencoba berbagai model frontier/SOTA, dan ternyata Kimi K2.6 bekerja sangat baik. Hasilnya, untuk Qwen3.6 MoE, prefill 20% lebih cepat dan decode 50% lebih cepat dibanding angka terbaik llama.cpp
Sekarang saya masih mendalami optimasi MTP dan DFlash dan hasilnya cukup memuaskan, lalu berikutnya saya ingin mencoba Gemma 4
Meski begitu, llama.cpp mungkin bukan yang paling kencang, tetapi bisa menjalankan sebagian besar model secara konsisten. MTP-nya kurang, dan tampaknya ada masalah invalidasi cache pada model hybrid, tetapi setidaknya saya tahu apa yang bisa jalan
Inferencer berbasis Python bercampur antara uv/venv, venv saya, environment sistem, Python, dan pustaka, sampai-sampai rasanya butuh agen hanya untuk mencari tahu apa yang sebenarnya sedang berjalan. Saya tahu ini masalah skill atau user error, tetapi saya memang tidak punya waktu untuk itu
Walau belum sempurna, kalau diunggah ke GitHub atau Hugging Face, agen lain bisa mulai dari sana alih-alih dari nol. Saya melakukan itu untuk Ling-2.6-flash (107B-A7B4 MoE), dan itulah LLM terbesar yang bisa saya jalankan secara praktis di hardware lain yang saya punya untuk LLM lokal, yaitu M2 Max
Walaupun MTP belum bekerja dengan baik, itu tetap lebih baik daripada kondisi saat ini di mana llama.cpp sama sekali tidak bisa menjalankan Ling-2.6-flash. Diskusi terkait ada di https://huggingface.co/inclusionAI/Ling-2.6-flash/discussion..., kuantisasi 4-bit di https://huggingface.co/ljupco/Ling-2.6-flash-GGUF, dan branch-nya di https://github.com/ljubomirj/llama.cpp/tree/LJ-Ling-2.6-flas...
Menurut saya llama.cpp seharusnya bisa jauh lebih baik dalam mendukung PC. Sebagiannya mungkin karena dukungan vendor yang buruk, tetapi dengan begitu banyak pengguna, tetap mengejutkan bahwa kita tidak melihat lebih banyak inferensi yang dioptimalkan untuk PC standar
Ini sangat keren. Saya penasaran seperti apa hasilnya jika satu model open source dioptimalkan secara intensif selama beberapa bulan
Bukan hanya inferensi serving, tetapi juga optimasi harness dan workflow khusus, untuk melihat seberapa besar celah yang bisa ditutup terhadap frontier model yang memang unggul dalam penalaran dan derivasi, sementara model open source pada dasarnya masih tertinggal karena batas ukuran atau pelatihan
Menjalankan Kimi 2.6 pada kecepatan token/detik yang layak menghabiskan $20.000 per bulan, dan agar token itu bisa dijual sambil tetap untung, biaya hardwarenya harus di bawah $1.000 per bulan
Kalau Anda menggantungkan kemampuan masa depan pada kemurahan hati para miliarder yang menjual token di harga 1/10 hingga 1/20 biaya sebenarnya, atau pada fantasi bahwa model open source yang kompeten akan muat di hardware konsumen, ya sebenarnya sudah selesai
Ada data point yang lucu, menarik, dan cukup banyak bicara. MacBook M3 Max saya naik hingga 50W saat DS4 menghasilkan token pada kecepatan maksimum
Jika DS4 Flash mencapai puncak 50W dan punya 280B parameter, apakah DS4 Pro 1.6T parameter kira-kira akan berada di sekitar 300W? GPT 5 dan Opus terbaru rasanya juga ada di kisaran 500W
Saat memakai Claude Code dan modelnya ngoceh sendiri panjang lebar, apakah masuk akal membayangkan bahwa di suatu pusat data ada 500W yang sedang dibakar untuk itu?
Di Mac Studio tidak ada opsi untuk memesan lebih dari 96GB RAM. Hal yang sama juga berlaku pada M3 Ultra maupun M4 Max. Saya tidak tahu apakah ini khusus Australia
Sementara itu MacBook Pro bisa dikonfigurasi ke 128GB pada Mac M5
https://www.apple.com/au/shop/buy-mac/mac-studio
Apple mungkin memilih untuk tidak memberi harga sama sekali daripada menghadapi kontroversi harga yang terasa seperti pemerasan atau reaksi atas kekurangan stok
Semua konfigurasi Mac Studio di atas 96GB dan Mac mini model dasar sudah dihapus. Ada juga rumor bahwa konfigurasi dasar Neo sedang dipertimbangkan untuk ditarik dari pasar
Sepertinya beginilah mereka menangani keterbatasan kapasitas fab dan pasokan RAM
Saya tidak yakin apakah saya melewatkan benchmark motivasional atau target yang sederhana
Dugaan saya ini lebih cepat daripada memakai toolchain umum, atau memungkinkan menjalankan model yang lebih besar dan lebih pintar, tetapi tampaknya tidak dijelaskan dengan jelas seberapa besar peningkatan yang sudah dicapai atau yang diharapkan dibanding baseline itu
Mungkin angka yang disajikan bisa dipakai menghitungnya jika orang tahu nilai pembanding yang relevan
Sangat mengesankan. Hanya saja agak aneh bahwa untuk input besar, waktu sampai mulai merespons tampaknya sekitar 4 menit
Saya tidak memakai LLM di hardware Mac, tetapi ini cukup mengejutkan dan tampaknya akan menjadi hambatan besar untuk penggunaan nyata
Namun untuk penggunaan umum, penjelasan tentang caching membuatnya jauh lebih masuk akal. Claude Code biasanya bisa mengirim prompt awal besar sekitar 25k token sebelum mulai melakukan pekerjaan berguna, dan jika
--kv-disk-dirdiaktifkan, cache KV di disk bisa memakai ulang prefix yang tersimpan setelah prefill mahal pertama, sehingga seluruh prompt tidak perlu diproses ulangTetapi di M3 Ultra, kecepatan prefill hampir 500 token/detik, jadi masih cukup layak dipakai. M3 Max butuh sedikit lebih banyak kesabaran tetapi tetap bekerja dengan baik, dan kalau memakai pi agent, ia menampilkan proses berpikirnya, jadi alih-alih menunggu, Anda malah membaca chain of thought yang tidak disensor
Kemarin saya mengunggah video di X saat memakainya di M3 Max, dan token keluar dengan kecepatan yang cukup bagus
Untuk LLM besar di MacBook, kecepatan generasi token masih bisa diterima, tetapi masalahnya adalah membaca konteks
Yang jadi masalah bukan pembacaan inkremental dengan cache KV seperti pada sesi chat, melainkan saat membaca input besar seperti menempelkan file besar. Itu bisa memakan beberapa menit
Kemungkinan besar ini cukup jauh dari kecerdasan asli yang ditawarkan penyedia cloud
Meski begitu, ini menunjukkan potensi LLM lokal untuk workflow berbasis agen dengan lebih baik
Apakah ada arsitektur yang tidak bergantung pada memasukkan ulang seluruh riwayat percakapan? Mungkin sesuatu seperti LLM rekuren?