Executar inferência em lote com o Ray no AKS

Neste artigo, você enviará um RayJob que executa inferência em lote offline vLLM usando o adaptador LoRA produzido pelo exemplo de treinamento LLM. O trabalho lê a divisão de teste do Viggo e o adaptador LoRA do Armazenamento de Blobs do Azure, gera previsões em uma única GPU e carrega os resultados.

Importante

O software de código aberto é mencionado em toda a documentação e amostras do AKS. O software que você implanta está excluído dos contratos de nível de serviço do AKS, garantia limitada e suporte do Azure. Ao usar tecnologia de código aberto junto com o AKS, consulte as opções de suporte disponíveis nas comunidades e mantenedores de projetos respectivos para desenvolver um plano.

A Microsoft assume a responsabilidade por criar os pacotes de código aberto que implantamos no AKS. Essa responsabilidade inclui ter propriedade completa do processo de criação, verificação, sinalização, validação e hotfix, junto com o controle sobre os binários em imagens de contêiner. Para obter mais informações, confira Gerenciamento de vulnerabilidades para o AKS e Cobertura de suporte do AKS.

Pré-requisitos

Definir variáveis de ambiente

Navegue até o exemplo de inferência em lote no repositório clonado e configure as variáveis de ambiente necessárias:

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

Observação

Se você configurou filas de equipe (Opção B), defina export QUEUE_NAME=team-a ou export QUEUE_NAME=team-b antes de executar source env.example. O padrão QUEUE_NAME=default só funciona com a configuração de fila única (Opção A).

Enviar a carga de trabalho

Envie o RayJob de inferência em lote:

./submit.sh

O script cria um ConfigMap a partir do script de inferência, renderiza o modelo de manifesto por meio envsubste o aplica. O Kueue aceita o trabalho quando 1 GPU estiver disponível na fila configurada.

Tip

Execute ./submit.sh --dry-run para validar o manifesto renderizado sem aplicá-lo ao cluster.

Monitorar o progresso

Encontre e exporte o nome do trabalho se estiver em um novo shell:

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

Assista ao status do RayJob e à admissão de Kueue:

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

Saída esperada quando o trabalho for concluído:

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

Acompanhe os logs do worker:

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

Verificar os resultados

Listar arquivos de previsão no armazenamento de blobs:

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

Baixe e inspecione as previsões:

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

Referência de configuração

Variable Default Description
AZURE_STORAGE_ACCOUNT_NAME (necessário) Conta de armazenamento do Módulo 1
JOB_NAME batch-inference-<timestamp> Nome exclusivo do RayJob
QUEUE_NAME default Nome de Kueue LocalQueue
LLM_DATA_CONTAINER llm-pipeline Contêiner de blobs com dados de teste do Viggo
LLM_LORA_CONTAINER llm-pipeline Contêiner de blobs com adaptadores LoRA
CONFIGMAP_NAME batch-inference-scripts Nome do ConfigMap que contém o script de inferência

Limpar os recursos

Exclua o RayJob e seu ConfigMap:

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

Para remover toda a infraestrutura, consulte Implantar infraestrutura – Limpar recursos.

Próximas Etapas