TinyML · intermedio

Come si esegue il TinyML su un ESP32?

Machine learning su un ESP32: LiteRT for Microcontrollers, ESP-DL, ESP-SR ed Edge Impulse, le istruzioni vettoriali dell'S3, la memoria e compiti di esempio.

Close-up of a small electronic module

Foto: Vishnu Mohanan / Unsplash

Dopo aver letto questo articolo saprai:

  • Scegliere tra il porting Espressif di TensorFlow Lite Micro, ESP-DL, ESP-SR ed Edge Impulse per un dato compito
  • Spiegare perché ESP32-S3 e P4 eseguono le reti neurali molto più velocemente dell'ESP32 classico o del C3
  • Ripartire flash, SRAM e PSRAM per un modello accanto allo stack Wi-Fi e al resto del firmware
In questa pagina
  1. Qual è l’ESP32 migliore per il TinyML?
  2. Quale framework usare?
  3. Quanta memoria c’è per il modello?
  4. Quali compiti funzionano bene su un ESP32?
  5. Come si inserisce l’inferenza in un budget a batteria?
  6. Per continuare

Il TinyML su un ESP32 si esegue con una di quattro catene di strumenti: il porting Espressif di LiteRT for Microcontrollers (l’ex TensorFlow Lite Micro), il framework ESP-DL di Espressif, la libreria vocale ESP-SR per wake word e comandi vocali, oppure Edge Impulse come flusso di lavoro in hosting che esporta una libreria per ESP-IDF o Arduino. Il chip conta quanto il framework. L’ESP32-S3 ha istruzioni vettoriali che i kernel di Espressif sfruttano, ed è quindi la scelta abituale; l’ESP32-P4 è il passo successivo per la visione; l’ESP32 classico e la serie C RISC-V eseguono modelli piccoli, più lentamente.

TinyML: machine learning sui microcontrollori descrive il flusso di lavoro generale, dalla raccolta dei dati a un modello int8 nel firmware. Questa guida è la parte specifica per l’ESP32: quale chip, quale framework, quanta memoria è davvero disponibile e quali compiti funzionano.

Qual è l’ESP32 migliore per il TinyML?

La caratteristica decisiva è il SIMD. Il datasheet dell’ESP32-S3 descrive estensioni del set di istruzioni con registri a 128 bit e operazioni vettoriali a 128 bit, aggiunte per “improve the operation efficiency of specific AI and DSP” algorithms. ESP-NN, la libreria Espressif di kernel ottimizzati per reti neurali, ha versioni in assembly per l’S3 che usano quelle istruzioni, versioni ottimizzate SIMD per l’ESP32-P4 e solo ottimizzazioni generiche per l’ESP32 classico e l’ESP32-C3. Copre le operazioni in cui le reti piccole passano il loro tempo: convoluzione, convoluzione depthwise, livelli fully connected, pooling e softmax.

Espressif pubblica l’effetto nel repository esp-tflite-micro, usando l’esempio di rilevamento di persone. Con ESP-NN un’inferenza richiede 54 ms sull’ESP32-S3 a 240 MHz, 73 ms sull’ESP32-P4 a 360 MHz (dove il repository segnala che l’ottimizzazione è ancora in corso), 380 ms sull’ESP32 classico a 240 MHz e 426 ms sull’ESP32-C3 a 160 MHz. Senza ESP-NN la stessa inferenza richiede più di un secondo su ogni chip. Sono valori di Espressif per un solo modello; il tuo modello darà numeri diversi, ma la classifica è un’indicazione attendibile.

Quindi l’S3 è la scelta predefinita per modelli audio, di vibrazione e di visione a bassa risoluzione. Il P4, con il suo dual core a 400 MHz, le interfacce per telecamera e display e nessuna radio, è adatto a prodotti di visione che lo affiancano a un chip wireless, come descritto in Scegliere un ESP32. Un C3 o un C6 va bene per modelli piccoli eseguiti di rado, come un punteggio di anomalia calcolato una volta al minuto.

Quale framework usare?

LiteRT for Microcontrollers (esp-tflite-micro). LiteRT for Microcontrollers di Google non richiede supporto dal sistema operativo né heap, e il suo runtime di base sta in 16 KB su un Arm Cortex-M3; la pagina elenca schede ESP32 tra i target supportati. Il componente esp-tflite-micro di Espressif aggiunge i kernel ESP-NN e include gli esempi hello_world, micro_speech e person_detection. Sceglilo quando il tuo modello viene da TensorFlow o Keras, o quando vuoi codice che giri anche su microcontrollori non Espressif. Supporta solo un sottoinsieme delle operazioni di TensorFlow e niente addestramento sul dispositivo.

ESP-DL. ESP-DL è il framework di inferenza di Espressif per i suoi chip. I modelli vengono quantizzati con lo strumento ESP-PPQ a partire da ONNX, quindi i modelli PyTorch e TensorFlow passano prima da ONNX, a precisione 8 bit, 16 bit o mista, e salvati in un formato .espdl basato su FlatBuffers. Il suo model zoo comprende il rilevamento di oggetti con YOLO11n, la classificazione con MobileNetV2 e, sul P4, il riconoscimento del testo. Sceglilo per la visione su S3 o P4, i chip a cui puntano i suoi benchmark e il suo model zoo.

ESP-SR. Per la voce, ESP-SR riunisce un front end audio (cancellazione dell’eco, soppressione del rumore, rilevamento dell’attività vocale), il motore di wake word WakeNet e il riconoscitore di comandi MultiNet, che gestisce fino a 300 comandi in cinese o in inglese. WakeNet gira sulla maggior parte della famiglia, compresi C3, C5 e C6 grazie a varianti per chip senza PSRAM o SIMD; MultiNet richiede S3, P4 o S31.

Edge Impulse. Edge Impulse copre raccolta dei dati, progettazione delle feature, addestramento ed esportazione. Per l’ESP32 produce una libreria C++ per ESP-IDF, una libreria Arduino o un firmware pronto per l’ESP-EYE, e usa la libreria ESP-DSP di Espressif per accelerare l’estrazione delle feature, come gli MFCC per l’audio. È adatto ai team che vogliono un solo strumento dai dati grezzi a una libreria pronta da integrare.

Quanta memoria c’è per il modello?

Meno di quanto suggerisca il datasheet. L’ESP32-S3 ha 512 KB di SRAM interna, ma lì vivono anche gli stack Wi-Fi e TLS, FreeRTOS, i buffer di rete e la tua applicazione. Le attivazioni del modello richiedono un buffer di lavoro contiguo, la tensor arena di LiteRT, ed è di solito la prima cosa a esaurirsi.

La PSRAM è la valvola di sfogo. L’S3 è venduto con fino a 16 MB di PSRAM nel package, e i moduli aggiungono altre opzioni. Arena di grandi dimensioni, frame della telecamera e buffer audio possono stare lì, al prezzo di un accesso più lento rispetto alla SRAM interna, quindi i buffer sul percorso critico è meglio tenerli in memoria interna. Senza PSRAM, mantieni il modello piccolo. Il modello micro_speech degli esempi di tflite-micro è inferiore a 20 kB.

I pesi stanno nella memoria flash, accanto al firmware. Se il dispositivo riceve aggiornamenti OTA, la tabella delle partizioni richiede almeno due slot applicativi, quindi il modello pesa due volte sul budget di flash, a meno che non stia in una partizione dati separata.

Quali compiti funzionano bene su un ESP32?

Keyword spotting. L’esempio micro_speech riconosce “yes” e “no” con un modello sotto i 20 kB ed è il punto giusto per imparare la pipeline. Per la wake word di un prodotto, WakeNet e il front end audio di ESP-SR gestiscono eco e rumore che un modello dimostrativo ignora.

Rilevamento delle anomalie su vibrazione o corrente. Un accelerometro su I2C o SPI, una finestra di campioni, una FFT con ESP-DSP, poi un piccolo autoencoder o classificatore che produce un punteggio. Il dispositivo pubblica il risultato, non il segnale grezzo, e così un flusso di campioni diventa un solo piccolo messaggio MQTT:

{"ts": 1767225600, "rms": 0.42, "anomaly": 0.07, "state": "normal", "model": "pump-v3"}

Includere la versione del modello nel payload permette di capire in seguito quale firmware ha prodotto quali punteggi. La guida alla manutenzione predittiva approfondisce l’elaborazione del segnale.

Visione semplice su S3 o P4. Rilevamento della presenza di persone o oggetti a bassa risoluzione, conteggi o la lettura di un quadrante. Tutto ciò che richiede dettagli fini o molte classi va su un processore più grande; vedi Visione artificiale sul dispositivo per l’IoT.

Come si inserisce l’inferenza in un budget a batteria?

L’inferenza è una fase di veglia come le altre: l’energia è la corrente attiva per il tempo di inferenza, quindi i valori per inferenza visti sopra si traducono direttamente in autonomia. Due tecniche tengono basso il costo. Lascia che il coprocessore ULP o il core LP sorvegli un segnale economico, come una soglia di vibrazione, e svegli i core principali solo quando c’è qualcosa da classificare. Ed esegui il modello prima di accendere la radio, così un risultato “normale” può essere salvato e inviato più tardi insieme ad altri. ESP32 a batteria descrive le modalità di consumo e il metodo di stima.

Per continuare

Argomenti: TinyML, ESP32, ESP32-S3, TensorFlow Lite, ESP-DL, Edge Impulse

Diagramma