Vai al contenuto principale
Versione: 3.0.0-alpha (Diátaxis)

Riferimento API - GPU

Questo riferimento dettaglia le API per utilizzare le GPU su Hikube, sia con macchine virtuali che con cluster Kubernetes.


🖥️ GPU con Macchine Virtuali

API VirtualMachine

apiVersion: apps.cozystack.io/v1alpha1
kind: VirtualMachine
metadata:
name: vm-gpu
spec:
running: true
instanceProfile: ubuntu
instanceType: u1.xlarge
gpus:
- name: "nvidia.com/AD102GL_L40S"

Parametri GPU per VM

ParametroTipoDescrizioneRichiesto
gpus[]GPULista delle GPU da collegare
gpus[].namestringTipo di GPU NVIDIA

Tipi di GPU Disponibili

# GPU per inferenza e sviluppo
gpus:
- name: "nvidia.com/AD102GL_L40S"

# GPU per addestramento ML
gpus:
- name: "nvidia.com/GA100_A100_PCIE_80GB"

# GPU per LLM e calcolo exascale
gpus:
- name: "nvidia.com/H100_94GB"

Specifiche Hardware

GPUArchitetturaMemoriaPrestazioni
L40SAda Lovelace48 GB GDDR6362 TOPS (INT8)
A100Ampere80 GB HBM2e312 TOPS (INT8)
H100Hopper80 GB HBM31979 TOPS (INT8)

Esempio VM GPU Completo

apiVersion: apps.cozystack.io/v1alpha1
kind: VirtualMachine
metadata:
name: ai-workstation
spec:
running: true
instanceProfile: ubuntu
instanceType: u1.2xlarge # 8 vCPU, 32 GB RAM
gpus:
- name: "nvidia.com/GA100_A100_PCIE_80GB"
systemDisk:
size: 200Gi
storageClass: replicated
external: true
externalMethod: PortList
externalPorts:
- 22
- 8888 # Jupyter
cloudInit: |
#cloud-config
users:
- name: ubuntu
sudo: ALL=(ALL) NOPASSWD:ALL

packages:
- python3-pip
- build-essential

runcmd:
# Driver NVIDIA
- wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2204/x86_64/cuda-keyring_1.0-1_all.deb
- dpkg -i cuda-keyring_1.0-1_all.deb
- apt-get update
- apt-get install -y cuda-toolkit nvidia-driver-535

# PyTorch con CUDA
- pip3 install torch torchvision --index-url https://download.pytorch.org/whl/cu121

☸️ GPU con Kubernetes

API Kubernetes con GPU Worker

apiVersion: apps.cozystack.io/v1alpha1
kind: Kubernetes
metadata:
name: cluster-gpu
spec:
controlPlane:
replicas: 1

nodeGroups:
gpu-workers:
minReplicas: 1
maxReplicas: 5
instanceType: "u1.xlarge"
ephemeralStorage: 100Gi
gpus:
- name: "nvidia.com/AD102GL_L40S"

Parametri GPU per NodeGroup

ParametroTipoDescrizioneRichiesto
nodeGroups.<name>.gpus[]GPUGPU per i worker
gpus[].namestringTipo di GPU NVIDIA

Configurazione Multi-GPU

nodeGroups:
gpu-intensive:
minReplicas: 1
maxReplicas: 2
instanceType: "u1.4xlarge" # 16 vCPU, 64 GB RAM
gpus:
- name: "nvidia.com/GA100_A100_PCIE_80GB"
- name: "nvidia.com/GA100_A100_PCIE_80GB"
- name: "nvidia.com/GA100_A100_PCIE_80GB"
- name: "nvidia.com/GA100_A100_PCIE_80GB"

Utilizzo nei Pod

apiVersion: v1
kind: Pod
metadata:
name: ml-training
spec:
containers:
- name: trainer
image: pytorch/pytorch:2.0.1-cuda11.7-cudnn8-runtime
resources:
limits:
nvidia.com/gpu: 1
requests:
nvidia.com/gpu: 1
command:
- python
- train.py

Job Multi-GPU

apiVersion: batch/v1
kind: Job
metadata:
name: distributed-training
spec:
template:
spec:
containers:
- name: trainer
image: pytorch/pytorch:2.0.1-cuda11.7-cudnn8-runtime
resources:
limits:
nvidia.com/gpu: 4
requests:
nvidia.com/gpu: 4
env:
- name: CUDA_VISIBLE_DEVICES
value: "0,1,2,3"
restartPolicy: Never

📋 Confronto degli Approcci

VM GPU vs Kubernetes GPU

AspettoVM GPUKubernetes GPU
Allocazione1 GPU = 1 VM (esclusivo)1+ GPU per worker (condivisibile)
IsolamentoCompleto a livello VMNamespace/Pod
ScalingVerticale (più GPU)Orizzontale + Verticale
GestioneManuale tramite YAMLOrchestrata da K8s
CondivisioneNoSi (tra pod)
OverheadMinimoOverhead orchestrazione

Quando utilizzare ciascun approccio

VM GPU raccomandata per:

  • Applicazioni legacy non containerizzate
  • Necessità di accesso diretto e completo alla GPU
  • Sviluppo e prototipazione
  • Workload monolitici
  • Applicazioni grafiche (rendering, CAD)

Kubernetes GPU raccomandato per:

  • Applicazioni containerizzate
  • Workload che necessitano scaling automatico
  • Job paralleli e distribuiti
  • Condivisione delle risorse GPU
  • Pipeline ML/AI complesse

🔧 Configurazione Avanzata

Multi-GPU su VM

apiVersion: apps.cozystack.io/v1alpha1
kind: VirtualMachine
metadata:
name: multi-gpu-vm
spec:
instanceType: u1.8xlarge # 32 vCPU, 128 GB RAM
gpus:
- name: "nvidia.com/H100_94GB"
- name: "nvidia.com/H100_94GB"
- name: "nvidia.com/H100_94GB"
- name: "nvidia.com/H100_94GB"

NodeGroup specializzato GPU

nodeGroups:
gpu-inference:
minReplicas: 2
maxReplicas: 10
instanceType: "u1.large"
gpus:
- name: "nvidia.com/AD102GL_L40S"

gpu-training:
minReplicas: 1
maxReplicas: 3
instanceType: "u1.4xlarge"
gpus:
- name: "nvidia.com/GA100_A100_PCIE_80GB"
- name: "nvidia.com/GA100_A100_PCIE_80GB"

Pod con GPU specifica

apiVersion: v1
kind: Pod
metadata:
name: specific-gpu-pod
spec:
nodeSelector:
gpu-type: "L40S"
containers:
- name: app
image: nvidia/cuda:12.0-runtime-ubuntu20.04
resources:
limits:
nvidia.com/gpu: 1

✅ Verifica e Monitoraggio

Verifica VM GPU

# Accedere alla VM
virtctl ssh ubuntu@vm-gpu

# Verificare le GPU
nvidia-smi

# Test CUDA
nvidia-smi --query-gpu=name,memory.total,utilization.gpu --format=csv

Verifica Kubernetes GPU

# Vedere le risorse GPU sui nodi
kubectl describe nodes

# Verificare l'allocazione GPU
kubectl get nodes -o custom-columns=NAME:.metadata.name,GPU:.status.allocatable.'nvidia\.com/gpu'

# Monitoraggio utilizzo GPU
kubectl top nodes

Monitoraggio GPU in un Pod

# Exec in un pod con GPU
kubectl exec -it <pod-name> -- nvidia-smi

# Vedere le metriche GPU
kubectl exec -it <pod-name> -- nvidia-smi --query-gpu=utilization.gpu,memory.used,memory.total --format=csv -l 5

💡 Buone Pratiche

Per VM GPU:

  • Utilizzate la storage class replicated per la produzione
  • Dimensionate CPU/RAM in base alla GPU (rapporto 8-16 vCPU per GPU)
  • Installate i driver NVIDIA tramite cloud-init
  • Fermate le VM quando inutilizzate per ottimizzare i costi

Per Kubernetes GPU:

  • Configurate resource limits appropriati
  • Utilizzate nodeSelector o nodeAffinity per indirizzare GPU specifiche
  • Implementate PodDisruptionBudget per i workload critici
  • Monitorate l'utilizzo GPU con metriche personalizzate

Generale:

  • L40S per inferenza/sviluppo
  • A100 per addestramento ML standard
  • H100 per LLM e calcolo exascale
  • Testate con L40S prima di passare a GPU più costose