Entrenar un LLM con Ray en AKS

En este artículo, se envía un RayJob que ajusta Qwen2.5-7B-Instruct en el conjunto de datos viggo NLG utilizando LLaMA-Factory y el entrenamiento distribuido de Ray. El trabajo utiliza cuatro trabajadores con una GPU cada uno, lee los datos de entrenamiento desde Azure Blob Storage y carga el adaptador LoRA entrenado para la inferencia posterior.

Importante

El software de código abierto se menciona en toda la documentación y ejemplos de AKS. El software que implemente se excluye de los contratos de nivel de servicio de AKS, la garantía limitada y el soporte técnico de Azure. A medida que usa la tecnología de código abierto junto con AKS, consulte las opciones de soporte técnico disponibles en las comunidades y los mantenedores de proyectos respectivos para desarrollar un plan.

Microsoft asume la responsabilidad de crear los paquetes de código abierto que implementamos en AKS. Esa responsabilidad incluye ser plenamente responsable del proceso de compilación, escaneo, firma, validación y corrección rápida, junto con el control de los binarios en las imágenes de contenedor. Para obtener más información, vea Administración de vulnerabilidades para AKS y Cobertura del soporte técnico de AKS.

Prerequisites

Establecimiento de variables de entorno

Vaya al ejemplo de entrenamiento de LLM en el repositorio clonado y configure las variables de entorno necesarias:

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

Note

Si has configurado colas de equipo (Opción B), establece export QUEUE_NAME=team-a o export QUEUE_NAME=team-b antes de ejecutar source env.example. El valor predeterminado QUEUE_NAME=default solo funciona con la configuración de una sola cola (opción A).

Enviar la carga de trabajo

Envíe el entrenamiento distribuido RayJob:

./submit.sh

El script crea un ConfigMap a partir del script de entrenamiento, genera la plantilla de manifiesto con cuatro trabajadores de GPU mediante envsubst y la aplica. Kueue admite el trabajo cuando hay cuatro GPU disponibles en la cola configurada.

Tip

Ejecute ./submit.sh --dry-run para validar el manifiesto representado sin aplicarlo al clúster.

Supervisión de progreso

Busca y exporta el nombre del trabajo si te encuentras en un nuevo shell:

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

Vea el estado de RayJob y la admisión de Kueue:

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

Salida esperada cuando se completa el trabajo:

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

Sigue los registros del 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

Comprobación de los resultados

Compruebe la subida del adaptador LoRA:

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

Resultado esperado:

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

Compruebe que se haya escrito el puntero latest.txt (utilizado por el ejemplo de inferencia por lotes para el autodescubrimiento):

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

Resultado esperado:

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

Referencia de configuración

Variable Predeterminado Description
AZURE_STORAGE_ACCOUNT_NAME (obligatorio) Cuenta de almacenamiento del módulo 1
NUM_WORKERS 4 Réplicas de nodos de trabajo con GPU (4 de 1 GPU cada una)
QUEUE_NAME default Nombre de la cola local de Kueue
LLM_DATA_CONTAINER llm-pipeline Contenedor de blobs para datos de entrada
LLM_LORA_CONTAINER llm-pipeline Contenedor de blobs para cargar LoRA
CONFIGMAP_NAME llm-training-scripts Nombre del objeto ConfigMap que contiene el script de entrenamiento

Limpieza de recursos

Elimine RayJob y su ConfigMap:

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

Pasos siguientes