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
Eu achava que a NPU da Ryzen era só um pouco mais rápida que a CPU, mas meu entusiasmo pelo Snapdragon caiu bastante.
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 velocidadeO Apple Neural Engine é muito mais rápido que CPU ou GPU
O objetivo da NPU é executar modelos pequenos com baixo consumo de energia
Para implantar um modelo na NPU, é necessária otimização baseada em profiling
A explicação no GitHub é mais útil que a do blog
int8 matmul, o desempenho do ONNX fica em cerca de 0,6 TFA Qualcomm não permite acesso direto à NPU
Pode haver a possibilidade de usar o Qualcomm SNPE SDK
Este texto trata de uma NPU específica, um benchmark específico e bibliotecas e frameworks específicos