1 puntos por GN⁺ 2024-05-16 | 1 comentarios | Compartir por WhatsApp

GGML: reescritura de SiLU y Softmax para CPU

Cambios principales

  • Introducción de una función expf() vectorizada:

    • Permite calcular Softmax y SiLU con mayor precisión que la tabla de consulta short[65536] usada anteriormente en GGML.
    • Soporta aarch64 y sse2+, y en el peor caso el error de redondeo es de 2 ULP.
    • También se implementaron versiones para avx2 y avx512, pero no se usan porque no ofrecen una gran ventaja frente a sse2+fma en relación con la complejidad del código.
  • Reacciones principales:

    • Varios contribuidores mostraron una reacción positiva ante este cambio.
    • En AMD Ryzen 9 5950X y M2 Ultra, SOFT_MAX es aproximadamente 1.5 veces más rápido.

Cambios en el código

  • Resumen de los cambios principales:
    • Eliminación de #define comentados.
    • Extracción de 5 líneas duplicadas a ggml_vec_soft_max_f32().
    • Eliminación de funciones relacionadas con GGML_SILU_FP16.
    • Adición de ggml_v_expf().
    • Adición de ggml_v_silu().
    • Ajuste de ggml_vec_silu_f32() con una directiva del preprocesador según las banderas SSE2 o __ARM_NEON.

Mejora de rendimiento

  • Resultados de benchmark:
    • En AMD Ryzen 9 5950X y M2 Ultra, SOFT_MAX es aproximadamente 1.5 veces más rápido.
    • Al incluir AVX2, la ganancia aumenta de 1.5x a 1.9x.
    • En znver4, al incluir avx512, aumenta a 2.1x.

Opiniones adicionales

  • Comentarios de los contribuidores:
    • Al usar AVX512, vscalefps puede manejar correctamente el overflow y el underflow, y permite eliminar verificaciones y mezclas.
    • Se confirmó una mejora de rendimiento en Skylake-AVX512/Cascadelake.

Opinión de GN⁺

  • Mejora de rendimiento: este cambio puede mejorar significativamente el rendimiento en CPU, especialmente en hardware moderno que usa AVX2 y AVX512.
  • Complejidad del código: como las implementaciones de AVX2 y AVX512 no ofrecen una gran ventaja frente a SSE2+fma, es importante reducir la complejidad del código.
  • Compatibilidad de hardware: es importante soportar varios conjuntos de instrucciones SIMD para optimizar el rendimiento en diferentes tipos de hardware.
  • Benchmark: se necesitan pruebas de benchmark en distintos equipos para confirmar la mejora de rendimiento.
  • Aplicación de tecnología moderna: es importante aprovechar los conjuntos de instrucciones SIMD más recientes para maximizar el rendimiento.

1 comentarios

 
GN⁺ 2024-05-16
Opiniones de Hacker News

Resumen de comentarios de Hacker News

  • Historia de hace 20 años sobre el procesador de señales de radar de Hughes

    • Comparten una experiencia optimizando el cálculo de e^x en un procesador de señales de radar de Hughes.
    • Para cada valor de 8 bits de una palabra de 32 bits, usaban 256 tablas de e^x y calculaban el valor final mediante multiplicación.
    • Funcionaba 5 veces más rápido que antes.
    • Esa máquina ahora es anticuada, pero en ese momento presumía una velocidad de procesamiento muy alta.
  • Impacto de las mejoras en silu y softmax sobre la velocidad de inferencia de los LLM

    • Opinión de que probablemente no tendrá un gran impacto en la velocidad de inferencia de los LLM.
    • La mayor parte del tiempo se consume en multiplicaciones de matrices.
  • Admiración por la optimización de código

    • Sorpresa y admiración ante un trabajo de optimización complejo.
    • Después de ver que el contribuidor era jart, dicen que todo tuvo sentido.
  • Dudas sobre el tamaño de la LUT

    • Opinión de que una LUT de tamaño 65536 podría ser ineficiente porque equivale al tamaño completo de la caché L1.
    • Aun así, podría funcionar bien gracias a un ajuste probabilístico.
  • Comparación entre llama.cpp y ggml en CPU

    • Comentario preguntando cómo se compara ggml con tensorflow lite, onnxruntime y otros.
  • Comparación de rendimiento en dispositivos CUDA

    • Pregunta sobre si gguf/llama.cpp es mejor en inferencia sin batching, o si exllamav2+flashattention sigue siendo superior.
  • Posibilidad de vectorizar la LUT

    • Opinión de que la LUT puede vectorizarse.
    • Se comparte un enlace a material relacionado.
  • Cálculo rápido de tanh

    • Se comparte un enlace sobre cálculo rápido de tanh.
  • Rendimiento de llama en CPU

    • Opinión de que, pese a las optimizaciones, llama con muchos parámetros puede seguir siendo demasiado lento en CPU.