Kleine Batch-Arbeitslast mit GPUs und Flex-Start-VMs ausführen

In diesem Leitfaden erfahren Sie, wie Sie die GPU-Bereitstellung für Trainingsarbeitslasten im kleinen und mittleren Maßstab mit Flex-Start-VMs optimieren. Flex-Start-VMs werden mit der Verbrauchsoption „Flex-Start“ erstellt. In diesem Leitfaden verwenden Sie Flex-Start-VMs, um eine Arbeitslast bereitzustellen, die aus zwei Kubernetes-Jobs besteht. Für jeden Job ist eine GPU erforderlich. GKE stellt automatisch einen einzelnen Knoten mit zwei A100-GPUs bereit, um beide Jobs auszuführen.

Wenn für Ihre Arbeitslast eine verteilte Verarbeitung auf mehreren Knoten erforderlich ist, sollten Sie Flex-Start mit Bereitstellung in der Warteschlange verwenden. Weitere Informationen finden Sie unter Arbeitslast im großen Maßstab mit Flex-Start und Bereitstellung in der Warteschlange ausführen.

Dieser Leitfaden richtet sich an Machine-Learning-Entwickler, Plattformadministratoren und ‑operatoren sowie an Daten- und KI-Experten, die Funktionen zur Kubernetes-Containerorchestrierung für die Ausführung von Batcharbeitslasten nutzen möchten. Weitere Informationen zu gängigen Rollen und Beispielaufgaben, auf die wir in Google Cloud Inhalten verweisen, finden Sie unter Häufig verwendete GKE-Nutzerrollen und -Aufgaben.

Preise für Flex-Start

Flex-Start wird empfohlen, wenn für Ihre Arbeitslast dynamisch bereitgestellte Ressourcen nach Bedarf für bis zu sieben Tage mit kurzfristigen Reservierungen, ohne komplexe Kontingentverwaltung und mit kostengünstigem Zugriff erforderlich sind. Flex-Start wird von Dynamic Workload Scheduler unterstützt und nach den Preisen für Dynamic Workload Scheduler abgerechnet:

  • Rabattiert (bis zu 53%) für vCPUs, GPUs und TPUs.
  • Sie zahlen nach Nutzung.

Hinweis

Führen Sie die folgenden Aufgaben aus, bevor Sie beginnen:

  • Aktivieren Sie die Google Kubernetes Engine API.
  • Google Kubernetes Engine API aktivieren
  • Wenn Sie die Google Cloud CLI für diese Aufgabe verwenden möchten, installieren und dann initialisieren Sie die gcloud CLI. Wenn Sie die gcloud CLI bereits installiert haben, rufen Sie die neueste Version mit dem gcloud components update Befehl ab. Ältere Versionen der gcloud CLI unterstützen möglicherweise nicht die Ausführung der Befehle in diesem Dokument.
  • Prüfen Sie, ob Sie einen Autopilot-Cluster oder einen Standardcluster mit Version 1.33.0-gke.1712000 oder höher haben.
  • Machen Sie sich mit den Einschränkungen von Flex-Start vertraut.
  • Wenn Sie einen Standardcluster verwenden, achten Sie darauf, dass mindestens ein Knotenpool ohne aktivierten Flex-Start vorhanden ist, damit der Cluster ordnungsgemäß funktioniert.
  • Prüfen Sie, ob Sie in Ihren Knoten standorten ein Kontingent für präemptive GPUs haben.

Wenn Sie keinen Cluster haben oder Ihr Cluster die Anforderungen nicht erfüllt, können Sie mit der gcloud CLI einen regionalen Standardcluster erstellen. Fügen Sie die folgenden Flags hinzu, um mehr über Flex-Start zu erfahren:

--location=us-central1 \
--node-locations=us-central1-a,us-central1-b \
--machine-type=g2-standard-8

Verwenden Sie beim Erstellen eines Flex-Start-Knotenpools die oben genannten Flags und --accelerator type=nvidia-l4,count=1.

Wenn Sie einen Standardcluster haben, der die Anforderungen erfüllt, führen Sie die nächsten Abschnitte durch, um einen GPU-Beschleunigertyp und einen Maschinentyp für Ihren Cluster auszuwählen.

GPU-Beschleunigertyp auswählen

Wenn Sie einen Cluster im Autopilot-Modus verwenden, überspringen Sie diesen Abschnitt und gehen Sie zum Abschnitt Batcharbeitslast ausführen.

Die GPU-Verfügbarkeit ist für jede Zone spezifisch. Sie müssen einen GPU-Beschleunigertyp finden, der in einer Zone verfügbar ist, in der sich der Standardcluster befindet. Wenn Sie einen regionalen Standardcluster haben, muss sich die Zone, in der der GPU-Beschleunigertyp verfügbar ist, in der Region befinden, in der sich der Cluster befindet. Beim Erstellen des Knotenpools geben Sie den Beschleunigertyp und die Zonen für die Knoten an. Wenn Sie einen Beschleunigertyp angeben, der am Standort des Clusters nicht verfügbar ist, schlägt die Erstellung des Knotenpools fehl.

Führen Sie die folgenden Befehle aus, um den Standort Ihres Clusters und einen unterstützten GPU-Beschleunigertyp abzurufen.

  1. Standort des Clusters abrufen:

    gcloud container clusters list
    

    Die Ausgabe sieht etwa so aus:

    NAME                LOCATION  MASTER_VERSION      MASTER_IP     MACHINE_TYPE  NODE_VERSION        NUM_NODES  STATUS   STACK_TYPE
    example-cluster-1   us-west2  1.33.2-gke.1111000  34.102.3.122  e2-medium     1.33.2-gke.1111000  9          RUNNING  IPV4
    
  2. Verfügbare GPU-Beschleunigertypen auflisten, mit Ausnahme virtueller Workstations am Standort:

    gcloud compute accelerator-types list | grep CONTROL_PLANE_LOCATION | grep -v "Workstation"
    

    Ersetzen Sie CONTROL_PLANE_LOCATION durch den Standort des Clusters.

    Führen Sie beispielsweise den folgenden Befehl aus, um eine Liste der GPU-Beschleunigertypen in der Region us-west2 abzurufen:

    gcloud compute accelerator-types list | grep us-west2 | grep -v "Workstation"
    

    Die Ausgabe sieht etwa so aus:

    nvidia-b200            us-west2-c                 NVIDIA B200 180GB
    nvidia-tesla-p4        us-west2-c                 NVIDIA Tesla P4
    nvidia-tesla-t4        us-west2-c                 NVIDIA T4
    nvidia-tesla-p4        us-west2-b                 NVIDIA Tesla P4
    nvidia-tesla-t4        us-west2-b                 NVIDIA T4
    

Kompatiblen Maschinentyp auswählen

Wenn Sie einen Cluster im Autopilot-Modus verwenden, überspringen Sie diesen Abschnitt und gehen Sie zum Abschnitt Batcharbeitslast ausführen.

Nachdem Sie wissen, welche GPUs am Standort des Clusters verfügbar sind, können Sie die kompatiblen Maschinentypen bestimmen. Google Cloud beschränkt GPUs auf bestimmte Maschinenreihen. So finden Sie einen Maschinentyp:

  1. Sehen Sie sich die Tabelle Verfügbare GPU-Modelle an.
  2. Suchen Sie die Zeile für den von Ihnen ausgewählten GPU-Beschleunigertyp.
  3. Sehen Sie sich die Spalte „Maschinenreihe“ für diese Zeile an. In dieser Spalte erfahren Sie, welche Maschinenreihe Sie verwenden müssen.
  4. Klicken Sie auf den Link zur Maschinenreihe, um die Namen der Maschinentypen zu sehen, die Sie angeben können.

Die einzige Ausnahme ist die Maschinenreihe N1, die zusätzliche Informationen dazu bietet, welche N1-Maschinentypen Sie verwenden können mit dem ausgewählten Beschleunigertyp.

Bevor Sie eine beschleunigeroptimierte Maschine verwenden, prüfen Sie, ob sie mit dem Bereitstellungsmodus „Flex-Start“ unterstützt wird. Informationen dazu finden Sie unter Verfügbarkeit der Verbrauchsoption nach Maschinentyp.

Anzahl der Beschleuniger bestimmen

Wenn Sie einen Cluster im Autopilot-Modus verwenden, überspringen Sie diesen Abschnitt und gehen Sie zum Abschnitt Batcharbeitslast ausführen.

Zum Erstellen eines Knotenpools müssen Sie die Anzahl der Beschleuniger bestimmen, die an jeden Knoten im Knotenpool angehängt werden sollen. Gültige Werte hängen vom Beschleunigertyp und Maschinentyp ab. Für jeden Maschinentyp gilt ein Limit für die Anzahl der GPUs, die er unterstützen kann. So bestimmen Sie den zu verwendenden Wert (neben dem Standardwert 1):

  1. Sehen Sie sich die GPU-Maschinentypen an.
  2. Suchen Sie in der Tabelle nach dem Beschleunigertyp für Ihren Maschinenserientyp.
  3. Verwenden Sie den Wert in der Spalte „GPU-Anzahl“.

Knotenpool mit Flex-Start erstellen

Wenn Sie einen Cluster im Autopilot-Modus verwenden, überspringen Sie diesen Abschnitt und gehen Sie zum Abschnitt Batcharbeitslast ausführen.

Zum Erstellen eines neuen Knotenpools mit aktiviertem Flex-Start in einem vorhandenen Standardcluster können Sie die gcloud CLI oder Terraform verwenden.

gcloud

  1. Knotenpool mit Flex-Start erstellen:

    gcloud container node-pools create NODE_POOL_NAME \
        --cluster CLUSTER_NAME \
        --location CONTROL_PLANE_LOCATION \
        --project PROJECT_ID \
        --accelerator type=ACCELERATOR_TYPE,count=COUNT \
        --machine-type MACHINE_TYPE \
        --max-run-duration MAX_RUN_DURATION \
        --flex-start \
        --node-locations NODE_ZONES \
        --num-nodes 0 \
        --enable-autoscaling \
        --total-min-nodes 0 \
        --total-max-nodes 5 \
        --location-policy ANY \
        --reservation-affinity none \
        --no-enable-autorepair \
        --consolidation-delay=CONSOLIDATION_DELAY
    

    Ersetzen Sie Folgendes:

    • NODE_POOL_NAME: der Name, den Sie für Ihren Knotenpool auswählen
    • CLUSTER_NAME: der Name des Standardclusters, den Sie ändern möchten
    • CONTROL_PLANE_LOCATION: die Compute-Region für die Steuerungsebene des Clusters
    • PROJECT_ID: Ihre Projekt-ID
    • ACCELERATOR_TYPE: der spezifische Beschleunigertyp (z. B. nvidia-tesla-t4 für NVIDIA T4), der an die Instanzen angehängt werden soll
    • COUNT: die Anzahl der Beschleuniger, die an die Instanzen angehängt werden sollen Der Standardwert ist 1.
    • MACHINE_TYPE: der Maschinentyp, der für Knoten verwendet werden soll
    • MAX_RUN_DURATION: optional. Die maximale Laufzeit eines Knotens in Sekunden, bis zum Standardwert von sieben Tagen. Die eingegebene Zahl muss mit s enden. Wenn Sie beispielsweise einen Tag angeben möchten, geben Sie 86400s ein.
    • CONSOLIDATION_DELAY: optional. Die Dauer, die das Cluster-Autoscaling wartet, bevor es unterlastete Knoten herunterskalieren kann. Mit dieser Einstellung können Sie das Herunterskalieren verzögern und den Knotenpool für die spätere Wiederverwendung durch andere Pods beibehalten. Die eingegebene Zahl muss mit s enden. Wenn Sie beispielsweise eine Stunde angeben möchten, geben Sie 3600s ein. Verfügbar in GKE-Version 1.34.1-gke.2364000 und höher.
    • NODE_ZONES: eine durch Kommas getrennte Liste mit einer oder mehreren Zonen, in denen GKE den Knotenpool erstellt

    In diesem Befehl weist das Flag --flex-start gcloud an, einen Knotenpool mit Flex-Start-VMs zu erstellen.

    GKE erstellt einen Knotenpool mit Knoten, die zwei Instanzen des angegebenen Beschleunigertyps enthalten. Der Knotenpool hat anfangs null Knoten und das Autoscaling ist aktiviert.

Terraform

Sie können Flex-Start mit GPUs über ein Terraform-Modul verwenden.

  1. Fügen Sie Ihrer Terraform-Konfiguration den folgenden Block hinzu:
resource "google_container_node_pool" "gpu_dws_pool" {
name = "gpu-dws-pool"

queued_provisioning {
    enabled = false
}

}
node_config {
    machine_type = "MACHINE_TYPE"
    accelerator_type = "ACCELERATOR_TYPE"
    accelerator_count = COUNT
    node_locations = ["NODE_ZONES"]
    flex_start = true
}

Ersetzen Sie Folgendes:

  • MACHINE_TYPE: der Maschinentyp, der für Knoten verwendet werden soll
  • ACCELERATOR_TYPE: der spezifische Typ des Beschleunigers (z. B. nvidia-tesla-t4 für NVIDIA T4), der an die Instanzen angehängt werden soll
  • COUNT: die Anzahl der Beschleuniger, die an die Instanzen angehängt werden sollen Der Standardwert ist 1.
  • NODE_ZONES: die durch Kommas getrennte Liste mit einer oder mehreren Zonen, in denen GKE den Knotenpool erstellt

Terraform ruft Google Cloud APIs auf, um einen Cluster mit einem Knoten pool zu erstellen, der Flex-Start-VMs mit GPUs verwendet. Der Knotenpool hat anfangs null Knoten und das Autoscaling ist aktiviert. Weitere Informationen zu Terraform finden Sie in der google_container_node_pool Ressourcenspezifikation auf terraform.io.

Status von Flex-Start im Knotenpool prüfen

Führen Sie dazu diesen Befehl aus:

gcloud container node-pools describe NODE_POOL_NAME \
    --cluster CLUSTER_NAME \
    --location CONTROL_PLANE_LOCATION \
    --format="get(config.flexStart)"

Wenn Flex-Start im Knotenpool aktiviert ist, ist das Feld flexStart auf True gesetzt.

Batcharbeitslast ausführen

In diesem Abschnitt erstellen Sie zwei Kubernetes-Jobs, für die jeweils eine GPU erforderlich ist. Ein Jobcontroller in Kubernetes erstellt einen oder mehrere Pods und sorgt dafür, dass sie eine bestimmte Aufgabe erfolgreich ausführen.

  1. Starten Sie in der Google Cloud Console eine Cloud Shell-Sitzung. Klicken Sie dazu auf Symbol für die Cloud Shell-Aktivierung Cloud Shell aktivieren. Im unteren Bereich der Google Cloud Console wird eine Sitzung geöffnet.

  2. Erstellen Sie eine Datei mit dem Namen dws-flex-start.yaml:

    apiVersion: batch/v1
    kind: Job
    metadata:
      name: job-1
    spec:
      template:
        spec:
          nodeSelector:
            cloud.google.com/gke-flex-start: "true"
            cloud.google.com/gke-accelerator: ACCELERATOR_TYPE
          containers:
          - name: container-1
            image: gcr.io/k8s-staging-perf-tests/sleep:latest
            args: ["10s"] # Sleep for 10 seconds
            resources:
              requests:
                  nvidia.com/gpu: 1
              limits:
                  nvidia.com/gpu: 1
          restartPolicy: OnFailure
    ---
    apiVersion: batch/v1
    kind: Job
    metadata:
      name: job-2
    spec:
      template:
        spec:
          nodeSelector:
            cloud.google.com/gke-flex-start: "true"
            cloud.google.com/gke-accelerator: ACCELERATOR_TYPE
          containers:
          - name: container-2
            image: gcr.io/k8s-staging-perf-tests/sleep:latest
            args: ["10s"] # Sleep for 10 seconds
            resources:
              requests:
                  nvidia.com/gpu: 1
              limits:
                  nvidia.com/gpu: 1
          restartPolicy: OnFailure
    
  3. Wenden Sie das Manifest dws-flex-start.yaml an:

    kubectl apply -f dws-flex-start.yaml
    
  4. Prüfen Sie, ob die Jobs auf demselben Knoten ausgeführt werden:

    kubectl get pods -l "job-name in (job-1,job-2)" -o wide
    

    Die Ausgabe sieht etwa so aus:

    NAME    READY   STATUS      RESTARTS   AGE   IP       NODE               NOMINATED NODE   READINESS GATES
    job-1   0/1     Completed   0          19m   10.(...) gke-flex-zonal-a2  <none>           <none>
    job-2   0/1     Completed   0          19m   10.(...) gke-flex-zonal-a2  <none>           <none>
    

Bereinigen

Damit Ihrem Google Cloud -Konto die auf dieser Seite verwendeten Ressourcen nicht in Rechnung gestellt werden, können Sie entweder das Projekt löschen, das die Ressourcen enthält, oder das Projekt beibehalten und die einzelnen Ressourcen löschen.

Projekt löschen

  1. Wechseln Sie in der Google Cloud Console zur Seite Ressourcen verwalten.

    Zur Seite „Ressourcen verwalten“

  2. Wählen Sie in der Projektliste das Projekt aus, das Sie löschen möchten, und klicken Sie auf Löschen.
  3. Geben Sie im Dialogfeld die Projekt-ID ein und klicken Sie auf Shut down (Beenden), um das Projekt zu löschen.

Einzelne Ressource löschen

  1. Jobs löschen:

    kubectl delete job -l "job-name in (job-1,job-2)"
    
  2. Löschen Sie den Knotenpool:

    gcloud container node-pools delete NODE_POOL_NAME \
          --location CONTROL_PLANE_LOCATION
    
  3. Löschen Sie den Cluster:

    gcloud container clusters delete CLUSTER_NAME
    

Nächste Schritte