Entraîner un LLM avec Ray sur AKS

Dans cet article, vous soumettez un RayJob qui affine Qwen2.5-7B-Instruct sur le jeu de données Viggo NLG à l’aide de LLaMA-Factory et de Ray Train en mode distribué. La tâche utilise quatre processus de travail avec un GPU chacun, lit les données d’apprentissage depuis Stockage Blob Azure et téléverse l’adaptateur LoRA entraîné pour les inférences en aval.

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’apprentissage LLM 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/llm-training
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

Soumettez le RayJob d’entraînement distribué :

./submit.sh

Le script crée un ConfigMap à partir du script d’entraînement, affiche le modèle de manifeste avec quatre workers GPU via envsubst, et l’applique. Kueue autorise l’exécution du job lorsque quatre GPU sont disponibles 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

Recherchez 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 llm-training)

Surveillez le statut du 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
llm-training-xxxxxxxxxx   SUCCEEDED    Complete            2026-01-01T00:00:00Z   2026-01-01T00:19:00Z   19m
NAME                                   QUEUE     RESERVED IN     ADMITTED   FINISHED   AGE
rayjob-llm-training-xxxxxxxxxx-xxxxx   default   cluster-queue   True       True       19m

Suivez les journaux du pod principal :

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

Vérifier les résultats

Vérifiez le chargement de l’adaptateur LoRA :

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

Sortie attendue :

Name                                       Blob Type    Blob Tier    Length    Content Type
-----------------------------------------  -----------  -----------  --------  ------------------------
lora/latest.txt                            BlockBlob    Hot          86        application/octet-stream
lora/<job-name>/rng_state_3.pth            BlockBlob    Hot          14725     application/octet-stream

Vérifiez que le latest.txt pointeur a été écrit (utilisé par l’exemple d’inférence par lot pour la découverte automatique) :

az storage blob download -c llm-pipeline -n lora/latest.txt \
  --account-name ${AZURE_STORAGE_ACCOUNT_NAME} --auth-mode login

Sortie attendue :

azure://llm-pipeline@<storage-account>.blob.core.windows.net/lora/<job-name>

Référence de configuration

Variable Default Description
AZURE_STORAGE_ACCOUNT_NAME (obligatoire) Compte de stockage à partir du module 1
NUM_WORKERS 4 Réplicas de workers GPU (4 x 1 GPU chacun)
QUEUE_NAME default Nom de Kueue LocalQueue
LLM_DATA_CONTAINER llm-pipeline Conteneur BLOB pour les données d’entrée
LLM_LORA_CONTAINER llm-pipeline Conteneur Blob pour le téléversement de LoRA
CONFIGMAP_NAME llm-training-scripts Nom de ConfigMap contenant le script d’entraînement

Nettoyer les ressources

Supprimez RayJob et son ConfigMap :

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

Étapes suivantes