Compartilhar via


Use GPUs do Windows para cargas de trabalho com uso intensivo de computação no Azure Kubernetes Service (AKS) (versão prévia)

As unidades de processamento gráfico (GPU) geralmente são usadas para cargas de trabalho de computação intensiva, tais como gráficos e cargas de trabalho de visualização. O AKS dá suporte a pools de nós Windows e Linux habilitados para GPU para executar cargas de trabalho de Kubernetes com uso intensivo de computação.

Esse artigo ajuda você a provisionar nós do Windows com GPUs agendáveis em clusters AKS novos e existentes (versão prévia).

Máquinas virtuais (VMs) habilitadas para GPU com suporte

Para exibir VMs habilitadas para GPU com suporte, consulte tamanhos de VM com otimização de GPU no Azure. Para pools de nós do AKS, é recomendável um tamanho mínimo de Standard_NC6s_v3. A série NVv4 (baseada em GPUs AMD) não tem suporte no AKS.

Observação

As VMs habilitadas para GPU contêm hardware especializado sujeito a preços mais altos e disponibilidade da região. Para obter mais informações, confira a ferramenta preço e a disponibilidade de 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 compatível com Kubernetes versão 1.28 e anteriores.

Antes de começar

  • Este artigo pressupõe que você tenha um cluster do AKS. Se você não tiver um cluster, crie um usando a CLI do Azure, 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 campo --skip-gpu-driver-installcom o comando az aks nodepool add. Execute az --version para encontrar a versão. Se você precisa instalar ou atualizar, consulte Instalar a CLI do Azure.
  • Você precisa da CLI do Azure versão 9.0.0b5 ou posterior instalada e configurada para usar o campo --driver-type com o comando az aks nodepool add. Execute az --version para encontrar a versão. Se você precisa instalar ou atualizar, consulte Instalar a CLI do Azure.

Obter as credenciais para o cluster

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

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

Usando GPU do Windows com instalação automática de 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 compatível, 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

As versões prévias do recurso AKS estão disponíveis em uma base de autoatendimento e aceitação. As visualizações são fornecidas "como estão" e "conforme disponíveis" e estão excluídas dos acordos de nível de serviço e da garantia limitada. As versões prévias do AKS são parcialmente cobertas pelo suporte ao cliente em uma base de melhor esforço. Dessa forma, esses recursos não são destinados ao uso em produção. Para obter mais informações, consulte os seguintes artigos:

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

  • Registre ou atualize a extensão aks-preview usando o comando az extension add ou 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 recurso WindowsGPUPreview

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

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

    Demora alguns minutos para o status exibir Registrado.

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

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

    az provider register --namespace Microsoft.ContainerService
    

Criar um pool de nós habilitado para GPU do Windows (versão prévia)

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

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

    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 suas GPUs são programáveis.

  3. Depois de confirmar que suas GPUs são programáveis, você poderá executar a carga de trabalho da GPU.

Especificar tipo de driver de GPU (versão prévia)

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

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

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

  • GRID: para aplicativos que exigem suporte à virtualização.
  • CUDA: otimizado para tarefas computacionais em computação científica e aplicativos com uso intensivo de dados.

Observação

Ao definir o sinalizador --driver-type, você assume a responsabilidade de garantir que o tipo de driver selecionado seja compatível com o tamanho da VM e a configuração específicas 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 comando az aks nodepool add.

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 tipo de driver de GPU GRID. Selecionar esse tipo de driver substitui o padrão de tipo de driver CUDA para SKUs de VM da série NC.

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

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

  1. Ignore a instalação do driver GPU (versão prévia) usando--skip-gpu-driver-install.
  2. Instalação manual do plug-in de dispositivo Kubernetes DirectX.

Ignorar a instalação do driver de GPU (versão prévia)

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

Importante

As versões prévias do recurso AKS estão disponíveis em uma base de autoatendimento e aceitação. As visualizações são fornecidas "como estão" e "conforme disponíveis" e estão excluídas dos acordos de nível de serviço e da garantia limitada. As versões prévias do AKS são parcialmente cobertas pelo suporte ao cliente em uma base de melhor esforço. Dessa forma, esses recursos não são destinados ao uso em produção. Para obter mais informações, consulte os seguintes artigos:

  1. Registre ou atualize a extensão aks-preview usando o comando az extension add ou 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 comando az aks nodepool add com o sinalizador --skip-gpu-driver-install para ignorar a 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
    

Observação

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 do dispositivo Kubernetes DirectX

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 seu cluster usando o comando az aks nodepool add.

    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 Kubernetes DirectX

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

    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 é criado com sucesso usando o comando kubectl apply.

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

Confirmar se as GPUs são agendáveis

Após criar seu cluster, confirme que as GPUs são agendáveis no Kubernetes.

  1. Listar os nós em seu cluster usando o comando kubectl get nodes.

    kubectl get nodes
    

    Seu resultado deve ser semelhante ao seguinte exemplo de saída:

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

    kubectl describe node aks-gpunp-28993262-0
    

    Na seção Capacidade, a GPU deve ser listada como microsoft.com/directx: 1. Seu resultado deve ser semelhante ao seguinte exemplo de saída condensado:

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

Usar o Container Insights para monitorar o uso da GPU

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

Nome da métrica Dimensão métrica (marcas) Descrição
containerGpuDutyCycle container.azm.ms/clusterId, container.azm.ms/clusterName, containerName, gpuId, gpuModel, gpuVendor Percentual de tempo sobre o período amostral passado (60 segundos) durante o qual a GPU estava ocupada/em processamento ativo para um contêiner. O ciclo de serviço é 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 de GPU, em bytes, disponível 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 de 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ó.

Limpar recursos

  • Remova os objetos do Kubernetes associados que você criou neste artigo usando o comando kubectl delete job.

    kubectl delete jobs windows-gpu-workload
    

Próximas etapas