Kleine Batch-Arbeitslast mit GPUs und dem Bereitstellungsmodus „Flex-Start“ ausführen


In dieser Anleitung erfahren Sie, wie Sie die GPU-Bereitstellung für Trainingsarbeitslasten mittleren und kleinen Umfangs mithilfe des Flex-Start-Bereitstellungsmodus optimieren. In dieser Anleitung verwenden Sie Flex-Start, 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 für die Ausführung beider Jobs bereit.

Wenn für Ihre Arbeitslast die verteilte Verarbeitung auf mehreren Knoten erforderlich ist, sollten Sie Flex-Start mit in die Warteschlange gestellter Bereitstellung verwenden. Weitere Informationen finden Sie unter Große Arbeitslast mit Flex-Start und Warteschlangenbereitstellung ausführen.

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 Google Cloud 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 unterbrechbare GPUs an Ihren Knotenstandorten haben.

Knotenpool mit Flex-Start erstellen

Wenn Sie einen Knotenpool mit aktiviertem Flex-Start in einem vorhandenen Standardcluster erstellen möchten, können Sie die gcloud CLI oder Terraform verwenden.

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

gcloud

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

    gcloud container node-pools create NODE_POOL_NAME \
        --cluster CLUSTER_NAME \
        --location LOCATION_NAME \
        --project PROJECT_ID \
        --accelerator type=nvidia-a100-80gb,count=2 \
        --machine-type a2-ultragpu-2g \
        --max-run-duration MAX_RUN_DURATION \
        --flex-start \
        --num-nodes 0 \
        --enable-autoscaling \
        --total-min-nodes 0 \
        --total-max-nodes 5 \
        --location-policy ANY \
        --reservation-affinity none \
        --no-enable-autorepair
    

    Ersetzen Sie Folgendes:

    • NODE_POOL_NAME: der Name, den Sie für Ihren Knotenpool auswählen
    • LOCATION_NAME: die Compute-Region für die Clustersteuerungsebene.
    • PROJECT_ID: Ihre Projekt-ID.
    • CLUSTER_NAME: Der Name des Standardclusters, den Sie ändern möchten.
    • MAX_RUN_DURATION: Optional. Die maximale Laufzeit eines Knotens in Sekunden, bis zum Standardwert von sieben Tagen.

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

    GKE erstellt einen Knotenpool mit Knoten, die zwei A100-GPUs (a2-ultragpu-2g) enthalten. Dieser Knotenpool skaliert Knoten automatisch von null auf maximal fünf Knoten.

  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.

Terraform

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

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

queued_provisioning {
    enabled = false
}

}
node_config {
    machine_type = "a3-highgpu-8g"
    flex_start = true
}
```

Terraform ruft Google Cloud APIs auf, um einen Cluster mit einem Knotenpool zu erstellen, der Flex-Start 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.

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, indem Sie auf Symbol für die Cloud Shell-Aktivierung Cloud Shell aktivieren klicken. Im unteren Bereich der Google Cloud -Konsole 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"
          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"
          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 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 -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. In the Google 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