3 poin oleh GN⁺ 26 hari lalu | 1 komentar | Bagikan ke WhatsApp
  • Mengoptimalkan penempatan tensor antara GPU·RAM·NVMe untuk menjalankan model bahasa besar dengan scheduler inferensi sadar hierarki penyimpanan
  • Di Mac Mini 32GB, mampu menjalankan model Mixtral 8x7B (31GB) pada 2.2 tok/s dan model Llama 70B (40GB) pada 0.3 tok/s
  • Menganalisis pola akses dan bandwidth hardware untuk menjalankan model yang melebihi memori fisik secara stabil, termasuk model yang sebelumnya gagal di llama.cpp karena OOM
  • Melalui routing pakar pada arsitektur MoE, cache neuron, dan prefetch, mengurangi I/O hingga 75% dan mencapai cache hit rate 99.5%
  • Secara otomatis memilih mode Full-resident, Expert-streaming, Dense FFN-streaming sesuai ukuran model dan hardware agar performa tetap optimal
  • Menyediakan HTTP API kompatibel Ollama untuk integrasi dengan OpenClaw dan lainnya, serta mendukung inferensi berbasis NVMe tanpa penurunan umur SSD karena SSD hanya dipakai baca-saja

Ikhtisar

  • Hypura adalah scheduler inferensi LLM sadar hierarki penyimpanan di lingkungan Apple Silicon, alat yang melakukan optimasi penempatan tensor antara GPU·RAM·NVMe
  • Dengan mendistribusikan penempatan tensor berdasarkan pola akses, biaya bandwidth, dan performa hardware, Hypura memungkinkan eksekusi stabil model besar yang melebihi memori fisik
  • Di Mac Mini 32GB, mampu menjalankan model Mixtral 8x7B (31GB) pada 2.2 tok/s dan model Llama 70B (40GB) pada 0.3 tok/s
  • Pada lingkungan yang sama, llama.cpp tidak dapat berjalan karena OOM (Out of Memory)

Latar belakang masalah

  • Mac konsumen memiliki unified memory cepat dan penyimpanan NVMe, tetapi kapasitas memorinya terbatas
  • Sebagai contoh, M1 Max 32GB tidak dapat memuat model 40GB secara langsung sehingga menyebabkan swap berlebihan dan penghentian karena OOM
  • Hypura menyelesaikan masalah ini dengan menganalisis struktur model dan melakukan penempatan optimal per lapisan

Penempatan hierarkis berbasis struktur model

  • Norm dan Embedding: kecil tetapi diakses pada setiap token, sehingga dipasang tetap di GPU
  • Routing pakar MoE: memanfaatkan sparsity, hanya 2 dari 8 pakar yang aktif per token
    • Dengan intersepsi router, pakar aktif diidentifikasi lalu hanya bagian yang diperlukan dimuat dari NVMe
    • I/O berkurang 75%, dengan cache neuron mencapai hit rate 99.5%
    • Melalui co-activation tracking, sistem memprediksi pakar aktif berikutnya dan melakukan prefetch terlebih dahulu
  • Bobot Dense FFN: mencakup sekitar 60% ukuran model
    • Dialirkan dari NVMe melalui dynamic pool buffer
    • Prefetch lookahead depth disesuaikan otomatis menurut memori yang tersedia
  • Hasilnya, model yang sebelumnya crash dengan pendekatan mmap kini dapat dijalankan, sementara model yang muat di memori tetap berjalan pada kecepatan Metal GPU tanpa overhead

Cara kerja

  • Hypura membaca file GGUF dan memprofilkan bandwidth GPU·RAM·NVMe
  • Setiap tensor ditempatkan ke salah satu dari tiga lapisan berikut
    • GPU (Metal): lapisan Attention, Norm, Embedding
    • RAM: lapisan overflow yang tidak bisa dimuat ke GPU
    • NVMe: lapisan sisanya, dengan I/O langsung menggunakan F_NOCACHE + pread
  • Berdasarkan ukuran model dan hardware, sistem otomatis memilih mode inferensi
    • Full-resident: seluruh model dimuat ke GPU+RAM, tanpa I/O NVMe
    • Expert-streaming: untuk model MoE, hanya tensor non-pakar yang menetap di GPU, sedangkan tensor pakar di-stream dari NVMe
    • Dense FFN-streaming: untuk model besar non-MoE, Attention+Norm berada di GPU, FFN di-stream dari NVMe
  • Ukuran pool buffer, kedalaman prefetch, dan anggaran memori dihitung otomatis berdasarkan profil hardware

Performa

  • Lingkungan pengujian: M1 Max, unified memory 32GB, NVMe 5.1GB/s
  • Hasil benchmark utama
    • Qwen 2.5 14B Q4_K_M (8.4GB): dimuat penuh di GPU, 21 tok/s
    • Mixtral 8x7B Q5_K_M (30.9GB): mode Expert-streaming, 2.2 tok/s, cache hit rate 99.5%
    • Llama 3.3 70B Q4_K_M (39.6GB): mode Dense FFN-streaming, 0.3 tok/s, pool 24 slot, prefetch 7 lapisan
  • Model yang muat di memori memiliki overhead 0, sedangkan model yang melebihi kapasitas tetap bisa dijalankan berkat Hypura

Instalasi dan menjalankan

  • Membutuhkan Rust 1.75+ dan CMake
  • Prosedur instalasi
    git clone --recurse-submodules https://github.com/hypura/hypura.git  
    cd hypura  
    cargo build --release  
    
  • Contoh menjalankan
    hypura profile  
    hypura run ./model.gguf --prompt "Hello, world"  
    hypura run ./model.gguf --interactive  
    hypura bench ./model.gguf  
    hypura inspect ./model.gguf  
    
  • Untuk model yang belum tervalidasi, disarankan menguji dengan --max-tokens 10

Server kompatibel Ollama

  • Hypura menyediakan HTTP API kompatibel Ollama sehingga sepenuhnya kompatibel dengan alat berbasis Ollama seperti OpenClaw
    hypura serve ./model.gguf  
    
    Endpoint: http://127.0.0.1:8080  
    
    API: /api/generate, /api/chat, /api/tags  
    
  • Endpoint utama
    Endpoint Fungsi
    GET / Pemeriksaan status
    GET /api/tags Daftar model yang dimuat
    GET /api/version Versi server
    POST /api/show Metadata model
    POST /api/generate Pembuatan teks
    POST /api/chat Pembuatan percakapan
  • Untuk integrasi OpenClaw, atur Ollama base URL ke Hypura di ~/.openclaw/openclaw.json
  • Opsi server
    hypura serve  [OPTIONS]  
    --host    default 127.0.0.1  
    --port    default 8080  
    --context    default 4096  
    

Arsitektur

  • Menggunakan struktur Cargo workspace, terdiri dari dua crate
    • hypura: biner dan library utama
    • hypura-sys: binding FFI llama.cpp (build CMake)
  • Modul utama
    Modul Peran
    scheduler/placement.rs Optimasi penempatan tensor antara GPU/RAM/NVMe
    compute/inference.rs Mesin inferensi dan fungsi load/generate untuk server
    compute/nvme_backend.rs NVMe streaming, cache neuron, callback evaluasi
    server/routes.rs Handler HTTP kompatibel Ollama
    profiler/ Profiling hardware
    cli/bench.rs Alat benchmark
    model/tensor_role.rs Klasifikasi peran tensor

FAQ

  • Tidak ada masalah umur SSD

    • Hypura hanya melakukan pembacaan dari SSD, tanpa penulisan
    • I/O NVMe dilakukan baca-saja dengan pread() + F_NOCACHE
    • SSD hanya berperan sebagai cold storage, sedangkan komputasi dilakukan di RAM/GPU
    • Penulisan yang terjadi hanya pada tingkat KB yang sangat kecil, seperti JSON hasil benchmark dan file statistik

Panduan keamanan

  • bench --baseline diblokir jika model melebihi batas RAM (dengan sisa margin 4GB)
  • Untuk model yang belum tervalidasi, uji dengan --max-tokens 10
  • Model pengujian disimpan di direktori ./test-models/

Lisensi

  • MIT License

Pemberitahuan etis

  • Kode di repositori ini tidak ditulis langsung oleh penulis
  • Dibuat sebagai eksperimen pembuatan kode berbasis instruksi dengan memanfaatkan LLM
  • Ini adalah proyek untuk mengeksplorasi kemungkinan pemanfaatan inferensi berbasis NVMe

1 komentar

 
GN⁺ 26 hari lalu
Komentar Hacker News
  • Ingin mengusulkan kepada maintainer. Tabel perbandingan saat ini memuat model lama seperti Qwen 2.5 14B, Mixtral 8x7B, dan Llama 3.3 70B
    Belakangan ini ada banyak laporan bahwa model Qwen 3.5 MoE menunjukkan performa luar biasa di hardware Apple
    Silakan rujuk tulisan Simon Willison
    Jika memungkinkan, akan bagus juga bila model Kimi K2.5 (1T parameter) ditambahkan ke tabel
    Tweet terkait: seikixtc, danpacary

    • Terima kasih sudah membagikan ini. Jika Anda bersedia menjalankan benchmark langsung dengan Hypura, saya akan menggabungkan hasilnya ke statistik. Kalau tidak, akan saya tambahkan ke daftar todo saya
    • Simon, sedikit di luar topik, situs Anda sempat down
      Muncul pesan error terkait Heroku, tetapi sekarang sudah normal lagi
      Saya masuk untuk melihat artikel ini, dan ternyata Anda juga sudah menulis artikel tentang litellm. Menarik untuk dibaca
    • Sayang sekali metrik kecepatan token tidak ada pada contoh Kimi
  • Untuk pekerjaan lokal, bahkan kecepatan di bawah 1 token per detik pun masih cukup berguna bila itu adalah pekerjaan latar belakang
    Perbedaan antara “selesai segera” dan “selesai semalaman” tetap merupakan loncatan performa yang bermakna

  • Dalam praktiknya, yang penting adalah seberapa sekuensial (sequential) pola pembacaannya
    NVMe bisa mencapai 5–7GB/s untuk pembacaan sekuensial, tetapi turun ke sekitar 500MB/s untuk pembacaan acak
    Untuk model 1T, pada fp16 perlu melakukan streaming 2TB untuk satu forward pass, sehingga secara teori butuh lebih dari 300 detik per token
    Ini tidak cocok untuk penggunaan interaktif, tetapi masih punya potensi untuk batch inference

    • Pada M1 Max, pembacaan acak 4K (QD=1) berada di kisaran 65MB/s
    • Setuju. Ini lebih dekat ke POC (Proof of Concept) daripada sesuatu yang praktis
      Namun pada model MoE kecil, masih bisa menghasilkan beberapa token per detik sehingga tetap layak dipakai
    • Inti model MoE adalah aktivasi jarang (sparse activation)
      Tidak semua 2TB dibaca; hanya sebagian layer expert yang diakses
      Karena tiap layer berukuran dalam satuan MiB, efisiensi akses NVMe juga tidak terlalu buruk
  • Saya sempat bertanya-tanya dari mana asal istilah “model 1T parameter”. Di repo hanya terlihat model hingga 70B

    • Itu disebutkan sebagai kemungkinan. Namun performanya terlalu lambat sehingga tidak praktis selain untuk pekerjaan jangka panjang khusus
      Model yang realistis adalah yang lebih kecil tetapi bisa menghasilkan beberapa token per detik, yaitu keluarga MoE
    • Judulnya terasa agak berlebihan. Pada akhirnya yang penting adalah kecepatan, tetapi tidak ada informasi soal itu
  • Poin MoE adalah bahwa karena aktivasi jarang, ia tidak membaca seluruh 2TB
    Namun pola aksesnya menjadi acak, yang merupakan kondisi terburuk bagi NVMe
    Untuk pekerjaan seperti agentic inference, di mana latensi (latency) penting, bagian ini menjadi kunci

  • Rasanya seperti Intel Optane sedang berputar di kuburannya

    • Memristor juga 10 tahun lalu tampak seperti akan segera dikomersialkan, tetapi sekarang benar-benar menghilang
    • Saya masih menyimpan 4 Optane baru. Bercanda, tapi memang benar ada
      Namun dalam praktiknya tidak lebih cepat daripada NVMe. Pada software yang mendukung baca/tulis paralel, perbedaannya hampir tidak ada
    • Intel membuat hal bagus lalu meninggalkannya di tengah jalan sudah terasa biasa sekarang
      Meski begitu, kalau 4 buah di-RAID 0, sepertinya bisa memenuhi bandwidth PCIe 16x
    • Menyebut pmem
  • Hardware Mac konsumen punya unified memory dan NVMe yang cepat, tetapi kapasitasnya terbatas
    Jika memuat model 40GB pada M1 Max 32GB, swap akan melonjak liar dan akhirnya masuk kondisi panic
    macOS tidak punya OOM killer seperti Linux; yang terjadi hanya kehabisan ruang swap

  • Mendapatkan “memori sebanyak mungkin” memang penting, tetapi bandwidth adalah variabel yang lebih besar
    M4 Pro memiliki 273GB/s, M4 Max 546GB/s, dan M4 Ultra 819GB/s
    Setelah model masuk ke memori, bandwidth menentukan kecepatan token
    Menurut Hypura, M4 Max adalah sweet spot. Dengan 64GB, model 70B (Q4) bisa dijalankan dengan nyaman, dan generasinya bisa 2x lebih cepat daripada Pro

  • Proyek ini pada dasarnya bekerja seperti smart swap memory
    Menarik karena ia mengatur agar NVMe tidak dipakai secara berlebihan
    Namun jika NVMe benar-benar dibebani berat, ada kekhawatiran soal penurunan umur pakai

    • Ungkapan “membebani NVMe” terasa agak asing
      Umur sel SSD memang berkurang karena jumlah penulisan, tetapi sangat jarang controller rusak hanya karena beban baca
      Kalau itu terjadi, berarti ada masalah lain pada sistem
  • Akan bagus jika proyek ini dibandingkan dengan eksperimen sebelumnya, upaya lain
    Yang kali ini berbasis mmap, dan ada laporan bahwa overhead-nya besar

    • Kode tersebut ditulis oleh LLM, jadi reliabilitasnya rendah
    • Selain itu, implementasi kali ini tidak memakai quantization yang terlalu agresif, sehingga penurunan kualitasnya lebih kecil