- colibrì adalah engine murni C yang dibuat untuk menjalankan GLM-5.2 744B MoE pada mesin konsumen dengan RAM sekitar 25GB, dan bekerja tanpa GPU dengan melakukan streaming expert yang dirutekan dari disk
- Struktur intinya menempatkan bagian dense sekitar 17B parameter tetap di RAM dalam int4 sehingga memakai 9.9GB, sementara 21.504 routed expert disimpan di disk sekitar 370GB dan dibaca saat diperlukan
- Implementasinya mencakup forward GLM-5.2, attention MLA dan KV-cache terkompresi, router gaya DeepSeek-V3, MTP speculative decoding, kernel kuantisasi int8/int4/int2, serta tokenizer BPE level-byte
- Di lingkungan WSL2 dengan 12 core, RAM 25GB, dan NVMe VHDX, waktu muat sekitar 30 detik, peak RSS saat chat sekitar 20GB, dan cold decode membaca disk sekitar 11GB per token dengan kecepatan 0.05~0.1 tok/s
- Pada NVMe yang lebih cepat dan RAM yang lebih besar, cache dan pinning menjadi penting; dalam pengukuran komunitas, Apple M5 Max 128GB mencatat 1.06 tok/s dengan MTP nonaktif
Masalah yang ingin diselesaikan colibrì
- colibrì mengusung slogan “Tiny engine, immense model” dan merupakan engine untuk menjalankan model GLM-5.2 744B-parameter MoE pada mesin konsumen dengan RAM sekitar 25GB
- Runtime-nya ditulis dalam C murni dan tidak memiliki ketergantungan pada Python, BLAS, atau GPU
- Engine ini terdiri dari satu file C tunggal
c/glm.c sekitar 1.300 baris beserta header kecil
- Contoh eksekusinya adalah
./coli chat, dan contoh output menampilkan colibrì v1.0 — GLM-5.2 · 744B MoE · int4 · streaming CPU dengan waktu persiapan sekitar 32 detik serta memori resident 9.9GB
Cara kerja eksekusi MoE berbasis streaming disk
- Model 744B Mixture-of-Experts milik GLM-5.2 hanya mengaktifkan sekitar 40B parameter per token
- Routed expert yang berubah pada setiap token setara dengan sekitar 11GB
- Bagian dense tetap berada di RAM
- mencakup attention, shared expert, dan embedding
- sekitar 17B parameter
- memakai sekitar 9.9GB RAM dalam int4
- Routed expert disimpan di disk
- mencakup 75 layer MoE × 256 expert dan head MTP
- total 21.504 routed expert
- sekitar 19MB per expert dalam int4
- total penggunaan disk sekitar 370GB
- Pemuatan expert memakai cache LRU per-layer, pinned hot-store opsional, dan OS page cache
Fitur utama yang diimplementasikan
- Forward GLM-5.2 diimplementasikan sesuai struktur
glm_moe_dsa, dan divalidasi token-exact terhadap oracle transformers
- teacher-forcing 32/32 pada model tiny-random
- greedy generation 20/20
- Attention MLA mencakup q/kv-LoRA dan partial RoPE yang diinterleave
- KV-cache terkompresi memakai 576 float per token
- 57 kali lebih kecil dibanding 32.768 float/token sebelumnya
- GLM-5.2 memiliki 64 head tanpa GQA
- Router sigmoid gaya DeepSeek-V3 diimplementasikan
noaux_tc
routed_scaling_factor
- shared expert
- first-3-dense layers
- Native MTP speculative decoding menggunakan head multi-token-prediction GLM-5.2 (layer 78) untuk membuat draft token, lalu model utama memverifikasinya dengan batched forward
- head MTP harus dalam int8
- pada int4, acceptance draft turun ke 0~4% sehingga spekulasi tidak bekerja
- pada int8, acceptance terukur 39~59%, 2.2~2.8 token/forward
- tetap lossless saat sampling melalui rejection sampling
- pada cold cache, verified draft dapat merutekan expert tambahan sehingga expert-loads/token bisa naik dari sekitar 660 menjadi sekitar 1100
- dalam kasus ini, waktu bisa lebih lama sampai cache dan pin menjadi warm, sehingga ada adaptive guard dan opsi
DRAFT=0
- True sampling mendukung temperature dan nucleus
- default 0.7 / 0.90
- pengaturan resmi 1.0 / 0.95 dijelaskan dapat mengambil noise kuantisasi di tail pada lingkungan int4
- Kernel integer-dot memakai aktivasi int8 gaya Q8_0 dan AVX2
maddubs
- matmul int8 1.4~2.5 kali lebih cepat
- performa terukur 119 GFLOP/s
- int4 1.8 kali lebih cepat pada batch
- int4 single-row terukur lebih lambat sehingga tetap memakai f32
- MLA weight absorption menghindari rekonstruksi k/v per token saat decode
- query menyerap
kv_b, dan context diproyeksikan setelah attention
- tervalidasi 32/32 pada TF dan 20/20 pada generation bahkan dalam lingkungan forced absorption
- Expert readahead membaca block berikutnya dengan
WILLNEED saat satu block expert sedang dikalikan
- Kernel kuantisasi mendukung int8, packed int4, packed int2, scale per-row, AVX2, dan dequant-on-use
- DSA sparse attention masih dalam pengerjaan
- bobot lightning-indexer berbentuk ekstraksi sekitar 108GB dari repo FP8
- forward indexer direncanakan sebagai langkah berikutnya
- sampai saat itu, attention tetap dense dan exact untuk context ≤ 2048 token
- Pada prefill dan verifikasi MTP, Batch-union MoE hanya membaca unique expert dalam batch satu kali, lalu menerapkannya ke semua posisi yang dirutekan ke expert tersebut
- Tokenizer adalah tokenizer BPE level-byte yang diimplementasikan dalam C dan memakai regex properti Unicode gaya GPT-2 serta 320k merges
- Pengaman RAM otomatis menyesuaikan ukuran cache expert saat startup berdasarkan
MemAvailable
- memperhitungkan peak projection dari working set, KV, baris MTP, dan reconstruction buffer
- dirancang agar kernel OOM-killer tidak aktif
- Konverter offline disediakan sebagai
c/convert_fp8_to_int4.py
- mengunduh shard FP8 GLM-5.2 satu per satu
- melakukan dequant dengan scale block 128×128 lalu requantize ke container engine
- berjalan sambil menghapus shard sehingga checkpoint FP8 756GB tidak perlu ada sekaligus di disk
- konversi dapat dilanjutkan kembali
Performa dasar yang diukur dan keterbatasannya
- Lingkungan pengembangan adalah WSL2, 12 core, RAM 25GB, NVMe via VHDX
- Nilai yang diukur sebagai berikut
- ukuran model container int4: sekitar 370GB
- RAM resident: 9.9GB
- load time: sekitar 30 detik
- peak RSS saat chat: sekitar 20GB, auto-capped
- biaya cold decode: sekitar 11GB disk read per token
- batas random disk VHDX: sekitar 1GB/s
- kecepatan cold decode: sekitar 0.05~0.1 tok/s
- spekulasi MTP: 2.2~2.8 tok/forward dengan head int8
- Dijelaskan bahwa ini bukan sistem yang cepat, dan warm cache, pinned hot expert, serta MTP dapat menurunkan latensi untuk mendapatkan respons yang berguna
- Ada dua catatan terkait SSD
- streaming colibrì bersifat read-only sehingga pembacaan itu sendiri tidak memberi dampak berarti pada keausan SSD
- jika kekurangan RAM memicu traffic swap, akan terjadi write yang dapat mempercepat keausan drive
- full read duty cycle dalam waktu lama dapat memanaskan drive murah, sehingga pemantauan suhu dan kesehatan diperlukan
Mengunduh model dan menjalankannya
- Model GLM-5.2 int4 yang sudah dikonversi sebelumnya tersedia di Hugging Face
- Jika mengambil model yang sudah dikonversi, langkah konversi FP8 → int4 bisa dilewati
- Untuk menjalankan, tetapkan
COLI_MODEL ke direktori model
COLI_MODEL=/path/to/GLM-5.2-colibri-int4 ./coli chat
- Quick start menjalankan
./setup.sh di direktori c untuk memeriksa gcc/OpenMP, build, dan self-test
- Untuk konversi sendiri, gunakan
./coli convert --model /nvme/glm52_i4
- memerlukan path ext4/NVMe dengan ruang kosong sekitar 400GB
- konversi memerlukan Python dan
torch, safetensors, huggingface_hub, numpy
- engine runtime itu sendiri tetap C murni dan Python hanya dipakai untuk converter sekali jalan
- Opsi yang berguna adalah sebagai berikut
--temp T: temperature sampling, default 0.7 dan nucleus 0.90, 0 berarti greedy
--topp 0.7: adaptive expert top-p, mengurangi penggunaan disk 30~40%
--ngen N: jumlah token maksimum per jawaban
AUTOPIN=0: menonaktifkan auto-pin learning cache
THINK=1: mengaktifkan blok reasoning GLM-5.2
DRAFT=n: kedalaman draft MTP
TF=1: validasi teacher-forcing
Learning cache dan ekspektasi berdasarkan hardware
- Learning cache mencatat expert yang benar-benar dirutekan ke
.coli_usage di samping model saat dipakai
- Saat startup, expert terpanas akan otomatis di-pin ke RAM yang tersisa
- Deskripsi proyek menyebut colibrì akan semakin cepat seiring akumulasi pola penggunaan
- Lingkungan yang dibutuhkan adalah Linux atau WSL2, gcc dengan dukungan OpenMP, AVX2, minimal 16GB RAM, dan NVMe lokal yang berisi model int4 sekitar 370GB
- path ext4 direkomendasikan
- mount network/9p disarankan untuk tidak digunakan
- Urutan pengujian adalah build dan self-test, mengukur disk dengan
iobench, memeriksa tok/s, expert hit-rate, dan RSS saat chat, merekam penggunaan expert lalu melakukan pinning, kemudian menjalankan benchmark kualitas
- Perkiraan berdasarkan hardware bukan hasil pengukuran langsung
- mesin pengembangan WSL2 VHDX, sekitar 1GB/s, RAM 25GB: 0.05~0.1 tok/s cold
- Linux native, PCIe4 NVMe 3~5GB/s random, 32GB: 0.5~1 tok/s
- PCIe5 NVMe atau 2×NVMe RAID0 8~12GB/s, 64GB, PIN sekitar 40GB: 2~4 tok/s
- RAM 128~256GB, 12 core, hot expert tercache: 2~4 tok/s
- RAM sama dengan 24~32 core atau kernel AVX-512/VNNI: 5~15 tok/s
Benchmark komunitas
- Intel Core Ultra 7 270K Plus, 24 thread, WSL2, RAM 24GB, dan NVMe VHDX mencatat 0.07 tok/s dengan pengaturan default
- disk iobench: 1.96GB/s buffered, 2.74GB/s O_DIRECT
- expert hit: 3~4%
- RSS: 14.1GB
- Pada lingkungan yang sama,
--topp 0.7 mencatat 0.11 tok/s
- expert hit: 11%
- RSS: 14.7GB
- kecepatan end-to-end naik 1.6 kali
- Apple M5 Max, 18 core, macOS, unified memory 128GB, dan SSD internal mencatat 1.06 tok/s
- disk iobench: 14.2GB/s O_DIRECT
- default, MTP nonaktif
- expert hit: 23%
- RSS: 21.8GB
- Pada mesin RAM 24GB, cache expert di-auto-cap ke 2 slot per layer, sehingga meskipun disk 2~2.7 kali lebih cepat daripada mesin pengembangan, decode tetap berada dalam kondisi cold
- Pada mesin dengan RAM kecil, batas RAM menjadi bottleneck, bukan disk
- Nilai pada M5 Max menunjukkan model 744B bisa mencapai sekitar 1 tok/s di SSD laptop, dan disk 14GB/s memindahkan bottleneck kembali ke budget RAM dan kernel
Benchmark kualitas dan pengukuran yang masih tersisa
- Biaya akurasi dari kuantisasi int4 masih belum diukur
- Harness benchmark sudah diimplementasikan, tetapi pada disk sekitar 1GB/s milik mesin pengembangan, eksekusi penuh memakan sebagian besar satu hari
- Perintah benchmark yang disediakan menjalankan
hellaswag, arc_challenge, dan mmlu
cd c
./coli bench
./coli bench hellaswag --limit 200
./coli bench mmlu arc_challenge --ram 100
- Output berupa accuracy per task, memakai scoring log-likelihood dan gaya EleutherAI-harness
- Skor publik GLM-5.2 full-precision disebut sekitar 85~95% pada task-task tersebut
- Jika container int4 berada hanya beberapa poin di bawahnya, kuantisasi dianggap tervalidasi; jika tidak, itu menjadi alasan untuk berinvestasi pada kuantisasi mixed atau grouped-scale
Struktur repositori dan lisensi
- Susunan file utamanya adalah sebagai berikut
c/glm.c: engine yang mencakup forward GLM-5.2, streaming MoE, MTP, dan mode serve
c/st.h: pembaca safetensors berbasis pread dan fadvise, tanpa mmap
c/tok.h: tokenizer BPE level-byte dalam C
c/coli: CLI untuk chat, run, bench, convert, info
c/iobench.c: microbenchmark disk paralel yang mencerminkan pengalaman engine
c/convert_fp8_to_int4.py: converter aman-disk FP8 → int4
c/make_glm_oracle.py: generator oracle tiny-random untuk validasi
c/olmoe.c: engine Stage-A dan target validasi pertama
- Nama colibrì berasal dari burung kolibri yang dapat melayang dengan bobot kecil dan mengunjungi banyak bunga dalam sehari
- Lisensi proyek adalah Apache 2.0, dan bobot GLM-5.2 dirilis Z.ai di bawah lisensi MIT
1 komentar
Komentar Hacker News
Yang paling membuat penasaran adalah apakah saat benar-benar dipakai ini masih berada di level yang bisa diukur dalam token/detik, atau justru mendekati 1 token per menit
LLM lokal tetap cukup berguna meski lambat seperti 1 token/detik, jika bisa dibiarkan mengerjakan proyek semalaman lalu hasilnya dicek 6~8 jam kemudian
Sebaliknya, 0,05~0,1 token/detik pada perangkat keras spesifikasi minimum yang disebut di tautan itu tampaknya hampir tidak punya kegunaan praktis
Meski begitu, konsep keseluruhannya sangat bagus, dan saya berharap akan ada lebih banyak upaya untuk menjalankan model kelas 350B~900B secara lokal di perangkat keras yang masih terjangkau bagi orang biasa, meskipun hanya 1 token/detik
Saya suka arah pemikiran seperti, “Ada NVMe SSD dengan performa baca cepat, dan ada model raksasa di disk lokal, jadi jangan muat semuanya sekaligus, baca saja 11GB/token saat dibutuhkan”
Sekarang saya merasa paling lambat sekitar 2028 nanti saya akan menjalankannya secara lokal
Saya ingin anggarannya di bawah 10 ribu dolar, dan bisa menjalankan model yang sebanding dengan model terbaik saat ini
Sebelum menghabiskan uang untuk Mac Studio atau GPU, saya sudah memutuskan cara memvalidasi ide ini dengan perangkat keras yang saya miliki sekarang, dan sepertinya minggu ini saya bisa membuat semacam proof of concept
Ini bukan ide baru, saya hanya perlu waktu untuk membuatnya berjalan sesuai cara kerja saya
Saya terus mencoba meningkatkannya lebih lanjut
1 token per menit terlalu kecil bahkan jika dibandingkan dengan batas penggunaan gratis
Saya sedang membuat sesuatu yang mirip untuk macOS di Apple Silicon
Arah yang saya ambil adalah Unsloth split GGUF, compressed partial residency di unified memory, kernel Metal native, dan compressed KV native khusus RAM
Ini tampaknya lebih masuk akal di 128GB daripada di 64GB saya, dan kalau sudah siap saya berencana mengunggahnya ke GitHub
Di sisi pembuatan gambar/video, saya juga pernah mencoba strategi serupa lewat https://github.com/cretz/thinfer
Ada banyak pekerjaan yang masuk ke branch video
Saya terus membutuhkan engine inferensi yang bisa memuat dan mengeluarkan bobot dengan metode LRU saat dibutuhkan, jadi akhirnya saya membuat dengan vibe coding sebuah alat yang menerima
--vram-budgetdan tetap berada dalam batas ituTerlihat bahwa biaya memindahkan byte yang di-mmap masuk dan keluar dari VRAM cukup murah dibandingkan komputasinya, dan bila digabungkan dengan pipelining serta double buffering, hampir selalu bottleneck-nya bukan memori melainkan komputasi
Tentu saja saya memakai model yang jauh lebih kecil
Saya penasaran apakah Anda membuat harness umum yang bisa menjalankan semuanya
Saya juga penasaran model mana yang lebih konsisten tetap berada dalam anggaran VRAM
llama.cpp mendukung berbagai kuantisasi 4-bit ke bawah dan secara default mem-mmap model, jadi tidak perlu menaruh seluruh bobot di memori
Sistem operasi akan mengambilnya dari penyimpanan saat diperlukan
Keren bahwa ini diimplementasikan dengan sangat sedikit kode tanpa dependensi, tetapi saya penasaran apakah ada keuntungan performa nyata
Cukup keren
Minggu ini saya sempat mencoba GLM 5.2 dan sama-sama terkesan
Di perusahaan, kami sedang menguji eksekusi lokal pada perangkat keras yang sangat mahal sebelum memulai proyek berikutnya, dan senang melihat ada orang-orang yang menjalankan rilis model open source raksasa ini di mesin yang lebih rata-rata
Meski belum terlalu praktis, ini tetap pekerjaan yang bagus
Saya tidak terlalu paham struktur internal LLM, tetapi saya penasaran apakah struktur serupa bisa dipakai pada model lain yang punya “lapisan”
Saya ingin tahu apakah bisa begitu satu lapisan selesai bekerja, lapisan itu dibuang dari RAM, lalu lapisan berikutnya dimuat dari disk dan diaktifkan terhadap hasil dari lapisan pertama
Mesin saya punya RAM 64GB dan VRAM 24GB, jadi saya penasaran apakah ini bisa disetel agar memakai RAM lebih banyak
Atau mungkin Gemma/Qwen bisa dijalankan di GPU lalu GLM-5.2 mendelegasikan tugas-tugas yang lebih kecil ke sana
Mungkin GLM-5.2 juga perlu dilatih ulang sampai tingkat tertentu
Saya juga penasaran apakah memakai beberapa disk secara paralel untuk menambah bandwidth bisa mempercepatnya
Peringatan keausan SSD menyebut bahwa cold start berat karena sekitar 11GB/token pembacaan acak, dan walaupun pembacaan itu sendiri aman, page cache sistem operasi bisa menimbulkan penulisan, serta penggunaan berlebihan bisa mempercepat keausan SSD murah
Salah satu cara aman mungkin membuat partisi terpisah untuk bobot model dan mengaturnya sebagai read-only
Saya tidak tahu apakah page cache itu berlaku per partisi atau per disk, tetapi jika per disk, mungkin ada cara memformat
data.isoread-only seperti partisi lalu me-mount-nya sebagai diskKalau saya punya lebih banyak disk, saya benar-benar bisa mengujinya
Kalau ada benchmark, silakan unggah sebagai pull request atau issue dan kita bisa mengerjakannya bersama
Apa yang saya lewatkan? Kenapa pembacaan dalam jumlah besar bisa menimbulkan penulisan?
Ada peringatan keausan SSD di halaman ini https://github.com/JustVugg/colibri#ssd-wear-warning
Kalau memakai PC desktop rakitan sendiri, SSD bisa diganti, tetapi bagaimana dengan pengguna yang memakai SSD solder?
Apakah sebaiknya menghindari aplikasi seperti ini, atau tetap memakainya sambil menerima kemungkinan perangkat penyimpanan rusak lebih cepat?
Sepertinya penyimpanan eksternal perlu dipakai sebagai SSD habis pakai
Laptop dengan SSD solder perlu benar-benar memantau pemakaian dan berhati-hati
Proyek ini tampak lebih seperti eksperimen daripada sesuatu yang akan dijalankan semua orang, tapi tetap cukup keren
Tidak perlu berpikir mistis soal ini
Aktivitas disk, terutama penulisan, bisa diukur
Misalnya di Linux bisa memakai
iostatatauvmstatAplikasi ini tidak melakukan penulisan, jadi secara nyata aplikasinya sendiri tidak akan mengauskan SSD
Selebihnya lebih mirip praktik pengelolaan umum yang tidak terlalu terkait dengan aplikasinya
Secara teknis ini mengesankan, tetapi saya penasaran apakah benar-benar bisa dipakai secara praktis
Sebenarnya saya juga sedang membuat hal yang sama, tetapi saya memilih mem-mmap seluruh model ke memori agar tidak menambah penggunaan RAM
Saya juga meminta Claude mengimplementasikan Medusahttps://arxiv.org/abs/2401.10774 pada model itu, agar bisa mendapat manfaat prediksi multi-token tanpa harus memuat model tambahan ke memori
Baru saja saya sampai di rumah dan ingin menambahkan, semua modifikasi saya lakukan di llama.cpp, dan tujuan akhirnya adalah menjalankannya di sesuatu seperti komputer papan tunggal yang menangani file mmap lewat NVMe
Berdasarkan pengujian sebelumnya, batas teoritis konfigurasi saya saat ini tampaknya sekitar 1,8 token/detik, tetapi head Medusa tambahan itu belum sepenuhnya terlatih, dan saya juga jujur tidak yakin apakah itu dihitung berdasarkan token yang dihasilkan
Pada akhirnya idenya terlihat serupa, tetapi saya belum tahu cara menulis parser/runner LLM dari nol, jadi alih-alih menentukan apa yang harus tetap di memori, saya menyerahkannya ke kernel Linux
Terakhir, saya sudah membatasi penggunaan llama.cpp menjadi 16GB dari total 32GB saya, jadi mungkin masih bisa diturunkan lagi