GPU auf Kubernetes bereitstellen
Hikube ermöglicht es, Node Groups mit NVIDIA-GPUs zu Ihren Kubernetes-Clustern hinzuzufügen. Diese Anleitung erklärt, wie Sie einen Cluster mit GPU-Workern konfigurieren, Pods bereitstellen, die GPU-Beschleunigung nutzen, und spezialisierte Node Groups einrichten.
Voraussetzungen
- kubectl konfiguriert mit Ihrem Hikube-Kubeconfig
- Ein bestehender Kubernetes-Cluster auf Hikube (oder ein bereitstellungsbereites Manifest)
- Vertrautheit mit den Konzepten von Kubernetes auf Hikube
Schritte
1. GPU Node Group zum Cluster hinzufügen
Ändern Sie das Manifest Ihres Clusters, um eine Node Group mit GPU hinzuzufügen. Die GPU-Konfiguration erfolgt auf Node Group-Ebene über gpus[].name:
apiVersion: apps.cozystack.io/v1alpha1
kind: Kubernetes
metadata:
name: cluster-gpu
spec:
controlPlane:
replicas: 1
nodeGroups:
default-workers:
minReplicas: 1
maxReplicas: 3
instanceType: "u1.large"
ephemeralStorage: 50Gi
gpu-workers:
minReplicas: 1
maxReplicas: 5
instanceType: "u1.xlarge"
ephemeralStorage: 100Gi
gpus:
- name: "nvidia.com/AD102GL_L40S"
Trennen Sie Ihre CPU- und GPU-Workloads in separate Node Groups. Dies ermöglicht eine unabhängige Skalierung und eine bessere Kostenkontrolle.
2. Cluster-Konfiguration anwenden
kubectl apply -f cluster-gpu.yaml
Warten Sie, bis die GPU-Nodes bereit sind:
kubectl get nodes -w
Erwartetes Ergebnis:
NAME STATUS ROLES AGE VERSION
cluster-gpu-cp-0 Ready master 5m v1.29.x
cluster-gpu-gpu-workers-0 Ready <none> 3m v1.29.x
3. GPU-Verfügbarkeit auf den Nodes überprüfen
Bestätigen Sie, dass die GPUs als Kubernetes-Ressourcen exponiert sind:
kubectl get nodes -o custom-columns=NAME:.metadata.name,GPU:.status.allocatable.'nvidia\.com/gpu'
Erwartetes Ergebnis:
NAME GPU
cluster-gpu-cp-0 <none>
cluster-gpu-gpu-workers-0 1
4. Pod mit GPU bereitstellen
Erstellen Sie einen Test-Pod, der einen GPU über resources.limits nutzt:
apiVersion: v1
kind: Pod
metadata:
name: gpu-test
spec:
containers:
- name: cuda-test
image: nvidia/cuda:12.0-runtime-ubuntu22.04
command: ["nvidia-smi"]
resources:
limits:
nvidia.com/gpu: 1
requests:
nvidia.com/gpu: 1
Anwenden und überprüfen:
kubectl apply -f gpu-pod.yaml
Warten Sie, bis der Pod seine Ausführung beendet:
kubectl wait --for=condition=Ready pod/gpu-test --timeout=120s
Konsultieren Sie die Logs, um zu bestätigen, dass der GPU sichtbar ist:
kubectl logs gpu-test
Erwartetes Ergebnis:
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 535.xx.xx Driver Version: 535.xx.xx CUDA Version: 12.x |
|-------------------------------+----------------------+----------------------+
| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |
|===============================+======================+======================|
| 0 NVIDIA L40S Off | 00000000:00:06.0 Off | 0 |
+-------------------------------+----------------------+----------------------+
5. Spezialisierte Node Groups konfigurieren
Für Produktionsumgebungen erstellen Sie dedizierte Node Groups für Inferenz und Training mit verschiedenen GPUs:
apiVersion: apps.cozystack.io/v1alpha1
kind: Kubernetes
metadata:
name: cluster-ml
spec:
controlPlane:
replicas: 3
nodeGroups:
default-workers:
minReplicas: 2
maxReplicas: 5
instanceType: "u1.large"
ephemeralStorage: 50Gi
gpu-inference:
minReplicas: 2
maxReplicas: 10
instanceType: "u1.large"
ephemeralStorage: 100Gi
gpus:
- name: "nvidia.com/AD102GL_L40S"
gpu-training:
minReplicas: 1
maxReplicas: 3
instanceType: "u1.4xlarge"
ephemeralStorage: 200Gi
gpus:
- name: "nvidia.com/GA100_A100_PCIE_80GB"
- name: "nvidia.com/GA100_A100_PCIE_80GB"
Um eine spezifische Node Group in Ihren Deployments anzuvisieren, verwenden Sie nodeSelector:
apiVersion: apps/v1
kind: Deployment
metadata:
name: model-serving
spec:
replicas: 3
selector:
matchLabels:
app: model-serving
template:
metadata:
labels:
app: model-serving
spec:
nodeSelector:
gpu-type: "L40S"
containers:
- name: inference
image: my-model:latest
resources:
limits:
nvidia.com/gpu: 1
requests:
nvidia.com/gpu: 1
Die für Kubernetes verfügbaren GPUs sind dieselben wie für VMs: L40S (Inferenz/Entwicklung), A100 (ML-Training) und H100 (LLM/Exascale). Konsultieren Sie die GPU API-Referenz für die vollständigen Spezifikationen.
Überprüfung
Bestätigen Sie nach der Bereitstellung, dass Ihre GPU-Konfiguration funktioniert:
- GPU-Nodes überprüfen:
kubectl get nodes -o custom-columns=NAME:.metadata.name,GPU:.status.allocatable.'nvidia\.com/gpu'
- GPU-Zuweisung auf einem Node überprüfen:
kubectl describe node cluster-gpu-gpu-workers-0 | grep -A 5 "Allocated resources"
- Mit einem interaktiven Pod testen:
kubectl run gpu-debug --rm -it --image=nvidia/cuda:12.0-runtime-ubuntu22.04 \
--overrides='{"spec":{"containers":[{"name":"gpu-debug","image":"nvidia/cuda:12.0-runtime-ubuntu22.04","command":["nvidia-smi"],"resources":{"limits":{"nvidia.com/gpu":"1"},"requests":{"nvidia.com/gpu":"1"}}}]}}' \
--restart=Never