Gerenciar cargas de trabalho de contêineres de GPU

É possível ativar e gerenciar recursos de unidade de processamento gráfico (GPU) nos seus contêineres. Por exemplo, talvez você prefira executar notebooks de inteligência artificial (IA) e machine learning (ML) em um ambiente de GPU. O suporte a GPU é ativado por padrão no dispositivo com isolamento físico do Google Distributed Cloud (GDC).

Antes de começar

Para implantar GPUs nos contêineres, você precisa ter o seguinte:

  • A função de administrador de namespace (namespace-admin) para implantar cargas de trabalho de GPU no namespace do projeto.

  • O caminho do kubeconfig para o cluster do Kubernetes bare metal. Faça login e gere o arquivo kubeconfig se você não tiver um.

Configurar um contêiner para usar recursos de GPU

Para usar GPUs em um contêiner, siga estas etapas:

  1. Confirme se os nós do cluster do Kubernetes oferecem suporte à alocação de recursos de GPU:

    kubectl describe nodes NODE_NAME
    

    Substitua NODE_NAME pelo nó que gerencia as GPUs que você quer inspecionar.

    A saída relevante é semelhante ao seguinte snippet:

    Capacity:
      nvidia.com/gpu-pod-NVIDIA_A100_80GB_PCIE: 1
    Allocatable:
      nvidia.com/gpu-pod-NVIDIA_A100_80GB_PCIE: 1
    
  2. Adicione os campos .containers.resources.requests e .containers.resources.limits à especificação do contêiner. Como o cluster do Kubernetes já está pré-configurado com máquinas de GPU, a configuração é a mesma para todas as cargas de trabalho:

     ...
     containers:
     - name: CONTAINER_NAME
       image: CONTAINER_IMAGE
       resources:
         requests:
           nvidia.com/gpu-pod-NVIDIA_A100_80GB_PCIE: 1
         limits:
           nvidia.com/gpu-pod-NVIDIA_A100_80GB_PCIE: 1
     ...
    

    Substitua:

    • CONTAINER_NAME: o nome do contêiner.
    • CONTAINER_IMAGE: a imagem do contêiner para acessar as máquinas de GPU. É preciso incluir o caminho e a versão do registro de contêiner da imagem, como REGISTRY_PATH/hello-app:1.0.
  3. Os contêineres também exigem permissões extras para acessar GPUs. Para cada contêiner que solicita GPUs, adicione as seguintes permissões à especificação do contêiner:

    ...
    securityContext:
     seLinuxOptions:
       type: unconfined_t
    ...
    
  4. Aplique o arquivo de manifesto do contêiner:

    kubectl apply -f CONTAINER_MANIFEST_FILE \
        -n NAMESPACE \
        --kubeconfig CLUSTER_KUBECONFIG
    

    Substitua:

    • CONTAINER_MANIFEST_FILE: o arquivo YAML do recurso personalizado da carga de trabalho do contêiner.
    • NAMESPACE: o namespace do projeto em que as cargas de trabalho de contêiner serão implantadas.
    • CLUSTER_KUBECONFIG: o arquivo kubeconfig do cluster do Kubernetes bare metal em que você está implantando cargas de trabalho de contêiner.
  5. Verifique se os pods estão em execução e usando as GPUs:

    kubectl get pods -A | grep CONTAINER_NAME \
        -n NAMESPACE \
        --kubeconfig CLUSTER_KUBECONFIG
    

    A saída relevante é semelhante ao seguinte snippet:

    Port:           80/TCP
    Host Port:      0/TCP
    State:          Running
    Ready:          True
    Restart Count:  0
    Limits:
      nvidia.com/gpu-pod-NVIDIA_A100_80GB_PCIE:  1
    Requests:
      nvidia.com/gpu-pod-NVIDIA_A100_80GB_PCIE:  1