Évaluation des Modèles LLM Locaux

Repo GitHub du Projet

Contexte

J’ai construit LLM Speed Benchmark (LLMSB) pendant mon temps en tant que stagiaire en ingénierie à temps partiel chez Anarchy (YC W23). LLMSB est un outil d’évaluation pour évaluer la performance d’un modèle LLM. Il utilise la bibliothèque transformers de HuggingFace pour charger et exécuter un modèle LLM et il mesure :

  • temps d’exécution total
  • tokens par seconde
  • spécifications matérielles générales
  • utilisation du CPU (fréquence actuelle & % d’utilisation des cœurs dans le temps)
  • utilisation de la RAM (RAM & swap dans le temps)
  • utilisation du GPU (charge, utilisation de la mémoire, & température dans le temps)

ICI est un exemple d’une évaluation effectuée pour le modèle codellama-13b-oasst-sft-v10 fonctionnant sur un H100. Je possède personnellement un Nvidia RTX 2070 Ti, qui a 8 Go de VRAM. Malheureusement, pour la plupart des modèles LLM modernes, 8 Go de VRAM ne suffisent pas pour interagir avec un modèle. En raison de cela, j’ai utilisé RunPod pour “louer” des GPU et exécuter mes évaluations sur certains modèles.

C’était l’histoire de fond/l’origine de LLMSB. Étant donné que le projet est open-source, vous pouvez consulter le code ICI. Ci-dessous, j’ai inclus le README du repo si vous souhaitez le consulter.

À Propos

🚧 LLM Speed Benchmark (LLMSB) est actuellement en version bêta (v0). Veuillez ne pas l’utiliser en production, ou utilisez-le à vos propres risques. Nous sommes encore en train de corriger certains problèmes et d’améliorer la fonctionnalité. Si vous rencontrez des bogues ou avez des suggestions, veuillez les signaler sous ISSUES. Vos retours sont inestimables !

LLM Speed Benchmark (LLMSB) est un outil d’évaluation pour évaluer la performance des modèles LLM sur différentes plateformes matérielles. Son objectif ultime est de compiler un ensemble de données complet détaillant la performance des modèles LLM sur divers systèmes, permettant aux utilisateurs de choisir plus efficacement le(s) bon(s) modèle(s) LLM pour leurs projets.

Limitations

LLMSB est en v0, donc il a des limitations :

  • Conçu uniquement pour fonctionner sur des systèmes d’exploitation basés sur Debian, c’est-à-dire qu’il n’est pas conçu pour fonctionner sur Windows. Cela est dû au fait que LLMSB utilise neofetch et nvidia-smi pour recueillir des métriques en arrière-plan et la logique des chemins de fichiers est basée sur des systèmes d’exploitation Unix.
  • En raison de la façon dont les métriques sont enregistrées, il peut falloir jusqu’à 1 seconde au collecteur de métriques pour effectuer une collecte. Cela signifie qu’au mieux, nous pouvons collecter des métriques matérielles toutes les 1 seconde.
  • LLMSB utilise uniquement HuggingFace pour charger et exécuter des modèles. Cela fonctionne pour l’instant, mais l’objectif est que LLMSB prenne en charge plusieurs frameworks, pas seulement HuggingFace.
  • Actuellement, tous les modèles sont exécutés par la logique présentée dans la fonction run_llm(), située dans src/hf.py, où les fonctions AutoTokenizer() et AutoModelForCausalLM() sont utilisées pour charger et exécuter un modèle. Cela fonctionne mais limite la façon dont nous pouvons configurer/optimiser des modèles spécifiques. Sachant cela, l’objectif est de créer des classes séparées pour chaque modèle populaire et d’utiliser les classes spécifiques aux modèles de HuggingFace, comme LlamaTokenizer & LlamaForCausalLM, à la place.
  • LLMSB ne recueille que des métriques générales et de haut niveau. À l’avenir, nous aimerions recueillir des métriques de bas niveau. Nous pensons que cela peut être en partie réalisé en utilisant le wrapper de profileur de Pytorch.

Exemples de Sorties

22 Novembre 2023

LLMSB a été exécuté/testé sur un GPU L40 et H100 via RunPod. Dans ces évaluations, les modèles llama-2-7b-hf, codellama-13b-oasst-sft-v10, & mpt-7b ont été testés. Consultez les résultats ICI. Si des erreurs/problèmes sont remarqués, veuillez les signaler dans les ISSUES.

Configuration

  1. Créez et activez l’environnement python :

    python3 -m venv env
    source env/bin/activate
    
  2. Installez les dépendances du package (en utilisant APT) :

    apt -y update
    apt install -y vim
    apt install -y neofetch
    
  3. Installez les dépendances python :

    pip3 install transformers
    pip3 install psutil
    pip3 install gputil
    pip3 install tabulate
    pip3 install sentencepiece
    pip3 install protobuf
    
  4. Installez Pytorch

    # installer la version stable de pytorch, pour linux, utilisant CUDA 12.1 :
    pip3 install torch torchvision torchaudio
    
  5. Installez LLM-VM :

    pip install llm-vm
    
  6. (optionnel) Si vous utilisez des modèles comme LLAMA, vous aurez besoin d’un jeton d’accès HuggingFace. Configurez votre jeton d’accès ICI puis enregistrez votre jeton dans votre console en exécutant la commande suivante :

    huggingface-cli login
    

Comment Exécuter

  1. Complétez les étapes énumérées dans la section Configuration.

  2. Pour configurer votre ensemble, vous devez créer un fichier json avec les paramètres suivants (voici un exemple) :

    • REMARQUE : tous les frameworks ne prennent pas en charge les mêmes paramètres
    {
      "model": "bigscience/bloom-560m",   # le chemin/repo du modèle sur HuggingFace (https://huggingface.co/models)
      "prompt": "Bonjour le monde !",      # le prompt que vous souhaitez entrer dans le modèle LLM
      "device": "cuda:0",                  # le dispositif sur lequel vous souhaitez exécuter le modèle LLM (GPU/CPU)
      "max_length": 50,                    # la longueur maximale des tokens générés
      "temperature": 0.9,                  # valeur de température pour le modèle LLM
      "top_k": 50,                         # valeur top-k pour le modèle LLM
      "top_p": 0.9,                        # valeur top-p pour le modèle LLM
      "num_return_sequences": 1,           # le nombre d'instances exécutées indépendamment du modèle
      "time_delay": 0,                     # le délai (secondes) que le collecteur de métriques attendra par itération
      "model_start_pause": 1,              # le temps (secondes) que le test attendra AVANT d'exécuter le modèle LLM
      "model_end_pause": 1                 # le temps (secondes) que le test attendra APRÈS que le modèle LLM ait fini de s'exécuter,
      "framework": "llm-vm"                # le nom du framework/bibliothèque que vous souhaitez utiliser pour exécuter le modèle
    }
    
  3. En utilisant le chemin vers le fichier de configuration que vous avez créé à l’étape précédente, exécutez ce qui suit pour démarrer l’évaluation (choisissez une option) :

    # exécuter une évaluation
    python3 run.py --config ./configs/llmvm_test.json
    
    # exécuter plus d'une évaluation (dans ce cas 3)
    python3 run.py --config ./configs/llmvm_test.json --loops 3
    
  4. Après que l’évaluation soit terminée, consultez les résultats finaux dans un fichier qui devrait ressembler à ceci :

    report_2023-11-25_05:55:04.207515_utc_1ffc4fa7-3aa9-4878-b874-1ff445e1ff8a.json
    

Configuration de RunPod :

  1. Configurez RunPod, configurez votre certificat/clé ssh, et faites fonctionner un pod. Vous pouvez accéder à votre/vos pod(s) sur la page de console de RunPod.

  2. Cliquez sur le bouton “Connecter” pour obtenir les informations de connexion ssh. Ces informations devraient ressembler à ceci :

    ssh root&12.345.678.90 -p 12345 -i ~/.ssh/id_example
    
    • Cette commande sera formatée comme ceci :

      ssh <user>@<ip-address> -p <port> -i <local-path-to-ssh-cert>
      
  3. En utilisant la commande à l’étape #2, vous devriez être en mesure de vous connecter en ssh au pod et d’utiliser le GPU que vous avez sélectionné dans ce pod RunPod.

  4. Si vous souhaitez copier un fichier du pod vers votre machine locale, vous exécuteriez la commande dans ce format (cela fait référence aux variables montrées à l’étape #2) :

    scp -P <port> -i <local-path-to-ssh-cert> <user>@<ip-address>:<path-to-file-in-pod> <path-to-local-directory>
    
    • Voici un exemple d’une telle commande :

      scp -P 12345 -i ~/.ssh/id_example <user>@<ip-address>:/root/test.txt /home/user1/Downloads/
      
  5. Après avoir terminé avec le pod, éteignez-le ou mettez-le en pause. Mais attention, si vous le mettez en pause, vous serez toujours facturé, juste beaucoup moins.

Excellentes Sources :