Compartir a través de


Uso de GPU para cargas de trabajo de proceso intensivo en AKS en Windows Server

Se aplica a: AKS en Windows Server

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 en Windows Server.

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 descritos en 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. 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 | 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 anfitrión 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. Se deben colocar las GPU en 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 

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 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_T4_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 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 al clúster de conmutación por error en Windows Server 2019 y Windows Server 2022.

Instalación o actualización de AKS

Consulte el inicio rápido de AKS con PowerShell o con Windows Admin Center para instalar o actualizar AKS en Windows Server.

Crear 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

Confirme que puede programar GPUs

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:

         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 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

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 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 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 2 GPU adicionales si ejecuta Standard_NK12. Si se ejecuta a plena capacidad y no tiene una GPU adicional, se recomienda reducir el grupo de nodos a un solo nodo antes de la actualización y luego escalar horizontalmente 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 ejecuta a plena capacidad y no tiene una GPU adicional, se recomienda reducir su grupo de nodos a un solo nodo antes de la actualización, y luego escalarlo después de que la actualización se realice correctamente.

Pasos siguientes