Come assegnare una GPU su Kubernetes
Hikube consente di aggiungere gruppi di nodi dotati di GPU NVIDIA ai suoi cluster Kubernetes gestiti. Questa guida spiega come configurare tale gruppo nella console, quindi distribuire pod che utilizzano la GPU.
Prerequisiti
- Un account Hikube e un progetto con quote sufficienti
- kubectl installato sulla sua postazione
- Familiarità con il Kubernetes gestito di Hikube
Passaggi
1. Aggiungere un gruppo di nodi GPU
Nuovo cluster: apra Infrastructure > Kubernetes > Create cluster, compili il passaggio General, quindi passi al passaggio Nodes.
Cluster esistente: apra il cluster, faccia clic su Edit e vada in Node groups.
Quindi:
- Faccia clic su Add node group.
- Group name: ad esempio
gpu-workers. - Instance type: scelga la serie e la dimensione, ad esempio Universal (U) > 2XLARGE (8 vCPU, 32 GB).
- Node disk size: preveda spazio sufficiente per le immagini di container CUDA, ad esempio
100GB. - Minimum nodes e Maximum nodes: ad esempio
1e3. - Sezione GPU: faccia clic sulla scheda del modello desiderato (ad esempio NVIDIA L40S); + e − regolano il numero di GPU per nodo.
Mantenga un gruppo di nodi senza GPU per i carichi di lavoro tradizionali e riservi il gruppo GPU ai pod che ne hanno bisogno: ogni gruppo si dimensiona in modo indipendente.
Un gruppo creato senza GPU non può riceverne (This node group was created without GPUs and cannot get any.). Un gruppo creato con GPU può cambiare modello o numero, ma deve mantenere almeno una GPU. Per cambiare categoria, aggiunga un nuovo gruppo di nodi.
2. Verificare gli addon
Al passaggio Addons (sezione Extensions & Addons in modifica), GPU Operator è selezionato e bloccato (Required when a node group has GPUs): installa i driver NVIDIA e il device plugin sui nodi GPU.
Attivi anche HAMi se desidera condividere una stessa GPU tra più pod.
3. Distribuire
Al passaggio Summary, il gruppo GPU mostra il modello e la quantità (ad esempio l40s (x1)). Faccia clic su Create cluster (o su Save per un cluster esistente).
Attenda che il cluster sia Ready o Running nell'elenco dei cluster.
4. Recuperare il kubeconfig del cluster
Nella pagina di dettaglio del cluster, faccia clic su Kubeconfig. La console scarica kubeconfig-<nome-del-cluster>.yaml. Questo pulsante è riservato agli amministratori del progetto; per gli altri membri è disattivato.
export KUBECONFIG=~/Downloads/kubeconfig-<nome-del-cluster>.yaml
kubectl get nodes
5. Verificare le GPU sui nodi
Una volta avviati i pod del GPU Operator (qualche minuto dopo l'arrivo dei nodi):
kubectl get nodes -o custom-columns=NAME:.metadata.name,GPU:.status.allocatable.'nvidia\.com/gpu'
Risultato atteso: i nodi del gruppo GPU mostrano 1 (o il numero di GPU per nodo scelto), gli altri <none>.
6. Distribuire un pod con GPU
apiVersion: v1
kind: Pod
metadata:
name: gpu-test
spec:
restartPolicy: Never
containers:
- name: cuda-test
image: nvidia/cuda:12.4.1-base-ubuntu22.04
command: ["nvidia-smi"]
resources:
limits:
nvidia.com/gpu: 1
kubectl apply -f gpu-pod.yaml
kubectl wait --for=jsonpath='{.status.phase}'=Succeeded pod/gpu-test --timeout=300s
kubectl logs gpu-test
Risultato atteso: la tabella nvidia-smi elenca la GPU (ad esempio NVIDIA L40S).
7. Indirizzare un modello di GPU
Se i suoi gruppi utilizzano modelli diversi, li indirizzi con l'etichetta applicata dal GPU Operator (rilevamento delle funzionalità GPU):
kubectl get nodes -L nvidia.com/gpu.product
apiVersion: apps/v1
kind: Deployment
metadata:
name: model-serving
spec:
replicas: 2
selector:
matchLabels:
app: model-serving
template:
metadata:
labels:
app: model-serving
spec:
nodeSelector:
nvidia.com/gpu.product: <valore mostrato dal comando precedente>
containers:
- name: inference
image: my-model:latest
resources:
limits:
nvidia.com/gpu: 1
Verifica
# GPU allocabili per nodo
kubectl get nodes -o custom-columns=NAME:.metadata.name,GPU:.status.allocatable.'nvidia\.com/gpu'
# GPU già assegnate su un nodo
kubectl describe node <nome-del-nodo> | grep -A 8 "Allocated resources"
# Pod del GPU Operator
kubectl get pods -A | grep -i gpu-operator