Compartir a través de


Uso de GPU para cargas de trabajo de proceso intensivo (AKS en Azure Local, versión 23H2)

Se aplica a: Azure Local, versión 23H2

Nota:

Para obtener información sobre las GPU en AKS en Azure Local 22H2, consulte Uso de GPU (Azure Local 22H2).

Las unidades de procesamiento gráfico (GPU) se usan para cargas de trabajo de proceso intensivo, como el aprendizaje automático, el aprendizaje profundo, etc. En este artículo se describe cómo usar GPU para cargas de trabajo de proceso intensivo en AKS habilitadas por Azure Arc.

Modelos de GPU admitidos

AkS admite los siguientes modelos de GPU en Azure Local, versión 23H2:

Fabricante Modelo de GPU Versión admitida
NVidia A2 2311.2
NVidia A16 2402.0
NVidia T4 2408.0

Tamaños de máquinas virtuales que se admiten

AkS en Azure Local, versión 23H2, admite los siguientes tamaños de máquina virtual para cada modelo de GPU.

Nvidia T4 es compatible con las SKU de NK T4

Tamaño de VM GPU Memoria de GPU: GiB vCPU Memoria: GiB
Standard_NK6 1 8 6 12
Standard_NK12 2 16 12 24

Nvidia A2 es compatible con las SKU NC2 A2

Tamaño de VM GPU Memoria de GPU: GiB vCPU Memoria: 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 es compatible con las SKU NC2 A16

Tamaño de VM GPU Memoria de GPU: GiB vCPU Memoria: 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 empezar

Para usar GPU en AKS Arc, asegúrese de instalar los controladores de GPU necesarios antes de comenzar la implementación del clúster. Siga los pasos descritos en esta sección.

Paso 1: instalar el sistema operativo

Instale el sistema operativo Azure Local, versión 23H2 localmente en cada servidor del clúster de Azure Local.

Paso 2: desinstalar el controlador de host nvidia

En cada máquina host, vaya a Panel de control > Agregar o quitar programas, desinstale el controlador host de NVIDIA y reinicie la máquina. Una vez reiniciada la máquina, confirme que el controlador se desinstaló correctamente. Abra un terminal de PowerShell con privilegios elevados y ejecute el siguiente comando:

Get-PnpDevice  | select status, class, friendlyname, instanceid | where {$_.friendlyname -eq "3D Video Controller"}

Debería ver que los dispositivos gpu aparecen en un estado de error, como se muestra en esta salida de ejemplo:

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 

Paso 3: desmontar el controlador host del host

Al desinstalar el controlador host, la GPU física entra en un estado de error. Debe desmontar todos los dispositivos gpu del host.

Para cada dispositivo de GPU (controlador de vídeo 3D), ejecute los siguientes comandos en PowerShell. Copie el identificador de instancia; por ejemplo, PCI\VEN_10DE&DEV_1EB8&SUBSYS_12A210DE&REV_A1\4&32EEF88F&0&0000 desde la salida del 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 las GPU se desmontaron correctamente del host, ejecute el siguiente comando. Debe colocar GPU en un 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 

Paso 4: descargar e instalar el controlador de mitigación de NVIDIA

El software puede incluir componentes desarrollados y propiedad de NVIDIA Corporation o sus licenciantes. El uso de estos componentes se rige por el contrato de licencia de usuario final de NVIDIA.

Consulte la documentación del centro de datos de NVIDIA para descargar el controlador de mitigación de NVIDIA. Después de descargar el controlador, expanda el archivo e instale el controlador de mitigación en cada máquina host. Puede seguir este script de PowerShell para descargar el controlador de mitigación y extraerlo:

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 el controlador de mitigación, vaya a la carpeta que contiene los archivos extraídos y seleccione el archivo del controlador de GPU en función del tipo de GPU real instalado en los hosts locales de Azure. Por ejemplo, si el tipo es A2 GPU, haga clic con el botón derecho en el archivo nvidia_azure_stack_A2_base.inf y seleccione Instalar.

También puede instalar mediante la línea de comandos; para ello, vaya a la carpeta y ejecute los siguientes comandos para instalar el controlador de mitigación:

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

Después de instalar el controlador de mitigación, las GPU se muestran en el estado Aceptar en 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

Paso 5: repetir los pasos 1 a 4

Repita los pasos del 1 al 4 para cada servidor del clúster de Azure Local.

Paso 6: continuar la implementación del clúster local de Azure

Continúe con la implementación del clúster local de Azure siguiendo los pasos descritos en Implementación de Azure Local, versión 23H2.

Obtención de una lista de las SKU de máquina virtual habilitadas para GPU disponibles

Una vez completada la implementación del clúster local de Azure, puede ejecutar el siguiente comando de la CLI para mostrar las SKU de máquina virtual disponibles en la implementación. Si los controladores de GPU están instalados correctamente, se muestran las SKU de máquina virtual de GPU correspondientes:

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

Creación de un clúster de cargas de trabajo con un grupo de nodos habilitado para GPU

Actualmente, el uso de grupos de nodos habilitados para GPU solo está disponible para grupos de nodos de Linux. Para crear un nuevo clúster de Kubernetes:

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

En el ejemplo siguiente se agrega un grupo de nodos con 2 nodos habilitados para GPU (NVDIA A2) con una SKU de máquina virtual de 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

Confirmación de que puede programar GPU

Con el grupo de nodos de GPU creado, confirme que puede programar GPU en Kubernetes. Primero, enumere los nodos del clúster con el 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

Ahora use el comando kubectl describe node para confirmar que las GPU se pueden programar. En la sección Capacidad , la GPU debe aparecer como nvidia.com/gpu: 1.

kubectl describe <node> | findstr "gpu" 

La salida debe mostrar las GPU del nodo de trabajo y tener un aspecto similar al siguiente:

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

Ejecución de una carga de trabajo habilitada para GPU

Una vez completados los pasos anteriores, cree un nuevo archivo YAML para las pruebas; por ejemplo, gpupod.yaml. Copie y pegue el siguiente código YAML en el nuevo archivo denominado gpupod.yaml y guárdelo:

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

Ejecute el siguiente comando para implementar la aplicación de ejemplo:

kubectl apply -f gpupod.yaml

Compruebe que el pod se inició, completó la ejecución y se asignó la GPU:

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

El comando anterior debe mostrar una GPU asignada:

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

Compruebe el archivo de registro del pod para ver si se ha superado la prueba:

kubectl logs cuda-vector-add

A continuación se muestra un ejemplo de salida del 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

Si recibe un error de coincidencia de versiones al llamar a controladores, como "La versión del controlador CUDA no es suficiente para la versión en tiempo de ejecución de CUDA", revise el gráfico de compatibilidad de matriz de controladores NVIDIA.

Preguntas más frecuentes

¿Qué ocurre durante la actualización de un grupo de nodos habilitado para GPU?

La actualización de grupos de nodos habilitados para GPU sigue el mismo patrón de actualización gradual que se usa para los grupos de nodos normales. Para que los grupos de nodos habilitados para GPU en una nueva máquina virtual se creen correctamente en la máquina host física, requiere que una o varias GPU físicas estén disponibles para la asignación correcta de dispositivos. Esta disponibilidad garantiza que las aplicaciones puedan seguir ejecutándose cuando Kubernetes programa pods en este nodo actualizado.

Antes de actualizar:

  1. Planee el tiempo de inactividad durante la actualización.
  2. Tenga una GPU adicional por host físico si ejecuta la Standard_NK6 o 2 GPU adicionales si ejecuta Standard_NK12. Si se ejecuta a plena capacidad y no tiene una GPU adicional, se recomienda reducir verticalmente el grupo de nodos a un solo nodo antes de la actualización y, a continuación, escalar verticalmente después de que la actualización se realice correctamente.

¿Qué ocurre si no tengo GPU físicas adicionales en mi máquina física durante una actualización?

Si se desencadena una actualización en un clúster sin recursos adicionales de GPU para facilitar la actualización gradual, el proceso de actualización se bloquea hasta que haya una GPU disponible. Si se ejecuta a plena capacidad y no tiene una GPU adicional, se recomienda reducir verticalmente el grupo de nodos a un solo nodo antes de la actualización y, a continuación, escalar verticalmente después de que la actualización se realice correctamente.

Pasos siguientes