1 puntos por GN⁺ 2024-10-17 | 2 comentarios | Compartir por WhatsApp

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

 
bungker 2024-10-18

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.

 
GN⁺ 2024-10-17
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 velocidad

    • El NPU se usa como parte del SoC al separar las operaciones de IA de la CPU
    • Si se mide el consumo de energía de CPU, NPU y GPU en un bucle infinito, se esperaría que el NPU fuera el más bajo
    • Como el NPU ocupa bastante área de silicio, es una lástima si no se aprovecha bien
  • El Apple Neural Engine es mucho más rápido que la CPU o la GPU

    • El rendimiento varía según la arquitectura del modelo, la conversión y el tuning
    • XCode ofrece herramientas para medir el tiempo de ejecución de los modelos
    • Es posible que los frameworks/runtimes de ML no implementen todos los operadores
  • El objetivo del NPU es ejecutar modelos pequeños con bajo consumo de energía

    • El NPU está pensado para modelos optimizados y realiza tareas pequeñas
    • En Windows puede ejecutar OCR de pantalla completa, entre otras cosas
  • Para desplegar modelos en el NPU se necesita optimización basada en profiling

    • Incluso modelos que funcionan bien en CPU pueden dar resultados decepcionantes en NPU
  • La explicación en GitHub es más útil que la del blog

    • Al ejecutar int8 matmul, el rendimiento de onnx es de aproximadamente 0.6TF
  • Qualcomm no permite acceso directo al NPU

    • Las herramientas de conversión podrían pasar por alto optimizaciones
    • El NPU es adecuado para modelos pequeños de ML y aproximación rápida de funciones
  • Podría ser posible usar el Qualcomm SNPE SDK

    • Me pregunto si el Hexagon SDK funciona correctamente
  • Este artículo trata sobre un NPU específico, un benchmark específico y bibliotecas y frameworks específicos

    • Por lo tanto, es difícil sacar conclusiones generales