Unterstützung für die Verbesserung dieser Seite beitragen
Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.
Um zu diesem Benutzerhandbuch beizutragen, wählen Sie den GitHub Link Diese Seite bearbeiten unter, der sich im rechten Bereich jeder Seite befindet.
Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.
Verwenden Sie Timeslicing mit NVIDIA-GPUs auf Amazon EKS
Time-slicing ermöglicht es mehreren Pods, sich eine einzige physische NVIDIA-GPU zu teilen. Der Kubernetes-Scheduler platziert mehrere Pods auf derselben GPU, und der CUDA-Scheduler der GPU multiplext die Arbeit. Time-slicing GPU-sharing ist die einfachste Strategie. Es verwendet nur Software, erfordert keine spezielle Hardware und funktioniert auf jedem NVIDIA-GPU-Instance-Typ AWS. Time-slicing bietet keine Speicher- oder Rechenisolierung zwischen Pods, die sich eine GPU teilen. Es eignet sich am besten für Workloads mit niedriger GPU-Auslastung, z. B. für Inferenzdienste, die zwischen Anfragen inaktiv sind, oder für Entwicklungsumgebungen, in denen sich mehrere Benutzer eine GPU teilen. Verwenden Sie stattdessen Multi-Instance GPU (MIG) für Workloads, die Speicher auf Hardwareebene und Rechenisolierung erfordern.
In Amazon EKS können Sie Timeslicing entweder mit dem NVIDIA DRA-Treiber oder dem NVIDIA-Geräte-Plugin verwalten. Installieren Sie das NVIDIA Kubernetes-Geräte-Plugin
Time-slicing kann nur mit Karpenter verwendet werden, wenn Sie statische Kapazitätsbereitstellung verwenden.
Time-slicing passt gut, wenn:
-
Die GPU-Auslastung ist durchweg gering, z. B. bei latenzempfindlichen Inferenzdiensten, die zwischen Anfragen inaktiv sind.
-
Mehrere Entwickler teilen sich einen einzigen GPU-Knoten für Notebook- oder Entwicklungsarbeiten.
-
Ihre Knoten verwenden einen GPU-Instance-Typ, der MIG nicht unterstützt, wie z. B. die
g6eFamilieng5g6,, oder. -
Sie können akzeptieren, dass ein Pod gelegentlich langsamer ist, weil ein anderer Pod auf derselben GPU ausgelastet ist.
Erwägen Sie einen anderen Ansatz, wenn:
-
Sie benötigen eine Speicherisolierung. Pods auf einer GPU mit Zeitaufteilung teilen sich denselben GPU-Speicher, und ein Pod kann den Speicher erschöpfen, auf den andere Pods angewiesen sind. Verwenden Sie MIG für die Speicherisolierung.
-
Sie benötigen eine vorhersehbare Latenz oder Servicequalität pro Pod. Der GPU-Scheduler verteilt die Rechenleistung nach bestem Bemühen ohne Garantien auf mehrere Steckplätze.
-
Sie führen Trainings-Workloads aus. Time-slicing fügt Kontextwechsel hinzu, der die Trainingseffizienz reduziert. Ein Checkpoint-Job, den ein anderer Pod verlangsamt, muss von seinem letzten Checkpoint aus erneut versucht werden.
Überlegungen
Lesen Sie die folgenden Überlegungen, bevor Sie Time-Slicing in der Produktion einsetzen.
Allgemeine Überlegungen
-
Keine Speicherisolierung: Pods, die sich eine Time-Slice-GPU teilen, teilen sich ihren Speicher. Ein Pod kann Speicher zuweisen, den andere Pods benötigen, was zu Fehlern bei unzureichendem Arbeitsspeicher führen kann. Passen Sie die Anzahl der Pods, die sich jede GPU teilen, an den Speicherbedarf Ihrer Workloads an. Wenn Ihre Pods regelmäßig große Modelle laden, teilen Sie sich weniger Pods pro GPU oder verwenden Sie MIG.
-
Best-effort gemeinsame Nutzung der Rechenleistung: Der GPU-Scheduler teilt die Rechenleistung nach bestem Bemühen auf die Pods auf und garantiert nicht, dass die Rechenleistung für jeden Pod proportional ist.
-
Time-slicing und MPS kann nicht dieselbe GPU gemeinsam nutzen: Time-slicing Stellt den GPU-Rechenmodus auf ein
DEFAULT, während der Multi-Process NVIDIA-Service (MPS) dies erfordert.EXCLUSIVE_PROCESSSie können beide Strategien im selben Cluster verwenden, jedoch nicht gleichzeitig auf derselben physischen GPU. Time-slicing hat auch keine Auswirkungen auf eine MIG-Instanz. Verwenden Sie stattdessen MPS, um eine einzelne MIG-Instanz containerübergreifend gemeinsam zu nutzen. -
Per-container Metriken: NVIDIA Data Center GPU Manager (DCGM) kann einzelnen Containern keine Metriken zuordnen, wenn Time-Slicing aktiv ist. GPU-level Metriken sind weiterhin verfügbar, aber Sie können nicht identifizieren, welcher Pod eine bestimmte Menge an GPU-Ressourcen verbraucht hat.
Überlegungen zum NVIDIA DRA-Treiber
-
Alpha-Funktion: Time-slicing Durch den DRA-Treiber ist das
TimeSlicingSettingsFeature Gate erforderlich. Dabei handelt es sich um eine Alpha-Funktion, die standardmäßig deaktiviert ist. Weitere Informationen finden Sie unter Verwenden Sie GPU-Timeslicing mit dem NVIDIA DRA-Treiber. -
User-mediated Nur gemeinsame Nutzung: Pods teilen sich nur eine GPU, indem sie auf dieselbe
ResourceClaimoder verweisen, wobei der Namespace-Bereich giltResourceClaimTemplate, sodass die gemeinsame Nutzung nicht über Namespaces hinweg möglich ist. System-mediated Teilen ist eine vorgeschlagene zukünftige Funktion. -
Deaktivieren Sie das integrierte Geräte-Plugin auf Bottlerocket: Der DRA-Treiber kann nicht zusammen mit dem NVIDIA-Geräte-Plugin auf demselben Knoten ausgeführt werden. Deaktivieren Sie auf Bottlerocket das integrierte Geräte-Plug-In, für das Bottlerocket Version 1.63.0 oder höher erforderlich ist. Weitere Informationen finden Sie unter Installieren Sie den NVIDIA DRA-Treiber.
-
Rechenunterstützung: Der NVIDIA DRA-Treiber wird bei der statischen Kapazitätsbereitstellung in Karpenter, EKS-verwalteten Knotengruppen oder selbstverwalteten Knoten unterstützt und wird im EKS-Automodus nicht unterstützt. Weitere Informationen finden Sie in der statischen NodePool Dokumentation zu Karpenter auf der Website von Karpenter.
Überlegungen zum NVIDIA-Geräte-Plugin
-
Best-effort gemeinsame Nutzung von Rechenleistung mit Steckplätzen: Das Geräte-Plug-in kündigt eine feste Anzahl von Steckplätzen pro GPU an. Wenn ein einzelner Pod mehr als einen Slot anfordert, erhält er keine zusätzliche Rechenleistung. Aktivieren Sie die
fail-requests-greater-than-oneOption, um Pods abzulehnen, die mehr als einen Slot anfordern. -
Bereitstellung mit Karpenter: Karpenter zählt jede
nvidia.com/gpuAnfrage als physische GPU, auch wenn Time-Slicing auf der GPU aktiviert ist. Weitere Informationen finden Sie in Karpenter Ausgabe #2140 unter. https://github.com/kubernetes-sigs/karpenter/issues/2140GitHub -
Keine Unterstützung für den EKS-Automatikmodus: Der EKS-Automodus verwaltet das NVIDIA-Geräte-Plug-In und stellt dessen Konfiguration nicht zur Verfügung. Da für Time-Slicing eine Geräte-Plug-in-Konfiguration erforderlich ist, können Sie keine Time-Slicing-Konfiguration auf EKS-Auto-Mode-Knoten anwenden.
-
Time-slicing Konfigurationsänderungen: Das NVIDIA-Geräte-Plugin überwacht das Time-Slicing nicht auf Änderungen.
ConfigMapStarten Sie das Geräte-Plug-In neu, nachdem Sie die Konfiguration aktualisiert haben.
Konfigurationsoptionen
Sie können Timeslicing für NVIDIA-GPUs mit den NVIDIA-AMIs EKS-optimized AL2023 und Bottlerocket verwenden. Die Time-Slicing-Einstellungen variieren je nachdem, ob Sie den NVIDIA DRA-Treiber oder das NVIDIA-Geräte-Plug-In verwenden.
Verwenden Sie GPU-Timeslicing mit dem NVIDIA DRA-Treiber
Mit dem NVIDIA DRA-Treiber teilen sich Pods eine GPU, indem sie gpu.nvidia.com DeviceClass mit einem Time-Slicing auf einen Common verweisenResourceClaim, der den anfordert. GpuConfig
Der NVIDIA DRA-Treiber implementiert derzeit ein vom Benutzer vermitteltes Time-Slicing: Eine GPU wird nur von den Pods und Containern gemeinsam genutzt, auf die Sie ausdrücklich auf dieselbe Behauptung hinweisen. Da a ResourceClaim und a einen Namespace-Bereich haben, müssen ResourceClaimTemplate sich die Pods, die auf diese Weise eine GPU teilen, im selben Namespace befinden. Um eine GPU für mehrere Container in einem einzelnen Pod gemeinsam zu nutzen, müssen Sie dafür sorgen, dass jeder Container im Claim auf denselben Anforderungsnamen verweist. Container, die auf unterschiedliche Anforderungsnamen verweisen, erhalten jeweils eine separate GPU. Erstellen Sie ein separates Intervall ResourceClaimTemplate für jedes Zeitintervall, das Sie benötigen, und eines für jeden Namespace, in dem Sie GPUs gemeinsam nutzen möchten.
System-mediatedBeim Timeslicing teilt sich der Treiber eine GPU für unabhängige Claims (einschließlich Namespaces), und zwar auf der Grundlage von Kriterien, die das System definiert, und nicht anhand eines von Ihnen konfigurierten Claims. Weitere Informationen zum systemgestützten Time-Slicing finden Sie unter Time-Slicing von GPUs (Ausgabe #659) und unter System-mediated Pull Request #1257 unter.
Wichtig
Time-slicing Durch den DRA-Treiber wird das TimeSlicingSettings Feature Gate benötigt, bei dem es sich um eine Alpha-Funktion handelt, die standardmäßig deaktiviert ist. Wenn Sie die TimeSlicing Sharing-Strategie anfordern, ohne dieses Feature Gate zu aktivieren, kann der Treiber das Gerät nicht vorbereiten und der Pod bleibt ContainerCreating mit einem FailedPrepareDynamicResources Ereignis verbunden, das gemeldet wirderror validating GPU config: unknown GPU sharing strategy: TimeSlicing. Aktiviere das Feature Gate nur, wenn du die Risiken akzeptierst, die mit der Verwendung einer Alpha-Funktion verbunden sind.
Voraussetzungen
-
Ein Amazon EKS-Cluster, auf dem Kubernetes Version 1.34 oder höher ausgeführt wird. Der NVIDIA DRA-Treiber wird bei der statischen Kapazitätsbereitstellung in Karpenter, EKS-verwalteten Knotengruppen oder selbstverwalteten Knoten unterstützt.
-
Knoten mit NVIDIA-GPU-Instance-Typen, die EKS-optimized das AL2023 NVIDIA AMI verwenden.
-
Der NVIDIA DRA-Treiber wurde wie unter beschrieben installiertInstallieren Sie den NVIDIA DRA-Treiber, wobei das
TimeSlicingSettingsFeature Gate aktiviert war.
Verfahren
-
Erstellen Sie eine
ResourceClaim, die eine GPU mit derTimeSlicingSharing-Strategie anfordert. Mehrere Pods, die auf diese Behauptung verweisen, verwenden dieselbe physische GPU.cat <<EOF | kubectl apply -f - apiVersion: resource.k8s.io/v1 kind: ResourceClaim metadata: name: shared-timeslice-gpu spec: devices: requests: - name: gpu exactly: deviceClassName: gpu.nvidia.com count: 1 config: - requests: ["gpu"] opaque: driver: gpu.nvidia.com parameters: apiVersion: resource.nvidia.com/v1beta1 kind: GpuConfig sharing: strategy: TimeSlicing timeSlicingConfig: interval: Long EOF -
Stellen Sie zwei oder mehr Pods bereit, die den gemeinsam genutzten Pods
ResourceClaimnamentlich referenzieren. Jeder Pod verweist überresourceClaimsund auf den Anspruchresources.claims.cat <<EOF | kubectl apply -f - apiVersion: v1 kind: Pod metadata: name: share-a spec: tolerations: - key: nvidia.com/gpu operator: Exists effect: NoSchedule containers: - name: cuda image: nvidia/cuda:12.6.0-base-ubuntu22.04 command: ["nvidia-smi", "-L"] resources: claims: - name: gpu resourceClaims: - name: gpu resourceClaimName: shared-timeslice-gpu restartPolicy: OnFailure EOF -
Stellen Sie sicher, dass die Pods dieselbe physische GPU verwenden. Führen Sie
nvidia-smi -Ljeden Pod aus und vergewissern Sie sich, dass sie dieselbe GPU-UUID melden.kubectl logs share-aEine Beispielausgabe sieht wie folgt aus. Ein zweiter Pod, der auf dieselbe Behauptung verweist, meldet eine identische
GPUUUID, was bestätigt, dass sich beide Pods eine physische GPU teilen.GPU 0: NVIDIA L4 (UUID: GPU-b41973ee-5d0a-cde8-6287-12b53f861f02)
Verwenden Sie GPU-Time-Slicing auf Bottlerocket-Knoten mit dem NVIDIA-Geräte-Plugin
Auf Bottlerocket enthält das beschleunigte AMI das EKS-optimized NVIDIA-Geräte-Plugin. Sie aktivieren Time-Slicing über die settings.kubelet-device-plugins.nvidia Einstellungen, die Bottlerocket beim Booten des Nodes in die Geräte-Plug-in-Konfiguration rendert.
Voraussetzungen
-
Ein Amazon EKS-Cluster. Das folgende Verfahren versorgt NVIDIA-GPU-Knoten mit dem EKS-optimized Bottlerocket NVIDIA AMI.
-
Karpenter wurde in Ihrem Cluster installiert und konfiguriert, da das folgende Verfahren einen Karpenter verwendet,
EC2NodeClassum die Time-Slicing-Einstellungen in den Benutzerdaten des Bottlerocket-Knotens bereitzustellen. Weitere Informationen finden Sie unter Erste Schritte mit Karpenter auf der Karpenter-Website. -
kubectlkonfiguriert für die Kommunikation mit Ihrem Cluster, weitere Informationen finden Sie unterInstallieren oder aktualisieren Sie kubectl.
Verfahren
Fügen Sie die Time-Slicing-Einstellungen zu den Bottlerocket-Benutzerdaten für Ihre GPU-Knoten hinzu. Im folgenden Beispiel werden vier Steckplätze pro GPU konfiguriert. Die Art und Weise, wie Sie Benutzerdaten angeben, hängt davon ab, wie Sie Knoten bereitstellen. Das folgende Beispiel zeigt einen KarpenterEC2NodeClass.
cat <<EOF | kubectl apply -f - apiVersion: karpenter.k8s.aws/v1 kind: EC2NodeClass metadata: name: gpu-bottlerocket-timeslicing spec: amiFamily: Bottlerocket amiSelectorTerms: - alias: bottlerocket@latest role: eksctl-KarpenterNodeRole-<cluster-name> subnetSelectorTerms: - tags: karpenter.sh/discovery: <cluster-name> securityGroupSelectorTerms: - tags: karpenter.sh/discovery: <cluster-name> userData: | [settings.kubelet-device-plugins.nvidia] device-sharing-strategy = "time-slicing" [settings.kubelet-device-plugins.nvidia.time-slicing] replicas = 4 rename-by-default = false fail-requests-greater-than-one = true EOF
Wenn Knoten, die mit diesen Einstellungen ausgestattet sind, dem Cluster beitreten, kündigt das Geräte-Plug-In vier nvidia.com/gpu Steckplätze für jede physische GPU an. Sie fordern sie in Ihrer Workload-Spezifikation mit Container-Ressourcenanforderungen oder Grenzwerten für die nvidia.com/gpu erweiterte Ressource an.
Verwenden Sie das GPU-Time-Slicing auf AL2023-Knoten mit dem NVIDIA-Geräte-Plugin
Auf AL2023 installieren Sie das NVIDIA-Geräte-Plug-In wie unter beschriebenInstallieren Sie das NVIDIA Kubernetes-Geräte-Plugin, und stellen die Time-Slicing-Konfiguration in einem bereit. ConfigMap
Voraussetzungen
-
Ein Amazon EKS-Cluster mit Knoten, die NVIDIA-GPU-Instance-Typen und das EKS-optimized AL2023 NVIDIA AMI verwenden.
-
Weitere Informationen finden Sie in den Anweisungen zur Einrichtung von Helm.
-
kubectlkonfiguriert für die Kommunikation mit Ihrem Cluster, weitere Informationen Installieren oder aktualisieren Sie kubectl finden Sie unter.
Verfahren
-
Erstellen Sie das Time-Slicing
ConfigMapin demnvidiaNamespace, in dem Sie das Geräte-Plug-In installiert haben. Installieren Sie das NVIDIA Kubernetes-Geräte-Plugin In diesem Beispiel werden vier Steckplätze pro GPU konfiguriert.cat <<EOF | kubectl apply -f - apiVersion: v1 kind: ConfigMap metadata: name: nvidia-device-plugin-config namespace: nvidia data: config.yaml: | version: v1 sharing: timeSlicing: renameByDefault: false failRequestsGreaterThanOne: true resources: - name: nvidia.com/gpu replicas: 4 EOF -
Aktualisieren Sie die bestehende Version des NVIDIA-Geräte-Plug-ins, um auf
ConfigMapdenconfig.nameWert zu verweisen. Das--reuse-valuesFlag behält die Werte bei, die Sie bei der Installation des Geräte-Plug-ins Installieren Sie das NVIDIA Kubernetes-Geräte-Plugin festgelegt haben.helm upgrade nvdp nvdp/nvidia-device-plugin \ --namespace nvidia \ --reuse-values \ --set config.name=nvidia-device-plugin-config
Anmerkung
Das Geräte-Plugin wird nicht automatisch neu geladen, wenn Sie das ändern. ConfigMap Nachdem Sie die Time-Slicing-Konfiguration aktualisiert haben, starten Sie die Geräte-Plugin-Pods neu, um die Änderung zu übernehmen.
Stellen Sie sicher, dass das GPU-Time-Slicing aktiv ist
Vergewissern Sie sich, dass das Geräte-Plug-in die erwartete Anzahl von Steckplätzen angibtReady, nachdem Ihre Knoten in Zeitaufteilung eingerichtet sind, und dass sich die Pods eine physische GPU teilen.
Anmerkung
Die Überprüfung der gemeinsamen UUID in diesem Verfahren zeigt das Time-Slicing am deutlichsten, wenn die Pods auf derselben physischen GPU landen. Auf einem Knoten mit einer einzigen GPU kündigt das Geräte-Plugin vier Steckplätze an, und alle vier Pods teilen sich diese GPU, sodass sie dieselbe UUID melden. Auf einem Knoten mit mehreren physischen GPUs kann der Scheduler Pods auf verschiedenen GPUs platzieren. Diese Pods melden unterschiedliche UUIDs, obwohl Time-Slicing aktiv ist. Um die gemeinsame Nutzung auf einer GPU zu demonstrieren, planen Sie die Arbeitslast auf einen Instanztyp mit einer einzelnen GPU ein. Fügen Sie beispielsweise einen Knotenselektor hinzu, z. B. node.kubernetes.io/instance-type: g6.2xlarge zur Pod-Spezifikation.
-
Vergewissern Sie sich, dass der Knoten die konfigurierte Anzahl von GPU-Steckplätzen bekannt gibt. Bei vier Steckplätzen pro GPU meldet
4sich ein Knoten mit einer physischen GPU.kubectl get nodes "-o=custom-columns=NAME:.metadata.name,GPU:.status.allocatable.nvidia\.com/gpu"Eine Beispielausgabe sieht wie folgt aus.
NAME GPU ip-192-168-11-225.us-west-2.compute.internal 4 -
Erstellen Sie eine Bereitstellung, in der vier Replikate ausgeführt werden, von denen jedes einen GPU-Steckplatz anfordert.
cat <<EOF | kubectl apply -f - apiVersion: apps/v1 kind: Deployment metadata: name: timeslicing-demo spec: replicas: 4 selector: matchLabels: app: timeslicing-demo template: metadata: labels: app: timeslicing-demo spec: tolerations: - key: nvidia.com/gpu operator: Exists effect: NoSchedule containers: - name: cuda image: nvidia/cuda:12.6.0-base-ubuntu22.04 command: ["bash", "-c", "nvidia-smi --query-gpu=uuid --format=csv,noheader; sleep infinity"] resources: limits: nvidia.com/gpu: 1 EOF -
Vergewissern Sie sich, dass alle vier Pods auf demselben Knoten geplant sind.
kubectl get pods -l app=timeslicing-demo -o wide -
Vergewissern Sie sich, dass alle vier Pods dieselbe GPU-UUID melden. Eine einzige gemeinsame UUID für alle vier Pods bestätigt, dass eine physische GPU im Zeitmultiplex ausgeführt wird.
kubectl logs -l app=timeslicing-demo --prefixEine Beispielausgabe sieht wie folgt aus.
[pod/timeslicing-demo-xxxxxxxxxx-aaaaa/cuda] GPU-c0583cce-87c5-c736-db7f-6d3128c84d03 [pod/timeslicing-demo-xxxxxxxxxx-bbbbb/cuda] GPU-c0583cce-87c5-c736-db7f-6d3128c84d03 [pod/timeslicing-demo-xxxxxxxxxx-ccccc/cuda] GPU-c0583cce-87c5-c736-db7f-6d3128c84d03 [pod/timeslicing-demo-xxxxxxxxxx-ddddd/cuda] GPU-c0583cce-87c5-c736-db7f-6d3128c84d03