Remarques :
- Ce tutoriel nécessite un accès à Oracle Cloud. Pour vous inscrire à un compte gratuit, reportez-vous à Introduction à Oracle Cloud Infrastructure Free Tier.
- Il utilise des exemples de valeurs pour les informations d'identification, la location et les compartiments Oracle Cloud Infrastructure. Lorsque vous terminez votre atelier, remplacez ces valeurs par celles propres à votre environnement cloud.
Configurer un système simple d'analyse comparative d'inférences de LLM avec vLLM sur Oracle Cloud Infrastructure Compute
Introduction
Comprendre les caractéristiques de performance d'un système vous permet de faire des choix éclairés sur ses composants et à quoi vous attendre d'eux. Dans ce tutoriel, nous allons mettre en place un système complet d'analyse comparative pour l'inférence du grand modèle de langage (LLM) de l'IA. Vous pouvez ainsi exécuter différentes expériences, de l'évaluation de l'adéquation d'une forme Oracle Cloud Infrastructure (OCI) Compute particulière pour le LLM et des exigences en matière de performances à la comparaison de différents LLM entre eux.
Dans ce tutoriel, nous utilisons le serveur d'inférence open source populaire vLLM, qui prend en charge de nombreux LLM de pointe et offre des optimisations de performances cruciales pour servir efficacement ces modèles et est capable de gérer des milliers de demandes simultanées. En outre, nous utilisons Ray LLMPerf pour exécuter les tests d'évaluation.
Remarque : ce tutoriel suppose que vous disposez d'une location OCI avec un quota de GPU. Pour plus d'informations sur les quotas, reportez-vous à Quotas de Compute.
Objectifs
-
Provisionnez des instances de GPU OCI Compute.
-
Installez les prérequis de pile AI standard.
-
Configurez vLLM et LLMPerf.
-
Exécuter le test d'évaluation des performances d'inférence LLM.
Prérequis
-
Accès à une location OCI.
-
Accès aux formes avec des GPU NVIDIA tels que des GPU A10. Par exemple,
VM.GPU.A10.1
. Pour plus d'informations sur les demandes d'augmentation de la limite, reportez-vous à Limites de service. -
Un compte Face Hugging avec un jeton d'accès configuré et l'autorisation de télécharger le modèle Llama-3.2-3B-Instruct.
Tâche 1 : configuration du réseau
Dans cette tâche, configurez votre réseau cloud virtuel (VCN) pour fournir une configuration fonctionnelle et sécurisée afin d'exécuter vos tests d'évaluation. Dans cet exemple, nous avons besoin d'un VCN avec un sous-réseau public et un sous-réseau privé. Vous pouvez utiliser l'assistant de configuration de VCN ou configurer manuellement tous les composants, en vous assurant que les listes de sécurité autorisent l'accès SSH et qu'une passerelle NAT est affectée au sous-réseau privé.
Avant de provisionner des instances OCI Compute et de poursuivre la configuration du test d'évaluation, il est important de vous assurer que vos paramètres réseau sont correctement configurés. Par défaut, le réseau provisionné autorise uniquement le trafic essentiel entre les sous-réseaux. Pour autoriser le trafic réseau requis pour l'analyse comparative, vous devez ajuster ces paramètres afin de permettre le trafic HTTP entre les sous-réseaux publics et privés. Plus précisément, ajoutez une règle entrante à la liste de sécurité du sous-réseau privé qui autorise le trafic du bloc CIDR VCN vers le port de destination 8000.
Tâche 2 : provisionnement des instances OCI Compute
Dans cette tâche, provisionnez deux instances OCI Compute pour notre configuration de test d'évaluation. L'une étant une instance de machine virtuelle (VM) à CPU uniquement qui agit en tant que bastion et machine client de référence, l'autre étant l'instance équipée de GPU testée.
-
Provisionnez une instance
VM.Flex.E5
avec huit OCPU et Oracle Linux 8. Le client bastion/benchmark ne nécessite pas de GPU car il envoie uniquement des demandes au modèle hébergé sur une machine distincte, d'où le choix d'une forme de CPU. Veillez à sélectionner le sous-réseau public dans les paramètres réseau et n'oubliez pas de télécharger votre clé publique SSH (ou téléchargez la clé privée fournie si vous le souhaitez). -
Provisionnez une instance
VM.GPU.A10.1
. Pour rationaliser la configuration, provisionnez l'instance à l'aide d'une image Oracle Linux 8 qui inclut les pilotes NVIDIA et la structure CUDA. Commencez par sélectionner la forme souhaitée, puis revenez au menu de sélection d'images et choisissez la variante Oracle Linux 8 avec prise en charge de GPU intégrée. Cette instance doit être provisionnée dans le sous-réseau privé, ce qui signifie qu'elle est accessible uniquement à l'aide de l'hôte de bastion. Veillez également à configurer la clé SSH.
Tâche 3 : configuration du client de référence
Dans cette tâche, nous allons installer tous les composants requis pour nos tests de performances et configurer l'hôte GPU.
-
Connectez-vous au bastion avec votre clé SSH et configurez toutes les exigences pour
LLMPerf
à l'aide de la commande suivante.sudo dnf install epel-release -y sudo yum-config-manager --enable ol8_baseos_latest ol8_appstream ol8_addons ol8_developer_EPEL sudo dnf install git python3.11 python3.11-devel python3.11-pip -y
-
Clonez le référentiel Ray LLMPerf, configurez un fichier
venv
Python et installez LLMPerf à l'aide de la commande suivante.git clone https://github.com/ray-project/llmperf.git cd llmperf mkdir venv && python3.11 -mvenv venv && source venv/bin/activate
-
Avant d'installer LLMPerf (et ses dépendances Python), modifiez le fichier
pyproject.toml
et enlevez la clause d'exigence Python. La clause limite inutilement la version Python à une valeur inférieure à3.11
.diff --git a/pyproject.toml b/pyproject.toml index 7687fb2..521a2a7 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -8,7 +8,6 @@ version = "0.1.0" description = "A framework for load testing LLM APIs" authors = [{name="Avnish Narayan", email="avnish@anyscale.com"}] license = {text= "Apache-2.0"} -requires-python = ">=3.8, <3.11" dependencies = ["pydantic<2.5", "ray", "pytest>=6.0",
-
Exécutez la commande
pip install -e
pour finaliser la configuration.
Tâche 4 : configuration de la cible de référence
Dans cette tâche, nous allons configurer la cible de référence elle-même. Comme nous avons déjà provisionné le nœud avec les pilotes nécessaires et la structure Compute Unified Device Architecture (CUDA), nous devons simplement installer vLLM et ses dépendances python et déployer le modèle que nous souhaitons évaluer.
Remarque : l'instance de calcul de GPU provisionnée réside dans un sous-réseau privé. Pour y accéder, vous devez d'abord vous connecter à l'hôte de bastion et configurer la clé SSH privée que vous avez choisie pour la cible de test d'évaluation. Ce n'est qu'alors que vous pourrez vous connecter à la cible de test d'évaluation à l'aide de son adresse IP privée.
-
Installez les packages nécessaires, comme la configuration initiale sur l'hôte de bastion. En outre, mettez à jour le pare-feu de l'hôte pour autoriser le trafic entrant sur le port
8000
à l'aide de la commande suivante.sudo dnf install epel-release -y sudo yum-config-manager --enable ol8_baseos_latest ol8_appstream ol8_addons ol8_developer_EPEL sudo dnf install git python3.11 python3.11-devel python3.11-pip -y sudo firewall-cmd --permanent --zone=public --add-port=8000/tcp sudo firewall-cmd --reload
-
Exécutez la commande suivante pour installer vLLM et ses conditions requises.
mkdir venv python3.11 -mvenv venv && source venv/bin/activate pip install -U pip "bitsandbytes>=0.44.0" vllm gpustat mistral_common
-
Nous sommes prêts à démarrer vLLM avec le modèle que nous aimerions tester.
export HF_TOKEN=<your huggingface token> export MODEL="meta-llama/Llama-3.2-3B-Instruct" ulimit -Sn 65536 # increase limits to avoid running out of files that can be opened vllm serve $MODEL --tokenizer-mode auto --config-format hf --load-format auto \ --enforce-eager --max-model-len 65536
Remarque : nous devons réduire la longueur du contexte de modèle pour l'adapter à la mémoire GPU A10. Nous réduisons la longueur du contexte de la taille par défaut des jetons 128k aux jetons 64k. Après le chargement, le modèle vLLM doit commencer à produire ses statistiques d'inférence à intervalles réguliers.
INFO 12-09 15:46:36 metrics.py:449] Avg prompt throughput: 0.0 tokens/s, Avg generation throughput: 0.0 tokens/s, Running: 0 reqs, Swapped: 0 reqs, Pending: 0 reqs, GPU KV cache usage: 0.0%, CPU KV cache usage: 0.0%.
-
Nous laissons le serveur continuer à fonctionner en arrière-plan pendant que nous passons à un autre terminal où nous allons maintenant tester et évaluer notre configuration. Un test simple peut être exécuté avec
curl
comme suit.export HOST="<the ip address of the benchmark machine" export MODEL="meta-llama/Llama-3.2-3B-Instruct" curl --location "http://${HOST}:8000/v1/chat/completions" --header 'Content-Type: application/json' --header 'Authorization: Bearer token' --data '{ "model": "'"$MODEL"'", "messages": [ { "role": "user", "content": "What is the question to the answer to the ultimate question of life, the universe, and everything. You may give a humorous response." } ] }' -s | jq
La sortie est la suivante :
{ "id": "chatcmpl-f11306f943604d41bad84be1dadd9da6", "object": "chat.completion", "created": 1733997638, "model": "meta-llama/Llama-3.2-3B-Instruct", "choices": [ { "index": 0, "message": { "role": "assistant", "content": "You want to know the ultimate question to the answer of 42?\n\nWell, after years of intense research and contemplation, I've discovered that the answer is actually a giant, cosmic joke. The question is: \"What's for lunch?\"", "tool_calls": [] }, "logprobs": null, "finish_reason": "stop", "stop_reason": null } ], "usage": { "prompt_tokens": 62, "total_tokens": 112, "completion_tokens": 50, "prompt_tokens_details": null }, "prompt_logprobs": null }
Tâche 5 : exécuter le test d'évaluation
Maintenant, nous sommes prêts à exécuter notre benchmark. Compte tenu d'un scénario d'application particulier avec un modèle de langage volumineux choisi, nous aimerions comprendre sur le système cible quelles sont les caractéristiques de performances de l'exécution de demandes d'inférence simultanées.
Etudions le scénario suivant :
PARAMETER | VALEUR |
---|---|
MODÈLE | Instruction Meta LLaMa 3.2 3B |
CAS D'EMPLOI | discussion |
JETONS D'ENTRÉE | N(200, 40) |
JETONS DE SORTIE | N(100, 10) |
DEMANDES SIMULTANÉES | 1 - 32 |
-
Créez le script suivant nommé
llm_benchmark.sh
sur le client de test d'évaluation (hôte de bastion) dans le répertoire de base.#!/usr/bin/env bash set -xe # Use vLLM OpenAPI endpoint export OPENAI_API_BASE="http://<benchmark host>:8000/v1" # API key is not in use, but needs to be set for llmbench export OPENAI_API_KEY="none" model="meta-llama/Llama-3.2-3B-Instruct" modelname="${model##*/}" mkdir "$modelname" concurrent_requests=(1 2 4 8 16 32) pushd llmperf source venv/bin/activate for cr in "${concurrent_requests[@]}" do python3 token_benchmark_ray.py --model $model \ --mean-input-tokens 200 --stddev-input-tokens 40 \ --mean-output-tokens 100 --stddev-output-tokens 10 \ --max-num-completed-requests $((cr * 100)) --num-concurrent-requests $cr \ --metadata "use_case=chatbot" \ --timeout 1800 --results-dir "../$modelname/result_outputs_chat_creq_$cr" --llm-api openai done popd
Ce script vous permettra d'exécuter automatiquement une série de tests de performances avec llmperf avec un nombre croissant de demandes simultanées (à partir de 1 et en doublant successivement jusqu'à 32). Comme vous pouvez le voir à partir des arguments transmis au script
token_benchmark_ray.py
, nous définissons les entrées et sorties de jeton telles que définies dans le tableau ci-dessus. -
Exécutez votre script de test d'évaluation à l'aide de la commande suivante.
bash -x llm_benchmark.sh
Une fois que vous avez terminé, vous trouverez un nouveau répertoire appelé Llama-3.2-3B-Instruct
dans votre répertoire de base, où tous les résultats de l'expérience seront stockés au format JSON, que vous pouvez télécharger et post-traiter à l'aide de votre outil d'analyse de données préféré.
Remarque : Une façon simple de transformer vos tests d'évaluation en tracé est d'extraire les chiffres qui vous intéressent le plus à l'aide d'un petit script shell et de
jq
au format.csv
, qui peut facilement être copié-collé dans Excel.echo "concurrent_requests,token_throughput" for i in *; do cat $i/*_summary.json | jq -r '[.num_concurrent_requests, .results_request_output_throughput_token_per_s_mean] | join(",")' done;
Remerciements
- Auteur - Omar Awile (Spécialiste de la solution GPU, équipe de spécialistes GPU Oracle EMEA)
Ressources de formation supplémentaires
Explorez d'autres ateliers sur docs.oracle.com/learn ou accédez à d'autres contenus de formation gratuits sur le canal Oracle Learning YouTube. De plus, visitez le site education.oracle.com/learning-explorer pour devenir un explorateur Oracle Learning.
Pour obtenir la documentation produit, consultez le site Oracle Help Center.
Set up a Simple LLM Inference Benchmarking System with vLLM on Oracle Cloud Infrastructure Compute
G27539-01
February 2025
Copyright ©2025, Oracle and/or its affiliates.