Aceleración de visión por computadora con SIMD en un ESP32-S3 de 2 dólares
(shraiwi.github.io)- El conjunto de instrucciones SIMD de 128 bits del económico ESP32-S3 acelera el detector de características FAST, procesando cuadros QVGA (320×240) en aproximadamente 6 ms
- Este chip es un microcontrolador con CPU de doble núcleo de hasta 240MHz, WiFi y Bluetooth Low Energy, y su manual técnico de referencia incluye soporte SIMD limitado
- La clave de la implementación es procesar 16 píxeles de 8 bits a la vez en el pre-test de esquinas FAST, aunque fue necesario sortear restricciones de lecturas desalineadas y comparaciones signed
- Para adaptar píxeles unsigned de 8 bits a comparaciones signed, se aprovechó la propiedad
x - 128 == x ^ 0x80para convertir los valores con XOR 0x80 - El rendimiento en pruebas aumentó de 5.1MP/s a 11.2MP/s, alcanzando un nivel que permite procesar streams VGA a 30fps en el ESP32-S3
Aceleración del detector de características FAST en el ESP32-S3
- Se implementó un detector de características FAST acelerado con SIMD para el ESP32-S3, con un rendimiento de aproximadamente 2 veces frente a la implementación de referencia
- Procesar un cuadro QVGA (320×240) toma alrededor de 6 ms
- El ESP32-S3 es un microcontrolador económico, pero incluye una CPU de doble núcleo de hasta 240MHz, WiFi y Bluetooth Low Energy
- En el manual técnico de referencia del ESP32-S3 se puede confirmar el soporte limitado para instrucciones SIMD
Instrucciones SIMD poco conocidas y preparación de la implementación
- Las instrucciones SIMD del ESP32-S3 no eran una función secreta, pero sí relativamente poco conocida
- Los ejemplos de referencia se resumen en tres
- Blog de Larry Bank: exploración de capacidades y un ejemplo mínimo
esp-dsp: biblioteca de Espressif usada para funciones de tipo DSP como convolution y FFTesp-dl: biblioteca de Espressif usada para aceleración de IA on-chip
- Durante la implementación se aprendió la estructura básica del ensamblador del ESP32-S3 y también se escribió un asignador básico de registros propio llamado
basm
Método de procesamiento SIMD para el pre-test de esquinas FAST
- El pre-test de esquinas del detector de características FAST toma muestras de píxeles en las direcciones norte, sur, este y oeste para verificar si hay al menos 3 píxeles “extremos”
- Aquí, un píxel extremo es aquel cuya diferencia absoluta con el píxel central supera cierto umbral
- Como cada registro vectorial puede almacenar 16 valores de 8 bits, se organizó el cálculo para obtener a la vez el conteo de extremos de 16 píxeles
- Se muestrean cuatro bloques de píxeles desde las direcciones norte, sur, este y oeste, y se comparan con sus píxeles centrales correspondientes
Restricciones del SIMD del ESP32-S3 y cómo se sortearon
- La primera restricción es que la ISA no permite lecturas desalineadas directas
- Si se asume que el píxel central está alineado, los bloques del este y del oeste quedan desalineados
- Los bloques del este y del oeste se obtienen concatenando dos registros adyacentes y luego extrayendo una porción con una instrucción de slicing
- La segunda restricción es que el ESP32-S3 solo implementa comparaciones signed de 8 bits
- Los datos de píxeles se almacenan como unsigned de 8 bits, por lo que interpretarlos directamente como signed mapea el rango
[128, 255]a[-128, -1]de forma no lineal - En ese estado, las operaciones de comparación no funcionan correctamente
- Los datos de píxeles se almacenan como unsigned de 8 bits, por lo que interpretarlos directamente como signed mapea el rango
Ajustar píxeles unsigned para comparaciones signed
- Los valores de píxeles deben trasladarse de
[0, 255]a[-128, 127]para que las comparaciones y la aritmética funcionen con sentido - Podría parecer que basta con restar 128, pero las operaciones aritméticas SIMD del ESP32-S3 son todas de aritmética saturada, lo que causa problemas
- Los valores de píxel por encima de 127 no hacen underflow correctamente, sino que quedan limitados a
-128
- Los valores de píxel por encima de 127 no hacen underflow correctamente, sino que quedan limitados a
- La solución fue restar 128 en paralelo sin usar una instrucción de resta
- En signed de 8 bits, el bit más significativo tiene valor posicional
-128 x - 128es equivalente a invertir el bit más significativo- Por eso se usa la relación
x - 128 == x ^ 0x80
- En signed de 8 bits, el bit más significativo tiene valor posicional
- Cada vez que se cargan valores unsigned de 8 bits, se aplica XOR con
0x80para convertirlos a un rango lineal apto para aritmética y comparaciones
Resultados de rendimiento y posibilidad de procesamiento en tiempo real
- Con estas dos técnicas de workaround se implementó el pre-test de esquinas FAST acelerado con SIMD
- También se escribió una función de scoring acelerada con SIMD usando una combinación de operaciones similar, aunque no se detallan sus internals
- En las pruebas, el rendimiento del detector de características FAST aumentó de 5.1MP/s a 11.2MP/s
- El throughput subió hasta aproximadamente 220% respecto al anterior
- Este rendimiento entra en un rango aceptable para tareas de visión por computadora en tiempo real, y permite que el ESP32-S3 procese con facilidad un stream VGA a 30fps
1 comentarios
Opiniones de Hacker News
Porque las grandes empresas explotan las fincas locales y mantienen monopolios regionales de facto, obligando a las fincas a venderles a precios muy por debajo de su valor real
Los países de todo el mundo están comprando miles de millones de estos dispositivos para vigilar a sus ciudadanos, y el Gran Hermano está creando economías de escala enormes
Se siente como una especie de Zynq económico para visión por computadora
https://wiki.sipeed.com/hardware/en/tang/Tang-Nano-4K/Nano-4...
https://www.aliexpress.us/item/3256806880637138.html
La variante S3 justifica de sobra el pequeño costo adicional, ya que tiene SIMD y FPU, por lo que fácilmente es varias veces más rápida, en el orden de un dígito
https://github.com/espressif/esp-dl/tree/master/examples/fac...
Que la detección de personas tome 54 ms es sorprendente: https://github.com/espressif/esp-tflite-micro?tab=readme-ov-...
Trabajamos directamente con varios proveedores para hacer optimizaciones de bajo nivel de deep learning, visión por computadora y procesamiento digital de señales en decenas de microcontroladores y arquitecturas de CPU, aceleradores especializados (incluida computación neuromórfica) y GPU de edge
ESP32 también está incluido: https://docs.edgeimpulse.com/docs/edge-ai-hardware/mcu/espre...
Si subes modelos de TensorFlow, PyTorch o JAX, puedes obtener de inmediato una biblioteca C++ optimizada desde tu laptop con unas pocas líneas de Python, lo cual es bastante sorprendente
También hay un Studio para entrenar modelos, además de optimización de hiperparámetros consciente del hardware, que encuentra el modelo óptimo según arquitecturas diseñadas para ejecutarse bien en distintos hardwares embebidos y la latencia y el uso de memoria del dispositivo objetivo
Features from accelerated segment test: https://en.wikipedia.org/wiki/Features_from_accelerated_segm...
Me pregunto si incluso los chips de este rango de precio tienen algo parecido a una TPU
Neon es una extensión opcional de instrucciones SIMD de ARMv7 y ARMv8, así que desde la Pi Zero en adelante hay extensiones SIMD
Entiendo que la Orrin Nano ofrece 40 TOPS, suficiente para Copilot+. "A PCIe Coral TPU Finally Works on Raspberry Pi 5" https://news.ycombinator.com/item?id=38310063
Según https://phys.org/news/2024-06-infrared-visible-device-2d-mat..., convirtieron hacia arriba una longitud de onda infrarroja de 1550 nm a luz visible de 622 nm, y la onda de luz de salida puede ser detectada por cámaras convencionales basadas en silicio
Se dice que este proceso mantiene la coherencia (coherent), por lo que si se graba un patrón específico en la frecuencia infrarroja de entrada, se transfiere automáticamente a la nueva frecuencia de salida
"Show HN: PicoVGA Library – VGA/TV Display on Raspberry Pi Pico" https://news.ycombinator.com/item?id=35117847#35120403
https://news.ycombinator.com/item?id=40275530
"Designing a SIMD Algorithm from Scratch" https://news.ycombinator.com/item?id=38450374
Las instrucciones SIMD del ESP32-S3 parecen estar diseñadas para acelerar la inferencia de modelos de IA cuantizados (https://github.com/espressif/esp-dl), e incluyen también procesamiento de señales como FFT
En el sentido de que tiene instrucciones específicas que ayudan a la inferencia de ML, también podría llamarse algo parecido a un TPU. Por ejemplo, EE.VRELU.Sx realiza la operación ReLU
Sin embargo, al usar estas instrucciones se sigue consumiendo tiempo de CPU, y normalmente un TPU funciona de forma asíncrona como un núcleo de procesamiento separado, así que se parece más a ARM NEON
El software y la documentación estaban bastante bien, pero lamentablemente no se masificó
Hoy en día es fácil encontrar placas de desarrollo baratas basadas en RV1103 ("LuckFox"), BL808 ("Ox64/Pine64") y CV1800B/SG20002 ("MilkV"), y todas tienen algo básico parecido a un TPU
Sin embargo, como están diseñadas como placas Linux, lo relacionado con el TPU está extremadamente abstraído y casi no hay documentación interna, así que no queda nada claro si realmente es un TPU o una imitación mediante optimizaciones inteligentes de código
MicroPython, a primera vista, parece bastante accesible, y me pregunto si sería fácil portar ese código a WebAssembly
Los casos de uso en dispositivos se pueden probar en https://micropython.org/unicorn/
Para desarrollo del lado del cliente se puede usar en PyScript, y también tiene un puente JavaScript/DOM
https://pyscript.net/tech-preview/micropython/about.html
Según mi experiencia, no-std de Rust en ESP32 tampoco está mal, pero las partes que se conectan con componentes como Wi‑Fi, redes o cámara todavía están menos pulidas
Como dice otro comentario, Rust también tiene soporte suficiente para SIMD y ensamblador
Antes de meterte de lleno, convendría preguntar en los chats de Rust embebido o Rust ESP32
Si se incorpora mucho SIMD y se usa junto con SMT-4 o SMT-8, los hilos podrían ocultar la latencia y mejorar el rendimiento por área