Membuat LLM On-Device dengan Input Real-Time Menggunakan ESP32-S3 dan Flash 16MB
TuBrief 편집팀
2026년 8월 12일
0
Computing/Software원본 영상을 바탕으로 AI의 도움을 받아 작성했습니다. 원본 영상이 기준입니다.
커뮤니티의 다른 글
댓글 (0)
Log in to leave a comment
아직 작성된 글이 없습니다
원본 영상을 바탕으로 AI의 도움을 받아 작성했습니다. 원본 영상이 기준입니다.
Log in to leave a comment
아직 작성된 글이 없습니다
Ketika Anda memutuskan untuk menjalankan model bahasa dengan 28,9 juta parameter pada papan ESP32-S3 seharga 8 dolar, Anda akan segera merasa jalan buntu. Model yang berjalan dengan sangat baik di video demo tiba-tiba menjadi tidak responsif saat digabungkan dengan periferal perangkat keras buatan Anda. Dengan SRAM yang hanya 512KB dan keharusan untuk mem-flash ulang partisi 15MB setiap kali Anda mengubah satu kalimat, Anda pasti akan merasa frustrasi saat proses pengembangan. Untuk menembus batasan ini dan membuat perangkat yang benar-benar berfungsi dengan menerima input keypad, Anda harus merancang ulang caching memori dan buffer I/O dari awal.
Membuang-buang waktu dengan mem-flash ulang papan hanya untuk mengubah satu kalimat pengujian bukanlah pilihan yang efisien. Dengan menggabungkan interupsi UART asinkron dan FreeRTOS semaphore, Anda tidak perlu me-reboot papan. Model akan langsung mengenali kalimat apa pun yang Anda ketik melalui monitor serial atau keypad.
Dengan konfigurasi ini, Anda dapat menghemat lebih dari 80% waktu yang dihabiskan untuk modifikasi dan pengujian prompt.
`
+------------------+ +-------------------+ +--------------------+
| External UART | ---> | HW FIFO Buffer | ---> | SW Ring Buffer |
| (Keypad/Monitor) | | (120 Bytes) | | (2048 Bytes) |
+------------------+ +-------------------+ +--------------------+
|
v
+------------------+ +-------------------+ +--------------------+
| LLM Forward Pass | <--- | xPromptSemaphore | <--- | BTK1 Tokenizer |
| (Inference Task) | | (Binary Lock) | | (43,056 B Library) |
+------------------+ +-------------------+ +--------------------+
`
Jika Anda menggunakan struktur Per-Layer Embeddings (PLE) yang diusulkan oleh para peneliti Google Gemma 3n, Anda dapat memecah dan memuat model 14,9MB yang telah dikurangi menjadi 4 bit. Tabel embedding yang mencapai 25 juta parameter ditempatkan di Flash SPI 16MB, sementara bobot Output Head (3,1 juta parameter) dan KV cache ditempatkan di PSRAM 8MB. Hanya Dense Compute Core 559K parameter yang paling sering digunakan dan buffer Hot Activation yang disematkan di SRAM 512KB.
Meningkatkan kecepatan hingga 14 token per detik atau lebih ternyata lebih sulit dari yang diperkirakan.
__attribute__((noinline)) tepat pada fungsi operasi matvec_i8_range. Jika kompiler melakukan inlining secara otomatis, cache miss pada I-RAM akan terjadi dan waktu komputasi justru akan melonjak dari 94,9 ms menjadi 155,2 ms.Saat melakukan porting murni dalam bahasa C, Anda akan mendapatkan kecepatan yang sangat lambat yaitu 0,57 token per detik. Namun, setelah menyelesaikan staging INT8 dan prefetch SRAM, kecepatan akan melebihi 14,0 token per detik.
| Tahap Optimasi | Latency Komputasi per Token | Jumlah Token yang Dihasilkan per Detik | Teknologi Utama yang Diterapkan |
|---|---|---|---|
| Porting Murni C (Baseline) | 1.757,2 ms | 0.57 tok/s | Single-core, komputasi FP32 |
| PSRAM Head & Optimasi Skalar | 193,9 ms | 4.61 tok/s | Penempatan Output Head di PSRAM |
| Penerapan Dual-Core FP32 | 139,4 ms | 6.22 tok/s | Operasi pemisahan lapisan dual-core |
| INT8 Staging + Optimasi SRAM | 94,9 ms | 9.88 tok/s | Kuantisasi INT8, penerapan noinline |
| Perluasan Buffer Prefetch SRAM | ~71.4 ms | 14.0+ tok/s | Prefetch SRAM lapisan awal |
Jika Anda terus menjalankan inti ganda pada clock 240MHz, arus yang dikonsumsi akan melonjak hingga 210mA (777mW). Mengesampingkan papan yang menjadi panas, baterai akan terkuras dalam sekejap. Anda harus menggunakan perintah esp_pm_configure untuk menurunkan clock ke 40MHz saat tidak ada inferensi dan mengaktifkan light sleep otomatis.
esp_sleep_pd_config(ESP_PD_DOMAIN_VDDSDIO, ESP_PD_OPTION_ON). Anda harus mempertahankan daya flash SPI dan RAM bahkan saat memasuki status sleep agar data tidak hilang.Jika Anda terus menjalankan komputasi dengan baterai LiPo 3,7V 1000mAh, baterai hanya akan bertahan selama 4,7 jam. Namun, dalam mode siaga light sleep, arus turun tajam menjadi 0,24mA (0.88mW). Di lingkungan penggunaan nyata di mana waktu siaga tercampur, arus rata-rata dipertahankan pada tingkat 15-30mA, yang meningkatkan masa pakai baterai lebih dari 3 kali lipat.