View a markdown version of this page

Exécuter une inférence LLM par lots avec vLLM - Deadline Cloud

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

Exécuter une inférence LLM par lots avec vLLM

Ce didacticiel explique comment exécuter l'inférence LLM (Large Language Model) à haut débit sur un fichier JSONL contenant des invites à l'aide du moteur d'inférence vLLM activé. GitHub Vous soumettez le bundle de tâches d'inférence par lots vLLM GitHub avec un fichier dans lequel chaque ligne correspond à une seule invite, vous choisissez un modèle et la tâche se répartit sur un parc de GPU. Chaque invite reçoit une réponse LLM, et une étape globale regroupe le tout dans un fichier JSONL plus une visionneuse HTML autonome que vous pouvez ouvrir dans n'importe quel navigateur.

Le bundle gère des charges de travail hors ligne et étonnamment parallèles : génération de contenu, ensembles de données d'évaluation, traduction, extraction et classification. Il s'adapte partout où vous avez besoin d'un modèle pour répondre à de nombreuses demandes indépendantes sans serveur API actif. Sous le capot, il utilise la fonction de découpage des tâches de Deadline Cloud pour regrouper les invites en tâches groupées, ce qui vous permet de comparer le parallélisme et les frais de planification à l'aide d'un seul paramètre. ChunkSize Pour de plus amples informations, veuillez consulter Découpage des tâches pour les modèles de tâches.

Le chargement d'un 7 B-parameter LLM prend 30 secondes ou plus, donc payer ce coût par tâche dominerait l'exécution par lots. Les environnements d'étape Open Job Description résolvent ce problème : le serveur vLLM démarre lorsqu'un collaborateur prend la tâche et reste chargé sur chaque tâche exécutée par le travailleur, puis s'arrête avec la session. Un lot de 24 heures sur une flotte de 4 employés permet de payer 4 chargements de modèles au lieu de 24.

Durée estimée : 30 à 60 minutes, configuration de la ferme comprise.

L'exécution de ce didacticiel entraîne des frais pour les instances de travail GPU qui traitent la tâche.

Présentation de

Pour terminer ce didacticiel, procédez comme suit :

  1. Configurez votre ferme.

  2. Préparez le fichier d'entrée.

  3. Soumettez la tâche d'inférence par lots.

  4. Téléchargez et visualisez les résultats.

  5. nettoyer les ressources.

Configurez votre ferme

Le moyen le plus rapide d'obtenir une batterie de serveurs compatible est de déployer le CloudFormation modèle de parc CUDA sur GitHub. Une fois la pile atteinteCREATE_COMPLETE, configurez la CLI Deadline Cloud pour utiliser la nouvelle batterie de serveurs :

deadline config set defaults.farm_id FarmId-from-stack-outputs deadline config set defaults.queue_id CUDAQueueId-from-stack-outputs

Si vous possédez déjà une ferme, vous avez besoin d'une flotte gérée par les services avec des GPU NVIDIA et au moins 32 Go de RAM, ainsi que d'une file d'attente avec un environnement de file d'attente conda qui lit CondaPackages les paramètres et les tâches. CondaChannels

Préparez le fichier d'entrée

L'entrée est un fichier JSONL avec un objet JSON par ligne. Chaque ligne doit comporter un prompt champ :

{"prompt": "What is photosynthesis?", "id": "001"} {"prompt": "Write a haiku about clouds.", "id": "002"} {"prompt": "Explain gravity to a 5 year old.", "id": "003", "max_tokens": 256, "temperature": 0.9}

Les champs facultatifs par invite permettent notamment id de suivre, max_tokens de limiter la longueur de réponse et de contrôler le caractère aléatoire de temperature l'échantillonnage. Per-promptles champs remplacent les valeurs par défaut au niveau de la tâche pour cette ligne uniquement, et tous les champs supplémentaires sont transmis inchangés à la sortie.

Le bundle inclut un outil HTML sans dépendance pour créer des fichiers d'entrée. Ouvrez tools/prompt_builder.html dans votre navigateur pour ajouter des invites, définir des options par invite et exporter au format JSONL.

Soumettre la tâche d'inférence par lots

Pour soumettre à l'aide de l'expéditeur de l'interface graphique
  1. Dans le répertoire du vllm_batch bundle, ouvrez l'émetteur :

    deadline bundle gui-submit .
  2. Choisissez votre fichier JSONL d'entrée.

  3. Définissez la plage d'invites (par exemple, 1-10 pour les 10 premières invites du fichier).

  4. Définissez la taille du bloc, c'est-à-dire le nombre d'invites traitées par chaque tâche (par défaut5).

  5. Choisissez un répertoire de sortie, puis choisissez Soumettre.

Vous pouvez également soumettre via l'interface de ligne de commande :

deadline bundle submit . \ --parameter InputFile=prompts.jsonl \ --parameter Prompts=1-10 \ --parameter ChunkSize=5 \ --parameter OutputDir=$PWD/results

Le ModelName paramètre est défini par défaut sur n'importe quel identifiant de modèle Hugging Face Qwen/Qwen2.5-7B-Instruct et l'accepte. Le Prompts paramètre accepte la syntaxe complète de la plage d'entiers Open Job Description, par exemple 2,5,8-9 pour des lignes spécifiques ou 4,7 pour réexécuter uniquement les lignes ayant échoué. Plutôt que de fixer la taille du bloc, vous pouvez également laisser Deadline Cloud le régler automatiquement : définissez TargetRuntimeSeconds la durée que vous souhaitez que chaque bloc prenne (120 secondes par défaut), et le planificateur augmente ou réduit la taille du segment pour les tâches futures pour atteindre l'objectif. Pour la liste complète des paramètres, consultez le tableau des paramètres dans l'exemple de fichier README sur GitHub.

Téléchargez et visualisez les résultats

Pour télécharger et consulter les résultats
  1. Une fois la tâche terminée, téléchargez le résultat :

    deadline job download-output --job-id job-id
  2. Toutes les sorties atterrissent dans un output/ sous-dossier du répertoire que vous avez choisi. Ouvrez results/output/results.html le visualiseur de résultats visuels dans votre navigateur ou lisez results/output/output.jsonl pour obtenir la sortie combinée brute.

Chaque ligne de sortie contient l'invite d'origine et ses champs de transmission, ainsi que la generated_text réponse, la raison de fin et le nombre de jetons :

{"prompt": "What is photosynthesis?", "id": "001", "generated_text": "Photosynthesis is...", "finish_reason": "stop", "prompt_tokens": 7, "completion_tokens": 42}

Enchaînez la sortie dans la génération d'images par lots

Le output.jsonl fichier est une entrée prête à l'emploi pour le bundle de synthèse texte-image. Générez du texte avec ce bundle (slogans, légendes, descriptions de scènes), puis soumettez le fichier de sortie au bundle de génération d'images, qui utilise automatiquement chaque ligne generated_text comme légende composée sur l'image générée. Pour la procédure pas à pas complète, voirGénérez des images par lots à l'aide d'un modèle de diffusion.

Nettoyage

Pour éviter des frais récurrents, nettoyez les ressources que vous avez créées pour ce didacticiel :

Pour nettoyer les ressources du didacticiel
  1. Si vous avez déployé le CloudFormation modèle de batterie de serveurs CUDA, supprimez la CloudFormation pile de la CloudFormation console.

  2. Si vous avez utilisé un parc de serveurs existant et créé un parc de GPU spécialement pour ce didacticiel, arrêtez ou supprimez ce parc. Si vous avez utilisé une flotte partagée préexistante, laissez-la en place.

  3. Supprimez les fichiers de sortie locaux si vous n'en avez plus besoin.

Les ressources suivantes fournissent des informations supplémentaires :