Preparar a infraestrutura do GKE para cargas de trabalho de DRA


Nesta página, explicamos como configurar sua infraestrutura do Google Kubernetes Engine (GKE) para oferecer suporte à alocação dinâmica de recursos (DRA, na sigla em inglês). Nesta página, você vai criar clusters que podem implantar cargas de trabalho de GPU ou TPU e instalar manualmente os drivers necessários para ativar o DRA.

Esta página é destinada a administradores de plataforma que querem reduzir a complexidade e a sobrecarga da configuração de infraestrutura com dispositivos de hardware especializados.

Sobre o DRA

O DRA é um recurso integrado do Kubernetes que permite solicitar, alocar e compartilhar hardware de maneira flexível no cluster entre pods e contêineres. Para mais informações, consulte Sobre a alocação dinâmica de recursos.

Limitações

  • O provisionamento automático de nós não é compatível.
  • Os clusters do Autopilot não são compatíveis com DRA.
  • A instalação automática de drivers de GPU não é compatível com o DRA.
  • Não é possível usar os seguintes recursos de compartilhamento de GPU:
    • GPUs de compartilhamento de tempo
    • GPUs com várias instâncias
    • Serviço multiprocesso (MPS)

Requisitos

Para usar o DRA, a versão do GKE precisa ser 1.32.1-gke.1489001 ou mais recente.

Você também precisa conhecer os seguintes requisitos e limitações, dependendo do tipo de hardware que quer usar:

Antes de começar

Antes de começar, verifique se você realizou as tarefas a seguir:

  • Ativar a API Google Kubernetes Engine.
  • Ativar a API Google Kubernetes Engine
  • Se você quiser usar a CLI do Google Cloud para essa tarefa, instale e inicialize a gcloud CLI. Se você instalou a gcloud CLI anteriormente, instale a versão mais recente executando gcloud components update.
  • Se você não estiver usando o Cloud Shell, instale a CLI do Helm:

    curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3
    chmod 700 get_helm.sh
    ./get_helm.sh
    

Criar um cluster do GKE Standard

Crie um cluster no modo padrão que ative as APIs Beta do Kubernetes para DRA:

   gcloud container clusters create CLUSTER_NAME \
       --enable-kubernetes-unstable-apis="resource.k8s.io/v1beta1/deviceclasses,resource.k8s.io/v1beta1/resourceclaims,resource.k8s.io/v1beta1/resourceclaimtemplates,resource.k8s.io/v1beta1/resourceslices" \
       --cluster-version=GKE_VERSION

Substitua:

  • CLUSTER_NAME: um nome para o cluster.
  • GKE_VERSION: a versão do GKE a ser usada para o cluster e os nós. Precisa ser 1.32.1-gke.1489001 ou mais recente.

Criar um pool de nós do GKE com GPUs ou TPUs

No GKE, é possível usar o DRA com GPUs e TPUs. As configurações de configuração do pool de nós, como tipo de máquina, tipo e contagem de acelerador, sistema operacional e locais dos nós, dependem dos seus requisitos.

GPU

Para usar o DRA com GPUs, faça o seguinte ao criar o pool de nós:

  • Desative a instalação automática do driver da GPU com gpu-driver-version=disabled.
  • Desative o plug-in do dispositivo GPU adicionando o identificador de nó gke-no-default-nvidia-gpu-device-plugin=true.
  • Permita que o DaemonSet do driver DRA seja executado nos nós adicionando o rótulo de nó nvidia.com/gpu.present=true.

Para criar um pool de nós de GPU para o DRA, siga estas etapas:

  1. Crie um pool de nós com o hardware necessário. O exemplo a seguir cria um pool de nós com instâncias g2-standard-24 no Container-Optimized OS com duas GPUs L4.

    gcloud container node-pools create NODEPOOL_NAME \
        --cluster=CLUSTER_NAME \
        --machine-type "g2-standard-24" \
        --accelerator "type=nvidia-l4,count=2,gpu-driver-version=disabled" \
        --num-nodes "1" \
        --node-labels=gke-no-default-nvidia-gpu-device-plugin=true,nvidia.com/gpu.present=true
    

    Substitua:

    • NODEPOOL_NAME: o nome do pool de nós.
    • CLUSTER_NAME: o nome do cluster.
  2. Instale manualmente os drivers no Container-Optimized OS ou nós do Ubuntu. Para instruções detalhadas, consulte Instale manualmente os drivers de GPU NVIDIA.

TPU

Para usar o DRA com TPUs, desative o plug-in do dispositivo TPU adicionando o rótulo do nó gke-no-default-tpu-device-plugin=true.

Crie um pool de nós que use TPUs. O exemplo a seguir cria um pool de nós da TPU Trillium:

gcloud container node-pools create NODEPOOL_NAME \
    --cluster CLUSTER_NAME --num-nodes 1 \
    --node-labels "gke-no-default-tpu-device-plugin=true,gke-no-default-tpu-dra-plugin=true" \
    --machine-type=ct6e-standard-8t

Substitua:

  • NODEPOOL_NAME: o nome do pool de nós.
  • CLUSTER_NAME: o nome do cluster.

Instalar drivers DRA

GPU

  1. Extraia e atualize o gráfico do Helm que contém o driver DRA da NVIDIA:

    helm repo add nvidia https://helm.ngc.nvidia.com/nvidia \
        && helm repo update
    
  2. Instale o driver NVIDIA DRA com a versão 25.3.0-rc.4:

    helm install nvidia-dra-driver-gpu nvidia/nvidia-dra-driver-gpu --version="25.3.0-rc.4" --create-namespace --namespace nvidia-dra-driver-gpu \
        --set nvidiaDriverRoot="/home/kubernetes/bin/nvidia/" \
        --set gpuResourcesEnabledOverride=true \
        --set resources.computeDomains.enabled=false \
        --set kubeletPlugin.priorityClassName="" \
        --set kubeletPlugin.tolerations[0].key=nvidia.com/gpu \
        --set kubeletPlugin.tolerations[0].operator=Exists \
        --set kubeletPlugin.tolerations[0].effect=NoSchedule
    

    Para nós do Ubuntu, use o caminho do diretório nvidiaDriverRoot="/opt/nvidia".

TPU

É possível instalar drivers DRA para TPUs com o gráfico Helm fornecido. Para acessar os gráficos do Helm, siga estas etapas:

  1. Clone o repositório ai-on-gke para acessar os gráficos do Helm que contêm os drivers DRA para GPUs e TPUs:

    git clone https://github.com/ai-on-gke/common-infra.git
    
  2. Navegue até o diretório que contém os gráficos:

    cd common-infra/common/charts
    
  3. Instale o driver DRA da TPU:

    ./tpu-dra-driver/install-tpu-dra-driver.sh
    

Verificar se sua infraestrutura está pronta para o DRA

Verifique se o pod do driver DRA está em execução.

GPU

kubectl get pods -n nvidia-dra-driver-gpu
NAME                                         READY   STATUS    RESTARTS   AGE
nvidia-dra-driver-gpu-kubelet-plugin-52cdm   1/1     Running   0          46s

TPU

kubectl get pods -n tpu-dra-driver
NAME                                         READY   STATUS    RESTARTS   AGE
tpu-dra-driver-kubeletplugin-h6m57           1/1     Running   0          30s

Confirme se o ResourceSlice lista os dispositivos de hardware que você adicionou:

kubectl get resourceslices -o yaml

Se você usou o exemplo na seção anterior, o ResourceSlice será semelhante ao seguinte, dependendo do tipo de hardware usado:

GPU

O exemplo a seguir cria uma máquina g2-standard-24 com duas GPUs L4.

apiVersion: v1
items:
- apiVersion: resource.k8s.io/v1beta1
  kind: ResourceSlice
  metadata:
    # lines omitted for clarity
  spec:
    devices:
    - basic:
        attributes:
          architecture:
            string: Ada Lovelace
          brand:
            string: Nvidia
          cudaComputeCapability:
            version: 8.9.0
          cudaDriverVersion:
            version: 12.9.0
          driverVersion:
            version: 575.57.8
          index:
            int: 0
          minor:
            int: 0
          productName:
            string: NVIDIA L4
          type:
            string: gpu
          uuid:
            string: GPU-4d403095-4294-6ddd-66fd-cfe5778ef56e
        capacity:
          memory:
            value: 23034Mi
      name: gpu-0
    - basic:
        attributes:
          architecture:
            string: Ada Lovelace
          brand:
            string: Nvidia
          cudaComputeCapability:
            version: 8.9.0
          cudaDriverVersion:
            version: 12.9.0
          driverVersion:
            version: 575.57.8
          index:
            int: 1
          minor:
            int: 1
          productName:
            string: NVIDIA L4
          type:
            string: gpu
          uuid:
            string: GPU-cc326645-f91d-d013-1c2f-486827c58e50
        capacity:
          memory:
            value: 23034Mi
      name: gpu-1
    driver: gpu.nvidia.com
    nodeName: gke-cluster-gpu-pool-9b10ff37-mf70
    pool:
      generation: 1
      name: gke-cluster-gpu-pool-9b10ff37-mf70
      resourceSliceCount: 1
kind: List
metadata:
  resourceVersion: ""

TPU

apiVersion: v1
items:
- apiVersion: resource.k8s.io/v1beta1
  kind: ResourceSlice
  metadata:
    # lines omitted for clarity
  spec:
    devices:
    - basic:
        attributes:
          index:
            int: 0
          tpuGen:
            string: v6e
          uuid:
            string: tpu-54de4859-dd8d-f67e-6f91-cf904d965454
      name: "0"
    - basic:
        attributes:
          index:
            int: 1
          tpuGen:
            string: v6e
          uuid:
            string: tpu-54de4859-dd8d-f67e-6f91-cf904d965454
      name: "1"
    - basic:
        attributes:
          index:
            int: 2
          tpuGen:
            string: v6e
          uuid:
            string: tpu-54de4859-dd8d-f67e-6f91-cf904d965454
      name: "2"
    - basic:
        attributes:
          index:
            int: 3
          tpuGen:
            string: v6e
          uuid:
            string: tpu-54de4859-dd8d-f67e-6f91-cf904d965454
      name: "3"
    driver: tpu.google.com
    nodeName: gke-tpu-b4d4b61b-fwbg
    pool:
      generation: 1
      name: gke-tpu-b4d4b61b-fwbg
      resourceSliceCount: 1
kind: List
metadata:
  resourceVersion: ""

A seguir