1 pontos por GN⁺ 2024-10-17 | 2 comentários | Compartilhar no WhatsApp

Benchmarking da NPU da Qualcomm

Introdução

  • A Microsoft oferece tablets Surface com Windows rodando em SoCs baseados em Arm da Qualcomm.
  • Esses tablets são divulgados como AI PCs e supostamente conseguem executar modelos de machine learning com mais rapidez e eficiência do que outros sistemas.
  • Como havia grande interesse no hardware da Qualcomm, especialmente na NPU, muito tempo e recursos foram investidos para portar aplicativos de terceiros para essa plataforma.
  • No entanto, como quase não havia exemplos de código ou benchmarks para desenvolvedores externos obterem resultados rapidamente, foi montado um projeto independente para demonstrar o desempenho.
  • Como o desempenho ficou abaixo do esperado, o benchmark foi publicado na esperança de obter ideias para reduzir a latência.

Instalação

Python

  • Python é usado para executar o script de teste.
  • Como o Python da Microsoft Store não oferece suporte à arquitetura Arm, recomenda-se usar o instalador oficial do Python.org.
  • Os resultados reportados usaram a versão Python 3.11.9.

Cmake

  • A ferramenta de build cmake é necessária para compilar o Onnx.
  • Execute o comando winget install cmake no Powershell.

Visual Studio

  • O Visual Studio é necessário por causa do compilador.
  • Ao baixar e instalar o Visual Studio Community Edition, selecione a carga de trabalho Desktop C++ Development.

Pacotes Pip

  • Os pacotes Python necessários podem ser instalados com o comando py -m pip install -r requirements.txt.
  • É usada a versão 1.16 do Onnx, compatível com o Qualcomm Onnx Runtime.

Benchmark

Execução

  • Para executar o benchmark: py benchmark_matmul.py

Entendendo a saída

  • O runtime do Onnx gera inicialmente muitos logs.
  • Os resultados do benchmark confirmam que os resultados numéricos de CPU e NPU coincidem.
  • A CPU alcança 821 Gigaops, a primeira abordagem da NPU 225 Gigaops e a segunda 573 Gigaops.

O que o benchmark mede

  • O benchmark executa 6 grandes multiplicações de matrizes, semelhantes às camadas mais demoradas de modelos transformer como o Whisper da OpenAI.
  • A NPU executa principalmente modelos quantizados de forma eficiente, e modelos com entradas e saídas de 8 bits são mais rápidos.

Fatores que podem causar confusão

Limites de computação
  • Modelos transformer modernos se baseiam em grandes multiplicações de matrizes e podem ficar limitados por memória.
  • A matriz de entrada é tornada mais próxima de um formato quadrado para permitir tiling e reutilização.
Configurações de energia
  • O benchmark foi executado com a configuração de uso de energia do Windows em "melhor desempenho" e com o tablet conectado à energia.
Topologia do modelo
  • O grafo foi gerado para refletir modelos de IA modernos, mas simplificado para facilitar a interpretação.
Erros de configuração
  • A forma de construir e executar o modelo pode acabar saindo do caminho rápido da implementação do driver ou do acelerador.
Framework Onnx
  • Há várias formas de acessar aceleração de IA no Windows, e o Onnx parece ser o framework mais adequado.

Interpretação dos resultados

  • Ao rodar no Snapdragon X 12-core X1E80100, o resultado da NPU é mais lento do que o da CPU.
  • O desempenho observado representa apenas 1,3% dos 45 trilhões de ops/s prometidos no material de marketing.
  • Em uma Nvidia Geforce RTX 4080 Laptop GPU, a execução levou 3,2 ms e atingiu 2.160 Gigaops.

Resumo do GN⁺

  • O desempenho da NPU da Qualcomm fica abaixo do esperado e apresenta resultados mais lentos do que a CPU.
  • Há expectativa de que mudanças de software possam otimizar o desempenho da NPU.
  • O framework Onnx parece ser a melhor escolha para obter desempenho acelerado na NPU da Qualcomm.
  • Em comparação com GPUs da Nvidia, o desempenho da NPU da Qualcomm fica muito atrás.

2 comentários

 
bungker 2024-10-18

Eu achava que a NPU da Ryzen era só um pouco mais rápida que a CPU, mas meu entusiasmo pelo Snapdragon caiu bastante.

 
GN⁺ 2024-10-17
Comentários no Hacker News
  • A diferença de desempenho entre CPU e GPU é pequena. Pode ser um problema do onnxruntime. O foco da NPU é mais o baixo consumo de energia do que a velocidade

    • A NPU é usada como parte do SoC, separando as operações de IA da CPU
    • Se medir o consumo de energia de CPU, NPU e GPU em um loop infinito, espera-se que a NPU tenha o menor consumo
    • Como a NPU ocupa muita área de silício, é uma pena quando não é bem aproveitada
  • O Apple Neural Engine é muito mais rápido que CPU ou GPU

    • O desempenho varia conforme a arquitetura do modelo, a conversão e o tuning
    • O XCode fornece ferramentas para medir o tempo de execução do modelo
    • Frameworks/runtimes de ML podem não implementar todos os operadores
  • O objetivo da NPU é executar modelos pequenos com baixo consumo de energia

    • A NPU é voltada para modelos otimizados e executa tarefas pequenas
    • No Windows, pode executar OCR em tela cheia etc.
  • Para implantar um modelo na NPU, é necessária otimização baseada em profiling

    • Um modelo que funciona bem na CPU pode ter resultados decepcionantes na NPU
  • A explicação no GitHub é mais útil que a do blog

    • Ao executar int8 matmul, o desempenho do ONNX fica em cerca de 0,6 TF
  • A Qualcomm não permite acesso direto à NPU

    • Ferramentas de conversão podem deixar passar otimizações
    • A NPU é adequada para modelos pequenos de ML e aproximação rápida de funções
  • Pode haver a possibilidade de usar o Qualcomm SNPE SDK

    • Fica a dúvida se o Hexagon SDK funciona direito
  • Este texto trata de uma NPU específica, um benchmark específico e bibliotecas e frameworks específicos

    • Portanto, é difícil tirar conclusões gerais