Benchmarking de la NPU de Qualcomm
Introducción
- Microsoft ofrece tabletas Surface con Windows ejecutándose en SoC basados en Arm de Qualcomm.
- Estas tabletas se promocionan como AI PC y se afirma que pueden ejecutar modelos de aprendizaje automático de forma más rápida y eficiente que otros sistemas.
- Debido al gran interés en el hardware de Qualcomm, especialmente en la NPU, se invirtió mucho tiempo y recursos en portar aplicaciones de terceros a esta plataforma.
- Sin embargo, casi no hay ejemplos de código ni benchmarks para desarrolladores externos que permitan obtener resultados rápidos, así que se armó un proyecto independiente para mostrar el rendimiento.
- Como el rendimiento fue menor de lo esperado, se publica el benchmark con la esperanza de obtener ideas para reducir la latencia.
Instalación
Python
- Se usa Python para ejecutar los scripts de prueba.
- La versión de Python de Microsoft Store no soporta la arquitectura Arm, por lo que se recomienda usar el instalador oficial de Python.org.
- Los resultados reportados se obtuvieron con Python 3.11.9.
Cmake
- Se necesita la herramienta de compilación cmake para compilar Onnx.
- Ejecuta el comando
winget install cmake en Powershell.
Visual Studio
- Se necesita Visual Studio para el compilador.
- Al descargar e instalar Visual Studio Community Edition, selecciona la carga de trabajo
Desktop C++ Development.
Paquetes de Pip
- Los paquetes de Python necesarios pueden instalarse con el comando
py -m pip install -r requirements.txt.
- Se usa la versión 1.16 de Onnx, compatible con Qualcomm Onnx Runtime.
Benchmark
Ejecución
- Ejecutar el benchmark:
py benchmark_matmul.py
Entender la salida
- El runtime de Onnx genera bastante ruido de logs al inicio.
- Los resultados del benchmark verifican que los resultados numéricos de CPU y NPU coinciden.
- La CPU muestra 821 gigaops, el primer enfoque de NPU 225 gigaops y el segundo 573 gigaops.
Qué mide el benchmark
- El benchmark ejecuta 6 multiplicaciones de matrices grandes, similares a las capas que más tiempo consumen en modelos transformadores como Whisper de OpenAI.
- La NPU ejecuta sobre todo modelos cuantizados de forma eficiente, y los modelos con entradas y salidas de 8 bits son más rápidos.
Factores que pueden causar confusión
Límite de cómputo
- Los modelos transformadores modernos se basan en grandes multiplicaciones de matrices y pueden estar limitados por memoria.
- Se hace que las matrices de entrada sean más cuadradas para permitir tiling y reutilización.
Configuración de energía
- Ajusta la configuración de uso de energía de Windows a "máximo rendimiento" y ejecuta el benchmark con la tableta conectada a la corriente.
Topología del modelo
- Se genera un grafo que refleja modelos modernos de IA, pero simplificado para facilitar su interpretación.
Errores de configuración
- La forma de construir y ejecutar el modelo podría salirse de la ruta rápida de la implementación del driver o del acelerador.
Framework Onnx
- Hay varias formas de acceder a la aceleración de IA en Windows, y Onnx parece ser el framework más adecuado.
Interpretación de los resultados
- Al ejecutarse en un Snapdragon X de 12 núcleos X1E80100, el resultado de la NPU es más lento que el de la CPU.
- El rendimiento observado representa solo el 1.3% de los 45 billones de ops/s prometidos en el material de marketing.
- En una Nvidia Geforce RTX 4080 Laptop GPU, se ejecuta en 3.2 ms y muestra un rendimiento de 2,160 gigaops.
Resumen de GN⁺
- El rendimiento de la NPU de Qualcomm no cumple con las expectativas y muestra resultados más lentos que la CPU.
- Existe expectativa de que puedan hacerse cambios de software para optimizar el rendimiento de la NPU.
- El framework Onnx parece ser la mejor opción para obtener rendimiento acelerado en la NPU de Qualcomm.
- Frente a una GPU de Nvidia, el rendimiento de la NPU de Qualcomm queda muy por detrás.
2 comentarios
Tenía entendido que el NPU de Ryzen era apenas un poco más rápido que la CPU, así que se me fueron por completo las ganas del Snapdragon.
Opiniones en Hacker News
La diferencia de rendimiento entre CPU y GPU es pequeña. Podría ser un problema de
onnxruntime. El NPU está más enfocado en el bajo consumo de energía que en la velocidadEl Apple Neural Engine es mucho más rápido que la CPU o la GPU
El objetivo del NPU es ejecutar modelos pequeños con bajo consumo de energía
Para desplegar modelos en el NPU se necesita optimización basada en profiling
La explicación en GitHub es más útil que la del blog
int8 matmul, el rendimiento deonnxes de aproximadamente 0.6TFQualcomm no permite acceso directo al NPU
Podría ser posible usar el Qualcomm SNPE SDK
Este artículo trata sobre un NPU específico, un benchmark específico y bibliotecas y frameworks específicos