Ayude a mejorar esta página
Para contribuir a esta guía del usuario, elija el enlace Edit this page on GitHub que se encuentra en el panel derecho de cada página.
importante
El complemento de dispositivo de Kubernetes para DirectX
Aprenda a ejecutar cargas de trabajo de contenedores de Windows aceleradas por GPU en Amazon EKS (Elastic Kubernetes Service) mediante GPU NVIDIA con el complemento de dispositivo de Kubernetes para DirectX desarrollado por TensorWorks. Para obtener más información, consulte Complemento de dispositivo de Kubernetes para DirectX
Existen dos enfoques principales para configurar la aceleración de la GPU para los contenedores de Windows:
-
Opción 1: cree una AMI optimizada para Windows EKS personalizada con los controladores de GPU necesarios preinstalados.
-
Utilice este enfoque cuando necesite un entorno consistente y preconfigurado listo para ejecutar contenedores de Windows acelerados por GPU, y esté dispuesto a invertir el esfuerzo adicional necesario para crear y mantener la AMI personalizada.
-
-
Opción 2: instale los controladores de GPU necesarios en los nodos de trabajo de EKS después de inicializar la instancia.
-
Utilice este enfoque cuando prefiera un proceso de configuración más sencillo y no tenga inconveniente en instalar los controladores de GPU en cada nuevo nodo de trabajo. Más adecuado para un entorno de desarrollo cuando se evalúan o crean prototipos de cargas de trabajo aceleradas por la GPU.
-
Puede aprovechar ambos enfoques según los pasos que se detallan en esta guía.
Consideraciones
Esta guía proporciona los pasos para instalar y configurar la aceleración por GPU para los contenedores de Windows mediante GPU NVIDIA, controladores NVIDIA GRID y el complemento de dispositivo de Kubernetes para DirectX
-
Únicamente se han probado y verificado los tipos de instancias de la familia G con controladores NVIDIA GRID para garantizar su funcionamiento con esta guía. Si bien otros tipos de instancias y combinaciones de controladores también pueden ejecutar contenedores de Windows acelerados por la GPU, es posible que requieran pasos de configuración adicionales que no se describen en esta guía.
-
Únicamente se han probado y verificado las cargas de trabajo basadas en DirectX para garantizar su funcionamiento con esta guía. Aunque otras API de GPU como OpenGL, Vulkan y OpenCL podrían ser compatibles para ejecutar contenedores de Windows acelerados por GPU, es posible que requieran pasos de configuración adicionales que no se abordan en esta guía.
-
Existen algunas limitaciones conocidas que se deben tener en cuenta antes de ejecutar contenedores de Windows acelerados por la GPU. Consulte la sección Limitaciones conocidas para obtener más información.
Requisitos previos
Para habilitar la aceleración por GPU para los contenedores de Windows en Amazon EKS, debe cumplir los siguientes requisitos antes de continuar:
-
Inicie un clúster de Amazon EKS con la versión 1.27 o posterior de Kubernetes.
-
Aprovisione nodos Windows con Windows Server 2022 o posterior.
-
Aprovisione nodos de Windows en la familia G de tipos de instancias, como G4
o G5 . -
Aprovisione los nodos de Windows con un tiempo de ejecución de contenedor con containerd
1.7.x
o2.x.x
. (Consulte Recuperación de la información sobre la versión de la AMI de Windows para verificar la versión de containerd en la AMI optimizada de Amazon EKS).
Instale el controlador de la GPU en cada nodo de Windows
Para instalar los controladores NVIDIA GRID en los nodos de trabajo de EKS, siga los pasos que se indican en Controladores NVIDIA para la instancia de Amazon EC2. Vaya a Opciones de instalación - Opción 3: Controladores GRID y siga los pasos de instalación.
Realización de la instalación para Windows Server Core
En el caso de Windows Server Core, que no cuenta con una experiencia de escritorio, instale los controladores NVIDIA GRID de forma silenciosa mediante los siguientes comandos:
$nvidiaInstallerFilePath = nvidia-driver-installer.exe # Replace with path to installer
$installerArguments = "-s -clean -noreboot -noeula"
Start-Process -FilePath $nvidiaInstallerFilePath -ArgumentList $installerArguments -Wait -NoNewWindow -PassThru
Comprobación de la instalación
Ejecute el siguiente comando de PowerShell para mostrar información de diagnóstico sobre las GPU de la instancia:
nvidia-smi
Este comando muestra la versión del controlador NVIDIA, así como información sobre el hardware de la GPU. Asegúrate de que la salida de este comando coincide con la versión del controlador NVIDIA GRID que esperaba instalar.
Implementación del complemento de dispositivo GPU en cada nodo
Para habilitar la detección y exposición de los recursos de GPU a los contenedores en los nodos de Windows, necesitará un complemento de dispositivo. Implemente el complemento de dispositivo DirectX
-
Implementar el complemento de dispositivo en el espacio de nombres
kube-system
. -
Establecer límites de recursos apropiados para el DaemonSet para asegurar que no consume recursos excesivos en los nodos.
nota
El complemento de dispositivo DaemonSet se ejecutará en cada nodo como un contenedor de procesos host con privilegios elevados. Se recomienda implementar controles de RBAC para restringir el acceso a este DaemonSet, de manera que solo los usuarios autorizados puedan ejecutar comandos privilegiados.
Cuando se ejecutan contenedores acelerados por GPU, el complemento de dispositivo admite dos modos:
-
Modo de tenencia única: este modo dedica todos los recursos de GPU a un único contenedor en la instancia. Instale los complementos de dispositivo con compatibilidad con tenencia única mediante el siguiente comando. Para obtener más información, consulte el archivo README.md.
kubectl apply -f "https://raw.githubusercontent.com/TensorWorks/directx-device-plugins/main/deployments/default-daemonsets.yml"
-
Modo de tenencia múltiple: este modo permite compartir los recursos de GPU entre varios contenedores en la instancia. Instale los complementos de dispositivo con compatibilidad con tenencia múltiple mediante el siguiente comando. Para obtener más información, consulte el archivo README.md.
kubectl apply -f "https://raw.githubusercontent.com/TensorWorks/directx-device-plugins/main/deployments/multitenancy-inline.yml"
Como alternativa, utilice un ConfigMap para especificar la tenencia múltiple.
kubectl apply -f "https://raw.githubusercontent.com/TensorWorks/directx-device-plugins/main/deployments/multitenancy-configmap.yml"
Verificación de la implementación del complemento del dispositivo
Tras implementar el complemento de dispositivo, sustituya <namespace>
y ejecute el siguiente comando para comprobar que el complemento de dispositivo DirectX se ejecuta correctamente en todos los nodos de Windows.
kubectl get ds device-plugin-wddm -n <namespace>
Verificación de que los contenedores están listos para su implementación
Una vez que el complemento de dispositivo DaemonSet esté en ejecución en los nodos de trabajo de Windows con GPU, utilice el siguiente comando para verificar que cada nodo disponga de GPU asignables. El número correspondiente debe coincidir con el número de dispositivos DirectX de cada nodo.
kubectl get nodes "-o=custom-columns=NAME:.metadata.name,DirectX:.status.allocatable.directx\.microsoft\.com/display"
Ejecución de contenedores de Windows con aceleración de GPU
Antes de lanzar los pods, especifique el nombre del recurso directx.microsoft.com/display
en .spec.containers[].resources
. Esto indicará que los contenedores requieren capacidades habilitadas para GPU y el kube-scheduler
intentará colocar los pods en el nodo Windows preconfigurado con recursos de GPU disponibles.
Como ejemplo, consulte el comando de muestra a continuación, que lanza un Job
para ejecutar una simulación de Monte Carlo y estimar el valor de pi. Este ejemplo proviene del repositorio de GitHub Complementos de dispositivo de Kubernetes para DirectX
cat <<EOF | kubectl apply -f -
apiVersion: batch/v1
kind: Job
metadata:
name: example-cuda-montecarlo-wddm
spec:
template:
spec:
containers:
- name: example-cuda-montecarlo-wddm
image: "index.docker.io/tensorworks/example-cuda-montecarlo:0.0.1"
resources:
limits:
directx.microsoft.com/display: 1
nodeSelector:
"kubernetes.io/os": windows
restartPolicy: Never
backoffLimit: 0
EOF
Limitaciones conocidas
Se pueden utilizar todas las GPU
Todas las GPU de la instancia estarán disponibles para cada contenedor en ejecución en el host, incluso si solicita un número específico de GPU para un contenedor determinado. Además, el comportamiento predeterminado es que todos los contenedores que se ejecutan en el host utilizarán la GPU con el índice 0, incluso si hay varias GPU disponibles en el nodo. Por lo tanto, para que las tareas que utilizan múltiples GPU funcionen correctamente, debe designar explícitamente el dispositivo GPU específico que se utilizará dentro del código de la aplicación.
La implementación exacta para asignar un dispositivo a utilizar en la aplicación dependerá del lenguaje de programación o del marco de trabajo que utilice. Por ejemplo, si utiliza la programación CUDA, para seleccionar una GPU específica, puede especificar explícitamente el dispositivo a utilizar en el código de la aplicación mediante la función cudaSetDevice()
La necesidad de especificar explícitamente el dispositivo se debe a un problema conocido que afecta a los contenedores de Windows. Puede seguir el progreso en la resolución de este problema en el tema #333 de microsoft/Windows-Containers
Considere un escenario en el que hay un único nodo de Windows del tipo de instancia g4dn.12xlarge
de EC2, que viene con cuatro GPU. Considere un escenario en el que se inicializan tres pods en esta instancia. La tabla muestra que, independientemente de la cantidad de GPU solicitadas por cada contenedor, los tres pods tienen acceso a las cuatro GPU de la instancia y, de forma predeterminada, utilizarán la GPU con el índice de dispositivo 0.
Pod | GPU solicitadas | Acceso real a la GPU | Uso de GPU predeterminado | Índices de GPU disponibles | Total de GPU de la instancia |
---|---|---|---|---|---|
Pod 1 |
1 GPU |
Las 4 GPU |
GPU con índice 0 |
0, 1, 2, 3 |
4 |
Pod 2 |
2 GPU |
Las 4 GPU |
GPU con índice 0 |
0, 1, 2, 3 |
4 |
Pod 3 |
1 GPU |
Las 4 GPU |
GPU con índice 0 |
0, 1, 2, 3 |
4 |
Compatibilidad con el complemento para dispositivos de Kubernetes
La implementación oficial de NVIDIA del complemento para dispositivos de Kubernetes
Limitaciones de las instancias de computación de GPU
Según la configuración de la cuenta de AWS, es posible que tenga límites de servicio en cuanto a la cantidad y los tipos de instancias de computación de GPU de Amazon EC2 que puede inicializar. Si necesita capacidad adicional, puede Solicitar un aumento de cuota.
Debe crear una AMI optimizada para la GPU de Windows
No existe una AMI optimizada para GPU de Windows en EKS ni un componente administrado del Generador de imágenes de EC2 proporcionado por Amazon EKS. Deberá seguir los pasos de esta guía para crear una AMI personalizada optimizada para Windows en EKS con los controladores de GPU necesarios preinstalados, o instalar los controladores de GPU requeridos en los nodos de trabajo de EKS después de inicializar las instancias.
No se admiten Inferentia ni Trainium
Las cargas de trabajo basadas en AWS Inferentia