Questo documento descrive gli strumenti e le best practice per massimizzare l'utilizzo delle risorse e ridurre al minimo i tempi di inattività dei workload AI/ML eterogenei in Google Kubernetes Engine (GKE), soprattutto quando non è disponibile capacità nelle prenotazioni o tramite risorse on demand. I workload eterogenei si riferiscono a diversi tipi di workload AI/ML che vengono eseguiti contemporaneamente nello stesso cluster GKE. Ad esempio, potresti eseguire un servizio di inferenza online sensibile alla latenza insieme a una serie di job di addestramento batch interrompibili.
Questa guida fornisce consigli per amministratori e operatori della piattaforma e per specialisti di dati e AI. Per una panoramica consolidata di tutte le best practice di GKE, consulta Best practice per GKE.
Vantaggi della definizione delle priorità dei workload AI/ML
I workload eterogenei hanno priorità diverse e condividono capacità e risorse limitate. Le best practice in questa pagina descrivono come configurare GKE e gli strumenti open source per aiutarti a ottenere i seguenti vantaggi:
- Ridurre al minimo i tempi di inattività per i workload ad alta priorità.
- Eseguire rapidamente i workload ad alta priorità.
- Ottimizzare il consumo di risorse.
Sfondo
GKE supporta i seguenti strumenti open source per l'ottimizzazione dell'utilizzo delle risorse.
Kueue:un sistema di accodamento dei workload nativo di Kubernetes progettato per workload batch, AI e di computing ad alte prestazioni. Kueue può essere esteso per gestire altri tipi di workload, come quelli definiti dalle definizioni di risorse personalizzate come
leaderworkerset. Kueue gestisce le quote e il modo in cui i workload le utilizzano in un cluster Kubernetes. Kueue decide quando un workload attende, quando un workload viene avviato (ad esempio creando il pod) e quando un pod appartenente a un workload viene prerilasciato.Per ulteriori informazioni su Kueue, consulta la documentazione sui concetti di Kueue concepts.
Hotswap:una tecnica che riduce il tempo medio di ripristino (MTTR). Hotswap consente il prerilascio in base alla priorità del workload quando le risorse del cluster sono completamente utilizzate e non è disponibile capacità aggiuntiva, né dalle istanze on demand né dalle prenotazioni esistenti.
- Quando un nodo che ospita un workload diventa non integro, il workload viene ripianificato sui nodi di riserva idonei. Se non sono disponibili nodi di riserva, Hotswap può prerilasciare un workload a priorità inferiore per fare spazio al workload in fase di ripristino.
- Se configuri i pod con
PriorityClass, il workload configurato con una priorità più alta elimina un workload a bassa priorità in esecuzione per acquisire le relative risorse. Questa procedura di eliminazione è nota come prerilascio.
Casi d'uso
Utilizza la tabella seguente per comprendere le best practice per ogni caso d'uso:
| Caso d'uso | Best practice | Descrizione |
|---|---|---|
| Più workload con priorità diverse | Utilizza Kueue per definire le code e assegnare priorità ai workload in base alla loro importanza. Kueue può gestire le quote in modo che determinati team o progetti abbiano accesso a una quantità fissa di risorse. |
Kueue ti consente di applicare le seguenti configurazioni:
Per testare la configurazione delle best practice, consulta l'esempio di Kueue in questo documento. |
| Devi ridurre l'MTTR corrente. | Utilizza Hotswap per ripianificare i workload nelle risorse integre quando si verifica un'interruzione e per prerilasciare i workload a bassa priorità a favore dei workload ad alta priorità. |
Hotswap ti consente di applicare le seguenti configurazioni:
Per testare la configurazione delle best practice, consulta l'esempio di Hotswap in questo documento. |
| Più workload AI in competizione per risorse limitate | Combina Kueue e Hotswap. Questa combinazione fornisce un sistema robusto che assegna la priorità ai workload critici sia durante la pianificazione iniziale sia durante il runtime. |
Kueue e Hotswap ti consentono di applicare le seguenti configurazioni:
Per testare la configurazione delle best practice, consulta l'esempio di Kueue e Hotswap in questo documento. |
Esempi di implementazioni delle best practice
Gli esempi seguenti mostrano come implementare Kueue e Hotswap e come combinarli per le best practice descritte nella sezione precedente.
Kueue
Il seguente manifest di esempio mostra una configurazione di Kueue:
apiVersion: kueue.x-k8s.io/v1beta1
kind: ResourceFlavor
metadata:
name: tpu-v6e-slice
spec:
nodeLabels:
cloud.google.com/gke-tpu-accelerator: tpu-v6e-slice
---
apiVersion: kueue.x-k8s.io/v1beta1
kind: ClusterQueue
metadata:
name: tpu-training-cq
spec:
resourceGroups:
- flavors:
- name: tpu-v6e-slice
resources:
- name: google.com/tpu
nominalQuota: 32
queueingStrategy: BestEffortFIFO
preemption:
reclaimWithinCohort: Never
reclaimOutOfCohort:
enable: true
reclaimMoreThanNominalQuota: false
---
apiVersion: kueue.x-k8s.io/v1beta1
kind: LocalQueue
metadata:
name: default-queue
namespace: default
spec:
clusterQueue: tpu-training-cq
Questo manifest esegue le seguenti operazioni:
- Definisce un
ResourceFlavordenominatotpu-v6e-sliceche specifica le etichette dei nodi per le slice TPU v6e. - Definisce una
ClusterQueuedenominatatpu-training-cqche gestisce la quota per le risorse TPU. - Definisce una
LocalQueuedenominatadefault-queueche consente ai workload in nello spazio dei nomidefaultdi utilizzare la coda del clustertpu-training-cq.
Hotswap
L'esempio seguente mostra una configurazione di Hotswap che definisce due PriorityClass, low-priority-job e high-priority-job. Questa
configurazione di Hotswap crea un workload JobSet ad alta priorità e utilizza
MaxText.
apiVersion: scheduling.k8s.io/v1
kind: PriorityClass
metadata:
name: low-priority-job
value: 1000000
globalDefault: false
description: "This priority class should be used for low priority pods only."
---
apiVersion: scheduling.k8s.io/v1
kind: PriorityClass
metadata:
name: high-priority-job
value: 2000000
globalDefault: false
description: "This priority class should be used for critical pods only."
---
apiVersion: jobset.x-k8s.io/v1alpha2
kind: JobSet
metadata:
name: high-jax-trillium
annotations:
alpha.jobset.sigs.k8s.io/exclusive-topology: cloud.google.com/gke-nodepool
spec:
failurePolicy:
maxRestarts: 10
restartStrategy: BlockingRecreate
replicatedJobs:
- name: slice
replicas: 2
template:
spec:
backoffLimit: 0
completions: 4
parallelism: 4
template:
spec:
nodeSelector:
cloud.google.com/gke-tpu-accelerator: tpu-v6e-slice
cloud.google.com/gke-tpu-topology: 4x4
hostNetwork: true
dnsPolicy: ClusterFirstWithHostNet
priorityClassName: high-priority-job
containers:
- name: jax-program
image: <IMAGE LOCATION>
command:
- python3
- MaxText/train.py
- MaxText/configs/base.yml
- model_name=llama2-7b
- run_name=<UNIQUE RUN NAME>
- steps=300
- base_output_directory=gs://<OUTPUT BUCKET>
- dataset_path=gs://max-datasets-rogue
- max_target_length=4096
- dataset_type=synthetic
- enable_checkpointing=False
resources:
limits:
google.com/tpu: 4
In base a questa configurazione, Hotswap esegue le seguenti azioni:
- Se un errore dell'infrastruttura interrompe il workload ad alta priorità, JobSet lo riavvia. Hotswap prerilascia il workload a bassa priorità per ripianificare il workload ad alta priorità prima del ripristino dell'infrastruttura. Il workload a bassa priorità rimane nello stato di errore. Questa procedura riduce significativamente il tempo di inattività del workload.
- Quando l'infrastruttura viene ripristinata, Hotswap ripianifica il workload a bassa priorità nel pool di nodi ripristinato.
Kueue e Hotswap
Combina Kueue e Hotswap quando operi in un ambiente complesso con risorse limitate. Questa combinazione fornisce un sistema robusto che assegna la priorità ai workload critici durante la pianificazione iniziale e durante il runtime.
L'esempio seguente mostra una configurazione combinata di Kueue e Hotswap. Questo esempio utilizza MaxText:
apiVersion: scheduling.k8s.io/v1
kind: PriorityClass
metadata:
name: low-priority-job
value: 1000000
globalDefault: false
description: "This priority class should be used for low priority pods only."
---
apiVersion: scheduling.k8s.io/v1
kind: PriorityClass
metadata:
name: high-priority-job
value: 2000000
globalDefault: false
description: "This priority class should be used for critical pods only."
---
apiVersion: kueue.x-k8s.io/v1beta1
kind: ResourceFlavor
metadata:
name: tpu-v6e-slice
spec:
nodeLabels:
cloud.google.com/gke-tpu-accelerator: tpu-v6e-slice
---
apiVersion: kueue.x-k8s.io/v1beta1
kind: ClusterQueue
metadata:
name: tpu-training-cq
spec:
resourceGroups:
- flavors:
- name: tpu-v6e-slice
resources:
- name: google.com/tpu
nominalQuota: 32
queueingStrategy: BestEffortFIFO
preemption:
reclaimWithinCohort: Never
reclaimOutOfCohort:
enable: true
reclaimMoreThanNominalQuota: false
---
apiVersion: kueue.x-k8s.io/v1beta1
kind: LocalQueue
metadata:
name: default-queue
namespace: default
spec:
clusterQueue: tpu-training-cq
---
apiVersion: jobset.x-k8s.io/v1alpha2
kind: JobSet
metadata:
name: low-jax-trillium
annotations:
kueue.x-k8s.io/queue-name: default-queue
alpha.jobset.sigs.k8s.io/exclusive-topology: cloud.google.com/gke-nodepool
spec:
failurePolicy:
maxRestarts: 10
restartStrategy: BlockingRecreate
replicatedJobs:
- name: slice
replicas: 2
template:
spec:
backoffLimit: 0
completions: 4
parallelism: 4
template:
metadata:
labels:
kueue.x-k8s.io/managed-by: kueue
kueue.x-k8s.io/priority-class: low-priority-job
spec:
nodeSelector:
cloud.google.com/gke-tpu-accelerator: tpu-v6e-slice
cloud.google.com/gke-tpu-topology: 4x4
hostNetwork: true
dnsPolicy: ClusterFirstWithHostNet
priorityClassName: low-priority-job
containers:
- name: jax-program
image: <IMAGE LOCATION>
command:
- python3
- MaxText/train.py
- MaxText/configs/base.yml
- model_name=llama2-7b
- run_name=low-priority-run
- steps=30000
- base_output_directory=gs://<OUTPUT BUCKET>
- dataset_path=gs://max-datasets-rogue
- max_target_length=4096
- dataset_type=synthetic
- enable_checkpointing=False
resources:
limits:
google.com/tpu: 4
---
apiVersion: jobset.x-k8s.io/v1alpha2
kind: JobSet
metadata:
name: high-jax-trillium
annotations:
kueue.x-k8s.io/queue-name: default-queue
alpha.jobset.sigs.k8s.io/exclusive-topology: cloud.google.com/gke-nodepool
spec:
failurePolicy:
maxRestarts: 10
restartStrategy: BlockingRecreate
replicatedJobs:
- name: slice
replicas: 2
template:
spec:
backoffLimit: 0
completions: 4
parallelism: 4
template:
metadata:
labels:
kueue.x-k8s.io/managed-by: kueue
kueue.x-k8s.io/priority-class: high-priority-job
spec:
nodeSelector:
cloud.google.com/gke-tpu-accelerator: tpu-v6e-slice
cloud.google.com/gke-tpu-topology: 4x4
hostNetwork: true
dnsPolicy: ClusterFirstWithHostNet
priorityClassName: high-priority-job
containers:
- name: jax-program
image: <IMAGE LOCATION>
command:
- python3
- MaxText/train.py
- MaxText/configs/base.yml
- model_name=llama2-7b
- run_name=high-priority-run
- steps=300
- base_output_directory=gs://<OUTPUT BUCKET>
- dataset_path=gs://max-datasets-rogue
- max_target_length=4096
- dataset_type=synthetic
- enable_checkpointing=False
resources:
limits:
google.com/tpu: 4
In base a questa configurazione, Kueue viene combinato con Hotswap ed esegue le seguenti azioni:
- Kueue gestisce l'ammissione di entrambi i JobSet
low-jax-trilliumehigh-jax-trilliumnella coda del cluster in base alle priorità definite e alle risorse disponibili. - Se il JobSet
high-jax-trilliumviene interrotto da un errore dell'infrastruttura, Hotswap prerilascia il JobSetlow-jax-trilliumper ripianificare il JobSet ad alta priorità. - Hotswap garantisce che il JobSet ad alta priorità venga riavviato rapidamente, riducendo al minimo il tempo di inattività.
- Quando l'infrastruttura viene ripristinata, Hotswap ripianifica il JobSet a bassa priorità nel pool di nodi ripristinato.
Passaggi successivi
- Scopri come eseguire il deployment dei workload GPU in GKE.
- Scopri come eseguire il deployment dei workload TPU in GKE.