- Menjalankan model bahasa 28,9 juta parameter di ESP32-S3 tanpa koneksi server, dan menampilkan teks di layar kecil dengan kecepatan sekitar 9 token per detik
- Menggunakan struktur Per-Layer Embeddings yang menaruh 25 juta dari seluruh parameter di flash yang lambat, lalu hanya membaca sekitar 6 baris yang dibutuhkan per token, sekitar 450 byte
- Model berukuran 14,9MB pada 4-bit; core komputasi yang dipakai setiap token ditempatkan di SRAM 512KB, output head dan memori kerja di PSRAM 8MB, serta tabel embedding besar di flash 16MB
- Dilatih dengan TinyStories sehingga mampu menghasilkan cerita pendek dan sederhana yang umumnya konsisten, tetapi tidak cocok untuk tanya jawab, menjalankan perintah, menulis kode, atau pengetahuan faktual
- Memuat sekitar 100 kali lebih banyak parameter dibanding model 260 ribu parameter yang sebelumnya dijalankan pada chip serupa; inti proyek ini terletak pada struktur memori untuk menampung model besar di chip kecil, bukan pada kualitas generasi teks
Perangkat keras dan performa eksekusi
- Semua pemrosesan dilakukan pada satu ESP32-S3 seharga sekitar 8 dolar, tanpa mengirim data ke server
- Menggunakan SRAM 512KB, PSRAM 8MB, dan flash 16MB
- Kecepatan keseluruhan sekitar 9,5 tok/s, dan kecepatan komputasi murni sekitar 9,7 tok/s
- Ukuran model 4-bit adalah 14,9MB
- Dari total 28,9 juta parameter, 25 juta disimpan dalam tabel lookup di flash
Cara memasukkan model ke memori kecil
- Umumnya seluruh model harus dapat diakses dari memori cepat, tetapi SRAM ESP32-S3 hanya 512KB, sehingga hanya dapat menampung model yang sangat kecil
- Memanfaatkan fakta bahwa sebagian besar parameter berada di tabel embedding yang bukan target komputasi, sehingga tabel tersebut tetap diletakkan di flash
- Hanya membaca sekitar 6 baris yang dibutuhkan per token, sekitar 450 byte
- Hanya bagian kecil yang menangani komputasi aktual yang dipertahankan di memori cepat
- Sebagian besar model tidak dimuat saat eksekusi; hanya bagian yang diperlukan yang dipilih dari flash
- Peran memori dibagi sebagai berikut
- SRAM: core komputasi yang digunakan pada semua token
- PSRAM: output head dan memori kerja
- Flash: tabel berisi 25 juta parameter
Penerapan Per-Layer Embeddings
- Per-Layer Embeddings yang digunakan di Google Gemma 3n dan Gemma 4 diterapkan pada struktur memori mikrokontroler, bukan pada ponsel atau GPU
- Sejauh yang dikonfirmasi pembuat proyek, belum ada preseden penerapan metode ini pada chip sekecil ini
Hal yang bisa dilakukan model dan batasannya
- Mempelajari cerita sintetis pendek dari TinyStories, sehingga dapat menghasilkan cerita sederhana dan umumnya menjaga konsistensi
- Tidak dapat melakukan tanya jawab, menjalankan perintah, menulis kode, atau memberikan pengetahuan faktual
- Batasan ini berasal dari core kecil yang menangani inferensi, dan teknik penempatan memori tidak meningkatkan kemampuan inferensi itu sendiri
Kode dan materi eksperimen
firmware/esp32_llm/README.mdberisi prosedur firmware, wiring, dan flashingsrc/danexperiments/mencakup kode pelatihan, eksperimen ablation, dan kuantisasiRESULTS.mdmerangkum metode lengkap, eksperimen ablation, dan pengukuran on-chip
Proyek dasar dan catatan
- TinyStories adalah dataset cerita sintetis pendek yang dibuat agar model kecil juga dapat belajar menulis secara konsisten
- Per-Layer Embeddings dari Google Gemma menjadi dasar untuk memasukkan model besar ke chip kecil
- llama2.c dari Andrej Karpathy memengaruhi pendekatan bahwa model bahasa kecil dapat dilatih lalu dijalankan dalam C murni
- Repositori juga menyisakan kesalahan perhitungan yang sempat membesar-besarkan jumlah parameter awal beserta proses koreksinya
- Riwayat commit dan
RESULTS.mdmenunjukkan titik perubahan angka serta alasannya
- Riwayat commit dan
1 komentar
Komentar di Hacker News
Hal-hal yang bisa dilakukan dengan mikrokontroler seharga 5 dolar belakangan ini sungguh mengejutkan. Di antara papan Milk-V, Duo memiliki memori hingga 256MB dan TPU 1TOPS@INT8, bahkan bisa menjalankan Linux, jadi saya membeli 5 unit
GCC dan Clang sepenuhnya mendukung xTHeadVector, dan jika memakai fungsi bawaan C, cukup dengan opsi command line saja sudah kompatibel dengan RVV 1.0. Banyak kode yang menangani elemen 8-bit seperti
memcpy(),memset(),memcmp(),strlen(),strcpy(),strcmp()cukup kompatibel secara binerSaat saya membeli Duo 64MB harganya 3 dolar, lalu model 64MB·256MB·512MB masing-masing menjadi 5·7·10 dolar, tetapi tahun ini harganya naik cukup banyak: https://arace.tech/products/milk-v-duo, https://arace.tech/products/milkv-duo-s
Masih ada kasus penggunaan di mana PIC 4KB adalah pilihan terbaik, tetapi kita tidak seharusnya bertindak seakan-akan di sebagian besar situasi tidak ada opsi yang lebih baik
Model konversi suara·teks juga makin mendekati ukuran ini, jadi saya penasaran seberapa dekat kita dengan perangkat kecil yang bisa bercakap-cakap dengan kita. Bisa saja datang dunia di mana sikat gigi memberi saran kebersihan mulut, atau bahkan iklan pasta gigi
Namun saya tidak ingin hidup di dunia di mana kita harus mencari pemblokir iklan untuk AI sikat gigi
Pemanfaatan teknik embedding per layer ini sangat cerdas. Karena ada juga model TTS praktis dengan sekitar 20 juta–30 juta parameter, ESP32 yang tidak terhubung ke jaringan pun mungkin bisa membacakan teks hampir secara real-time
PSRAM, flash, dan kartu SD masing-masing tidak memiliki bandwidth tinggi, tetapi jika banyak yang dijalankan secara bersamaan, throughput yang cukup besar bisa dicapai. Hardware khusus berskala besar memang akan unggul dalam performa per daya, tetapi konfigurasi seperti ini juga menarik karena biaya awal rendah dan skalabilitas bertahap
Saya penasaran opsi realistis apa yang ada agar LLM lokal di Raspberry Pi 4 tidak butuh 30 detik untuk tiap jawaban dibandingkan mikrokontroler
Menjalankan LLM di perangkat superkecil memang keren, tetapi yang lebih mengesankan adalah metode pelatihan yang menghasilkan bobot seperti ini
Jika flash dimanfaatkan dengan pola akses yang baik, saya penasaran apakah pendekatan ini bisa diperluas untuk menjalankan model yang jauh lebih besar di CPU
ESP32-S3 cukup kuat, dan saat ini saya menggunakannya untuk pekerjaan pengembangan Raspberry Pi 4. Dari dua port USB, salah satunya mendukung OTG, sehingga bisa mewujudkan fungsi yang dengan cara lain mungkin menghabiskan lebih dari 100 dolar
Saat ini berjalan dengan tinyusb dan pico-pio-usb, dan saya juga sedang bereksperimen dengan porting Rust dengan harapan performa lebih tinggi
Saya penasaran seberapa baik akurasi model terkuantisasi ini
Performa yang ditunjukkan pada ukuran seperti ini luar biasa, dan saya menantikan apa lagi yang mungkin dilakukan pada single-board computer yang sedikit lebih kuat yang dibahas di thread ini