3 puntos por GN⁺ 2024-06-26 | 1 comentarios | Compartir por WhatsApp
  • 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 ^ 0x80 para 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 FFT
    • esp-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

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
  • 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 - 128 es equivalente a invertir el bit más significativo
    • Por eso se usa la relación x - 128 == x ^ 0x80
  • Cada vez que se cargan valores unsigned de 8 bits, se aplica XOR con 0x80 para 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

 
GN⁺ 2024-06-26
Opiniones de Hacker News
  • Si hablamos de silicio más barato que un café promedio, suena bastante genial, aunque quizá no es que el chip sea demasiado barato, sino que el café es demasiado caro
    • Desde que vi Minority Report, he estado esperando vasos de café desechables con anuncios de video OLED, pero el avance tecnológico va demasiado lento
    • Es posible que, en realidad, el café debería ser más caro de lo que es ahora
      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
    • Más precisamente, no es tanto el café en sí, sino el costo del trabajo de que alguien lo prepare
    • Hay una razón incómoda por la que la visión por computadora es posible con hardware ultrabarato
      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
  • Existe una placa similar llamada ESP32-CAM, y este proyecto práctico de visión por computadora la soporta: https://github.com/jomjol/AI-on-the-edge-device?tab=readme-o...
  • También vale la pena leer este breve artículo sobre SIMD en el ESP32-S3. Ya se había discutido antes: https://bitbanksoftware.blogspot.com/2024/01/surprise-esp32-...
  • Si te interesa este tema y quieres probarlo por tu cuenta, conviene echarle un vistazo a nuestro producto Edge Impulse: https://edgeimpulse.com/ai-practitioners
    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
    • Como referencia, por las limitaciones del plan comunitario, parece que los resultados generados aquí serían difíciles de usar en cualquier proyecto open source
    • ¿Por qué C++? Me da curiosidad si el código C++ generado usa funciones complejas de C++, o si se parece más a C con clases
  • Me da curiosidad para qué se usa FAST
    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

  • El detector de características FAST es un algoritmo que encuentra regiones visualmente destacadas en una imagen y puede usarse como primer paso para el seguimiento de movimiento y SLAM, comunes en XR, robótica, etc.
    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
  • Como función parecida a TPU en chips de este rango de precio, Kendryte K210 admite convoluciones 1x1 y 3x3 en su "TPU"
    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
  • TinyML es interesante porque sus principios pueden aplicarse directamente también a aplicaciones web
    MicroPython, a primera vista, parece bastante accesible, y me pregunto si sería fácil portar ese código a WebAssembly
  • Suponiendo que se sacrifique en cierta medida la ventana de detección, me pregunto qué tan difícil sería usar varias de estas placas en paralelo para procesar resoluciones y tasas de cuadros más altas
  • Si alguien ha usado Rust en controladores ESP32, me pregunto si esto también se puede hacer en Rust
    • Comparado con ESP8266, el soporte de Rust en ESP32 en general es bastante bueno, pero si quieres usar la biblioteca estándar es muy probable que tengas que traer el toolchain de C++
      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
    • Es posible. Depende principalmente del soporte de LLVM/clang, y el ensamblador de Rust es muy fácil de manejar
  • Si no lo leí mal, ¿la penúltima parte no es simplemente complemento a dos básico?
  • En este tipo de procesamiento, parece que SIMD supera a SMT
    • No veo SIMD y SMT como una disyuntiva
      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