Unterstützung für die Verbesserung dieser Seite beitragen
Um zu diesem Benutzerhandbuch beizutragen, klicken Sie auf den Link Diese Seite auf GitHub bearbeiten, der sich im rechten Bereich jeder Seite befindet.
Ausführung von GPU-beschleunigten Containern (Windows in EC2-G-Serie)
Wichtig
Das Kubernetes-Geräte-Plugin für DirectX
Erfahren Sie, wie Sie GPU-beschleunigte Windows-Container-Workloads in Amazon EKS (Elastic Kubernetes Service) mit NVIDIA-GPUs und dem Kubernetes-Geräte-Plugin für DirectX von TensorWorks ausführen. Weitere Informationen finden Sie unter Kubernetes-Geräte-Plugin für DirectX
Es gibt zwei Hauptansätze für die Einrichtung der GPU-Beschleunigung für Ihre Windows-Container:
-
Option 1: Entwickeln Sie ein benutzerdefiniertes, für Windows optimiertes EKS-AMI mit vorab installierten erforderlichen GPU-Treibern.
-
Verwenden Sie diesen Ansatz, wenn Sie eine konsistente, vorkonfigurierte Umgebung für die Ausführung GPU-beschleunigter Windows-Container benötigen und den zusätzlichen Aufwand für die Erstellung und Wartung des benutzerdefinierten AMIs in Kauf nehmen können.
-
-
Option 2: Installieren Sie die erforderlichen GPU-Treiber auf Ihren EKS-Worker-Knoten, nachdem Sie Ihre Instance gestartet haben.
-
Verwenden Sie diesen Ansatz, wenn Sie einen einfacheren Einrichtungsprozess wünschen und es Ihnen nichts ausmacht, die GPU-Treiber auf jedem neuen Worker-Knoten zu installieren. Dieser Ansatz eignet sich besser für eine Entwicklungsumgebung, in der Sie GPU-beschleunigte Workloads evaluieren oder Prototypen erstellen.
-
Beide Ansätze können mithilfe der in diesem Leitfaden beschriebenen Schritte umgesetzt werden.
Überlegungen
Dieser Leitfaden enthält Schritte zur Installation und Einrichtung der GPU-Beschleunigung für Ihre Windows-Container unter Verwendung von NVIDIA-GPUs, NVIDIA GRID-Treibern und dem Kubernetes-Geräte-Plugin für DirectX
-
Es wurden nur Instance-Typen der G-Familie mit NVIDIA-GRID-Treibern getestet und ihre Funktion mit diesem Handbuch bestätigt. Andere Instance-Typen und Treiberkombinationen können möglicherweise ebenfalls GPU-beschleunigte Windows-Container ausführen, erfordern jedoch möglicherweise zusätzliche Konfigurationsschritte, die in dieser Anleitung nicht behandelt werden.
-
Es wurden nur DirectX-basierte Workloads getestet und ihre Funktion mit diesem Handbuch bestätigt. Andere GPU-APIs wie OpenGL, Vulkan und OpenCL sind möglicherweise mit der Ausführung von GPU-beschleunigten Windows-Containern kompatibel, erfordern jedoch möglicherweise zusätzliche Konfigurationsschritte, die in diesem Handbuch nicht behandelt werden.
-
Es gibt einige bekannte Einschränkungen, die Sie beachten sollten, bevor Sie GPU-beschleunigte Windows-Container ausführen. Weitere Informationen finden Sie im Abschnitt Bekannte Beschränkungen.
Voraussetzungen
Um die GPU-Beschleunigung für Ihre Windows-Container in Amazon EKS zu aktivieren, müssen Sie zunächst die folgenden Voraussetzungen erfüllen:
-
Starten Sie einen Amazon-EKS-Cluster mit Kubernetes v1.27 oder neuer.
-
Stellen Sie Windows-Knoten mit Windows Server 2022 oder neuer bereit.
-
Stellen Sie Windows-Knoten in den Instance-Typen der G-Familie bereit, beispielsweise G4
oder G5 . -
Stellen Sie Windows-Knoten mit einer Container-Laufzeitumgebung mit containerd
1.7.xoder2.x.xbereit. (Lesen Sie Abrufen der Windows-AMI-Versionsinformationen, um die containerd-Version in Ihrem Amazon-EKS-optimierten AMI zu überprüfen.)
Installation des GPU-Treibers auf jedem Windows-Knoten
Um die NVIDIA-GRID-Treiber auf Ihren EKS-Worker-Knoten zu installieren, befolgen Sie die Schritte, die unter NVIDIA-Treiber für Ihre Amazon-EC2-Instance beschrieben sind. Navigieren Sie zu den Installationsoptionen – Option 3: GRID-Treiber und befolgen Sie die Installationsschritte.
Installation für Windows Server Core
Installieren Sie für Windows Server Core, das keine Desktop-Erfahrung bietet, NVIDIA-GRID-Treiber im Hintergrund mithilfe der folgenden Befehle:
$nvidiaInstallerFilePath = nvidia-driver-installer.exe # Replace with path to installer $installerArguments = "-s -clean -noreboot -noeula" Start-Process -FilePath $nvidiaInstallerFilePath -ArgumentList $installerArguments -Wait -NoNewWindow -PassThru
Überprüfen der Installation
Führen Sie den folgenden PowerShell-Befehl aus, um Diagnoseinformationen zu den GPUs auf der Instance anzuzeigen:
nvidia-smi
Dieser Befehl zeigt die Version des NVIDIA-Treibers sowie Informationen zur GPU-Hardware an. Stellen Sie sicher, dass die Ausgabe dieses Befehls mit der NVIDIA GRID-Treiberversion übereinstimmt, die Sie installiert haben sollten.
Bereitstellen des GPU-Geräte-Plugins auf jedem Knoten
Um die Erkennung und Freigabe der GPU-Ressourcen für Container auf Ihren Windows-Knoten zu ermöglichen, benötigen Sie ein Geräte-Plugin. Stellen Sie das DirectX-Geräte-Plugin
-
Stellen Sie das Geräte-Plugin im
kube-system-Namespace bereit. -
Legen Sie angemessene Ressourcenbeschränkungen für das DaemonSet fest, um sicherzustellen, dass es nicht übermäßig viele Ressourcen auf Ihren Knoten verbraucht.
Anmerkung
Das Geräte-Plugin DaemonSet wird auf jedem Knoten als Host-Prozess-Container mit erweiterten Berechtigungen ausgeführt. Es wird empfohlen, RBAC-Steuerelemente zu implementieren, um den Zugriff auf dieses DaemonSet einzuschränken, sodass nur autorisierte Benutzer privilegierte Befehle ausführen können.
Beim Ausführen von GPU-beschleunigten Containern unterstützt das Geräte-Plugin zwei Modi:
-
Single-Tenancy-Modus: In diesem Modus werden alle GPU-Ressourcen einem einzelnen Container auf der Instance zugewiesen. Installieren Sie die Geräte-Plugins mit Single-Tenancy-Unterstützung mithilfe des folgenden Befehls. Weitere Informationen finden Sie in der Datei README.md.
kubectl apply -f "https://raw.githubusercontent.com/TensorWorks/directx-device-plugins/main/deployments/default-daemonsets.yml" -
Multi-Tenancy-Modus: Dieser Modus ermöglicht die gemeinsame Nutzung von GPU-Ressourcen durch mehrere Container auf der Instance. Installieren Sie die Geräte-Plugins mit Multi-Tenancy-Unterstützung mithilfe des folgenden Befehls. Weitere Informationen finden Sie in der Datei README.md.
kubectl apply -f "https://raw.githubusercontent.com/TensorWorks/directx-device-plugins/main/deployments/multitenancy-inline.yml"Alternativ können Sie auch eine ConfigMap verwenden, um die Multi-Tenancy festzulegen.
kubectl apply -f "https://raw.githubusercontent.com/TensorWorks/directx-device-plugins/main/deployments/multitenancy-configmap.yml"
Überprüfung der Bereitstellung des Geräte-Plugins
Nachdem Sie das Geräte-Plugin bereitgestellt haben, ersetzen Sie <namespace> und führen Sie den folgenden Befehl aus, um zu überprüfen, ob das DirectX-Geräte-Plugin auf allen Ihren Windows-Knoten ordnungsgemäß ausgeführt wird.
kubectl get ds device-plugin-wddm -n <namespace>
Überprüfen, ob Container für die Bereitstellung bereit sind
Sobald das Geräte-Plugin DaemonSet auf den GPU-gestützten Windows-Worker-Knoten ausgeführt wird, überprüfen Sie mit dem folgenden Befehl, ob jeder Knoten über zuweisbare GPUs verfügt. Die entsprechende Zahl sollte mit der Anzahl der DirectX-Geräte auf jedem Knoten übereinstimmen.
kubectl get nodes "-o=custom-columns=NAME:.metadata.name,DirectX:.status.allocatable.directx\.microsoft\.com/display"
Ausführung von Windows-Containern mit GPU-Beschleunigung
Geben Sie vor dem Starten Ihrer Pods den Ressourcen-Namen directx.microsoft.com/display in .spec.containers[].resources an. Dies zeigt an, dass Ihre Container GPU-fähige Funktionen benötigen. kube-schedulerversucht, Ihre Pods auf Ihrem vorkonfigurierten Windows-Knoten mit verfügbaren GPU-Ressourcen zu platzieren.
Ein Beispiel hierfür ist der folgende Beispielbefehl, der Job startet, um eine Monte-Carlo-Simulation zur Schätzung des Pi-Werts auszuführen. Dieses Beispiel stammt aus dem GitHub-Repository Kubernetes-Geräte-Plugins für 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
Bekannte Beschränkungen
Alle GPUs sind verwendbar
Alle GPUs auf der Instance können von jedem ausgeführten Container auf dem Host genutzt werden, auch wenn Sie eine bestimmte Anzahl von GPUs für einen bestimmten Container anfordern. Darüber hinaus ist das Standardverhalten so, dass alle auf dem Host ausgeführten Container die GPU mit dem Index 0 verwenden, auch wenn auf dem Knoten mehrere GPUs verfügbar sind Damit Multi-GPU-Aufgaben ordnungsgemäß funktionieren, müssen Sie das zu verwendende GPU-Gerät im Code Ihrer Anwendung explizit angeben.
Die genaue Implementierung zur Zuweisung eines für die Anwendung zu verwendenden Geräts hängt von der von Ihnen verwendeten Programmiersprache oder dem verwendeten Framework ab. Wenn Sie beispielsweise CUDA-Programmierung verwenden, können Sie zur Auswahl einer bestimmten GPU das zu verwendende Gerät explizit in Ihrem Anwendungscode mithilfe der Funktion cudaSetDevice()
Die Notwendigkeit, das Gerät explizit anzugeben, ist auf ein bekanntes Problem zurückzuführen, das Windows-Container betrifft. Sie können den Fortschritt bei der Behebung dieses Problems unter microsoft/Windows-Containers issue #333
Stellen Sie sich ein Szenario vor, in dem es einen einzelnen Windows-Knoten vom EC2-Instance-Typ g4dn.12xlarge gibt, der mit vier GPUs ausgestattet ist. Nehmen Sie an, auf dieser Instance werden drei Pods gestartet. Die Tabelle zeigt, dass unabhängig von der Anzahl der von jedem Container angeforderten GPUs alle drei Pods Zugriff auf alle vier GPUs der Instance haben und standardmäßig die GPU mit dem Geräteindex 0 verwenden.
| Pod | Gewünschte GPUs | Tatsächlicher GPU-Zugriff | Standardmäßige GPU-Nutzung | Verfügbare GPU-Indizes | Gesamtzahl der Instance-GPUs |
|---|---|---|---|---|---|
|
Pod 1 |
1 GPU |
Alle 4 GPUs |
GPU mit index 0 |
0, 1, 2, 3 |
4 |
|
Pod 2 |
2 GPUs |
Alle 4 GPUs |
GPU mit index 0 |
0, 1, 2, 3 |
4 |
|
Pod 3 |
1 GPU |
Alle 4 GPUs |
GPU mit index 0 |
0, 1, 2, 3 |
4 |
Support für Kubernetes-Geräte-Plugins
Die offizielle Implementierung des Kubernetes-Geräte-Plugins
Einschränkungen für GPU-Rechen-Instances
Abhängig von Ihrer AWS-Konto-Konfiguration gelten möglicherweise Beschränkungen hinsichtlich der Anzahl und Art der Amazon-EC2-GPU-Rechen-Instances, die Sie starten können. Wenn Sie zusätzliche Kapazität benötigen, können Sie eine Kontingenterhöhung anfordern.
Notwendigkeit, eine für Windows-GPUs-optimierte AMI zu erstellen
Amazon EKS stellt keine EKS-Windows-GPU-optimierte AMI oder eine von EC2 Image Builder verwaltete Komponente zur Verfügung. Sie müssen die Schritte in dieser Anleitung befolgen, um eine benutzerdefinierte EKS-Windows-optimierte AMI mit den erforderlichen vorinstallierten GPU-Treibern zu erstellen, oder die erforderlichen GPU-Treiber auf Ihren EKS-Worker-Knoten installieren, nachdem Sie Ihre Instances gestartet haben.
Inferentia und Trainium werden nicht unterstützt
AWS Inferentia