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:
- Planee el tiempo de inactividad durante la actualización.
- 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.