Ejecución de la inferencia por lotes con Ray en AKS

En este artículo, enviarás un RayJob que ejecuta la inferencia por lotes de vLLM sin conexión utilizando el adaptador LoRA generado por el ejemplo de entrenamiento de LLM. El trabajo lee la partición de prueba de Viggo y el adaptador LoRA desde Azure Blob Storage, genera predicciones en una única GPU y sube los resultados.

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 inferencia por lotes 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/batch-inference
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 la inferencia por lotes RayJob:

./submit.sh

El script crea un ConfigMap a partir del script de inferencia, procesa la plantilla del manifiesto mediante envsubst y la aplica. Kueue admite el trabajo cuando hay 1 GPU disponible 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 batch-inference)

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
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

Consulta los registros del trabajador:

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

Comprobación de los resultados

Enumeración de archivos de predicción en Blob Storage:

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

Resultado esperado:

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

Descargue e inspeccione las predicciones:

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

Resultado esperado:

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

Referencia de configuración

Variable Predeterminado Description
AZURE_STORAGE_ACCOUNT_NAME (obligatorio) Cuenta de almacenamiento del módulo 1
JOB_NAME batch-inference-<timestamp> Nombre único de RayJob
QUEUE_NAME default Nombre de la cola local de Kueue
LLM_DATA_CONTAINER llm-pipeline Contenedor de blobs con datos de prueba de viggo
LLM_LORA_CONTAINER llm-pipeline Contenedor de blobs con adaptadores de LoRA
CONFIGMAP_NAME batch-inference-scripts Nombre del objeto ConfigMap que contiene el script de inferencia

Limpieza de recursos

Elimine RayJob y su ConfigMap:

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

Para anular toda la infraestructura, consulte Implementación de la infraestructura: limpieza de recursos.

Pasos siguientes