Gestire i dispositivi GPU con l'allocazione dinamica delle risorse

Questa pagina descrive come configurare i carichi di lavoro GPU per utilizzare l'allocazione dinamica delle risorse nei cluster Google Distributed Cloud bare metal. L'allocazione dinamica delle risorse è un'API Kubernetes che ti consente di richiedere e condividere risorse generiche, come GPU, tra pod e container. I driver di terze parti gestiscono queste risorse.

Con l'allocazione dinamica delle risorse, Kubernetes pianifica i pod in base alla configurazione del dispositivo a cui viene fatto riferimento. Gli operatori delle app non devono selezionare nodi specifici nei loro carichi di lavoro e non devono assicurarsi che ogni pod richieda esattamente il numero di dispositivi collegati a questi nodi. Questa procedura è simile all'allocazione dei volumi per l'archiviazione.

Questa funzionalità ti aiuta a eseguire i workload di AI allocando in modo dinamico e preciso le risorse GPU all'interno dei cluster bare metal, migliorando l'utilizzo e le prestazioni delle risorse per i workload più impegnativi.

Questa pagina è rivolta ad amministratori, architetti e operatori che gestiscono il ciclo di vita dell'infrastruttura tecnologica sottostante. Per scoprire di più sui ruoli comuni e sulle attività di esempio a cui facciamo riferimento nei contenuti, consulta Ruoli e attività comuni degli utenti di GKE Enterprise. Google Cloud

Prima di iniziare

Prima di configurare i tuoi workload GPU per utilizzare l'allocazione dinamica delle risorse, verifica che siano soddisfatti i seguenti prerequisiti:

Crea workload GPU che utilizzano l'allocazione dinamica delle risorse

Affinché i carichi di lavoro GPU sfruttino l'allocazione dinamica delle risorse per richiedere GPU, devono trovarsi in uno spazio dei nomi condiviso con un ResourceClaim che descriva la richiesta di allocazione dei dispositivi GPU. I tuoi workload devono fare riferimento a ResourceClaim affinché Kubernetes possa assegnare risorse GPU.

I seguenti passaggi configurano un ambiente in cui i tuoi 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 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 per l'allocazione dinamica delle risorse.

  2. Crea un ResourceClaim per descrivere la richiesta di accesso alla 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 richiesta di rivendicazione di risorse per le richieste di GPU.

  3. Crea workload che fanno riferimento a ResourceClaim creato 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 architettura di calcolo unificata (CUDA) NVIDIA progettati per eseguire carichi di lavoro CUDA sulle GPU. Quando il pod pod1 viene completato correttamente, indica che la funzionalità di allocazione dinamica delle risorse funziona correttamente ed è pronta a gestire le risorse GPU nel cluster.

    Ubuntu

    1. Utilizza il seguente comando 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. Scarica e installa il modulo di policy SELinux nvidia_container_t, necessario per accedere alle GPU.

      Per ulteriori informazioni, consulta il repository dgx-selinux di NVIDIA.

    2. Utilizza il seguente comando 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
        securityContext:
          seLinuxOptions:
            type: nvidia_container_t
        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, la policy SELinux può interferire con i container che tentano di accedere alle GPU. Per ulteriori informazioni, consulta Come utilizzare le GPU nei container su RHEL 8 bare metal.

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

Passaggi successivi