Compartir a través de


Uso de GPU para cargas de trabajo de proceso intensivo

Se aplica a: AKS en Azure Stack HCI 22H2, AKS en Windows Server

Las unidades de procesamiento gráfico (GPU) se usan para cargas de trabajo que consumen muchos procesos, 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.

Antes de empezar

Si va a actualizar AKS desde una versión preliminar anterior a octubre de 2022 que ejecuta grupos de nodos habilitados para GPU, asegúrese de quitar todos los clústeres de cargas de trabajo que ejecutan GPU antes de comenzar. Siga los pasos de esta sección.

Paso 1: Desinstalar el controlador host de 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. Después de reiniciar 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 | findstr /i /c:"3d video" 

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 2: 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 LAS GPU en un 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 

Paso 3: 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.

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, haga clic con el botón derecho en el archivo nvidia_azure_stack_T4_base.inf y seleccione Instalar. Compruebe que tiene el controlador correcto; AKS actualmente solo admite la GPU NVIDIA Tesla T4.

También puede instalar con 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_T4_base.inf /install 
pnputil /scan-devices 

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

Paso 4: Repita los pasos del 1 al 3

Repita los pasos del 1 al 3 para cada nodo del clúster de conmutación por error.

Importante

Las máquinas virtuales habilitadas para GPU no se agregan a la agrupación en clústeres de conmutación por error en Windows Server 2019, Windows Server 2022 o Azure Stack HCI.

Instalación o actualización de AKS

Consulte el inicio rápido de AKS mediante PowerShell o mediante Windows Admin Center para instalar o actualizar AKS habilitado por Arc.

Create un nuevo 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.

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

Después de instalar el clúster de cargas de trabajo, ejecute el siguiente comando para obtener kubeconfig:

Get-AksHciCredential -Name gpucluster

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 se pueden programar las GPU. 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:

         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

Ejecución de una carga de trabajo habilitada para GPU

Una vez completados los pasos anteriores, cree un nuevo archivo YAML para 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 versión al llamar a controladores, como "La versión del controlador CUDA no es suficiente para la versión del entorno de ejecución de CUDA", revise el gráfico de compatibilidad de 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 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 realizar la actualización:

  1. Planee el tiempo de inactividad durante la actualización.
  2. Tenga una GPU adicional por host físico si ejecuta las GPU adicionales Standard_NK6 o 2 gpu adicionales si ejecuta Standard_NK12. Si se ejecuta con capacidad completa 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 con capacidad completa 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