1 points par GN⁺ 2024-05-16 | 1 commentaires | Partager sur WhatsApp

GGML : réécriture de SiLU et Softmax pour CPU

Principaux changements

  • Introduction d'une fonction expf() vectorisée :

    • Elle permet de calculer Softmax et SiLU avec une meilleure précision que la table de correspondance short[65536] utilisée jusque-là dans GGML.
    • Elle prend en charge aarch64 et sse2+, avec une erreur d'arrondi maximale de 2 ULP.
    • Des implémentations avx2 et avx512 ont également été écrites, mais ne sont pas utilisées car elles n'apportent pas de gain majeur par rapport à sse2+fma au vu de la complexité du code.
  • Réactions principales :

    • Plusieurs contributeurs ont réagi positivement à ce changement.
    • Sur AMD Ryzen 9 5950X et M2 Ultra, SOFT_MAX est environ 1,5x plus rapide.

Modifications du code

  • Résumé des principaux changements :
    • Suppression du #define commenté.
    • Extraction de 5 lignes dupliquées dans ggml_vec_soft_max_f32().
    • Suppression des fonctions liées à GGML_SILU_FP16.
    • Ajout de ggml_v_expf().
    • Ajout de ggml_v_silu().
    • Ajustement de ggml_vec_silu_f32() avec une directive de préprocesseur selon les flags SSE2 ou __ARM_NEON.

Améliorations de performance

  • Résultats de benchmark :
    • Sur AMD Ryzen 9 5950X et M2 Ultra, SOFT_MAX est environ 1,5x plus rapide.
    • Avec AVX2, le gain passe de 1,5x à 1,9x.
    • Sur znver4, avec avx512, il atteint 2,1x.

Avis supplémentaires

  • Commentaires des contributeurs :
    • En utilisant vscalefps avec AVX512, il est possible de gérer correctement l'overflow et l'underflow, tout en supprimant les vérifications et les blends.
    • Des gains de performance ont été constatés sur Skylake-AVX512/Cascadelake.

L'avis de GN⁺

  • Amélioration des performances : ce changement peut fortement améliorer les performances sur CPU, avec des gains encore plus marqués sur le matériel récent utilisant AVX2 et AVX512.
  • Complexité du code : comme les implémentations AVX2 et AVX512 n'apportent pas de bénéfice majeur face à SSE2+fma, il est important de limiter la complexité du code.
  • Compatibilité matérielle : il est important de prendre en charge différents jeux d'instructions SIMD afin d'optimiser les performances sur une large variété de matériels.
  • Benchmark : des tests de benchmark sur divers matériels sont nécessaires pour valider les gains de performance.
  • Adoption des technologies récentes : il est important d'exploiter les jeux d'instructions SIMD les plus récents pour maximiser les performances.

1 commentaires

 
GN⁺ 2024-05-16
Réactions sur Hacker News

Résumé des commentaires de Hacker News

  • Une histoire vieille de 20 ans sur un processeur de signaux radar Hughes

    • Partage d’une expérience d’optimisation du calcul de e^x sur un processeur de signaux radar Hughes.
    • Utilisation de 256 tables de e^x pour chaque valeur de 8 bits d’un mot de 32 bits, puis multiplication pour obtenir la valeur finale.
    • Le système fonctionnait 5 fois plus vite qu’auparavant.
    • Cette machine est désormais obsolète, mais affichait à l’époque une vitesse de traitement très élevée.
  • Impact des améliorations de silu et softmax sur la vitesse d’inférence des LLM

    • Avis selon lequel l’impact sur la vitesse d’inférence des LLM ne serait pas très important.
    • La majeure partie du temps est consacrée aux multiplications de matrices.
  • Admiration pour l’optimisation du code

    • Surprise et admiration face à ce travail d’optimisation complexe.
    • Cela devient plus compréhensible en apprenant que le contributeur est jart.
  • Question sur la taille de la LUT

    • Avis selon lequel une LUT de taille 65536 pourrait être inefficace, car elle occupe toute la taille du cache L1.
    • Mais cela pourrait tout de même bien fonctionner grâce à des ajustements probabilistes.
  • Comparaison entre llama.cpp et ggml sur CPU

    • Commentaire s’interrogeant sur la comparaison de ggml avec tensorflow lite, onnxruntime, etc.
  • Comparaison des performances sur périphériques CUDA

    • Question pour savoir si gguf/llama.cpp est meilleur en inférence non batchée, ou si exllamav2+flashattention reste dominant.
  • Possibilité de vectoriser la LUT

    • Avis selon lequel la LUT peut être vectorisée.
    • Lien vers une ressource connexe.
  • Calcul rapide de tanh

    • Lien vers une ressource sur le calcul rapide de tanh.
  • Performances de llama sur CPU

    • Avis selon lequel, malgré les optimisations, llama avec beaucoup de paramètres peut rester trop lent sur CPU.