Compartir a través de


Uso de GPU para cargas de trabajo de proceso intensivo en AKS en Azure Local

Se aplica a: AKS en Azure Local

Nota:

Para obtener información sobre las GPU en AKS en Windows Server, vea Usar GPU en AKS en Windows Server.

Las unidades de procesamiento gráfico (GPU) son útiles 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. Tenga en cuenta que las GPU solo se admiten en grupos de nodos del sistema operativo Linux. Las GPU no se admiten en grupos de nodos del sistema operativo Windows.

Fabricante Modelo de GPU Versión admitida
NVidia A2 2311.2
NVidia A16 2402.0
NVidia T4 2408.0
NVidia L4 2512.0
NVidia L40 2512.0
NVidia L40S 2512.0

Tamaños de máquina virtual de GPU admitidos

AKS en Azure Local 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 Unidad Central de Procesamiento Virtual (vCPU) Memoria: GiB
Standard_NK6 1 8 6 12
Standard_NK12 2 16 12 veinticuatro

Nvidia A2 es compatible con las SKU NC2 A2

Tamaño de VM GPU Memoria de GPU: GiB Unidad Central de Procesamiento Virtual (vCPU) Memoria: GiB
Standard_NC4_A2 1 16 4 8
Standard_NC8_A2 1 16 8 16
Standard_NC16_A2 2 32 16 64
Standard_NC32_A2 2 32 32 128

Nvidia A16 es compatible con las SKU NC2 A16

Tamaño de VM GPU Memoria de GPU: GiB Unidad Central de Procesamiento Virtual (vCPU) Memoria: GiB
Standard_NC4_A16 1 16 4 8
Standard_NC8_A16 1 16 8 16
Standard_NC16_A16 2 32 16 64
Standard_NC32_A16 2 32 32 128

Nvidia L4 es compatible con las SKU NC2 L4 (versión preliminar)

Tamaño de VM GPU Memoria de GPU: GiB Unidad Central de Procesamiento Virtual (vCPU) Memoria: GiB
Standard_NC16_L4_1 1 veinticuatro 16 64
Standard_NC16_L4_2 2 48 16 64
Standard_NC32_L4_1 1 veinticuatro 32 128
Standard_NC32_L4_2 2 48 32 128

Nvidia L40 es compatible con las SKU NC2 L40 (versión preliminar)

Tamaño de VM GPU Memoria de GPU: GiB Unidad Central de Procesamiento Virtual (vCPU) Memoria: GiB
Standard_NC16_L40_1 1 48 16 64
Standard_NC16_L40_2 2 96 16 64
Standard_NC32_L40_1 1 48 32 128
Standard_NC32_L40_2 2 96 32 128

Nvidia L40S es compatible con las SKU NC2 L40S (versión preliminar)

Tamaño de VM GPU Memoria de GPU: GiB Unidad Central de Procesamiento Virtual (vCPU) Memoria: GiB
Standard_NC16_L40S_1 1 48 16 64
Standard_NC16_L40S_2 2 96 16 64
Standard_NC32_L40S_1 1 48 32 128
Standard_NC32_L40S_2 2 96 32 128

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 Local de Azure localmente en cada servidor del clúster de Azure Local.

Paso 2: desinstalar el controlador de host nvidia

En cada máquina host, vaya al 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 del sistema anfitrión.

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 desmontan correctamente del host, ejecute el siguiente comando. Deberías ver las GPU en un estado de 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 

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 el controlador de mitigación ejecutando los siguientes comandos desde la línea de comandos:

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 OK en Nvidia A2_base - Dismounted:

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 local de Azure.

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

Cuando finalice la implementación del clúster local de Azure, ejecute el siguiente comando de la CLI para mostrar las SKU de máquina virtual disponibles en la implementación. Si instala correctamente los controladores de GPU, el comando enumera las SKU de máquina virtual de GPU correspondientes:

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

Crear un nuevo clúster de cargas de trabajo con un grupo de nodos habilitado para GPU

Actualmente, solo puede usar grupos de nodos habilitados para GPU 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 dos nodos habilitados para GPU (NVIDIA A2) con una SKU de máquina virtual 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 que puede programar GPUs

Después de crear el grupo de nodos de GPU, 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 puede programar las GPU. En la sección Capacidad , la GPU aparece como nvidia.com/gpu: 1.

kubectl describe <node> | findstr "gpu" 

La salida muestra las GPU del nodo de trabajo y tiene un aspecto similar al ejemplo 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

Después de completar los pasos anteriores, cree un nuevo archivo YAML para pruebas, como 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

Verifique que el pod se inició, se completó la ejecución y que 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 se recibe un error de coincidencia de versión al llamar a los controladores, como, por ejemplo, "la versión del controlador CUDA no es suficiente para la versión de CUDA en ejecución", revise el gráfico de compatibilidad de la matriz de controladores de 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 la actualización se realice correctamente, Kubernetes debe crear nuevas máquinas virtuales en la máquina host física que tenga una o varias GPU físicas disponibles para la asignación de dispositivos. Esta disponibilidad garantiza que tus aplicaciones puedan seguir ejecutándose cuando Kubernetes programe pods en este nodo mejorado.

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 dos GPU adicionales si ejecuta Standard_NK12. Si está ejecutándose a plena capacidad y no tiene una GPU adicional, reduzca el grupo de nodos a un solo nodo antes de la actualización, luego amplíe 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 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 está utilizando toda la capacidad y no cuenta con una GPU adicional, reduzca el grupo de nodos a un solo nodo antes de la actualización, y luego incremente la cantidad de nodos después de que la actualización haya sido exitosa.

Pasos siguientes