Usar GPUs para cargas de trabalho com uso intensivo de computação
Aplica-se ao: AKS no Azure Local 22H2, AKS no Windows Server
As GPUs (Unidades de Processamento Gráfico) 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.
Antes de começar
Se estiver atualizando o AKS de uma versão prévia anterior a outubro de 2022 que esteja executando pools de nós habilitados para GPU, antes de começar remova todos os clusters de carga de trabalho que executam GPUs. Siga as etapas nesta seção.
Etapa 1: Desinstalar o driver de host Nvidia
Em cada computador host, navegue até Painel de Controle > Adicionar ou Remover Programas, desinstale driver de host NVIDIA e reinicie o computador. Após a reinicialização do computador, 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 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 2: desmontar o driver do sistema host
Quando você desinstala o driver de host, a GPU física entra em um estado de erro. Você deve desmontar todos os dispositivos de GPU do host.
Para cada dispositivo GPU (Controlador de Vídeo 3D), execute os comandos a seguir no PowerShell. Copie a ID da instância; por exemplo, PCI\VEN_10DE&DEV_1EB8&SUBSYS_12A210DE&REV_A1\4&32EEF88F&0&0000
da saída de 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 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: Baixar e instalar o driver de mitigação NVIDIA
O software pode incluir componentes desenvolvidos e de propriedade da NVIDIA Corporation ou seus licenciadores. O uso desses componentes é regido pelo contrato de licença do usuário final da NVIDIA .
Consulte a documentação do centro de dados 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.
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
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 driver de mitigação, as GPUs são listadas no estado OK em 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
Etapa 4: Repetir as etapas 1 a 3
Repita as etapas de um a três para cada nó no cluster de failover.
Importante
Máquinas virtuais habilitadas para GPU não são adicionadas ao cluster de failover no Windows Server 2019, Windows Server 2022 ou Azure Local.
Instalar ou atualizar o AKS
Consulte o início rápido do AKS usando do PowerShell ou usando do Windows Admin Center para instalar ou atualizar o AKS habilitado pelo Arc.
Criar um novo cluster de workload 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 do 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 o Kubeconfig:
Get-AksHciCredential -Name gpucluster
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 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:
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 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, terminou de executar e se a GPU foi 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
Veja a seguir o 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 Freqüentes
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 os pools de nós habilitados para GPU em uma nova VM sejam criados com sucesso na máquina host física, é necessário que uma ou mais GPUs físicas estejam disponíveis para a atribuição com sucesso do dispositivo. Essa disponibilidade garante que seus aplicativos possam continuar em execução quando o Kubernetes agendar pods neste nó atualizado.
Antes de atualizar:
- Planeje o tempo de inatividade durante a atualização.
- Tenha uma GPU extra por host físico se você estiver executando as GPUs Standard_NK6 ou 2 GPUs extras se estiver executando Standard_NK12. Se você estiver operando 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 então escalar novamente após a atualização ser bem-sucedida.
O que acontece se eu não tiver GPUs físicas extras no meu computador físico 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á travado até que uma GPU esteja disponível. Se você estiver operando 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, expandir após a atualização ser bem-sucedida.