Träna en LLM med Ray på AKS

I den här artikeln skickar du in ett RayJob som finjusterar Qwen2.5-7B-Instruct med viggo-NLG-datamängden med LLaMA-Factory och distribuerad Ray Train. Jobbet använder fyra arbetare med en GPU vardera, läser träningsdata från Azure Blob Storage och laddar upp den tränade LoRA-adaptern för efterföljande inferens.

Important

Programvara med öppen källkod nämns i hela AKS-dokumentationen och exemplen. Programvaran som du distribuerar är undantagen från AKS-servicenivåavtal, begränsad garanti och Azure-support. När du använder open-source-teknik tillsammans med AKS, konsultera de supportalternativ som finns tillgängliga från respektive gemenskaper och projektunderhållare för att utveckla en plan.

Microsoft tar ansvar för att skapa de paket med öppen källkod som vi distribuerar på AKS. Det ansvaret omfattar att ha fullständigt ägarskap för bygg-, genomsöknings-, signerings-, validerings- och snabbkorrigeringsprocessen, tillsammans med kontroll över binärfilerna i containeravbildningar. Mer information finns i Sårbarhetshantering för AKS - och AKS-stödtäckning.

Prerequisites

Ange miljövariabler

Gå till LLM-träningsexemplet på den klonade lagringsplatsen och konfigurera de miljövariabler som krävs:

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

Anmärkning

Om du har konfigurerat teamköer (alternativ B) anger du export QUEUE_NAME=team-a eller export QUEUE_NAME=team-b innan du kör source env.example. Standardinställningen QUEUE_NAME=default fungerar bara med konfigurationen med en kö (alternativ A).

Skicka arbetsbelastningen

Skicka in den distribuerade utbildningen RayJob:

./submit.sh

Skriptet skapar en ConfigMap från träningsskriptet, renderar manifestmallen med fyra GPU-arbetare via envsubstoch tillämpar den. Kueue medger jobbet när fyra GPU:er är tillgängliga i den konfigurerade kön.

Tip

Kör ./submit.sh --dry-run för att verifiera det renderade manifestet utan att tillämpa det på klustret.

Övervaka förloppet

Hitta och exportera jobbnamnet om du är i ett nytt gränssnitt:

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

Titta på RayJob-status och Kueue-antagning:

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

Förväntade utdata när jobbet är klart:

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

Följ head-poddens loggar:

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

Verifiera resultat

Kontrollera Uppladdningen av LoRA-adaptern:

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

Förväntat resultat:

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

Kontrollera att pekaren latest.txt skrevs (används av exemplet för batchinferens för automatisk upptäckt):

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

Förväntat resultat:

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

Konfigurationsreferens

Variabel Standardinställning Description
AZURE_STORAGE_ACCOUNT_NAME (krävs) Lagringskonto från modul 1
NUM_WORKERS 4 GPU-arbetsrepliker (4 x 1 GPU vardera)
QUEUE_NAME default Namn på Kueue LocalQueue
LLM_DATA_CONTAINER llm-pipeline Blobcontainer för indata
LLM_LORA_CONTAINER llm-pipeline Blobcontainer för LoRA-uppladdning
CONFIGMAP_NAME llm-training-scripts Namn på ConfigMap som innehåller träningsskriptet

Rensa resurser

Ta bort RayJob och dess ConfigMap:

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

Nästa steg