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.

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 opções de configuração para as máquinas do cluster.

  • O papel de visualizador de nós do cluster de usuário (user-cluster-node-viewer) para verificar GPUs e o papel de administrador do namespace (namespace-admin) para implantar cargas de trabalho de GPU no namespace do projeto.

  • O caminho 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.

  • O nome do cluster do Kubernetes. Peça essas informações ao administrador da plataforma se você não as tiver.

  • O caminho do kubeconfig do cluster do Kubernetes. 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 nodepoolclaims -n KUBERNETES_CLUSTER_NAME \
        --kubeconfig ORG_INFRASTRUCTURE_CLUSTER
    

    A saída relevante é semelhante ao seguinte snippet:

    Spec:
      Machine Class Name:  a2-ultragpu-1g-gdc
      Node Count:          2
    

    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 do 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 a alocação de recursos da GPU para encontrar os nomes dos recursos da 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 NAMESPACE \
        --kubeconfig KUBERNETES_CLUSTER_KUBECONFIG
    

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
    

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

    A saída relevante é semelhante ao seguinte snippet:

    Capacity:
      nvidia.com/mig-1g.10gb-NVIDIA_A100_80GB_PCIE: 7
    Allocatable:
      nvidia.com/mig-1g.10gb-NVIDIA_A100_80GB_PCIE: 7
    

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