TuBrief
Subscribed Channels
Videos
Community

Membuat LLM On-Device dengan Input Real-Time Menggunakan ESP32-S3 dan Flash 16MB

TuBrief Editorial
August 12, 2026
0
Computing/Software

Written with AI assistance from the source video. The video is the authority.

Bahasa Indonesia한국어中文العربيةEspañolDeutschEnglishFrançaisहिन्दीPortuguêsРусский日本語

Related Video

Mikrokontroler Seharga $8 Ini Menjalankan Language Model Secara Lokal!8:14

Mikrokontroler Seharga $8 Ini Menjalankan Language Model Secara Lokal!

Better Stack

More from the community

사내 시스템에 llm api 붙일 때 마주하는 현실적인 한계와 대응법

September 13, 2026

레거시 백엔드에 GPT-6 Astra 붙일 때 예산 승인과 보안 통과를 먼저 끝내는 법이 있습니다

September 13, 2026

에이전트끼리 대화하다 6천만 원 청구서가 나오는 이유

September 13, 2026

사내 RAG 벡터 검색에 Okta 권한 필터를 직접 거는 방법

September 13, 2026

브라우저 에이전트에게 내 구글 계정을 통째로 넘기면 안 되는 이유

September 12, 2026

Apple Won the AI Race

September 12, 2026

Comments (0)

Log in to leave a comment

No posts yet

© 2026 . All rights reserved.

TuBrief
Subscribed Channels
Videos
Community
Log in

Membuat LLM On-Device dengan Input Real-Time Menggunakan ESP32-S3 dan Flash 16MB

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.

Menyuntikkan Prompt Melalui Serial Tanpa Flash Ulang Setiap Saat

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.

  1. Tetapkan pin GPIO 16/17 ke port UART_NUM_2, atur ambang batas FIFO perangkat keras ke 120 byte, dan buka interupsi penerimaan.
  2. Buat buffer ring 2048 byte di SRAMinternal. Ini mencegah data meluap dan mengalami crash selama proses inferensi berlangsung.
  3. Lampirkan parser streaming yang mendeteksi karakter baris baru, dan ubah teks input langsung menjadi array ID token menggunakan pustaka encoder BTK1 berukuran 43.056 byte.
  4. Terapkan semaphore ganda xPromptSemaphore. Ketika tugas penerimaan selesai menulis token dan memanggil xSemaphoreGive, tugas inferensi yang menunggu akan mendapatkan kunci memori dengan xSemaphoreTake dan memulai komputasi.

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) |
+------------------+ +-------------------+ +--------------------+

`

Mencapai Kecepatan 14 Token dengan Per-Layer Embedding Branching dan Caching SRAM

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.

  1. Tambahkan atribut __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.
  2. Bagikan operasi ple_model_proj dan operasi qkv ke Dual Xtensa LX7 Cores dari ESP32-S3. Kecepatan penuh hanya dapat dicapai dengan menjalankan inti ganda secara bersamaan.
  3. Perluas buffer prefetch yang memuat data embedding lapisan awal terlebih dahulu ke ruang SRAM yang tersisa untuk mengatasi hambatan memori flash.

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

Kontrol Light Sleep untuk Menjaga Arus pada 210mA

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.

  1. Dalam struktur esp_pm_config_esp32s3_t, atur max_freq_mhz ke 240, min_freq_mhz ke 40, dan aktifkan light_sleep_enable ke true.
  2. Jalankan 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.
  3. Gunakan uart_set_wakeup_threshold dan esp_sleep_enable_uart_wakeup untuk mengatur interupsi pemulihan sehingga CPU terbangun dari sleep begitu sinyal serial masuk.

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.