Faça a gestão de dispositivos GPU com a atribuição dinâmica de recursos

Esta página descreve como configurar as suas cargas de trabalho de GPU para usar a atribuição dinâmica de recursos nos clusters Bare Metal do Google Distributed Cloud. A atribuição dinâmica de recursos é uma API Kubernetes que lhe permite pedir e partilhar recursos genéricos, como GPUs, entre Pods e contentores. Os controladores de terceiros gerem estes recursos.

Com a atribuição dinâmica de recursos, o Kubernetes agenda pods com base na configuração do dispositivo referenciado. Os operadores de apps não precisam de selecionar nós específicos nas respetivas cargas de trabalho nem garantir que cada Pod pede exatamente o número de dispositivos anexados a esses nós. Este processo é semelhante à atribuição de volumes para armazenamento.

Esta capacidade ajuda a executar cargas de trabalho de IA através da alocação dinâmica e precisa dos recursos de GPU nos seus clusters bare metal, o que melhora a utilização dos recursos e o desempenho para cargas de trabalho exigentes.

Esta página destina-se a administradores, arquitetos e operadores que gerem o ciclo de vida da infraestrutura tecnológica subjacente. Para saber mais sobre as funções comuns e exemplos de tarefas que referimos no conteúdo, consulte o artigo Funções de utilizador e tarefas comuns do GKE Enterprise. Google Cloud

Antes de começar

Antes de configurar as cargas de trabalho da GPU para usar a atribuição dinâmica de recursos, verifique se os seguintes pré-requisitos são cumpridos:

Crie cargas de trabalho de GPU que usam a atribuição dinâmica de recursos

Para que as cargas de trabalho da GPU tirem partido da atribuição dinâmica de recursos para pedir GPUs, têm de estar num espaço de nomes partilhado com um ResourceClaim que descreva o pedido de atribuição de dispositivos GPU. As suas cargas de trabalho têm de fazer referência ao ResourceClaim para que o Kubernetes atribua recursos de GPU.

Os passos seguintes configuram um ambiente no qual as suas cargas de trabalho usam a atribuição dinâmica de recursos para pedir recursos de GPU:

  1. Para criar recursos relacionados com a atribuição dinâmica de recursos, crie um novo Namespace no seu cluster:

    cat <<EOF | kubectl apply --kubeconfig=CLUSTER_KUBECONFIG -f -
    apiVersion: v1
    kind: Namespace
    metadata:
      name: NAMESPACE_NAME
    EOF
    

    Substitua o seguinte:

    • CLUSTER_KUBECONFIG: o caminho do ficheiro kubeconfig do cluster de utilizadores.

    • NAMESPACE_NAME com o nome do espaço de nomes de alocação de recursos dinâmicos.

  2. Crie um ResourceClaim para descrever o pedido de acesso à GPU:

    cat <<EOF | kubectl apply --kubeconfig=CLUSTER_KUBECONFIG -f -
    apiVersion: resource.k8s.io/v1beta1
    kind: ResourceClaim
    metadata:
      namespace: NAMESPACE_NAME
      name: RESOURCE_CLAIM_NAME
    spec:
        devices:
          requests:
          - name: gpu
            deviceClassName: gpu.nvidia.com
    EOF
    

    Substitua RESOURCE_CLAIM_NAME pelo nome da sua reivindicação de recursos para pedidos de GPU.

  3. Crie cargas de trabalho que façam referência ao ResourceClaim criado no passo anterior.

    Os exemplos de carga de trabalho seguintes mostram como fazer referência a um ResourceClaimnamed gpu-claim no espaço de nomes dra-test. Os contentores no pod1 pod são exemplos da arquitetura de dispositivos unificados de computação (CUDA) da NVIDIA concebidos para executar cargas de trabalho da CUDA nas GPUs. Quando o pod1pod é concluído com êxito, indica que a capacidade de atribuição dinâmica de recursos está a funcionar corretamente e que a atribuição dinâmica de recursos está pronta para gerir recursos de GPU no seu cluster.

    Ubuntu

    1. Use o seguinte comando para aplicar o manifesto ao seu cluster:

      cat <<EOF | kubectl apply --kubeconfig=CLUSTER_KUBECONFIG -f -
      apiVersion: v1
      kind: Pod
      metadata:
        name: pod1
        namespace: dra-test
      spec:
        restartPolicy: OnFailure
        resourceClaims:
          - name: gpu
            resourceClaimName: gpu-claim
        containers:
          - name: ctr0
            image: nvcr.io/nvidia/k8s/cuda-sample:vectoradd-cuda12.5.0
            resources:
              claims:
                - name: gpu
          - name: ctr1
            image: nvcr.io/nvidia/k8s/cuda-sample:devicequery
            resources:
              claims:
                - name: gpu
      EOF
      

    RHEL

    1. Transfira e instale o módulo de política SELinux nvidia_container_t, que é necessário para aceder às GPUs.

      Para mais informações, consulte o repositório dgx-selinux da NVIDIA.

    2. Use o seguinte comando para aplicar o manifesto ao seu cluster:

      cat <<EOF | kubectl apply --kubeconfig=CLUSTER_KUBECONFIG -f -
      apiVersion: v1
      kind: Pod
      metadata:
        name: pod1
        namespace: dra-test
      spec:
        restartPolicy: OnFailure
        securityContext:
          seLinuxOptions:
            type: nvidia_container_t
        resourceClaims:
          - name: gpu
            resourceClaimName: gpu-claim
        containers:
          - name: ctr0
            image: nvcr.io/nvidia/k8s/cuda-sample:vectoradd-cuda12.5.0
            resources:
              claims:
                - name: gpu
          - name: ctr1
            image: nvcr.io/nvidia/k8s/cuda-sample:devicequery
            resources:
              claims:
                - name: gpu
      EOF
      

Limitações

Tenha em atenção as seguintes limitações quando usa a atribuição dinâmica de recursos:

  • Quando usa o SO RHEL, a política SELinux pode interferir com contentores que tentam aceder a GPUs. Para mais informações, consulte o artigo Como usar GPUs em contentores no RHEL 8 bare metal.

  • Esta funcionalidade usa o grupo de APIs resource.k8s.io/v1beta1, que difere do grupo de APIs Kubernetes de código aberto para esta funcionalidade, resource.k8s.io/v1. O grupo de APIs de v1código aberto oferece mais funcionalidades e melhor estabilidade do que o grupo de APIs v1beta1.

O que se segue?