Usar GPUs para cargas de trabalho de computação intensiva (AKS no Azure Local, versão 23H2)
Aplica-se a: Azure Local, versão 23H2
Nota
Para obter informações sobre GPUs no AKS no Azure Local 22H2, consulte Usar GPUs (Azure Local 22H2).
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 usar GPUs para cargas de trabalho de computação intensiva no AKS habilitado pelo Azure Arc.
Modelos de GPU suportados
Os seguintes modelos de GPU são suportados pelo AKS no Azure Local, versão 23H2:
Fabricante | Modelo de GPU | Versão suportada |
---|---|---|
NVidia | A2 | 2311.2 |
NVidia | A16 | 2402.0 |
NVidia | T4 | 2408.0 |
Tamanhos de VM suportados
Os seguintes tamanhos de VM para cada modelo de GPU são suportados pelo AKS no Azure Local, versão 23H2.
Nvidia T4 é suportado por NK T4 SKUs
Tamanho da VM | GPUs | Memória GPU: GiB | vCPU | Memória: GiB |
---|---|---|---|---|
Standard_NK6 | 1 | 8 | 6 | 12 |
Standard_NK12 | 2 | 16 | 12 | 24 |
Nvidia A2 é suportado por NC2 A2 SKUs
Tamanho da VM | GPUs | Memória GPU: GiB | vCPU | Memória: GiB |
---|---|---|---|---|
Standard_NC4_A2 | 1 | 16 | 4 | 8 |
Standard_NC8_A2 | 1 | 16 | 8 | 16 |
Standard_NC16_A2 | 2 | 48 | 16 | 64 |
Standard_NC32_A2 | 2 | 48 | 32 | 28 |
Nvidia A16 é suportado por NC2 A16 SKUs
Tamanho da VM | GPUs | Memória GPU: GiB | vCPU | Memória: GiB |
---|---|---|---|---|
Standard_NC4_A16 | 1 | 16 | 4 | 8 |
Standard_NC8_A16 | 1 | 16 | 8 | 16 |
Standard_NC16_A16 | 2 | 48 | 16 | 64 |
Standard_NC32_A16 | 2 | 48 | 32 | 28 |
Antes de começar
Para usar GPUs no AKS Arc, certifique-se de instalar os drivers de GPU necessários antes de iniciar a implantação do cluster. Siga os passos nesta secção.
Passo 1: instalar o SO
Instale o sistema operacional Azure Local, versão 23H2 localmente em cada servidor em seu cluster Local do Azure.
Etapa 2: desinstalar o driver de host NVIDIA
Em cada máquina host, navegue até Adicionar ou Remover programas do Painel de Controle>, desinstale o driver de 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 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 3: desmontar o driver de host 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 (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 GPUs em um Unknown
estado:
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: baixar e instalar 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 da NVIDIA.
Consulte a documentação do data center da 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 máquina 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 GPU A2, clique com o botão direito do mouse no arquivo 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
Passo 5: repita os passos 1 a 4
Repita as etapas 1 a 4 para cada servidor em seu 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 do Azure Local, versão 23H2.
Obtenha uma lista de SKUs de VM habilitadas para GPU disponíveis
Quando a implantação do cluster Local do Azure estiver concluída, você poderá executar o seguinte comando da CLI para mostrar as SKUs de VM disponíveis em sua implantação. Se os drivers da GPU estiverem instalados corretamente, as SKUs de VM da GPU correspondentes serão listadas:
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 habilitado para GPU
Atualmente, o uso de pools de nós habilitados para GPU só está disponível para pools de nós Linux. Para criar um novo cluster 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 2 nós habilitados para GPU (NVDIA A2) com uma Standard_NC4_A2 SKU de VM:
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 da GPU criado, confirme se você pode agendar 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 use o comando kubectl describe node para confirmar que 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 a(s) GPU(s) do nó de trabalho e ter esta aparência:
Capacity:
cpu: 4
ephemeral-storage: 103110508Ki
hugepages-1Gi: 0
hugepages-2Mi: 0
memory: 7865020Ki
nvidia.com/gpu: 1
pods: 110
Executar uma carga de trabalho habilitada para 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, 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 você 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", revise o gráfico de compatibilidade da matriz de driver NVIDIA.
FAQ
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 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 uma atribuição de dispositivo bem-sucedida. Essa disponibilidade garante que seus aplicativos possam continuar em execução quando o Kubernetes agendar pods nesse nó atualizado.
Antes de atualizar:
- Planeje o tempo de inatividade durante a atualização.
- 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 executando em plena capacidade 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 após a atualização bem-sucedida.
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 você executar em plena capacidade 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 a escala depois que a atualização for bem-sucedida.