Compartilhar via


Usar GPUs para cargas de trabalho com uso intensivo de computação no AKS no Azure Local

Aplica-se a: AKS no Azure Local

Observação

Para obter informações sobre GPUs no AKS no Windows Server, consulte Usar GPUs no AKS no Windows Server.

As unidades de processamento gráfico (GPU) são usadas para cargas de trabalho com uso intensivo de computação, como aprendizado de máquina, aprendizado profundo e muito mais. Este artigo descreve como usar GPUs para cargas de trabalho com uso intensivo de computação no AKS habilitado pelo Azure Arc.

Modelos de GPU suportados

Os seguintes modelos de GPU têm suporte do AKS no Azure Local. Observe que as GPUs só têm suporte em pools de nós do sistema operacional Linux. Não há suporte para GPUs em pools de nós do sistema operacional Windows.

Fabricante Modelo de GPU Versão com suporte
NVidia A2 2311.2
NVidia A16 2402.0
NVidia T4 2408.0

Tamanhos de VM da GPU compatíveis

Os seguintes tamanhos de VM para cada modelo de GPU são compatíveis com o AKS no Azure Local.

Nvidia T4 é compatível com SKUs NK T4

Tamanho da VM GPUs Memória da GPU: GiB vCPU Memória: GiB
Standard_NK6 1 oito 6 12
Standard_NK12 2 16 12 24

O Nvidia A2 tem suporte pelos SKUs NC2 A2

Tamanho da VM GPUs Memória da GPU: GiB vCPU Memória: GiB
Standard_NC4_A2 1 16 4 oito
Standard_NC8_A2 1 16 oito 16
Standard_NC16_A2 2 32 16 64
Standard_NC32_A2 2 32 32 128

Nvidia A16 é compatível com SKUs NC2 A16

Tamanho da VM GPUs Memória da GPU: GiB vCPU Memória: GiB
Standard_NC4_A16 1 16 4 oito
Standard_NC8_A16 1 16 oito 16
Standard_NC16_A16 2 32 16 64
Standard_NC32_A16 2 32 32 128

Antes de começar

Para usar GPUs no AKS Arc, verifique se você instalou os drivers de GPU necessários antes de iniciar a implantação do cluster. Siga as etapas nesta seção.

Etapa 1: instale o sistema operacional

Instale o sistema operacional local do Azure localmente em cada servidor em seu cluster local do Azure.

Etapa 2: desinstale o driver do host da NVIDIA

Em cada máquina host, navegue até o Painel > de Controle Adicionar ou Remover programas, desinstale o driver host NVIDIA e 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 | where {$_.friendlyname -eq "3D Video Controller"}

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

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 3: Desmontar o driver do 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 (Controlador de Vídeo 3D), execute os comandos a seguir no PowerShell. Copie o ID da instância; Por exemplo, PCI\VEN_10DE&DEV_1EB8&SUBSYS_12A210DE&REV_A1\4&32EEF88F&0&0000 na 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 comando a seguir. Você deve colocar as GPUs em estado Unknown.

Get-PnpDevice  | select status, class, friendlyname, instanceid | where {$_.friendlyname -eq "3D Video Controller"}
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 4: baixe e instale o driver de mitigação NVIDIA

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

Consulte a documentação do data center NVIDIA para baixar o driver de mitigação da NVIDIA. Depois de baixar o driver, expanda o arquivo e instale o driver de mitigação em cada computador host. Você pode seguir este script do PowerShell para baixar o driver de mitigação e extraí-lo:

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 e selecione o arquivo de driver de GPU com base no tipo de GPU real instalado em seus hosts locais do Azure. Por exemplo, se o tipo for A2 GPU, clique com o botão direito do mouse no nvidia_azure_stack_A2_base.inf e selecione Instalar.

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_A2_base.inf /install 
pnputil /scan-devices 

Depois de instalar o driver de mitigação, as GPUs são listadas no estado OK em Nvidia A2_base - Desmontado:

Get-PnpDevice  | select status, class, friendlyname, instanceid | where {$_.friendlyname -match "Nvidia"}"
OK       Nvidia A2_base - Dismounted               PCI\VEN_10DE&DEV_1EB8&SUBSYS_12A210DE&REV_A1\4&32EEF88F&0&0000 
OK       Nvidia A2_base - Dismounted               PCI\VEN_10DE&DEV_1EB8&SUBSYS_12A210DE&REV_A1\4&3569C1D3&0&0000

Etapa 5: repita as etapas 1 a 4

Repita as etapas de 1 a 4 para cada servidor no cluster local do Azure.

Etapa 6: continuar a implantação do cluster local do Azure

Continue a implantação do cluster local do Azure seguindo as etapas na implantação local do Azure.

Obtenha uma lista de SKUs de VM disponíveis habilitadas para GPU

Depois que a implantação do cluster local do Azure for concluída, você poderá executar o seguinte comando da CLI para mostrar os SKUs de VM disponíveis em sua implantação. Se os drivers de GPU estiverem instalados corretamente, os SKUs de VM de GPU correspondentes serão listados:

az aksarc vmsize list --custom-location <custom location ID> -g <resource group name>

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

Atualmente, o uso de pools de nós com suporte a GPU só está disponível para pools de Linux. Para criar um novo cluster do Kubernetes:

az aksarc create -n <aks cluster name> -g <resource group name> --custom-location <custom location ID> --vnet-ids <vnet ID>

O exemplo a seguir adiciona um pool de nós com dois nós habilitados para a GPU (NVDIA A2) com um SKU de VM Standard_NC4_A2 :

az aksarc nodepool add --cluster-name <aks cluster name> -n <node pool name> -g <resource group name> --node-count 2 --node-vm-size Standard_NC4_A2 --os-type Linux

Confirme se você pode agendar GPUs

Com o pool de nós de GPU criado, confirme que é possível agendar GPUs no Kubernetes. Primeiro, liste os nós no 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 use 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 exibir as GPUs do nó de trabalho e ter uma aparência semelhante a esta:

Capacity: 
  cpu:                4 
  ephemeral-storage:  103110508Ki 
  hugepages-1Gi:      0 
  hugepages-2Mi:      0 
  memory:             7865020Ki 
  nvidia.com/gpu:     1 
  pods:               110

Execute uma carga de trabalho com suporte a 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.yaml e 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, se a execução foi concluída 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 passou:

kubectl logs cuda-vector-add

Veja a seguir 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 você receber um erro de incompatibilidade de versão durante uma chamada nos drivers, como "A versão do driver CUDA é insuficiente para a versão de runtime do CUDA", examine o gráfico da matriz de compatibilidade do driver 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 sem interrupção usado para pools de nós regulares. Para que conjuntos de nós habilitados para GPU em uma nova VM sejam criados com êxito na máquina host física, é necessário que uma ou mais GPUs físicas estejam disponíveis para atribuição de dispositivos bem-sucedida. Essa disponibilidade garante que seus aplicativos possam continuar em execução 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 você estiver operando em plena capacidade e não tiver uma GPU extra, recomendamos diminuir o pool de nós para um único nó antes da atualização e, em seguida, aumentar novamente após a atualização ser bem-sucedida.

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

Se uma atualização for disparada em um cluster sem recursos extras de GPU para facilitar a atualização sem interrupção, o processo de atualização será interrompido até que uma GPU esteja disponível. Se você executar com capacidade total e não tiver uma GPU extra, recomendamos reduzir o pool de nós para um único nó antes da atualização e, em seguida, aumentar depois que a atualização for bem-sucedida.

Próximas etapas