Usar GPUs do Windows para cargas de trabalho de computação intensiva no Serviço Kubernetes do Azure (AKS) (visualização)

As unidades de processamento gráfico (GPUs) são frequentemente usadas para cargas de trabalho de computação intensiva, como cargas de trabalho gráficas e de visualização. O AKS suporta pools de nós Windows e Linux habilitados para GPU para executar cargas de trabalho Kubernetes com uso intensivo de computação.

Este artigo ajuda você a provisionar nós do Windows com GPUs escalonáveis em clusters AKS novos e existentes (visualização).

Máquinas virtuais (VMs) habilitadas para GPU suportadas

Para exibir VMs habilitadas para GPU com suporte, consulte Tamanhos de VM otimizados para GPU no Azure. Para pools de nós AKS, recomendamos um tamanho mínimo de Standard_NC6s_v3. A série NVv4 (baseada em GPUs AMD) não é suportada no AKS.

Nota

As VMs habilitadas para GPU contêm hardware especializado sujeito a preços mais altos e disponibilidade de região. Para obter mais informações, consulte a ferramenta de preços e a disponibilidade da região.

Limitações

  • Não há suporte para a atualização de um pool de nós do Windows existente para adicionar GPU.
  • Não suportado no Kubernetes versão 1.28 e inferior.

Antes de começar

  • Este artigo pressupõe que você tenha um cluster AKS existente. Se você não tiver um cluster, crie um usando a CLI do Azure, o Azure PowerShell ou o portal do Azure.
  • Você precisa da CLI do Azure versão 1.0.0b2 ou posterior instalada e configurada para usar o --skip-gpu-driver-install campo com o az aks nodepool add comando. Executar az --version para localizar a versão. Se precisar de instalar ou atualizar, veja Install Azure CLI (Instalar o Azure CLI).
  • Você precisa da CLI do Azure versão 9.0.0b5 ou posterior instalada e configurada para usar o --driver-type campo com o az aks nodepool add comando. Executar az --version para localizar a versão. Se precisar de instalar ou atualizar, veja Install Azure CLI (Instalar o Azure CLI).

Obter as credenciais para o cluster

  • Obtenha as credenciais para o seu cluster AKS usando o az aks get-credentials comando. O comando de exemplo a seguir obtém as credenciais para o myAKSCluster no grupo de recursos myResourceGroup :

    az aks get-credentials --resource-group myResourceGroup --name myAKSCluster
    

Usando a GPU do Windows com a instalação automática do driver

O uso de GPUs NVIDIA envolve a instalação de vários componentes de software NVIDIA, como o plug-in de dispositivo DirectX para Kubernetes, instalação de driver de GPU e muito mais. Quando você cria um pool de nós do Windows com uma VM habilitada para GPU suportada, esses componentes e os drivers NVIDIA CUDA ou GRID apropriados são instalados. Para tamanhos de VM das séries NC e ND, o driver CUDA está instalado. Para tamanhos de VM da série NV, o driver GRID está instalado.

Importante

Os recursos de visualização do AKS estão disponíveis em uma base de autosserviço e opt-in. As visualizações prévias são fornecidas "como estão" e "conforme disponíveis" e são excluídas dos contratos de nível de serviço e da garantia limitada. As visualizações do AKS são parcialmente cobertas pelo suporte ao cliente com base no melhor esforço. Como tal, estas funcionalidades não se destinam a utilização em produção. Para obter mais informações, consulte os seguintes artigos de suporte:

Instalar a extensão da CLI do aks-preview Azure

  • Registre ou atualize a extensão aks-preview usando o az extension add comando or az extension update .

    # Register the aks-preview extension
    az extension add --name aks-preview
    
    # Update the aks-preview extension
    az extension update --name aks-preview
    

Registrar o sinalizador de WindowsGPUPreview recurso

  1. Registre o WindowsGPUPreview sinalizador de recurso usando o az feature register comando.

    az feature register --namespace "Microsoft.ContainerService" --name "WindowsGPUPreview"
    

    Leva alguns minutos para que o status mostre Registrado.

  2. Verifique o status do registro usando o az feature show comando.

    az feature show --namespace "Microsoft.ContainerService" --name "WindowsGPUPreview"
    
  3. Quando o status refletir Registrado, atualize o registro do provedor de recursos Microsoft.ContainerService usando o az provider register comando.

    az provider register --namespace Microsoft.ContainerService
    

Criar um pool de nós habilitado para GPU do Windows (visualização)

Para criar um pool de nós habilitado para GPU do Windows, você precisa usar um tamanho de VM habilitado para GPU suportado e especificar o os-type como Windows. O Windows os-sku padrão é Windows2022, mas todas as opções do Windows os-sku são suportadas.

  1. Crie um pool de nós habilitado para GPU do Windows usando o az aks nodepool add comando.

    az aks nodepool add \
       --resource-group myResourceGroup \
       --cluster-name myAKSCluster \
       --name gpunp \
       --node-count 1 \
       --os-type Windows \
       --kubernetes-version 1.29.0 \
       --node-vm-size Standard_NC6s_v3
    
  2. Verifique se as GPUs são escalonáveis.

  3. Depois de confirmar que suas GPUs são escalonáveis, você pode executar sua carga de trabalho de GPU.

Especificar o tipo de driver de GPU (visualização)

Por padrão, o AKS especifica um tipo de driver de GPU padrão para cada VM habilitada para GPU suportada. Como a carga de trabalho e a compatibilidade de drivers são importantes para cargas de trabalho de GPU em funcionamento, você pode especificar o tipo de driver para o nó da GPU do Windows. Esse recurso não é suportado para pools de nós de GPU Linux.

Ao criar um pool de agentes do Windows com suporte a GPU, você tem a opção de especificar o tipo de driver de GPU usando o --driver-type sinalizador.

As opções disponíveis são:

  • GRID: Para aplicações que requerem suporte de virtualização.
  • CUDA: Otimizado para tarefas computacionais em computação científica e aplicações com uso intensivo de dados.

Nota

Ao definir o sinalizador, você assume a --driver-type responsabilidade de garantir que o tipo de driver selecionado seja compatível com o tamanho e a configuração específicos da VM do pool de nós. Embora o AKS tente validar a compatibilidade, há cenários em que a criação do pool de nós pode falhar devido a incompatibilidades entre o tipo de driver especificado e a VM ou hardware subjacente.

Para criar um pool de nós habilitado para GPU do Windows com um tipo de driver de GPU específico, use o az aks nodepool add comando.

az aks nodepool add \
    --resource-group myResourceGroup \
    --cluster-name myAKSCluster \
    --name gpunp \
    --node-count 1 \
    --os-type Windows \
    --kubernetes-version 1.29.0 \
    --node-vm-size Standard_NC6s_v3 \
    --driver-type GRID

Por exemplo, o comando acima cria um pool de nós habilitado para GPU usando o GRID tipo de driver de GPU. A seleção desse tipo de driver substitui o padrão do tipo de driver para skus de CUDA VM da série NC.

Usando a GPU do Windows com a instalação manual do driver

Ao criar um pool de nós do Windows com tamanhos de VM da série N (NVIDIA GPU) no AKS, o driver da GPU e o plug-in de dispositivo DirectX do Kubernetes são instalados automaticamente. Para ignorar essa instalação automática, use as seguintes etapas:

  1. Ignore a instalação do driver de GPU (visualização) usando --skip-gpu-driver-installo .
  2. Instalação manual do plug-in do dispositivo Kubernetes DirectX.

Ignorar a instalação do driver da GPU (visualização)

O AKS tem a instalação automática do driver da GPU habilitada por padrão. Em alguns casos, como instalar seus próprios drivers, você pode querer ignorar a instalação do driver de GPU.

Importante

Os recursos de visualização do AKS estão disponíveis em uma base de autosserviço e opt-in. As visualizações prévias são fornecidas "como estão" e "conforme disponíveis" e são excluídas dos contratos de nível de serviço e da garantia limitada. As visualizações do AKS são parcialmente cobertas pelo suporte ao cliente com base no melhor esforço. Como tal, estas funcionalidades não se destinam a utilização em produção. Para obter mais informações, consulte os seguintes artigos de suporte:

  1. Registre ou atualize a extensão aks-preview usando o az extension add comando or az extension update .

    # Register the aks-preview extension
    az extension add --name aks-preview
    
    # Update the aks-preview extension
    az extension update --name aks-preview
    
  2. Crie um pool de nós usando o az aks nodepool add comando com o sinalizador para ignorar a --skip-gpu-driver-install instalação automática do driver de GPU.

    az aks nodepool add \
        --resource-group myResourceGroup \
        --cluster-name myAKSCluster \
        --name gpunp \
        --node-count 1 \
        --os-type windows \
        --os-sku windows2022 \
        --skip-gpu-driver-install
    

Nota

Se o --node-vm-size que você está usando ainda não estiver integrado no AKS, você não poderá usar GPUs e --skip-gpu-driver-install não funcionará.

Instale manualmente o plug-in de dispositivo DirectX do Kubernetes

Você pode implantar um DaemonSet para o plug-in de dispositivo Kubernetes DirectX, que executa um pod em cada nó para fornecer os drivers necessários para as GPUs.

  • Adicione um pool de nós ao cluster usando o az aks nodepool add comando.

    az aks nodepool add \
        --resource-group myResourceGroup \
        --cluster-name myAKSCluster \
        --name gpunp \
        --node-count 1 \
        --os-type windows \
        --os-sku windows2022
    

Crie um namespace e implante o plug-in de dispositivo DirectX do Kubernetes

  1. Crie um namespace usando o kubectl create namespace comando.

    kubectl create namespace gpu-resources
    
  2. Crie um arquivo chamado k8s-directx-device-plugin.yaml e cole o seguinte manifesto YAML fornecido como parte do plug-in de dispositivo NVIDIA para o projeto Kubernetes:

    apiVersion: apps/v1
    kind: DaemonSet
    metadata:
      name: nvidia-device-plugin-daemonset
      namespace: gpu-resources
    spec:
      selector:
        matchLabels:
          name: nvidia-device-plugin-ds
      updateStrategy:
        type: RollingUpdate
      template:
        metadata:
          # Mark this pod as a critical add-on; when enabled, the critical add-on scheduler
          # reserves resources for critical add-on pods so that they can be rescheduled after
          # a failure.  This annotation works in tandem with the toleration below.
          annotations:
            scheduler.alpha.kubernetes.io/critical-pod: ""
          labels:
            name: nvidia-device-plugin-ds
        spec:
          tolerations:
          # Allow this pod to be rescheduled while the node is in "critical add-ons only" mode.
          # This, along with the annotation above marks this pod as a critical add-on.
          - key: CriticalAddonsOnly
            operator: Exists
          - key: nvidia.com/gpu
            operator: Exists
            effect: NoSchedule
          - key: "sku"
            operator: "Equal"
            value: "gpu"
            effect: "NoSchedule"
          containers:
          - image: mcr.microsoft.com/oss/nvidia/k8s-device-plugin:v0.14.1
            name: nvidia-device-plugin-ctr
            securityContext:
              allowPrivilegeEscalation: false
              capabilities:
                drop: ["ALL"]
            volumeMounts:
              - name: device-plugin
                mountPath: /var/lib/kubelet/device-plugins
          volumes:
            - name: device-plugin
              hostPath:
                path: /var/lib/kubelet/device-plugins
    
  3. Crie o DaemonSet e confirme se o plug-in do dispositivo NVIDIA foi criado com sucesso usando o kubectl apply comando.

    kubectl apply -f nvidia-device-plugin-ds.yaml
    
  4. Agora que você instalou com sucesso o plug-in de dispositivo NVIDIA, você pode verificar se suas GPUs são escalonáveis.

Confirme se as GPUs são escalonáveis

Depois de criar seu cluster, confirme se as GPUs são escalonáveis no Kubernetes.

  1. Liste os nós no cluster usando o kubectl get nodes comando.

    kubectl get nodes
    

    Sua saída deve ser semelhante à saída de exemplo a seguir:

    NAME                   STATUS   ROLES   AGE   VERSION
    aks-gpunp-28993262-0   Ready    agent   13m   v1.20.7
    
  2. Confirme se as GPUs são escalonáveis usando o kubectl describe node comando.

    kubectl describe node aks-gpunp-28993262-0
    

    Na seção Capacidade, a GPU deve listar como microsoft.com/directx: 1. Sua saída deve ser semelhante à seguinte saída de exemplo condensada:

    Capacity:
    [...]
     microsoft.com.directx/gpu:                 1
    [...]
    

Use o Container Insights para monitorar o uso da GPU

O Container Insights com AKS monitora as seguintes métricas de uso de GPU:

Nome da métrica Dimensão métrica (tags) Description
containerGpuDutyCycle container.azm.ms/clusterId, container.azm.ms/clusterName, containerName, gpuId, gpuModel, gpuVendor Porcentagem de tempo durante o último período de amostra (60 segundos) durante o qual a GPU esteve ocupada/processando ativamente para um contêiner. O ciclo de trabalho é um número entre 1 e 100.
containerGpuLimits container.azm.ms/clusterId, container.azm.ms/clusterName, containerName Cada contêiner pode especificar limites como uma ou mais GPUs. Não é possível solicitar ou limitar uma fração de uma GPU.
containerGpuRequests container.azm.ms/clusterId, container.azm.ms/clusterName, containerName Cada contêiner pode solicitar uma ou mais GPUs. Não é possível solicitar ou limitar uma fração de uma GPU.
containerGpumemoryTotalBytes container.azm.ms/clusterId, container.azm.ms/clusterName, containerName, gpuId, gpuModel, gpuVendor Quantidade de memória GPU em bytes disponíveis para uso em um contêiner específico.
containerGpumemoryUsedBytes container.azm.ms/clusterId, container.azm.ms/clusterName, containerName, gpuId, gpuModel, gpuVendor Quantidade de memória GPU em bytes usada por um contêiner específico.
nodeGpuAllocatable container.azm.ms/clusterId, container.azm.ms/clusterName, gpuVendor Número de GPUs em um nó que o Kubernetes pode usar.
nodeGpuCapacity container.azm.ms/clusterId, container.azm.ms/clusterName, gpuVendor Número total de GPUs em um nó.

Clean up resources (Limpar recursos)

  • Remova os objetos Kubernetes associados criados neste artigo usando o kubectl delete job comando.

    kubectl delete jobs windows-gpu-workload
    

Próximos passos