11 points par GN⁺ 2024-02-24 | 1 commentaires | Partager sur WhatsApp
  • Moteur d’inférence C++ léger et autonome pour les modèles Gemma de Google
  • À qui s’adresse ce projet ?
    • Les moteurs d’inférence modernes pour grands modèles de langage (LLM) sont des systèmes complexes dotés de fonctionnalités spécialisées qui vont au-delà des runtimes traditionnels de réseaux neuronaux
    • Il existe des opportunités de recherche et d’innovation grâce à la co-conception d’algorithmes de haut niveau et de calcul bas niveau, mais un fossé subsiste entre les runtimes d’inférence C++ non conçus pour l’expérimentation et les frameworks de recherche ML centrés sur Python qui abstraient les calculs bas niveau
    • gemma.cpp fournit une implémentation minimale des modèles Gemma 2B et 7B, en mettant l’accent sur la simplicité et le caractère direct plutôt que sur la généralité
    • gemma.cpp vise les cas d’usage d’expérimentation et de recherche, peut être facilement intégré à d’autres projets avec un minimum de dépendances, et se modifie aisément grâce à environ 2K LoC d’implémentation principale et 4K LoC d’utilitaires de support
    • Utilise le SIMD portable de Google Highway Library pour l’inférence sur CPU
    • Pour un déploiement en production, il est recommandé d’emprunter les voies de déploiement standard utilisant des frameworks Python comme JAX, Keras, PyTorch et Transformers

Démarrage rapide

Configuration système requise

  • Avant de commencer, CMake, le compilateur C++ Clang (avec prise en charge de C++17 ou supérieur) et tar pour extraire les archives depuis Kaggle doivent être installés

Étape 1 : obtenir les poids du modèle et le tokenizer depuis Kaggle

  • Rendez-vous sur la page du modèle Gemma sur Kaggle puis sélectionnez Model Variations |> Gemma C++
  • Le menu déroulant Variation propose des poids en bfloat16 (fidélité plus élevée) et des poids en virgule flottante convertis en 8 bits (inférence plus rapide)
  • Il est généralement recommandé de commencer avec le checkpoint -sfp

Étape 2 : extraire les fichiers

  • Après avoir rempli le formulaire de consentement, téléchargez puis extrayez le fichier archive.tar.gz
  • Les fichiers extraits incluent les poids du modèle (par exemple 2b-it-sfp.sbs) et le fichier de tokenizer (tokenizer.spm)
  • Vous pouvez déplacer ces fichiers vers un répertoire pratique (par exemple le répertoire build/ de ce dépôt)

Étape 3 : compilation

  • Le système de build utilise CMake
  • Pour compiler le runtime d’inférence gemma, créez un répertoire de build puis générez les fichiers de build avec cmake depuis le répertoire racine du projet
  • Pour les poids en virgule flottante convertis en 8 bits (sfp), exécutez cmake sans option
  • Si vous avez téléchargé des poids en bfloat16, au lieu d’exécuter cmake sans option comme ci-dessus, lancez cmake en définissant WEIGHT_TYPE sur le type hwy::bfloat16_t de highway
  • Après avoir exécuté la commande cmake appropriée, placez-vous dans le répertoire build/ puis exécutez make pour compiler l’exécutable ./gemma

Étape 4 : exécution

  • Vous pouvez exécuter gemma depuis le répertoire build/
  • gemma nécessite des arguments obligatoires et peut par exemple être lancé avec le fichier de poids 2b-it-sfp.sbs et le fichier de tokenizer tokenizer.spm

Utilisation

  • gemma propose différents modes d’utilisation, contrôlés par le drapeau de verbosité
  • Tous les modes d’utilisation sont actuellement interactifs, la génération de texte étant déclenchée à chaque saisie d’une nouvelle ligne

Application terminal interactive

  • Par défaut, la verbosité est définie sur 1, et gemma fournit une interface interactive en terminal lors de son exécution

Utilisation comme outil en ligne de commande

  • Pour utiliser l’exécutable gemma comme outil en ligne de commande, il peut être utile de créer un alias avec des arguments entièrement spécifiés pour gemma.cpp

Inclure la bibliothèque gemma.cpp dans un projet

  • La façon la plus simple d’inclure gemma.cpp dans votre propre projet est d’utiliser FetchContent pour récupérer gemma.cpp et ses dépendances
  • Vous pouvez ajouter ce qui suit à votre CMakeLists.txt

Compiler gemma.cpp comme bibliothèque

  • gemma.cpp peut être utilisé comme dépendance de bibliothèque dans votre propre projet, et vous pouvez générer un artefact de bibliothèque partagée en compilant la cible libgemma

Remerciements et contact

  • gemma.cpp a été lancé à l’automne 2023 par Austin Huang et Jan Wassenberg, puis publié en février 2024 avec les contributions de Phil Culliton, Paul Chang et Dan Zheng
  • Ce n’est pas un produit Google officiellement pris en charge.

Avis de GN⁺ :

  1. gemma.cpp est un outil utile pour l’expérimentation et la recherche sur les grands modèles de langage, en fournissant un moteur d’inférence allégé basé sur C++ qui contribue à combler le fossé avec les frameworks existants centrés sur Python
  2. Ce projet offre l’opportunité de contribuer à la communauté open source et souligne l’importance de respecter les directives open source de Google
  3. gemma.cpp est conçu pour être facilement intégré et utilisé par les développeurs et les chercheurs dans leurs propres projets grâce à ses divers modes d’utilisation, avec un potentiel pour stimuler l’innovation dans les domaines de l’IA et du ML

1 commentaires

 
GN⁺ 2024-02-24
Avis Hacker News
  • Résumé des commentaires Hacker News :
    • Présentation d’Austin et description du projet :

      • Austin est co-auteur du projet et indique qu’il répondra aux questions.
      • gemma.cpp est indépendant de llama.cpp/ggml, tout en étant inspiré du projet llama.cpp.
      • gemma.cpp est une implémentation directe de Gemma, axée sur l’expérimentation, la recherche, la portabilité et la facilité de modification.
      • L’implémentation initiale est centrée sur le SIMD CPU, avec des options à l’étude pour la prise en charge GPU.
      • Les questions sur le modèle Gemma lui-même seront traitées par d’autres collègues ; il s’agit ici d’une implémentation C++, relativement indépendante du processus d’entraînement du modèle.
      • Le projet a été réalisé par une petite équipe chez Google, qui espère qu’il sera utile à d’autres.
      • Un lien vers un fil Twitter à propos du projet est fourni.
    • Avis sur la compétitivité de Google dans les LLM :

      • Même si Google est critiqué pour son retard sur OpenAI dans les produits commerciaux, l’entreprise reste très compétente dans le domaine des LLM.
      • Certains estiment que lorsque Google se met réellement en mouvement, les résultats peuvent être impressionnants.
      • On espère que la concurrence open source continuera grâce à Facebook et Llama, et que, même si OpenAI s’est éloigné de sa mission initiale, il faut se souvenir de l’importance de sa vision de départ.
    • Question sur le système de build :

      • Un commentaire s’interroge sur les raisons pour lesquelles Google n’a pas utilisé bazel comme système de build.
    • Éloges sur les performances de Gemma :

      • Gemma a été ajouté au classement HHEM et affiche un faible taux d’hallucination parmi les petits modèles.
    • Admiration pour la vitesse d’évolution de l’écosystème open source des LLM :

      • Le rythme de progression de l’écosystème open source des LLM est extrêmement rapide, avec de nouvelles informations et du nouveau code qui arrivent en continu.
    • Question sur les formats de modèle :

      • Un commentaire demande une explication des différences entre divers formats de modèle comme GGUF et GGML, ainsi que de la manière dont ils sont gérés.
    • Discussion sur les capacités mathématiques des LLM :

      • Discussion sur le fait que les LLM ne résolvent pas très bien les problèmes de mathématiques, et sur les raisons pour lesquelles ChatGPT peut donner l’impression de mieux s’en sortir.
      • Question sur la prise en charge de modèles à plugins dans les projets LLM, et sur la possibilité d’appliquer une approche par plugins à un système développé avec llama.cpp.
    • Question sur d’éventuelles restrictions de contenu dans Gemma :

      • Un commentaire demande si Gemma intègre, comme Gemini, des mécanismes de restriction de contenu, ou si cela relève plutôt de l’application Gemini.
    • Remerciements envers gemma.cpp et attente de nouvelles fonctionnalités :

      • Un commentaire remercie pour le dépôt gemma.cpp et indique avoir développé un wrapper Python.
      • Ce wrapper Python a été créé pour faciliter l’usage des nouvelles techniques à chaque mise à jour de l’équipe gemma.cpp.
    • Question sur la taille de l’exécutable du modèle Gemma :

      • Un commentaire demande quelle serait la taille finale de l’exécutable si le modèle Gemma était compilé avec une interface en ligne de commande minimale et empaqueté en binaire autonome pouvant s’exécuter hors ligne.