Utilizar GPUs para cargas de trabalho intensivas de computação

Aplica-se a: AKS no Azure Stack HCI 22H2, AKS no Windows Server

As Unidades de Processamento Gráfico (GPU) são utilizadas para cargas de trabalho intensivas de computação, como machine learning, aprendizagem profunda e muito mais. Este artigo descreve como utilizar GPUs para cargas de trabalho intensivas de computação no AKS ativadas pelo Azure Arc.

Antes de começar

Se estiver a atualizar o AKS a partir de uma versão de pré-visualização anterior a outubro de 2022 que esteja a executar conjuntos de nós compatíveis com GPU, certifique-se de que remove todos os clusters de cargas de trabalho que executam GPUs antes de começar. Siga os passos nesta secção.

Passo 1: Desinstalar o controlador anfitrião Nvidia

Em cada computador anfitrião, navegue para Painel de Controlo > Adicionar ou Remover programas, desinstale o controlador anfitrião NVIDIA e, em seguida, reinicie o computador. Após o reinício da máquina, confirme que o controlador foi desinstalado com êxito. Abra um terminal do PowerShell elevado e execute o seguinte comando:

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

Deverá ver os dispositivos GPU aparecerem num 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 

Passo 2: Desmontar o controlador de anfitrião do anfitrião

Ao desinstalar o controlador anfitrião, a GPU física entra num estado de erro. Tem de desmontar todos os dispositivos GPU do anfitrião.

Para cada dispositivo GPU (Controlador de Vídeo 3D), 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 a partir 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 que as GPUs foram corretamente desmontadas do anfitrião, execute o seguinte comando. Deve colocar GPUs num Unknown estado:

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 

Passo 3: Transferir e instalar o controlador de mitigação NVIDIA

O software pode incluir componentes desenvolvidos e pertencentes à NVIDIA Corporation ou aos respetivos licenciadores. A utilização destes componentes é regida pelo contrato de licença de utilizador final NVIDIA.

Veja a documentação do datacenter NVIDIA para transferir o controlador de mitigação NVIDIA. Depois de transferir o controlador, expanda o arquivo e instale o controlador de mitigação em cada computador anfitrião.

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 controlador de mitigação, navegue para a pasta que contém os ficheiros extraídos, clique com o botão direito do rato no ficheiro nvidia_azure_stack_T4_base.inf e selecione Instalar. Verifique se tem o controlador correto; Atualmente, o AKS suporta apenas a GPU NVIDIA Tesla T4.

Também pode instalar com a linha de comandos ao navegar para a pasta e executar os seguintes comandos para instalar o controlador 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 em Nvidia T4_base - Desmontada:

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: Repetir os passos 1 a 3

Repita os passos 1 a 3 para cada nó no cluster de ativação pós-falha.

Importante

As máquinas virtuais ativadas para GPU não são adicionadas ao clustering de ativação pós-falha no Windows Server 2019, Windows Server 2022 ou Azure Stack HCI.

Instalar ou atualizar o AKS

Veja o início rápido do AKS com o PowerShell ou com Windows Admin Center para instalar ou atualizar o AKS ativado pelo Arc.

Create um novo cluster de cargas de trabalho com um conjunto de nós preparado para GPU

Atualmente, a utilização de conjuntos de nós compatíveis com GPU só está disponível para conjuntos de nós do Linux.

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

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

Get-AksHciCredential -Name gpucluster

Confirme que pode agendar GPUs

Com o conjunto de nós de GPU criado, confirme que pode agendar GPUs no Kubernetes. Primeiro, liste os nós no cluster com 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 que as GPUs podem ser agendadas. Na secção Capacidade , a GPU deve aparecer como nvidia.com/gpu: 1.

kubectl describe <node> | findstr "gpu" 

O resultado deve apresentar as GPUs do nó de trabalho e ter um aspeto semelhante ao seguinte:

         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 ativada por GPU

Depois de concluir os passos anteriores, crie um novo ficheiro YAML para teste; por exemplo, gpupod.yaml. Copie e cole o seguinte YAML no novo ficheiro com o nome gpupod.yaml e, em seguida, guarde-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 implementar a aplicação de exemplo:

kubectl apply -f gpupod.yaml

Verifique se o pod iniciou, concluiu a execução e 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 ficheiro de registo do pod para ver se o teste passou:

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 controladores, como "A versão do controlador CUDA é insuficiente para a versão do runtime CUDA", reveja o gráfico de compatibilidade da matriz do controlador NVIDIA.

FAQ

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

Atualizar conjuntos de nós preparados para GPU segue o mesmo padrão de atualização sem interrupção utilizado para conjuntos de nós normais. Para que os conjuntos de nós preparados para GPU numa nova VM sejam criados com êxito no computador anfitrião físico, é necessário que uma ou mais GPUs físicas estejam disponíveis para atribuição de dispositivos com êxito. Esta disponibilidade garante que as aplicações podem continuar em execução quando o Kubernetes agenda pods neste nó atualizado.

Antes da atualização:

  1. Planeie o período de indisponibilidade durante a atualização.
  2. Tenha uma GPU extra por anfitrião físico se estiver a executar o Standard_NK6 ou 2 GPUs adicionais se estiver a executar Standard_NK12. Se estiver a executar a capacidade total e não tiver uma GPU adicional, recomendamos que reduza verticalmente o conjunto de nós para um único nó antes da atualização e, em seguida, aumente verticalmente após a atualização ser bem-sucedida.

O que acontece se não tiver GPUs físicas adicionais no meu computador físico durante uma atualização?

Se uma atualização for acionada num cluster sem recursos de GPU adicionais para facilitar a atualização sem interrupção, o processo de atualização fica suspenso até que uma GPU esteja disponível. Se executar na capacidade total e não tiver uma GPU adicional, recomendamos que reduza verticalmente o conjunto de nós para um único nó antes da atualização e, em seguida, aumente verticalmente após a atualização ser bem-sucedida.

Passos seguintes