Partilhar via


Usar GPUs para cargas de trabalho de computação intensiva no AKS no Windows Server

Aplica-se a: AKS no Windows Server

As Unidades de Processamento Gráfico (GPU) são usadas para cargas de trabalho de computação intensiva, como aprendizado de máquina, aprendizado profundo e muito mais. Este artigo descreve como utilizar GPUs para cargas de trabalho intensivas em computação no AKS no Windows Server.

Antes de começar

Se você estiver atualizando o AKS a partir de uma versão de visualização anterior a outubro de 2022 que esteja executando pools de nós habilitados para GPU, certifique-se de remover todos os clusters de carga de trabalho que executam GPUs antes de começar. Siga os passos nesta secção.

Etapa 1: desinstalar o driver de host Nvidia

Em cada máquina host, navegue até Painel de Controlo > Adicionar ou Remover Programas, desinstale o driver NVIDIA do host e, em seguida, reinicie a máquina. Após a reinicialização da máquina, confirme se o driver foi desinstalado com êxito. Abra um terminal do PowerShell com privilégios elevados e execute o seguinte comando:

Get-PnpDevice  | select status, class, friendlyname, instanceid | findstr /i /c:"3d video" 

Você deve ver os dispositivos GPU aparecerem em um estado de erro, conforme mostrado neste exemplo de saída:

Error       3D Video Controller                   PCI\VEN_10DE&DEV_1EB8&SUBSYS_12A210DE&REV_A1\4&32EEF88F&0&0000 
Error       3D Video Controller                   PCI\VEN_10DE&DEV_1EB8&SUBSYS_12A210DE&REV_A1\4&3569C1D3&0&0000 

Etapa 2: Desmontar o driver de host

Quando você desinstala o driver de host, a GPU física entra em um estado de erro. Você deve desmontar todos os dispositivos GPU do host.

Para cada dispositivo GPU (3D Video Controller), execute os seguintes comandos no PowerShell. Copie o ID da instância; Por exemplo, PCI\VEN_10DE&DEV_1EB8&SUBSYS_12A210DE&REV_A1\4&32EEF88F&0&0000 da saída do comando anterior:

$id1 = "<Copy and paste GPU instance id into this string>"
$lp1 = (Get-PnpDeviceProperty -KeyName DEVPKEY_Device_LocationPaths -InstanceId $id1).Data[0]
Disable-PnpDevice -InstanceId $id1 -Confirm:$false
Dismount-VMHostAssignableDevice -LocationPath $lp1 -Force

Para confirmar se as GPUs foram desmontadas corretamente do host, execute o seguinte comando. Você deve colocar as GPUs em um estado Unknown:

Get-PnpDevice  | select status, class, friendlyname, instanceid | findstr /i /c:"3d video"
Unknown       3D Video Controller               PCI\VEN_10DE&DEV_1EB8&SUBSYS_12A210DE&REV_A1\4&32EEF88F&0&0000 
Unknown       3D Video Controller               PCI\VEN_10DE&DEV_1EB8&SUBSYS_12A210DE&REV_A1\4&3569C1D3&0&0000 

Etapa 3: Baixe e instale o driver de mitigação NVIDIA

O software pode incluir componentes desenvolvidos e de propriedade da NVIDIA Corporation ou de seus licenciantes. O uso desses componentes é regido pelo contrato de licença de usuário final NVIDIA.

Consulte a documentação do data center da NVIDIA para transferir o driver de mitigação da NVIDIA. Depois de baixar o driver, expanda o arquivo e instale o driver de mitigação em cada máquina host.

Invoke-WebRequest -Uri "https://docs.nvidia.com/datacenter/tesla/gpu-passthrough/nvidia_azure_stack_inf_v2022.10.13_public.zip" -OutFile "nvidia_azure_stack_inf_v2022.10.13_public.zip"
mkdir nvidia-mitigation-driver
Expand-Archive .\nvidia_azure_stack_inf_v2022.10.13_public.zip .\nvidia-mitigation-driver\

Para instalar o driver de mitigação, navegue até a pasta que contém os arquivos extraídos, clique com o botão direito do mouse no arquivo nvidia_azure_stack_T4_base.inf e selecione Instalar. Verifique se você tem o driver correto; Atualmente, o AKS suporta apenas a GPU Tesla T4 da NVIDIA.

Você também pode instalar usando a linha de comando navegando até a pasta e executando os seguintes comandos para instalar o driver de mitigação:

pnputil /add-driver nvidia_azure_stack_T4_base.inf /install 
pnputil /scan-devices 

Depois de instalar o controlador de mitigação, as GPUs são listadas no estado OK sob a designação Nvidia T4_base - Desmontado:

Get-PnpDevice  | select status, class, friendlyname, instanceid | findstr /i /c:"nvidia"
OK       Nvidia T4_base - Dismounted               PCI\VEN_10DE&DEV_1EB8&SUBSYS_12A210DE&REV_A1\4&32EEF88F&0&0000 
OK       Nvidia T4_base - Dismounted               PCI\VEN_10DE&DEV_1EB8&SUBSYS_12A210DE&REV_A1\4&3569C1D3&0&0000

Passo 4: Repita os passos 1 a 3

Repita os passos 1 a 3 para cada nó no seu cluster de failover.

Importante

Máquinas virtuais com suporte a GPU não são adicionadas ao clustering de failover no Windows Server 2019 e Windows Server 2022.

Instalar ou atualizar o AKS

Consulte o início rápido do AKS usando o PowerShell ou o Windows Admin Center para instalar ou atualizar o AKS no Windows Server.

Criar um novo cluster de carga de trabalho com um pool de nós com suporte a GPU

Atualmente, a utilização de pools de nós com suporte a GPU está disponível apenas para pools de nós Linux.

New-AksHciCluster -Name "gpucluster" -nodePoolName "gpunodepool" -nodeCount 2 -osType linux -nodeVmSize Standard_NK6 

Depois de instalar o cluster de carga de trabalho, execute o seguinte comando para obter seu Kubeconfig:

Get-AksHciCredential -Name gpucluster

Confirme se é possível agendar GPUs

Com o pool de nós de GPU criado, verifique se é possível programar GPUs no Kubernetes. Primeiro, liste os nós em seu cluster usando o comando kubectl get nodes:

kubectl get nodes
NAME             STATUS  ROLES                 AGE   VERSION
moc-l9qz36vtxzj  Ready   control-plane,master  6m14s  v1.22.6
moc-lhbkqoncefu  Ready   <none>                3m19s  v1.22.6
moc-li87udi8l9s  Ready   <none>                3m5s  v1.22.6

Agora, utilize o comando kubectl describe node para confirmar se as GPUs podem ser agendadas. Na seção Capacidade, a GPU deve aparecer como nvidia.com/gpu: 1.

kubectl describe <node> | findstr "gpu" 

A saída deve apresentar a(s) GPU(s) do nó de trabalho e deve ter um aspecto semelhante a este:

         nvidia.com/gpu.compute.major=7
         nvidia.com/gpu.compute.minor=5
         nvidia.com/gpu.count=1
         nvidia.com/gpu.family=turing
         nvidia.com/gpu.machine=Virtual-Machine
         nvidia.com/gpu.memory=16384
         nvidia.com/gpu.product=Tesla-T4
Annotations:    cluster.x-k8s.io/cluster-name: gpucluster
                cluster.x-k8s.io/machine: gpunodepool-md-58d9b96dd9-vsdbl
                cluster.x-k8s.io/owner-name: gpunodepool-md-58d9b96dd9
         nvidia.com/gpu:   1
         nvidia.com/gpu:   1
ProviderID:         moc://gpunodepool-97d9f5667-49lt4
kube-system         gpu-feature-discovery-gd62h       0 (0%)    0 (0%)   0 (0%)      0 (0%)     7m1s
         nvidia.com/gpu   0     0

Executar uma carga de trabalho que utiliza GPU

Depois de concluir as etapas anteriores, crie um novo arquivo YAML para teste; por exemplo, gpupod.yaml. Copie e cole o seguinte YAML no novo arquivo chamado gpupod.yamle, em seguida, salve-o:

apiVersion: v1
kind: Pod
metadata:
  name: cuda-vector-add
spec:
  restartPolicy: OnFailure
  containers:
  - name: cuda-vector-add
    image: "k8s.gcr.io/cuda-vector-add:v0.1"
    resources:
      limits:
        nvidia.com/gpu: 1

Execute o seguinte comando para implantar o aplicativo de exemplo:

kubectl apply -f gpupod.yaml

Verifique se o pod foi iniciado, concluiu a execução e se a GPU está atribuída:

kubectl describe pod cuda-vector-add | findstr 'gpu'

O comando anterior deve mostrar uma GPU atribuída:

nvidia.com/gpu: 1
nvidia.com/gpu: 1

Verifique o arquivo de log do pod para ver se o teste foi aprovado:

kubectl logs cuda-vector-add

Segue-se um exemplo de saída do comando anterior:

[Vector addition of 50000 elements]
Copy input data from the host memory to the CUDA device
CUDA kernel launch with 196 blocks of 256 threads
Copy output data from the CUDA device to the host memory
Test PASSED
Done

Se receber um erro de incompatibilidade de versão ao chamar drivers, como "A versão do driver CUDA é insuficiente para a versão de tempo de execução do CUDA", reveja a tabela de compatibilidade dos drivers NVIDIA.

Perguntas Frequentes

O que acontece durante a atualização de um pool de nós habilitado para GPU?

A atualização de pools de nós habilitados para GPU segue o mesmo padrão de atualização contínua usado para pools de nós regulares. Para que pools de nós com suporte a GPU sejam criados com êxito em uma nova VM na máquina anfitriã física, é necessário que uma ou mais GPUs físicas estejam disponíveis para uma atribuição de dispositivo bem-sucedida. Esta disponibilidade garante que as suas aplicações possam continuar a funcionar quando o Kubernetes agendar pods neste nó atualizado.

Antes de atualizar:

  1. Planeje o tempo de inatividade durante a atualização.
  2. Tenha uma GPU extra por host físico se estiver executando o Standard_NK6 ou 2 GPUs extras se estiver executando Standard_NK12. Se estiver a funcionar a plena capacidade e não tiver uma GPU extra, recomendamos diminuir o agrupamento de nós para um único nó antes da atualização e, em seguida, aumentar após a atualização ser concluída com sucesso.

O que acontece se eu não tiver GPUs físicas extras na minha máquina física durante uma atualização?

Se uma atualização for acionada em um cluster sem recursos adicionais da GPU para facilitar a atualização contínua, o processo de atualização travará até que uma GPU esteja disponível. Se estiver a operar na capacidade máxima e não tiver uma GPU extra, recomendamos reduzir o seu conjunto de nós para um único nó antes da atualização e, depois de a atualização ser bem-sucedida, aumentar novamente o número de nós.

Próximos passos