Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
In questo articolo viene configurato il controllo di ammissione Kueue per i carichi di lavoro Ray in Servizio Azure Kubernetes (AKS). Kueue regola gli invii dei RayJob: i processo vengono creati con suspend: true e un'etichetta di coda. Kueue li ammette quando la quota è disponibile impostando suspend: false, che attiva l'operatore KubeRay per creare il cluster Ray.
Vengono fornite due configurazioni di coda. Scegliere quello più adatto al caso d'uso:
| Configurazione | Cosa dimostra |
|---|---|
| Coda singola | Una ClusterQueue con backpressure: un carico di lavoro viene eseguito, quello successivo attende |
| Code del team | Due ClusterQueue in una coorte condivisa con quote per team, prestito e precedenza |
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
- Infrastruttura distribuita seguendo Distribuire l'infrastruttura per Ray e Kueue in AKS.
-
kubectlconnesso al cluster. - Controller Kueue in esecuzione (verificare con
kubectl -n kueue-system get pods).
Crea il namespace e l'account di servizio
Passa al modulo di configurazione della coda nel repository clonato:
cd <path-to-cloned-repo>/AKS/examples/kueue-and-ray-on-aks/2-kueue-queues
kubectl apply -f manifests/00-namespace.yaml
kubectl apply -f <(terraform -chdir=../1-infrastructure/terraform output -raw ray_workload_sa_yaml)
Verificare che l'account del servizio abbia annotazioni di identità del carico di lavoro:
kubectl -n ray get serviceaccount ray-workload -o yaml
L'output deve includere azure.workload.identity/client-id e azure.workload.identity/tenant-id annotazioni che consentono ai pod Ray di accedere Archiviazione BLOB di Azure senza credenziali.
Creare ResourceFlavors
ResourceFlavors descrive i tipi di nodi disponibili nel cluster. Creare due versioni: default (qualsiasi nodo) e gpu (nodi dell'acceleratore NVIDIA):
kubectl apply -f manifests/10-resource-flavors.yaml
Verificare:
kubectl get resourceflavors
Output previsto:
NAME AGE
default 1m
gpu 1m
La configurazione gpu si rivolge ai nodi con etichetta accelerator=nvidia, che AKS applica automaticamente ai pool di nodi GPU.
Opzione A: Configurare una singola coda
La configurazione a coda singola crea un clusterQueue con quote ridimensionate per un carico di lavoro alla volta. Quando la quota è completamente esaurita, la richiesta successiva rimane in stato Pending finché la prima non viene completata.
kubectl apply -f manifests/20-single-queue.yaml
Verificare la ClusterQueue e la LocalQueue:
kubectl get clusterqueue cluster-queue
kubectl -n ray get localqueue default
Output previsto:
NAME COHORT PENDING WORKLOADS
cluster-queue 0
NAME CLUSTERQUEUE PENDING WORKLOADS ADMITTED WORKLOADS
default cluster-queue 0 0
Controllare le quote configurate:
kubectl get clusterqueue cluster-queue -o jsonpath='{.spec.resourceGroups}' | python3 -m json.tool
Le quote predefinite vengono ridimensionate per ammettere un carico di lavoro da questa soluzione alla volta: 96 CPU, 768 Gi di memoria, 8 GPU.
Opzione B: configura le code del team con funzionalità di prestito
La configurazione della coda di team suddivide il nodo GPU tra due team, ciascuno con la propria ClusterQueue, collegati tramite una coorte condivisa:
kubectl apply -f manifests/30-team-queues.yaml
Importante
Scegliere Opzione A o Opzione B, non entrambe. Per passare da una configurazione all'altra, eliminare prima di tutto la configurazione attiva:
kubectl delete -f manifests/20-single-queue.yaml
Verificare:
kubectl get clusterqueues
kubectl -n ray get localqueues
Output previsto:
NAME COHORT PENDING WORKLOADS
team-a-cq shared-cohort 0
team-b-cq shared-cohort 0
NAME CLUSTERQUEUE PENDING WORKLOADS ADMITTED WORKLOADS
team-a team-a-cq 0 0
team-b team-b-cq 0 0
Nota
Per impostazione predefinita, gli esempi di workload sono impostati su QUEUE_NAME=default, che corrisponde all'opzione A. Se hai scelto l'opzione B, imposta export QUEUE_NAME=team-a o export QUEUE_NAME=team-bprima di eseguire source env.example in ogni directory del workload.
Ogni team ottiene 4 GPU garantite con un borrowingLimit valore pari a 4, quindi un team può usare fino a 8 GPU totali quando l'altro team è inattiva. Comportamenti principali:
| Scenario | Che succede |
|---|---|
| Il team A invia, il team B è inattivo | Il team A ottiene tutte e 8 le GPU (4 proprietari + 4 prese in prestito) |
| Il team B invia mentre il team A usa 8 | Kueue sottrae le GPU prese in prestito da Team A, Team B ottiene le 4 GPU garantite |
| Entrambi i team impegnati | Ogni team usa 4 GPU garantite |
Risoluzione dei problemi
| Sintomo | Cause | Correzione |
|---|---|---|
| Il carico di lavoro rimane in sospeso | Quota esaurita | Attendere il completamento del carico di lavoro in esecuzione o aumentare nominalQuota nel ClusterQueue |
LocalQueue not found |
Etichetta del nome della coda errata | Verificare che l'etichetta kueue.x-k8s.io/queue-name corrisponda a un nome LocalQueue esistente |
| ResourceFlavor non corrisponde ai nodi | Etichetta del nodo mancante | Controllare che i nodi GPU abbiano l'etichetta accelerator=nvidia con kubectl get nodes --show-labels |
| Il controller Kueue non è in esecuzione | Problema della release Helm | Verificare con kubectl -n kueue-system logs deploy/kueue-controller-manager |
Per tutti i dettagli del file manifest, consulta la directory 2-kueue-queues nel repository.
Pulire le risorse
Per rimuovere la configurazione della coda Kueue (mantenendo il cluster e gli operatori):
kubectl delete -f manifests/20-single-queue.yaml # or 30-team-queues.yaml
kubectl delete -f manifests/10-resource-flavors.yaml
kubectl delete -f manifests/00-namespace.yaml
Nota
L'eliminazione dello ray spazio dei nomi rimuove tutti i carichi di lavoro, LocalQueues e ServiceAccount in tale spazio dei nomi. ClusterQueues e ResourceFlavors sono con ambito cluster e devono essere eliminati separatamente. Per smantellare l'intera infrastruttura, vedi Distribuire l'infrastruttura per Ray e Kueue in AKS.
Passaggi successivi
Eseguire gli esempi del carico di lavoro nelle code configurate. I passaggi da 1 a 2 e passaggi da 3 a 4 sono coppie indipendenti:
- Ottimizzare il modello meteo Aurora
- Servire il modello Aurora ottimizzato con Ray Serve (richiede il passaggio 1)
- Eseguire il training di un LLM con Ray
- Eseguire l'inferenza batch con Ray (richiede il passaggio 3)