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:
- O cluster bare metal está na versão 1.33.0 ou posterior.
- O seu sistema operativo é o Ubuntu 22.04 ou o Red Hat Enterprise Linux (RHEL) 9.4.
- Atualizou o cluster para ativar a atribuição dinâmica de recursos, conforme descrito no artigo Ative a atribuição dinâmica de recursos.
- Tem, pelo menos, uma máquina de nó com uma GPU anexada e o controlador da GPU NVIDIA instalado. Para mais informações, consulte o artigo Instale ou desinstale o operador de GPU da NVIDIA incluído.
- Seguiu as instruções em Controlador NVIDIA DRA para GPUs para instalar o controlador NVIDIA DRA em todos os nós ligados à GPU.
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:
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.
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.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
ResourceClaim
namedgpu-claim
no espaço de nomesdra-test
. Os contentores nopod1
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 opod1
pod é 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
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
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.
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 dev1
código aberto oferece mais funcionalidades e melhor estabilidade do que o grupo de APIsv1beta1
.
O que se segue?
- Consulte a documentação do Kubernetes para mais informações sobre a atribuição dinâmica de recursos.
- Saiba como publicar MDIs de terceiros em hardware dedicado.