1 pontos por GN⁺ 2024-05-16 | 1 comentários | Compartilhar no WhatsApp

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 no GGML.
    • Suporta aarch64 e sse2+, com erro de arredondamento de até 2 ULP no pior caso.
    • Implementações para avx2 e avx512 também foram escritas, mas não são usadas por não oferecerem uma vantagem significativa em relação ao sse2+fma, considerando a complexidade extra do código.
  • Principais reações:

    • Vários contribuidores reagiram positivamente a essa mudança.
    • Em AMD Ryzen 9 5950X e M2 Ultra, o SOFT_MAX fica cerca de 1,5x mais rápido.

Mudanças no código

  • Resumo das principais alterações:
    • Remoção de #define comentados.
    • 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 flags SSE2 ou __ARM_NEON.

Melhorias de desempenho

  • Resultados de benchmark:
    • Em AMD Ryzen 9 5950X e M2 Ultra, o SOFT_MAX fica cerca de 1,5x mais rápido.
    • Com AVX2, o ganho aumenta de 1,5x para 1,9x.
    • Em znver4, com avx512, o ganho sobe para 2,1x.

Comentários adicionais

  • Opinião dos contribuidores:
    • Ao usar AVX512, empregar vscalefps permite 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.

Opinião do GN⁺

  • Melhoria de desempenho: essa mudança pode melhorar bastante o desempenho em CPU, especialmente em hardware mais recente com AVX2 e AVX512.
  • Complexidade do código: como as implementações AVX2 e AVX512 não oferecem grande vantagem em relação a SSE2+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

 
GN⁺ 2024-05-16
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

    • Compartilhamento de uma experiência otimizando o cálculo de e^x em um processador de sinais de radar da Hughes.
    • Para cada valor de 8 bits em uma palavra de 32 bits, eram usadas 256 tabelas de e^x para calcular o valor final por multiplicação.
    • Funcionava 5 vezes mais rápido do que antes.
    • Essa máquina agora é obsoleta, mas na época tinha uma velocidade de processamento muito alta.
  • Impacto das melhorias em silu e softmax na velocidade de inferência de LLMs

    • Opinião de que o impacto na velocidade de inferência de LLMs provavelmente não será grande.
    • A maior parte do tempo é gasta em multiplicação de matrizes.
  • Admiração pela otimização de código

    • Surpresa e admiração com o trabalho complexo de otimização.
    • Depois de descobrir que o autor da contribuição era jart, isso passou a fazer sentido.
  • Dúvida sobre o tamanho da LUT

    • Opinião de que uma LUT de tamanho 65536 pode ser ineficiente por ocupar o mesmo tamanho de toda a cache L1.
    • No entanto, pode funcionar bem por causa de ajustes probabilísticos.
  • Comparação entre llama.cpp e ggml na CPU

    • Comentário perguntando como o ggml se compara a tensorflow lite, onnxruntime etc.
  • Comparação de desempenho em dispositivos CUDA

    • Pergunta sobre se gguf/llama.cpp é melhor em inferência sem batching, ou se exllamav2+flashattention ainda continua superior.
  • Possibilidade de vetorização da LUT

    • Opinião de que a LUT pode ser vetorizada.
    • Link para material relacionado fornecido.
  • Cálculo rápido de tanh

    • Link para cálculo rápido de tanh fornecido.
  • Desempenho do llama na CPU

    • Opinião de que, apesar das otimizações, o llama com muitos parâmetros pode continuar lento demais na CPU.