Gestire i dispositivi GPU con l'allocazione dinamica delle risorse

L'allocazione dinamica delle risorse è un'API Kubernetes che ti consente di richiedere e condividere risorse, come le GPU, tra pod e container nei tuoi cluster Google Distributed Cloud bare metal. I driver di terze parti gestiscono questi dispositivi e Kubernetes li alloca dinamicamente, in modo simile ai volumi di archiviazione. I tuoi workload di AI non devono avere come target nodi specifici o richiedere il numero esatto di dispositivi collegati. Questo documento mostra come configurare i workload GPU in modo che utilizzino l'allocazione dinamica delle risorse.

Prima di iniziare

Prima di configurare i workload GPU in modo che utilizzino l'allocazione dinamica delle risorse, verifica che siano soddisfatti i seguenti prerequisiti:

  • Il cluster bare metal è alla versione 1.33.0 o successiva.
  • Il tuo sistema operativo è Ubuntu 22.04 o Red Hat Enterprise Linux (RHEL) 9.4.
  • Hai aggiornato il cluster per attivare l'allocazione dinamica delle risorse come descritto in Attiva l'allocazione dinamica delle risorse.
  • Hai almeno una macchina nodo con una GPU collegata e il driver GPU NVIDIA installato. Per ulteriori informazioni, consulta Installa o disinstalla l'operatore GPU NVIDIA in bundle.
  • Se utilizzi l'operatore GPU NVIDIA integrato, la versione 1.33.0 o successive abilita Container Device Interface (CDI) per impostazione predefinita. Se utilizzi un operatore GPU installato manualmente, assicurati che la CDI sia abilitata in ClusterPolicy.
  • Hai seguito le istruzioni riportate in Driver NVIDIA DRA per GPU per installare il driver NVIDIA DRA su tutti i nodi collegati alla GPU.

Crea workload GPU che utilizzano l'allocazione dinamica delle risorse

Affinché i workload GPU possano sfruttare l'allocazione dinamica delle risorse per richiedere GPU, devono trovarsi in uno spazio dei nomi condiviso con un ResourceClaim che descrive la richiesta di allocazione dei dispositivi GPU. I tuoi workload devono fare riferimento alla ResourceClaim affinché Kubernetes possa assegnare le risorse GPU.

I passaggi seguenti configurano un ambiente in cui i workload utilizzano l'allocazione dinamica delle risorse per richiedere risorse GPU:

  1. Per creare risorse correlate all'allocazione dinamica delle risorse, crea un nuovo Namespace nel tuo cluster:

    cat <<EOF | kubectl apply --kubeconfig=CLUSTER_KUBECONFIG -f -
    apiVersion: v1
    kind: Namespace
    metadata:
      name: NAMESPACE_NAME
    EOF
    

    Sostituisci quanto segue:

    • CLUSTER_KUBECONFIG: il percorso del file kubeconfig del cluster utente.

    • NAMESPACE_NAME con il nome dello spazio dei nomi di allocazione dinamica delle risorse.

  2. Crea un ResourceClaim per descrivere la richiesta di accesso alle GPU:

    cat <<EOF | kubectl apply --kubeconfig=CLUSTER_KUBECONFIG -f -
    apiVersion: resource.k8s.io/v1beta1
    kind: ResourceClaim
    metadata:
      namespace: NAMESPACE_NAME
      name: RESOURCE_CLAIM_NAME
    spec:
        devices:
          requests:
          - name: gpu
            deviceClassName: gpu.nvidia.com
    EOF
    

    Sostituisci RESOURCE_CLAIM_NAME con il nome della tua richiesta di risorse per le richieste di GPU.

  3. Crea workload che fanno riferimento alla risorsa ResourceClaim creata nel passaggio precedente.

    I seguenti esempi di workload mostrano come fare riferimento a un ResourceClaim denominato gpu-claim nello spazio dei nomi dra-test. I container nel pod pod1 sono esempi di Compute Unified Device Architecture (CUDA) di NVIDIA progettati per eseguire workload CUDA sulle GPU. Quando il pod pod1 viene completato correttamente, significa che la funzionalità di allocazione dinamica delle risorse funziona correttamente ed è pronta per gestire le risorse GPU nel cluster.

    Ubuntu

    1. Utilizza il comando seguente per applicare il manifest al cluster:

      cat <<EOF | kubectl apply --kubeconfig=CLUSTER_KUBECONFIG -f -
      apiVersion: v1
      kind: Pod
      metadata:
        name: pod1
        namespace: dra-test
      spec:
        restartPolicy: OnFailure
        resourceClaims:
          - name: gpu
            resourceClaimName: gpu-claim
        containers:
          - name: ctr0
            image: nvcr.io/nvidia/k8s/cuda-sample:vectoradd-cuda12.5.0
            resources:
              claims:
                - name: gpu
          - name: ctr1
            image: nvcr.io/nvidia/k8s/cuda-sample:devicequery
            resources:
              claims:
                - name: gpu
      EOF
      

    RHEL

    1. Utilizza il comando seguente per applicare il manifest al cluster:

      cat <<EOF | kubectl apply --kubeconfig=CLUSTER_KUBECONFIG -f -
      apiVersion: v1
      kind: Pod
      metadata:
        name: pod1
        namespace: dra-test
      spec:
        restartPolicy: OnFailure
      
        resourceClaims:
          - name: gpu
            resourceClaimName: gpu-claim
        containers:
          - name: ctr0
            image: nvcr.io/nvidia/k8s/cuda-sample:vectoradd-cuda12.5.0
            resources:
              claims:
                - name: gpu
          - name: ctr1
            image: nvcr.io/nvidia/k8s/cuda-sample:devicequery
            resources:
              claims:
                - name: gpu
      EOF
      

Limitazioni

Tieni presenti le seguenti limitazioni quando utilizzi l'allocazione dinamica delle risorse:

  • Quando utilizzi il sistema operativo RHEL con una versione supportata dell'operatore GPU NVIDIA, la Container Device Interface (CDI) gestisce automaticamente l'inserimento dei dispositivi e l'etichettatura SELinux. Non è necessario utilizzare la configurazione manuale della policy SELinux o impostare il pod securityContext.

  • Questa funzionalità utilizza il gruppo di API resource.k8s.io/v1beta1, che è diverso dal gruppo di API Kubernetes open source per questa funzionalità, resource.k8s.io/v1. Il gruppo di API open source v1 offre più funzionalità e una maggiore stabilità rispetto al gruppo di API v1beta1.

Passaggi successivi