🛠 Inference IA accélérée par les instructions vectorielles
Objetivos
Comprender qué aportan las instrucciones vectoriales del LX7 (ausentes en el ESP32 y el S2) a la inferencia de redes neuronales cuantificadas a int8: las bibliotecas ESP-NN (capas) y ESP-DSP (señal) las aprovechan, lo que permite al ESP32-S3 ejecutar ESP-WHO (detección de rostros) o ESP-Skainet (reconocimiento de voz sin conexión). Usted mismo medirá la mejora con una capa totalmente conectada calculada mediante esp_nn_fully_connected_s8, la primitiva estrella de ESP-NN.
Material
- 1 placa ESP32-S3 (las variantes N8R8/N16R8 con PSRAM octal son adecuadas para modelos grandes)
- IDE Arduino con core esp32 >= 2.0.14 (ESP-NN se incluye como componente del core) o proyecto ESP-IDF v5.x con el componente esp-nn
- 1 cable USB
Código completo
// Couche fully-connected int8 acceleree (ESP-NN, cote Arduino via esp32 core)
// Outils -> Board: "ESP32S3 Dev Module" ; ajouter "esp_nn" aux includes paths
#include "esp_nn.h"
#define ENTREES 64
#define SORTIES 8
// Poids et biases quantifies int8 (ici des valeurs demo)
static int8_t poids[SORTIES][ENTREES];
static int32_t biais[SORTIES];
static int8_t entree[ENTREES];
static int8_t sortie[SORTIES];
void setup {
Serial.begin(115200);
for (int i = 0; i < SORTIES; i++) {
biais[i] = 0;
for (int j = 0; j < ENTREES; j++)
poids[i][j] = (int8_t)((i * 7 + j * 13) % 251 - 125);
}
for (int j = 0; j < ENTREES; j++) entree[j] = (int8_t)(j % 127);
setCpuFrequencyMhz(240);
dl_nn_version; // version d'ESP-NN liee
uint32_t t0 = micros;
for (int k = 0; k < 1000; k++) {
esp_nn_fully_connected_s8(
entree, ENTREES, 0, // activations, taille, zero-point
poids, SORTIES, 0, // poids, sortie, zero-point poids
biais, 1033, 12, // biais, mult, shift (quantification)
sortie, -128, 127); // tampon sortie, plage int8
}
uint32_t t1 = micros;
Serial.printf("1000 FC %dx8 : %lu us (ESP-NN vectoriel)\n",
ENTREES, (unsigned long)(t1 - t0));
Serial.printf("sortie[0] = %d\n", sortie[0]);
}
void loop { delay(1000); }
Verificación esperada
La consola muestra la versión de ESP-NN y luego el tiempo necesario para mil capas 64×8 int8 — del orden de unas pocas centenas de microsegundos en un núcleo a 240 MHz, lo que representa un rendimiento que permite modelos de audio o sensores con varias decenas de inferencias por segundo. Al comparar con un bucle de referencia escrito a mano (sin esp_nn), la diferencia visible demuestra el efecto de las instrucciones vectoriales del LX7. Para un caso real, utilice TensorFlow Lite for Microcontrollers con el delegate ESP-NN, o directamente ESP-WHO/ESP-Skainet.
Errores frecuentes
- Creer que el simple hecho de estar en el S3 acelera todo: solo las bibliotecas vectorizadas (ESP-NN, ESP-DSP, delegate TFLite ESP-NN) aprovechan el LX7; un cálculo en coma flotante ingenuo apenas obtiene beneficio.
- Cuantificación mal parametrizada: multiplicar/desplazar (mult/shift) inconsistentes entre el entrenamiento y el despliegue producen salidas incorrectas pero sin errores de ejecución.
- Olvidar la PSRAM en modelos grandes: un modelo de rostro (ESP-WHO) satura la RAM interna de 512 KB; elija una variante R (PSRAM octal en GPIO35/36/37) y active «Support of PSRAM» en el menú Herramientas.
- No aumentar la frecuencia: algunas compilaciones funcionan por defecto a 160 MHz; use
setCpuFrequencyMhz(240)antes de medir. - Wi-Fi durante la inferencia: la radio añade latencia y contención de caché/PSRAM; mida el rendimiento con la radio apagada.
Otros tutoriales para esta placa
Ejemplos de código para esta placa
clignotante.inoArduinobouton-led.inoArduinorespiration.inoArduinodht22.inoArduinooled-i2c.inoArduinoserveur-web.inoArduino