Exécuter l’inférence par lot avec Ray sur AKS

Dans cet article, vous soumettez un RayJob qui exécute une inférence par lots hors ligne avec vLLM à l’aide de l’adaptateur LoRA généré par l’exemple d’entraînement LLM. La tâche lit le fractionnement de test viggo et l’adaptateur LoRA à partir du Stockage Blob Azure, génère des prédictions sur un seul GPU et charge les résultats.

Important

Les logiciels open source sont mentionnés dans la documentation et les exemples AKS. Les logiciels que vous déployez sont exclus des contrats de niveau de service AKS, de la garantie limitée et du support Azure. Quand vous utilisez une technologie open source avec AKS, consultez les options de support disponibles auprès des communautés et responsables de projet respectifs pour élaborer un plan.

Microsoft assume la responsabilité de la génération des packages open source que nous déployons sur AKS. Cette responsabilité comprend la maîtrise complète des processus de génération, d’analyse, de signature et de validation ainsi que l’application de correctifs logiciels et le contrôle des fichiers binaires présents dans les images conteneur. Pour plus d’informations, consultez Gestion des vulnérabilités pour AKS et Couverture du support AKS.

Prérequis

Définir des variables d’environnement

Accédez à l’exemple d’inférence par lots dans le référentiel cloné et configurez les variables d’environnement requises :

cd <path-to-cloned-repo>/AKS/examples/kueue-and-ray-on-aks/3-workloads/batch-inference
export AZURE_STORAGE_ACCOUNT_NAME=$(terraform -chdir=../../1-infrastructure/terraform output -raw storage_account_name)
source env.example

Remarque

Si vous avez configuré des files d’attente d’équipe (option B), définissez export QUEUE_NAME=team-a ou export QUEUE_NAME=team-b avant l’exécution source env.example. La valeur par défaut QUEUE_NAME=default fonctionne uniquement avec la configuration à file d’attente unique (option A).

Soumettre la charge de travail

Envoyez l’inférence de lot RayJob :

./submit.sh

Le script crée un ConfigMap à partir du script d’inférence, affiche le modèle de manifeste via envsubst, et l’applique. Kueue accepte la tâche lorsqu’un GPU est disponible dans la file d’attente configurée.

Tip

Exécutez ./submit.sh --dry-run pour valider le manifeste rendu sans l’appliquer au cluster.

Surveiller la progression

Trouvez et exportez le nom de la tâche si vous êtes dans un nouveau shell :

export JOB_NAME=$(kubectl -n ray get rayjob --no-headers -o custom-columns=":metadata.name" | grep batch-inference)

Surveillez l’état de RayJob et l’admission de Kueue :

kubectl -n ray get rayjob ${JOB_NAME} -w
kubectl -n ray get workload -w

Sortie attendue lorsque le travail se termine :

NAME                         JOB STATUS   DEPLOYMENT STATUS   START TIME             END TIME               AGE
batch-inference-xxxxxxxxxx   SUCCEEDED    Complete            2026-01-01T00:00:00Z   2026-01-01T00:09:00Z   9m
NAME                                      QUEUE     RESERVED IN     ADMITTED   FINISHED   AGE
rayjob-batch-inference-xxxxxxxxxx-xxxxx   default   cluster-queue   True       True       9m

Suivez les journaux du worker :

kubectl -n ray logs -l ray.io/cluster=$(kubectl -n ray get rayjob ${JOB_NAME} -o jsonpath='{.status.rayClusterName}') -f --tail=100

Vérifier les résultats

Lister les fichiers de prédiction dans le stockage Blob :

az storage blob list -c llm-pipeline --prefix "inference/${JOB_NAME}/" \
  --account-name ${AZURE_STORAGE_ACCOUNT_NAME} --auth-mode login -o table

Sortie attendue :

Name                                                 Blob Type    Blob Tier    Length    Content Type
---------------------------------------------------  -----------  -----------  --------  ------------------------
inference/<job-name>/metrics.json                    BlockBlob    Hot          128       application/octet-stream
inference/<job-name>/predictions.jsonl               BlockBlob    Hot          411777    application/octet-stream

Téléchargez et inspectez les prédictions :

az storage blob download -c llm-pipeline \
  -n "inference/${JOB_NAME}/predictions.jsonl" \
  --account-name ${AZURE_STORAGE_ACCOUNT_NAME} --auth-mode login \
  --file /tmp/predictions.jsonl
head -1 /tmp/predictions.jsonl | python3 -m json.tool

Sortie attendue :

{
    "input": "I'm wondering, have you played any games you found genuinely shocking?",
    "expected": "request(specifier[shocking])",
    "generated": "request_explanation"
}

Référence de configuration

Variable Default Description
AZURE_STORAGE_ACCOUNT_NAME (obligatoire) Compte de stockage à partir du module 1
JOB_NAME batch-inference-<timestamp> Nom unique de RayJob
QUEUE_NAME default Nom de Kueue LocalQueue
LLM_DATA_CONTAINER llm-pipeline Conteneur Blob avec les données de test Viggo
LLM_LORA_CONTAINER llm-pipeline Conteneur Blob avec des adaptateurs LoRA
CONFIGMAP_NAME batch-inference-scripts Nom du configMap contenant le script d’inférence

Nettoyer les ressources

Supprimez RayJob et son ConfigMap :

kubectl -n ray delete rayjob ${JOB_NAME}
kubectl -n ray delete configmap ${CONFIGMAP_NAME}

Pour supprimer toutes les infrastructures, consultez Déployer l’infrastructure : nettoyer les ressources.

Étapes suivantes