Addestrare un LLM con Ray in AKS

In questo articolo si invia un RayJob che ottimizza Qwen2.5-7B-Instruct sul dataset NLG Viggo usando LLaMA-Factory e Ray Train in modalità distribuita. Il processo usa quattro worker con una GPU ciascuno, legge i dati di training da archiviazione BLOB di Azure e carica l'adattatore LoRA addestrato per l'inferenza a valle.

Importante

Il software open source è citato nella documentazione e negli esempi di AKS. Il software che distribuisci è escluso dagli accordi sul livello di servizio di AKS, dalla garanzia limitata e dal supporto Azure. Quando si utilizza una tecnologia open source insieme ad AKS, consulta le opzioni di supporto offerte dalle rispettive community e dai responsabili dei progetti per definire un piano.

Microsoft si assume la responsabilità di creare i pacchetti open source che distribuiamo su AKS. Tale responsabilità comprende la piena responsabilità del processo di compilazione, scansione, firma, convalida e applicazione degli hotfix, oltre al controllo dei file binari nelle immagini container. Per altre informazioni, vedere Gestione delle vulnerabilità per il servizio Azure Kubernetes (AKS) e Copertura del supporto del servizio Azure Kubernetes (AKS).

Prerequisiti

Impostare le variabili di ambiente

Passa all'esempio di addestramento dell'LLM nel repository clonato e configura le variabili di ambiente necessarie:

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

Nota

Se si sono configurate le code di team (opzione B), impostare export QUEUE_NAME=team-a o export QUEUE_NAME=team-b prima di eseguire source env.example. L'impostazione predefinita QUEUE_NAME=default funziona solo con la configurazione a coda singola (opzione A).

Invia il carico di lavoro

Invia il RayJob di addestramento distribuito:

./submit.sh

Lo script crea un oggetto ConfigMap dallo script di training, esegue il rendering del modello manifesto con quattro ruoli di lavoro GPU tramite envsubst e lo applica. Kueue accetta il processo quando sono disponibili quattro GPU nella coda configurata.

Tip

Eseguire ./submit.sh --dry-run per convalidare il manifesto di cui è stato eseguito il rendering senza applicarlo al cluster.

Monitorare lo stato di avanzamento

Trova ed esporta il nome del job se ti trovi in una nuova shell:

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

Monitora lo stato di RayJob e l'ammissione di Kueue:

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

Output previsto al termine del processo:

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

Visualizzare i log del pod head:

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

Verificare i risultati

Controllare il caricamento dell'adapter LoRA:

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

Output previsto:

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

Verifica che il puntatore latest.txt sia stato creato (usato dall'esempio di inferenza in batch per il rilevamento automatico):

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

Output previsto:

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

Informazioni di riferimento sulla configurazione

Variabile Predefinito Description
AZURE_STORAGE_ACCOUNT_NAME (obbligatorio) Account di archiviazione dal modulo 1
NUM_WORKERS 4 Repliche di worker GPU (4 x 1 GPU ciascuna)
QUEUE_NAME default Nome LocalQueue Kueue
LLM_DATA_CONTAINER llm-pipeline Contenitore BLOB per i dati di input
LLM_LORA_CONTAINER llm-pipeline Contenitore blob per il caricamento di LoRA
CONFIGMAP_NAME llm-training-scripts Nome del ConfigMap che contiene lo script di addestramento

Pulire le risorse

Eliminare RayJob e il relativo ConfigMap:

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

Passaggi successivi