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. Para executar cargas de trabalho de contêineres de GPU, é necessário ter um cluster do Kubernetes compatível com dispositivos de GPU. O suporte a GPU é ativado por padrão para clusters do Kubernetes que têm máquinas de GPU provisionadas para eles.

Este documento é destinado a desenvolvedores de aplicativos no grupo de operadores de aplicativos responsáveis por criar cargas de trabalho de aplicativos para a organização. Para mais informações, consulte Públicos-alvo da documentação do GDC com isolamento físico.

Antes de começar

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

  • Um cluster do Kubernetes com uma classe de máquina de GPU. Confira a seção placas de GPU compatíveis para ver as opções de configuração das máquinas do cluster.

  • O papel de administrador do cluster de usuário (user-cluster-admin) para verificar GPUs em um cluster compartilhado e o papel de administrador do namespace (namespace-admin) no namespace do projeto para implantar cargas de trabalho de GPU em um cluster compartilhado.

  • O papel de administrador do cluster padrão (standard-cluster-admin) para verificar GPUs em um cluster padrão e o papel de desenvolvedor do cluster (cluster-developer) no cluster padrão para implantar cargas de trabalho de GPU em um cluster padrão.

  • Para executar comandos em um cluster do Kubernetes, verifique se você tem os seguintes recursos:

    • Localize o nome do cluster do Kubernetes ou pergunte a um membro do grupo de administradores da plataforma.

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

    • Use o caminho kubeconfig do cluster do Kubernetes para substituir KUBERNETES_CLUSTER_KUBECONFIG nestas instruções.

  • O caminho do kubeconfig para o servidor da API de gerenciamento zonal que hospeda seu cluster do Kubernetes. Faça login e gere o arquivo kubeconfig se você não tiver um.

  • O caminho kubeconfig do cluster de infraestrutura da organização na zona destinada a hospedar suas GPUs. 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 essas GPUs em um contêiner, siga estas etapas:

  1. Verifique se o cluster do Kubernetes tem pools de nós que oferecem suporte a GPUs:

    kubectl describe clusters.cluster.gdc.goog/KUBERNETES_CLUSTER_NAME \
        -n KUBERNETES_CLUSTER_NAMESPACE \
        --kubeconfig MANAGEMENT_API_SERVER
    

    Substitua:

    • KUBERNETES_CLUSTER_NAME: o nome do cluster.
    • KUBERNETES_CLUSTER_NAMESPACE: o namespace do cluster. Para clusters compartilhados, use o namespace platform. Para clusters padrão, use o namespace do projeto do cluster.
    • MANAGEMENT_API_SERVER: o caminho kubeconfig do servidor da API zonal em que o cluster do Kubernetes está hospedado. Se você ainda não gerou um arquivo kubeconfig para o servidor da API na zona de destino, consulte Fazer login.

    A saída relevante é semelhante ao seguinte snippet:

    # Several lines of code are omitted here.
    spec:
      nodePools:
      - machineTypeName: a2-ultragpu-1g-gdc
        nodeCount: 2
    # Several lines of code are omitted here.
    

    Para uma lista completa de tipos de máquinas com GPU e perfis de GPU de várias instâncias (MIG) compatíveis, consulte Tipos de máquinas de nós de cluster.

  2. Adicione os campos .containers.resources.requests e .containers.resources.limits à especificação do contêiner. Cada nome de recurso é diferente dependendo da classe da máquina. Verifique sua alocação de recursos de GPU para encontrar os nomes dos recursos de GPU.

    Por exemplo, a especificação de contêiner a seguir solicita três partições de uma GPU de um nó a2-ultragpu-1g-gdc:

     ...
     containers:
     - name: my-container
       image: "my-image"
       resources:
         requests:
           nvidia.com/mig-1g.10gb-NVIDIA_A100_80GB_PCIE: 3
         limits:
           nvidia.com/mig-1g.10gb-NVIDIA_A100_80GB_PCIE: 3
     ...
    
  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 KUBERNETES_CLUSTER_NAMESPACE \
        --kubeconfig KUBERNETES_CLUSTER_KUBECONFIG
    

    Substitua:

    • CONTAINER_MANIFEST_FILE: o arquivo de manifesto YAML para sua carga de trabalho de contêiner.
    • KUBERNETES_CLUSTER_NAMESPACE: o namespace do cluster. Para clusters compartilhados, use o namespace platform. Para clusters padrão, use o namespace do projeto do cluster.
    • KUBERNETES_CLUSTER_KUBECONFIG: o caminho kubeconfig do cluster.

Verificar a alocação de recursos da GPU

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

    kubectl describe nodes NODE_NAME --kubeconfig KUBERNETES_CLUSTER_KUBECONFIG
    

    Substitua:

    • NODE_NAME: o nó que gerencia as GPUs que você quer inspecionar.
    • KUBERNETES_CLUSTER_KUBECONFIG: o caminho kubeconfig do cluster.

    A saída relevante é semelhante ao seguinte snippet:

    # Several lines of code are omitted here.
    Capacity:
      nvidia.com/mig-1g.10gb-NVIDIA_A100_80GB_PCIE: 7
    Allocatable:
      nvidia.com/mig-1g.10gb-NVIDIA_A100_80GB_PCIE: 7
    # Several lines of code are omitted here.
    

Anote os nomes dos recursos das GPUs. Eles precisam ser especificados ao configurar um contêiner para usar recursos de GPU.

A seguir