Ausführung von GPU-beschleunigten Containern (Windows in EC2-G-Serie) - Amazon EKS

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 von TensorWorks ist ein Drittanbieter-Tool, das von AWS weder empfohlen, unterstützt noch gewartet wird. AWS übernimmt keine Verantwortung für die Sicherheit, Zuverlässigkeit oder Leistung dieses Plugins.

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 von TensorWorks. Die Schritte wurden getestet und verifiziert, um GPU-Beschleunigung für Ihre Windows-Container-Workloads in Amazon EKS bereitzustellen. Weitere Informationen zu kompatiblen Treibern und Geräte-Plugins finden Sie unter Bekannte Beschränkungen. Beachten Sie Folgendes, bevor Sie fortfahren:

  • 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.x oder 2.x.x bereit. (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 von Tensorworks auf jedem Worker-Knoten bereit, indem Sie es als DaemonSet in Ihrem EKS-Cluster ausführen. Befolgen Sie die Installationsanleitung in der README.md, welche die folgenden Schritte umfasst. Es wird empfohlen, Folgendes zu tun:

  • 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, das mehrere Beispiele enthält, mit denen Sie die GPU-Fähigkeiten Ihres Windows-Knotens testen können.

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() angeben.

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 verfolgen. Die folgende Tabelle stellt eine visuelle Darstellung und ein praktisches Beispiel für dieses GPU-Zuweisungsverhalten dar.

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 durch NVIDIA unterstützt Windows nicht. Sie können den Fortschritt bei der Hinzufügung der offiziellen Windows-Unterstützung im NVIDIA/k8s-device-plugin Problem #419 verfolgen.

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 und AWS Trainium-basierte Workloads werden unter Windows nicht unterstützt.