Implementare un carico di lavoro accelerato - Amazon EKS

Contribuisci a migliorare questa pagina

Per contribuire a questa guida per l’utente, seleziona il link Edit this page on GitHub che si trova nel riquadro destro di ogni pagina.

Implementare un carico di lavoro accelerato

Questo tutorial dimostra come Amazon EKS Auto Mode semplifica l’avvio di carichi di lavoro accelerati. Amazon EKS Auto Mode semplifica le operazioni oltre il cluster stesso automatizzando i componenti chiave dell’infrastruttura che forniscono funzionalità di elaborazione, rete, bilanciamento del carico, storage e accesso e gestione delle identità pronte all’uso.

Amazon EKS Auto Mode include i driver e i plug-in di dispositivo necessari per determinati tipi di istanze, come i driver NVIDIA e AWS Neuron. Non è necessario installare o aggiornare questi componenti.

EKS Auto Mode gestisce automaticamente i driver per questi acceleratori:

Nota

EKS Auto Mode include il plug-in di dispositivo NVIDIA per Kubernetes. Questo plug-in viene eseguito automaticamente e non è visibile come daemon impostato nel cluster.

Supporto di reti avanzate:

Amazon EKS Auto Mode elimina la difficoltà della gestione dei driver dell’acceleratore e dei plug-in di dispositivo.

Puoi anche trarre vantaggio dai risparmi sui costi ridimensionando il cluster fino a zero. Puoi configurare EKS Auto Mode per terminare le istanze quando non è in esecuzione alcun carico di lavoro. Ciò è utile per i carichi di lavoro di inferenza basati su batch.

Di seguito viene fornito un esempio di come avviare carichi di lavoro accelerati con Amazon EKS Auto Mode.

Prerequisiti

  • Un cluster Kubernetes con Amazon EKS Auto Mode configurato.

  • Una classe del nodo default EKS creata quando i pool di nodi gestiti da general-purpose o system sono abilitati.

Fase 1: Implementare un carico di lavoro GPU

In questo esempio, creerai un NodePool per carichi di lavoro basati su NVIDIA che richiede 45 GB di memoria GPU. Con EKS Auto Mode, utilizzi i vincoli di pianificazione di Kubernetes per definire i requisiti delle istanze.

Per implementare la Amazon EKS Auto Mode NodePool e l’esempio workload, esaminare la seguente definizione di NodePool e Pod e salvare come nodepool-gpu.yaml e pod.yaml:

nodepool-gpu.yaml

apiVersion: karpenter.sh/v1 kind: NodePool metadata: name: gpu spec: disruption: budgets: - nodes: 10% consolidateAfter: 1h consolidationPolicy: WhenEmpty template: metadata: {} spec: nodeClassRef: group: eks.amazonaws.com kind: NodeClass name: default requirements: - key: "karpenter.sh/capacity-type" operator: In values: ["on-demand"] - key: "kubernetes.io/arch" operator: In values: ["amd64"] - key: "eks.amazonaws.com/instance-family" operator: In values: - g6e - g6 taints: - key: nvidia.com/gpu effect: NoSchedule terminationGracePeriod: 24h0m0s

pod.yaml

apiVersion: v1 kind: Pod metadata: name: nvidia-smi spec: nodeSelector: eks.amazonaws.com/compute-type: auto restartPolicy: OnFailure containers: - name: nvidia-smi image: public.ecr.aws/amazonlinux/amazonlinux:2023-minimal args: - "nvidia-smi" resources: requests: memory: "30Gi" cpu: "3500m" nvidia.com/gpu: 1 limits: memory: "30Gi" nvidia.com/gpu: 1 tolerations: - key: nvidia.com/gpu effect: NoSchedule operator: Exists

Il selettore eks.amazonaws.com/compute-type: auto richiede che il carico di lavoro sia implementato su un nodo di Amazon EKS Auto Mode. Il NodePool imposta inoltre un taint che consente solo la pianificazione pod con tolleranze per le GPU Nvidia.

Applica il NodePool e il carico di lavoro al cluster.

kubectl apply -f nodepool-gpu.yaml kubectl apply -f pod.yaml

Verrà visualizzato l’output seguente:

nodepool.karpenter.sh/gpu configured created pod/nvidia-smi created

Attendi qualche secondo e controlla i nodi del cluster. Ora dovresti vedere un nuovo nodo fornito nel cluster di Amazon EKS Auto Mode:

> kubectl get nodes NAME TYPE CAPACITY ZONE NODE READY AGE gpu-dnknr g6e.2xlarge on-demand us-west-2b i-02315c7d7643cdee6 True 76s

Fase 2: Convalida

Puoi vedere che Amazon EKS Auto Mode ha lanciato un g6e.2xlarge anziché un g6.2xlarge in quanto il carico di lavoro richiedeva un’istanza con l40s GPU, in base ai seguenti vincoli di pianificazione di Kubernetes:

... nodeSelector: eks.amazonaws.com/instance-gpu-name: l40s ... requests: memory: "30Gi" cpu: "3500m" nvidia.com/gpu: 1 limits: memory: "30Gi" nvidia.com/gpu: 1

Ora, analizzare i log dei container, eseguendo il seguente comando:

kubectl logs nvidia-smi

Output di esempio:

+---------------------------------------------------------------------------------------+ | NVIDIA-SMI 535.230.02 Driver Version: 535.230.02 CUDA Version: 12.2 | |-----------------------------------------+----------------------+----------------------+ | GPU Name Persistence-M | Bus-Id Disp.A | Volatile Uncorr. ECC | | Fan Temp Perf Pwr:Usage/Cap | Memory-Usage | GPU-Util Compute M. | | | | MIG M. | |=========================================+======================+======================| | 0 NVIDIA L40S On | 00000000:30:00.0 Off | 0 | | N/A 27C P8 23W / 350W | 0MiB / 46068MiB | 0% Default | | | | N/A | +-----------------------------------------+----------------------+----------------------+ +---------------------------------------------------------------------------------------+ | Processes: | | GPU GI CI PID Type Process name GPU Memory | | ID ID Usage | |=======================================================================================| | No running processes found | +---------------------------------------------------------------------------------------+

Puoi vedere che il container ha rilevato che è in esecuzione su un’istanza con una GPU NVIDIA e che non hai dovuto installare alcun driver di dispositivo, poiché questa è gestita da Amazon EKS Auto Mode.

Fase 3: Pulizia

Per rimuovere tutti gli oggetti creati, usare kubectl per eliminare l’implementazione di esempio e NodePool in modo tale che il nodo venga terminato:

kubectl delete -f nodepool-gpu.yaml
kubectl delete -f pod.yaml

Riferimento a NodePools di esempio

Creare un NodePool di NVIDIA

Il seguente NodePool definisce:

  • Solo istanze di avvio della famiglia g6e e g6

  • Consolidare i nodi quando sono vuoti per 1 ora

    • Il valore di 1 ora per consolodateAfter supporta carichi di lavoro con picchi e riduce il tasso di abbandono dei nodi. Puoi eseguire l’ottimizzazione di consolidateAfter in base ai requisiti del carico di lavoro.

NodePool di esempio con famiglia di istanze GPU e consolidamento

apiVersion: karpenter.sh/v1 kind: NodePool metadata: name: gpu spec: disruption: budgets: - nodes: 10% consolidateAfter: 1h consolidationPolicy: WhenEmpty template: metadata: {} spec: nodeClassRef: group: eks.amazonaws.com kind: NodeClass name: default requirements: - key: "karpenter.sh/capacity-type" operator: In values: ["on-demand"] - key: "kubernetes.io/arch" operator: In values: ["amd64"] - key: "eks.amazonaws.com/instance-family" operator: In values: - g6e - g6 terminationGracePeriod: 24h0m0s

Invece di impostare il eks.amazonaws.com/instance-gpu-name, puoi utilizzare eks.amazonaws.com/instance-family per specificare la famiglia di istanze. Per altre etichette note che influenzano la revisione della pianificazione, consultare Etichette supportate da EKS Auto Mode.

Se disponi di requisiti di archiviazione specifici, puoi ottimizzare l’archiviazione temporaneo dei nodi iops, size e throughput creando la propria NodeClass a cui fare riferimento nel NodePool. Maggiori informazioni su configurable NodeClass options.

Configurazione di archiviazione esemplificativa per NodeClass

apiVersion: eks.amazonaws.com/v1 kind: NodeClass metadata: name: gpu spec: ephemeralStorage: iops: 3000 size: 80Gi throughput: 125

Definire un NodePool AWS Trainium e AWS Inferentia

Il seguente NodePool ha un set eks.amazonaws.com/instance-category che avvia solo istanze della famiglia Inferentia e Trainium:

        - key: "eks.amazonaws.com/instance-category"
          operator: In
          values:
            - inf
            - trn