Gerenciar cargas de trabalho de GPU

Esta página descreve como ativar e gerenciar cargas de trabalho da unidade de processamento gráfico (GPU) no Google Distributed Cloud. Para aproveitar essa funcionalidade, você precisa ter uma configuração de hardware do Distributed Cloud que contenha GPUs. O suporte a GPU fica desativado por padrão. É necessário ativar explicitamente o suporte a GPUs no cluster do Distributed Cloud.

Para planejar e pedir uma configuração desse tipo, escolha a configuração 2 nos seguintes documentos:

Se o rack do Distributed Cloud incluir GPUs, você poderá configurar as cargas de trabalho do Distributed Cloud para usar recursos de GPU.

As cargas de trabalho do Distributed Cloud podem ser executadas em contêineres e em máquinas virtuais:

  • Cargas de trabalho de GPU executadas em contêineres. Quando você ativa o suporte a GPU, todos os recursos de GPU no cluster do Distributed Cloud são inicialmente alocados para cargas de trabalho em execução em contêineres. O driver de GPU para executar cargas de trabalho em contêineres baseadas em GPU está incluído no Distributed Cloud. Em cada contêiner, as bibliotecas de GPU são montadas em /opt/nvidia.

  • Cargas de trabalho de GPU em execução em máquinas virtuais. Para executar uma carga de trabalho baseada em GPU em uma máquina virtual, aloque recursos de GPU no nó de destino do Distributed Cloud para máquinas virtuais, conforme descrito mais adiante nesta página. Isso ignora o driver de GPU integrado e passa as GPUs diretamente para as máquinas virtuais. É necessário instalar manualmente um driver de GPU compatível no sistema operacional convidado de cada máquina virtual. Você também precisa proteger todas as licenças necessárias para executar drivers de GPU especializados nas máquinas virtuais.

Para confirmar se as GPUs estão presentes em um nó do Distributed Cloud, verifique se o nó tem o rótulo vm.cluster.gke.io.gpu=true. Se o rótulo não estiver presente no nó, não haverá GPUs instaladas na máquina física correspondente do Distributed Cloud.

Ativar suporte a GPU

Para ativar o suporte a GPU nas suas cargas de trabalho, crie ou modifique o recurso personalizado VMRuntime que contém o parâmetro enableGPU com o valor definido como true e aplique-o ao cluster do Distributed Cloud. Exemplo:

apiVersion: vm.cluster.gke.io/v1
kind: VMRuntime
metadata:
  name: vmruntime
spec:
  # Enable GPU support
  enableGPU: true

Dependendo do tipo de cluster em que você quer ativar o VM Runtime no subsistema de máquina virtual do GDC, faça o seguinte:

  • Para clusters do plano de controle do Cloud em que você ainda não ativou o ambiente de execução de VMs no subsistema de máquina virtual do GDC, é necessário criar manualmente o recurso VMRuntime.
  • Para clusters do plano de controle do Cloud em que você já ativou o subsistema de máquina virtual do ambiente de execução de VM no GDC, edite o recurso VMRuntime atual
  • Para clusters de plano de controle local, edite o recurso VMRuntime atual.

O mesmo recurso VMRuntime também configura o suporte do ambiente de execução de VM no GDC no cluster usando o parâmetro enable. Configure os dois parâmetros de acordo com as necessidades da sua carga de trabalho. Não é necessário ativar o suporte do ambiente de execução de VMs no GDC para ativar o suporte a GPUs no cluster do Distributed Cloud.

A tabela a seguir descreve as configurações disponíveis.

Valor de enable Valor de enableGPU Configuração resultante
false false As cargas de trabalho são executadas apenas em contêineres e não podem usar recursos de GPU.
false true As cargas de trabalho são executadas apenas em contêineres e podem usar recursos de GPU.
true true

As cargas de trabalho podem ser executadas em máquinas virtuais e em contêineres.

Os dois tipos de cargas de trabalho podem usar recursos de GPU.

true false

As cargas de trabalho podem ser executadas em máquinas virtuais e em contêineres.

Nenhum dos tipos de carga de trabalho pode usar recursos de GPU.

Verificar se o suporte à GPU foi ativado

Para verificar se o suporte a GPU foi ativado no cluster, use o seguinte comando:

kubectl get pods --namespace vm-system

O comando retorna uma saída semelhante a este exemplo:

NAME                                         READY   STATUS     RESTARTS  AGE
...
gpu-controller-controller-manager-vbv4w      2/2     Running    0         31h
kubevirt-gpu-dp-daemonset-gxj7g              1/1     Running    0         31h
nvidia-gpu-dp-daemonset-bq2vj                1/1     Running    0         31h
...

Na saída, verifique se os pods do controlador de GPU foram implantados e estão em execução no namespace vm-system.

Alocar recursos de GPU

Por padrão, quando você ativa o suporte a GPU no cluster do Distributed Cloud, todos os recursos de GPU em cada nó do cluster são alocados para cargas de trabalho conteinerizadas. Para personalizar a alocação de recursos de GPU em cada nó, siga as etapas desta seção.

Configurar a alocação de recursos de GPU

  1. Para alocar recursos de GPU em um nó do Distributed Cloud, use o comando a seguir para editar o recurso personalizado GPUAllocation no nó de destino:

    kubectl edit gpuallocation NODE_NAME --namespace vm-system

    Substitua NODE_NAME pelo nome do nó de destino do Distributed Cloud.

    No exemplo a seguir, a saída do comando mostra a alocação de recursos da GPU padrão de fábrica. Por padrão, todos os recursos de GPU são alocados para cargas de trabalho conteinerizadas (pod), e nenhum recurso de GPU é alocado para cargas de trabalho de máquina virtual (vm):

    ...
    spec:
      pod:   2  # Number of GPUs allocated for container workloads
      vm:    0  # Number of GPUs allocated for VM workloads
    
  2. Defina as alocações de recursos de GPU da seguinte maneira:

    • Para alocar um recurso de GPU a cargas de trabalho em contêineres, aumente o valor do campo pod e diminua o valor do campo vm na mesma quantidade.
    • Para alocar um recurso de GPU a cargas de trabalho máquina virtual, aumente o valor do campo vm e diminua o valor do campo pod na mesma quantidade.

    O número total de recursos de GPU alocados não pode exceder o número de GPUs instaladas na máquina física do Distributed Cloud em que o nó é executado. Caso contrário, o nó rejeita a alocação inválida.

    No exemplo a seguir, dois recursos de GPU foram realocados de cargas de trabalho em contêineres (pod) para cargas de trabalho de máquina virtual (vm):

    ...
    spec:
      pod:   0  # Number of GPUs allocated for container workloads
      vm:    2  # Number of GPUs allocated for VM workloads
    

    Quando terminar, aplique o recurso GPUAllocation modificado ao cluster e aguarde a mudança de status para AllocationFulfilled.

Verificar a alocação de recursos da GPU

  • Para verificar a alocação de recursos da GPU, use o seguinte comando:

    kubectl describe gpuallocations NODE_NAME --namespace vm-system

    Substitua NODE_NAME pelo nome do nó de destino do Distributed Cloud.

    O comando retorna uma saída semelhante a este exemplo:

     Name:         mynode1
     ...
     spec:
       node:  mynode1
       pod:   2  # Number of GPUs allocated for container workloads
       vm:    0  # Number of GPUs allocated for VM workloads
     Status:
       Allocated:  true
       Conditions:
         Last Transition Time:  2022-09-23T03:14:10Z
         Message:
         Observed Generation:   1
         Reason:                AllocationFulfilled
         Status:                True
         Type:                  AllocationStatus
         Last Transition Time:  2022-09-23T03:14:16Z
         Message:
         Observed Generation:   1
         Reason:                DeviceStateUpdated
         Status:                True
         Type:                  DeviceStateUpdated
       Consumption:
         pod:         0/2   # Number of GPUs currently consumed by container workloads
         vm:          0/0   # Number of GPUs currently consumed by VM workloads
       Device Model:  Tesla T4
     Events:          <none>
    

Configurar um contêiner para usar recursos de GPU

Para configurar um contêiner em execução no Distributed Cloud para usar recursos de GPU, configure a especificação dele conforme mostrado no exemplo a seguir e aplique ao cluster:

  apiVersion: v1
  kind: Pod
  metadata:
    name: my-gpu-pod
  spec:
    containers:
    - name: my-gpu-container
      image: CUDA_TOOLKIT_IMAGE
      command: ["/bin/bash", "-c", "--"]
      args: ["while true; do sleep 600; done;"]
      env:
      resources:
        requests:
        nvidia.com/gpu-pod-TESLA_T4: 2
        limits:
        nvidia.com/gpu-pod-TESLA_T4: 2
    nodeSelector:
      kubernetes.io/hostname: NODE_NAME

Substitua:

  • CUDA_TOOLKIT_IMAGE: o caminho completo e o nome da imagem do kit de ferramentas NVIDIA CUDA. A versão do kit de ferramentas CUDA precisa corresponder à versão do driver da NVIDIA em execução no cluster do Distributed Cloud. Para determinar a versão do driver NVIDIA, consulte as Notas da versão do Distributed Cloud. Para encontrar a versão correspondente do kit de ferramentas CUDA, consulte Compatibilidade com CUDA.
  • NODE_NAME: o nome do nó de destino do Distributed Cloud.

Configurar uma máquina virtual para usar recursos de GPU

Para configurar uma máquina virtual em execução no Distributed Cloud para usar recursos de GPU, configure a especificação de recursos VirtualMachine, conforme mostrado no exemplo a seguir, e aplique ao cluster:

apiVersion: vm.cluster.gke.io/v1
kind: VirtualMachine
...
spec:
  ...
  gpu:
    model: nvidia.com/gpu-vm-TESLA_T4
    quantity: 2

A seguir