Benchmark des modèles LLM locaux

Dépot GitHub du projet

Contexte

J’ai construit LLM Speed Benchmark (LLMSB) pendant mon temps en tant que stagiaire ingénieur à temps partiel chez Anarchy (YC W23). LLMSB est un outil de benchmarking permettant d’évaluer les performances 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
  • jetons par seconde
  • spécifications générales du matériel
  • utilisation du CPU (fréquence actuelle et pourcentage d’utilisation des cœurs dans le temps)
  • utilisation de la RAM (RAM et swap au fil du temps)
  • utilisation du GPU (charge, utilisation de la mémoire et température au fil du temps)

ICI se trouve un exemple d’exécution de benchmark pour le modèle codellama-13b-oasst-sft-v10 exécuté sur un H100. Je possède personnellement une Nvidia RTX 2070 Ti, qui dispose de 8 Go de VRAM. Malheureusement, pour la plupart des modèles LLM modernes, 8 Go de VRAM ne suffisent pas pour interfacer un modèle. Pour cette raison, j’ai utilisé RunPod pour « louer » des GPU et exécuter mes benchmarks sur certains modèles.

C’était le contexte/l’histoire d’origine de LLMSB. Comme le projet est open source, vous pouvez consulter le code ICI. Ci-dessous, j’ai inclus le README du dépôt si vous souhaitez le consulter.

À propos

🚧 LLM Speed Benchmark (LLMSB) est actuellement en bêta (v0). Veuillez ne pas l’utiliser en production, ou l’utiliser à vos risques et périls. Nous sommes encore en train de résoudre certains problèmes et d’améliorer les fonctionnalités. Si vous rencontrez des bugs ou avez des suggestions, veuillez les signaler dans ISSUES. Vos retours sont inestimables !

LLM Speed Benchmark (LLMSB) est un outil de benchmarking permettant d’évaluer les performances des modèles LLM sur différentes plateformes matérielles. Son objectif final est de constituer un ensemble de données complet détaillant les performances des modèles LLM sur divers systèmes, afin de permettre aux utilisateurs de choisir plus efficacement le ou les modèles LLM adaptés à leurs projets.

Limites

LLMSB est en v0, donc il a des limites :

  • Conçu uniquement pour fonctionner sur des systèmes d’exploitation basés sur Debian, autrement dit il n’est pas conçu pour fonctionner sur Windows. Cela est dû au fait que LLMSB utilise neofetch et nvidia-smi pour collecter les métriques en arrière-plan et que la logique des chemins de fichiers est basée sur les systèmes d’exploitation Unix.
  • En raison de la manière 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 les modèles. Cela fonctionne pour l’instant, mais l’objectif est que LLMSB prenne en charge plusieurs frameworks, et pas seulement HuggingFace.
  • Actuellement, tous les modèles sont exécutés selon 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 manière 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 à la place les classes spécifiques aux modèles de HuggingFace, comme LlamaTokenizer et LlamaForCausalLM.
  • LLMSB ne collecte que des métriques générales de haut niveau. À l’avenir, nous aimerions collecter des métriques de plus bas niveau. Nous pensons que cela peut en partie être fait à l’aide du wrapper de profilers de Pytorch.

Exemples de sorties

22 novembre 2023

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

Configuration

  1. Créez et activez un environnement Python :

    python3 -m venv env
    source env/bin/activate
    
  2. Installez les dépendances du paquet (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

    # install pytorch stable build, for linux, using CUDA 12.1:
    pip3 install torch torchvision torchaudio
    
  5. Installez LLM-VM :

    pip install llm-vm
    
  6. (facultatif) 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 सूचीé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/le dépôt du modèle sur HuggingFace (https://huggingface.co/models)
      "prompt": "Hello World!",           # l'invite que vous souhaitez saisir dans le modèle LLM
      "device": "cuda:0",                 # l'appareil sur lequel vous souhaitez exécuter le modèle LLM (GPU/CPU)
      "max_length": 50,                   # la longueur maximale des jetons 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 temporel (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/de la 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 le benchmark (choisissez une option) :

    # exécuter un benchmark
    python3 run.py --config ./configs/llmvm_test.json
    
    # exécuter plus d’un benchmark (dans ce cas 3)
    python3 run.py --config ./configs/llmvm_test.json --loops 3
    
  4. Une fois le benchmark terminé, 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 lancez un pod. Vous pouvez accéder à votre ou vos pods sur la page de console de RunPod.

  2. Cliquez sur le bouton « Connect » 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 de l’étape #2, vous devriez pouvoir vous connecter en SSH au pod et 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 utiliseriez une 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. Une fois que vous avez terminé avec le pod, arrêtez-le ou mettez-le en pause. Mais attention, si vous le mettez en pause, vous serez quand même facturé, juste beaucoup moins.

Excellentes sources :