Kleine Batcharbeitslast mit TPUs und dem Bereitstellungsmodus „Flex-Start“ ausführen


In diesem Leitfaden erfahren Sie, wie Sie die TPU-Bereitstellung für Trainingsarbeitslasten mittleren und kleinen Umfangs mit dem Bereitstellungsmodus „Flex-Start“ optimieren. In dieser Anleitung verwenden Sie Flex-Start, um eine Arbeitslast bereitzustellen, die aus einem TPU-Slice-Knotenpool besteht.

Dieser Leitfaden richtet sich an Entwickler von maschinellem Lernen (ML), Plattformadministratoren und ‑operatoren sowie an Daten- und KI-Spezialisten, die daran interessiert sind, Kubernetes-Container-Orchestrierungsfunktionen zum Ausführen von Batcharbeitslasten zu nutzen. Weitere Informationen zu gängigen Rollen und Beispielaufgaben, auf die wir in Trusted Cloud by S3NS Inhalten verweisen, finden Sie unter Häufig verwendete GKE Enterprise-Nutzerrollen und -Aufgaben.

Flex-Start-Preise

Flex-Start wird empfohlen, wenn für Ihre Arbeitslast dynamisch bereitgestellte Ressourcen nach Bedarf für bis zu sieben Tage mit kurzfristigen Reservierungen, ohne komplexes Kontingentmanagement und kostengünstigen Zugriff erforderlich sind. Flex-Start basiert auf dem Dynamic Workload Scheduler und wird gemäß der Preisgestaltung für den Dynamic Workload Scheduler abgerechnet:

  • Rabattiert (bis zu 53%) für vCPUs, GPUs und TPUs.
  • Sie zahlen nur für die tatsächliche Nutzung.

Hinweise

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, müssen Sie die gcloud CLI installieren und dann initialisieren. Wenn Sie die gcloud CLI bereits installiert haben, rufen Sie die neueste Version mit gcloud components update ab.
  • 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, muss mindestens ein Knotenpool ohne aktivierte Flex-Start-Funktion vorhanden sein, damit der Cluster ordnungsgemäß funktioniert.
  • Prüfen Sie, ob Sie ein Kontingent für TPUs auf Abruf an Ihren Knotenstandorten haben.

Knotenpool mit Flex-Start erstellen

Wenn Sie einen Knotenpool mit aktiviertem Flex-Start in einem vorhandenen Standard-Cluster erstellen möchten, verwenden Sie die gcloud CLI.

Wenn Sie einen Cluster im Autopilot-Modus verwenden, überspringen Sie diesen Abschnitt und fahren Sie mit dem Abschnitt Batcharbeitslast ausführen fort.

Sie können einen TPU-Slice-Knotenpool mit einem oder mehreren Hosts mit Flex-Start erstellen:

  1. So erstellen Sie einen Knotenpool mit Flex-Start:

    Einzelner Host

    gcloud container node-pools create NODE_POOL_NAME \
        --cluster=CLUSTER_NAME \
        --location=LOCATION_NAME \
        --node-locations=NODE_ZONES \
        --machine-type=MACHINE_TYPE \
        --reservation-affinity=none \
        --enable-autoscaling \
        --flex-start \
        --num-nodes 0 \
        --min-nodes=0 \
        --max-nodes=1
    

    Ersetzen Sie Folgendes:

    • NODE_POOL_NAME: der Name, den Sie für Ihren Knotenpool auswählen
    • CLUSTER_NAME ist der Name des Clusters.
    • LOCATION_NAME: die Compute-Region für die Clustersteuerungsebene.
    • NODE_ZONES: Die durch Kommas getrennte Liste mit einer oder mehreren Zonen, in denen GKE den Knotenpool erstellt.
    • MACHINE_TYPE: Der Maschinentyp für Knoten. Weitere Informationen zu TPU-kompatiblen Maschinentypen finden Sie in der Tabelle unter TPU-Version auswählen.

    Mehrere Hosts

    gcloud container node-pools create NODE_POOL_NAME \
        --cluster=CLUSTER_NAME \
        --location=LOCATION_NAME \
        --node-locations=NODE_ZONES \
        --machine-type=MACHINE_TYPE \
        --tpu-topology=TPU_TOPOLOGY \
        --flex-start \
        --enable-autoscaling \
        --num-nodes=0 \
        --max-nodes=2 \
        --reservation-affinity=none \
        --no-enable-autorepair
    

    Ersetzen Sie Folgendes:

    • NODE_POOL_NAME: der Name, den Sie für Ihren Knotenpool auswählen
    • CLUSTER_NAME ist der Name des Clusters.
    • LOCATION_NAME: die Compute-Region für die Clustersteuerungsebene.
    • NODE_ZONES: Die durch Kommas getrennte Liste mit einer oder mehreren Zonen, in denen GKE den Knotenpool erstellt.
    • MACHINE_TYPE: Der Maschinentyp für Knoten. Sie können beispielsweise ct6e-standard-4t für TPU Trillium verwenden. Weitere Informationen zu den verfügbaren Maschinentypen finden Sie unter TPU-Version auswählen.
    • TPU_TOPOLOGY: Die physische Topologie für das TPU-Slice. Das Format der Topologie hängt von der TPU-Version ab. Weitere Informationen zu TPU-Topologien finden Sie in der Tabelle unter Topologie auswählen.

    Im vorherigen Befehl werden die folgenden erforderlichen Flags verwendet, wenn Sie einen Knotenpool mit Flex-Start erstellen:

    • --enable-autoscaling:Bei „flex-start“ werden nur die erforderlichen Rechenressourcen bereitgestellt, wenn Ihre Arbeitslast ausgeführt wird. Sie müssen die folgenden Parameter festlegen:

      • --num-nodes=0
      • --min-nodes=0
      • --max-nodes auf die Anzahl der virtuellen Maschinen festgelegt, die für Ihren TPU-Slice erforderlich sind.

        Der Befehl zum Erstellen eines Knotenpools kann beispielsweise die folgenden Parameter enthalten:

        ...
        --machine-type=ct6e-standard-4t \
        --tpu-topology=4x4 \
        --enable-autoscaling \
        --num-nodes=0 \
        --max-nodes=4 \
        

        Mit diesem Befehl wird das Feld --max-nodes auf 4 gesetzt, da eine 4x4-Topologie aus 16 Chips besteht und jede ct6e-standard-4t-VM 4 Chips hat.

      Cluster Autoscaler skaliert auf die Anzahl der Knoten, die für Ihre Arbeitslast erforderlich sind. Nachdem Ihre Arbeitslast abgeschlossen ist, skaliert Cluster Autoscaler auf null Knoten herunter.

    • --reservation-affinity=none:Bei „Flex-Start“ werden keine Reservierungen verwendet oder benötigt.

  2. Prüfen Sie den Status von Flex-Start im Knotenpool:

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

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

Batcharbeitslast ausführen

In diesem Abschnitt erstellen Sie einen Job, der einen TPU-Knoten mit Flex-Start plant. 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 Trusted Cloud Console eine Cloud Shell-Sitzung, indem Sie auf Symbol für die Cloud Shell-Aktivierung Cloud Shell aktivieren klicken. Im unteren Bereich der Trusted Cloud -Konsole wird eine Sitzung geöffnet.

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

    Einzelner Host

    Verwenden Sie das folgende Manifest für die Datei 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-tpu-accelerator: ACCELERATOR_TYPE
            cloud.google.com/gke-tpu-topology: TPU_TOPOLOGY
          containers:
          - name: container-1
            image: gcr.io/k8s-staging-perf-tests/sleep:latest
            args: ["3600s"] # Sleep for 1 hour
            resources:
              requests:
                  google.com/tpu: NUM_CHIPS
              limits:
                  google.com/tpu: NUM_CHIPS
          restartPolicy: OnFailure
    

    Mehrere Hosts

    Verwenden Sie das folgende Manifest für die Datei dws-flex-start.yaml:

    apiVersion: v1
    kind: Service
    metadata:
      name: headless-svc
    spec:
      clusterIP: None
      selector:
        job-name: job-1
    ---
    apiVersion: batch/v1
    kind: Job
    metadata:
      name: job-1
    spec:
      backoffLimit: 0
      completions: 2
      parallelism: 2
      completionMode: Indexed
      template:
        spec:
          subdomain: headless-svc
          restartPolicy: Never
          nodeSelector:
              cloud.google.com/gke-flex-start: "true"
              cloud.google.com/gke-tpu-accelerator: ACCELERATOR_TYPE
              cloud.google.com/gke-tpu-topology: TPU_TOPOLOGY
          containers:
          - name: tpu-job
            image: python:3.10
            ports:
            - containerPort: 8471 # Default port using which TPU VMs communicate
            - containerPort: 8431 # Port to export TPU runtime metrics, if supported.
            securityContext:
              privileged: true
            command:
            - bash
            - -c
            - |
              pip install 'jax[tpu]' -f https://storage.googleapis.com/jax-releases/libtpu_releases.html
              python -c 'import jax; print("TPU cores:", jax.device_count())'
            resources:
              requests:
                google.com/tpu: NUM_CHIPS
              limits:
                google.com/tpu: NUM_CHIPS
    

    Ersetzen Sie Folgendes:

    • ACCELERATOR_TYPE: Der Typ des TPU-Beschleunigers, den Sie beim Erstellen der Knotenpools verwendet haben. Beispiel: tpu-v4-podslice oder tpu-v5-lite-podslice.
    • TPU_TOPOLOGY: Die physische Topologie für das TPU-Slice. Der Wert kann beispielsweise 4x4x4 oder 2x2 sein, je nach TPU-Version.
    • NUM_CHIPS: Die Anzahl der TPU-Chips in jeder VM beträgt eins, vier oder acht. Weitere Informationen finden Sie unter TPU-Versionen.
  3. Wenden Sie das dws-flex-start.yaml-Manifest an:

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

    kubectl get pods
    

    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>
    

Bereinigen

Damit Ihrem Trusted Cloud by S3NS -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. In the Trusted Cloud console, go to the Manage resources page.

    Go to Manage resources

  2. In the project list, select the project that you want to delete, and then click Delete.
  3. In the dialog, type the project ID, and then click Shut down to delete the project.

Einzelne Ressource löschen

  1. Löschen Sie die Jobs:

    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 LOCATION_NAME
    
  3. Löschen Sie den Cluster:

    gcloud container clusters delete CLUSTER_NAME
    

Nächste Schritte