Nova função exponencial que torna SiLU e Softmax 2x mais rápidos, mantendo totalmente a precisão
(github.com/ggerganov)GGML: reescrita de SiLU e Softmax para CPU
Principais mudanças
-
Introdução de uma função
expf()vetorizada:- Agora é possível calcular Softmax e SiLU com mais precisão do que com a tabela de consulta
short[65536]usada anteriormente noGGML. - Suporta
aarch64esse2+, com erro de arredondamento de até 2 ULP no pior caso. - Implementações para
avx2eavx512também foram escritas, mas não são usadas por não oferecerem uma vantagem significativa em relação aosse2+fma, considerando a complexidade extra do código.
- Agora é possível calcular Softmax e SiLU com mais precisão do que com a tabela de consulta
-
Principais reações:
- Vários contribuidores reagiram positivamente a essa mudança.
- Em
AMD Ryzen 9 5950XeM2 Ultra, oSOFT_MAXfica cerca de 1,5x mais rápido.
Mudanças no código
- Resumo das principais alterações:
- Remoção de
#definecomentados. - Extração de 5 linhas duplicadas para
ggml_vec_soft_max_f32(). - Remoção de funções relacionadas a
GGML_SILU_FP16. - Adição de
ggml_v_expf(). - Adição de
ggml_v_silu(). - Ajuste de
ggml_vec_silu_f32()com diretivas de pré-processador de acordo com as flagsSSE2ou__ARM_NEON.
- Remoção de
Melhorias de desempenho
- Resultados de benchmark:
- Em
AMD Ryzen 9 5950XeM2 Ultra, oSOFT_MAXfica cerca de 1,5x mais rápido. - Com
AVX2, o ganho aumenta de 1,5x para 1,9x. - Em
znver4, comavx512, o ganho sobe para 2,1x.
- Em
Comentários adicionais
- Opinião dos contribuidores:
- Ao usar
AVX512, empregarvscalefpspermite lidar adequadamente com overflow e underflow, além de remover verificações e blends. - Houve confirmação de melhora de desempenho em
Skylake-AVX512/Cascadelake.
- Ao usar
Opinião do GN⁺
- Melhoria de desempenho: essa mudança pode melhorar bastante o desempenho em CPU, especialmente em hardware mais recente com
AVX2eAVX512. - Complexidade do código: como as implementações
AVX2eAVX512não oferecem grande vantagem em relação aSSE2+fma, é importante reduzir a complexidade do código. - Compatibilidade de hardware: é importante oferecer suporte a diferentes conjuntos de instruções SIMD para otimizar o desempenho em vários tipos de hardware.
- Benchmark: são necessários testes de benchmark em diferentes hardwares para confirmar os ganhos de desempenho.
- Aplicação de tecnologias mais recentes: é importante aproveitar os conjuntos de instruções SIMD mais modernos para maximizar o desempenho.
1 comentários
Comentários do Hacker News
Resumo da coletânea de comentários do Hacker News
História de um processador de sinais de radar da Hughes de 20 anos atrás
Impacto das melhorias em silu e softmax na velocidade de inferência de LLMs
Admiração pela otimização de código
Dúvida sobre o tamanho da LUT
Comparação entre llama.cpp e ggml na CPU
Comparação de desempenho em dispositivos CUDA
Possibilidade de vetorização da LUT
Cálculo rápido de tanh
Desempenho do llama na CPU