In dieser Anleitung wird erläutert, wie Sie ausfallsichere, GPU-fähige Cloud Run-Jobs entwerfen und bereitstellen, die bis zu 12 Stunden ausgeführt werden können.
Cloud Run unterstützt zwar verlängerte Zeitlimits für Aufgaben, bietet aber kein SLA für eine unterbrechungsfreie Ausführung. Da GPU-fähige Aufgaben nicht live migriert werden, werden sie bei der wöchentlichen routinemäßigen Wartung während der Ausführung beendet. Daher ist davon auszugehen, dass jede längere Aufgabe mindestens einmal unterbrochen wird. Damit Ihr Job erfolgreich abgeschlossen wird, ohne dass Rechenressourcen verschwendet werden, sollten Sie Ihre Anwendung so konzipieren, dass sie Prüfpunkte erstellt und fortgesetzt wird, anstatt sich auf eine einzelne, ununterbrochene Ausführung zu verlassen.
In dieser Anleitung erfahren Sie, wie Sie Prüfpunkte implementieren, SIGTERM-Signale der Plattform verarbeiten und die maximale Anzahl von Wiederholungsversuchen konfigurieren.
Ziele
In dieser Anleitung tun Sie Folgendes:
- Bereiten Sie eine Python-Anwendung vor, die Prüfpunkte implementiert und
SIGTERM-Signale verarbeitet. - Erstellen Sie einen Cloud Storage-Bucket, um Prüfpunkte beizubehalten.
- Erstellen und stellen Sie einen Cloud Run-Job mit aktivierter GPU, einem Aufgaben-Timeout von 12 Stunden und einer konfigurierten Wiederholungsrichtlinie bereit.
- Job ausführen und Preemption-Ereignisse in den Logs überwachen.
Kosten
In diesem Dokument verwenden Sie die folgenden kostenpflichtigen Komponenten von Google Cloud:
Mit dem Preisrechner können Sie eine Kostenschätzung für Ihre voraussichtliche Nutzung vornehmen.
Hinweis
- Melden Sie sich in Ihrem Google Cloud -Konto an. Wenn Sie mit Google Cloudnoch nicht vertraut sind, erstellen Sie einfach ein Konto, um die Leistungsfähigkeit unserer Produkte in der Praxis sehen und bewerten zu können. Neukunden erhalten außerdem ein Guthaben von 300 $, um Arbeitslasten auszuführen, zu testen und bereitzustellen.
-
Installieren Sie die Google Cloud CLI.
-
Wenn Sie einen externen Identitätsanbieter (IdP) verwenden, müssen Sie sich zuerst mit Ihrer föderierten Identität in der gcloud CLI anmelden.
-
Führen Sie den folgenden Befehl aus, um die gcloud CLI zu initialisieren:
gcloud init -
Erstellen oder wählen Sie ein Google Cloud -Projekt aus.
Erforderliche Rollen zum Auswählen oder Erstellen eines Projekts
- Projekt auswählen: Für die Auswahl eines Projekts ist keine bestimmte IAM-Rolle erforderlich. Sie können jedes Projekt auswählen, für das Ihnen eine Rolle zugewiesen wurde.
-
Projekt erstellen: Zum Erstellen eines Projekts benötigen Sie die Rolle „Project Creator“ (
roles/resourcemanager.projectCreator), die die Berechtigungresourcemanager.projects.createenthält. Informationen zum Zuweisen von Rollen
-
Erstellen Sie ein Projekt in Google Cloud :
gcloud projects create PROJECT_ID
Ersetzen Sie
PROJECT_IDdurch einen Namen für das Projekt in Google Cloud , das Sie erstellen. -
Wählen Sie das von Ihnen erstellte Projekt Google Cloud aus:
gcloud config set project PROJECT_ID
Ersetzen Sie
PROJECT_IDdurch den Namen Ihres Projekts in Google Cloud .
-
Prüfen Sie, ob die Abrechnung für Ihr Google Cloud -Projekt aktiviert ist.
-
Installieren Sie die Google Cloud CLI.
-
Wenn Sie einen externen Identitätsanbieter (IdP) verwenden, müssen Sie sich zuerst mit Ihrer föderierten Identität in der gcloud CLI anmelden.
-
Führen Sie den folgenden Befehl aus, um die gcloud CLI zu initialisieren:
gcloud init -
Erstellen oder wählen Sie ein Google Cloud -Projekt aus.
Erforderliche Rollen zum Auswählen oder Erstellen eines Projekts
- Projekt auswählen: Für die Auswahl eines Projekts ist keine bestimmte IAM-Rolle erforderlich. Sie können jedes Projekt auswählen, für das Ihnen eine Rolle zugewiesen wurde.
-
Projekt erstellen: Zum Erstellen eines Projekts benötigen Sie die Rolle „Project Creator“ (
roles/resourcemanager.projectCreator), die die Berechtigungresourcemanager.projects.createenthält. Informationen zum Zuweisen von Rollen
-
Erstellen Sie ein Projekt in Google Cloud :
gcloud projects create PROJECT_ID
Ersetzen Sie
PROJECT_IDdurch einen Namen für das Projekt in Google Cloud , das Sie erstellen. -
Wählen Sie das von Ihnen erstellte Projekt Google Cloud aus:
gcloud config set project PROJECT_ID
Ersetzen Sie
PROJECT_IDdurch den Namen Ihres Projekts in Google Cloud .
-
Prüfen Sie, ob die Abrechnung für Ihr Google Cloud -Projekt aktiviert ist.
Aktivieren Sie die APIs für Cloud Run, Artifact Registry, Cloud Build und Cloud Storage, falls sie noch nicht aktiviert sind:
Rollen, die zum Aktivieren von APIs erforderlich sind
Zum Aktivieren von APIs benötigen Sie die Berechtigung
serviceusage.services.enable. Wenn Sie das Projekt erstellt haben, haben Sie diese Berechtigung wahrscheinlich bereits über die Inhaberrolle (roles/owner). Andernfalls können Sie diese Berechtigung über die Rolle „Service Usage-Administrator“ (roles/serviceusage.serviceUsageAdmin) erhalten. Informationen zum Zuweisen von Rollengcloud services enable run.googleapis.com
cloudbuild.googleapis.com artifactregistry.googleapis.com storage.googleapis.com - Legen Sie Ihre Region als Umgebungsvariable fest:
export REGION=REGION
- Erstellen Sie ein Dienstkonto für den Job:
gcloud iam service-accounts create gpu-job-sa
- Sie benötigen ein [ausreichendes GPU-Kontingent](/run/docs/configuring/jobs/gpu#request-quota) (z.B. Nvidia L4) in der ausgewählten Region.
Anwendung vorbereiten
Damit ein Job mit langer Ausführungszeit stabil ist, muss Ihre Anwendung Folgendes tun:
Speichern Sie den Fortschritt regelmäßig (Prüfpunkte) an einem nichtflüchtigen Speicherort, z. B. in einem bereitgestellten Cloud Storage-Bucket.
Nach
SIGTERMhaben Sie etwa 10 Sekunden Zeit, bevor die Aufgabe beendet wird. Das ist nicht genug Zeit, um einen großen Modellprüfpunkt zu schreiben. Behandeln Sie denSIGTERM-Handler als Best-Effort-Flush nur für kleine Zustände und verlassen Sie sich auf regelmäßige Prüfpunkte als primären Schutz. Wählen Sie das Prüfpunktintervall danach aus, wie viel Arbeit Sie sich leisten können, zu verlieren. Denken Sie daran, dass häufigere Prüfpunkte bedeuten, dass mehr Zeit nicht für nützliche Arbeit aufgewendet wird. Das Ziel ist es, die richtige Balance für Ihren Anwendungsfall zu finden.Zustand beim Start vom letzten Prüfpunkt wiederherstellen.
Warten Sie auf das Signal
SIGTERM, das Cloud Run 10 Sekunden vor dem Wartungsprozess sendet, und versuchen Sie, einen letzten Prüfpunkt zu speichern, bevor Sie den Vorgang beenden.
Das folgende Beispiel zeigt, wie diese Funktionen implementiert werden.
Anwendungscode erstellen
Erstellen Sie ein Verzeichnis für Ihr Projekt:
mkdir gc-run-gpu-resilience cd gc-run-gpu-resilienceErstellen Sie eine Datei mit dem Namen
task.pyund fügen Sie das folgende Script ein, um einen Trainings- oder Batchverarbeitungsprozess zu simulieren, der Prüfpunkte und Signalverarbeitung unterstützt:import os import sys import time import signal # The checkpoint directory will be mounted to this path CHECKPOINT_DIR = "/checkpoints" # Cloud Run sets these variables automatically JOB_NAME = os.environ.get("CLOUD_RUN_JOB", "local-job") TASK_INDEX = os.environ.get("CLOUD_RUN_TASK_INDEX", "0") CHECKPOINT_FILE = os.path.join( CHECKPOINT_DIR, f"{JOB_NAME}-task-{TASK_INDEX}-checkpoint.txt") TOTAL_STEPS = 100 current_step = 0 is_exiting = False def save_checkpoint(step): print(f"Saving checkpoint at step {step} to {CHECKPOINT_FILE}...") try: # Write to a temp file and rename to ensure atomicity temp_file = CHECKPOINT_FILE + ".tmp" with open(temp_file, "w") as f: f.write(str(step)) os.rename(temp_file, CHECKPOINT_FILE) print("Checkpoint saved successfully.") except Exception as e: print(f"Failed to save checkpoint: {e}") def load_checkpoint(): print(f"Looking for a checkpoint at {CHECKPOINT_FILE}...") global current_step if os.path.exists(CHECKPOINT_FILE): try: with open(CHECKPOINT_FILE, "r") as f: current_step = int(f.read().strip()) print(f"Resuming from checkpointed step {current_step}.") except Exception as e: print(f"Failed to load checkpoint: {e}. Starting from scratch.") else: print("No checkpoint found. Starting from scratch.") def sigterm_handler(signum, frame): global is_exiting print("Received SIGTERM signal from platform. Initiating graceful shutdown...") is_exiting = True # Register the signal handler for SIGTERM signal.signal(signal.SIGTERM, sigterm_handler) # Load existing checkpoint if any to resume work load_checkpoint() # Simulate work loop while current_step < TOTAL_STEPS and not is_exiting: print(f"Processing step {current_step}/{TOTAL_STEPS}...") # Simulate heavy GPU computation time.sleep(1) current_step += 1 # Periodically save checkpoint (e.g., every 5 steps) if current_step % 5 == 0: save_checkpoint(current_step) if is_exiting: # Save final state before exiting due to preemption # Best-effort only: with ~10s before SIGKILL this will not complete for # large state. Periodic checkpointing (above) is what actually protects # you. save_checkpoint(current_step) # Note that save_checkpoint already writes-then-renames for atomicity, # which is good, but the reason it matters here is that a truncated # checkpoint from an interrupted final save must not clobber the last # good one. print("Graceful shutdown complete. Exiting with error code to trigger retry.") # Exit with a non-zero code to signal to Cloud Run that the task # was interrupted and needs to be retried from the checkpoint. sys.exit(143) # Note that this statement deliberately consumes of the configured retry # attempts. print("Task completed successfully.") sys.exit(0)Erstellen Sie ein
Dockerfile, um die Anwendung zu containerisieren:
Eine detailliertere, realistischere Implementierung finden Sie in diesem Beispiel.
Cloud Storage-Bucket für Prüfpunkte erstellen
Erstellen Sie einen Cloud Storage-Bucket zum Speichern der Prüfpunktdateien und gewähren Sie dem Dienstkonto Ihres Jobs Zugriff darauf.
Erstellen Sie den Bucket:
gcloud storage buckets create gs://gpu-checkpoints-PROJECT_ID \ --location REGIONWeisen Sie dem Dienstkonto des Jobs die Rolle „Storage-Objekt-Administrator“ zu:
gcloud storage buckets add-iam-policy-binding gs://gpu-checkpoints-PROJECT_ID \ --member="serviceAccount:gpu-job-sa@PROJECT_ID.iam.gserviceaccount.com" \ --role="roles/storage.objectAdmin"
Job bereitstellen
Stellen Sie den Job in Cloud Run bereit:
gcloud beta run jobs deploy gpu-resilient-job \
--source=. \
--region REGION \
--gpu 1 \
--gpu-type nvidia-l4 \
--no-gpu-zonal-redundancy \
--task-timeout 168h \
--max-retries 3 \
--service-account gpu-job-sa@PROJECT_ID.iam.gserviceaccount.com \
--add-volume=name=checkpoint-volume,type=cloud-storage,bucket=gpu-checkpoints-PROJECT_ID \
--add-volume-mount=volume=checkpoint-volume,mount-path=/checkpoints
Beachten Sie die folgenden wichtigen Flags:
--task-timeout 168h: Ermöglicht die Ausführung der Aufgabe für bis zu 12 Stunden.--max-retries 3: Für GPU-Jobs mit einem Zeitlimit von mehr als 1 Stunde empfehlen wir, die Standardkonfiguration von 3 Wiederholungsversuchen festzulegen. Um unbemerkte Fehler während der Plattformwartung zu vermeiden, empfehlen wir, nicht 0 Wiederholungsversuche festzulegen. Schließlich empfehlen wir, mindestens einen Wiederholungsversuch für wartungsbedingte Fehler sowie zusätzliche Wiederholungsversuche für Anwendungsfehler über einen Ausführungszeitraum von 12 Stunden einzuplanen.--add-volumeund--add-volume-mount: Der Cloud Storage-Bucket wird in/checkpointsbereitgestellt, damit die Anwendung den Status über Aufgabenwiederholungen hinweg beibehalten kann.
Job ausführen und überwachen
Job ausführen:
gcloud run jobs execute gpu-resilient-job --region REGIONDieser Befehl gibt eine Meldung ähnlich der folgenden zurück:
Execution [gpu-resilient-job-abcde] has been successfully started. View details about this execution by running `gcloud run jobs executions describe gpu-resilient-job-abcde`. See logs for this execution at: https://console.cloud.google.com/logs/viewer?project=YOUR_PROJECT_ID&resource=cloud_run_job/job_name/my-job/location/my-region/execution_id/gpu-resilient-job-abcdeDer String
gpu-resilient-job-abcdeist die automatisch generierte eindeutige ID für diesen spezifischen Ausführungsversuch. Sie können damit diesen spezifischen Lauf überwachen oder abbrechen. Die Ausgabe enthält auch einen direkten Link zur Seite „Log-Explorer“ in der Google Cloud Console, auf der Sie die Ausgabe oder Fehler Ihrer Jobaufgaben aufrufen können.Logs überwachen Wenn ein Wartungsereignis auftritt, protokolliert Cloud Run eine Warnung. Sie sehen Folgendes:
- Ihre Anwendungslogs:
Received SIGTERM signal from platform. Initiating graceful shutdown...gefolgt vonSaving checkpoint.... - Ein Systemprotokoll, das auf eine vorzeitige Beendigung hinweist:
Container instance preemption initiated by the platform due to underlying hardware maintenance.mit dem GrundINSTANCE_PREEMPTED. - Cloud Run startet die Aufgabe automatisch neu.
- Ihre Anwendungslogs beim Neustart:
Resuming from checkpointed step X..
- Ihre Anwendungslogs:
Bereinigen
Löschen Sie alle Ressourcen, die Sie mit dieser Kurzanleitung bereitgestellt haben, um zusätzliche Kosten für Ihr Google Cloud -Konto zu vermeiden.
Repository löschen
Cloud Run berechnet nur die Zeit, in der Ihr Job ausgeführt wird. Allerdings können für das Speichern des Container-Images in Artifact Registry Kosten anfallen. Wenn Sie Artifact Registry-Repositories löschen möchten, folgen Sie der Anleitung unter Repositories löschen in der Artifact Registry-Dokumentation.
Job löschen
Für Cloud Run-Jobs fallen nur Kosten an, wenn eine Jobaufgabe ausgeführt wird. So löschen Sie Ihren Cloud Run-Job:
Console
So löschen Sie einen Job:
Rufen Sie in der Google Cloud Console Cloud Run auf:
Klicken Sie in der Jobliste das Kästchen des zu löschenden Jobs an.
Klicken Sie auf Löschen. Dadurch werden alle laufenden Jobausführungen und alle laufenden Containerinstanzen beendet.
gcloud
Führen Sie den folgenden Befehl aus, um einen Job zu löschen:
gcloud run jobs delete JOB_NAME
Ersetzen Sie JOB_NAME durch den Namen des Jobs.
Testprojekt löschen
Durch das Löschen des Projekts „ Google Cloud “ wird die Abrechnung für alle Ressourcen in diesem Projekt beendet. So geben Sie alle Google Cloud -Ressourcen in Ihrem Projekt frei:
Google Cloud -Projekt löschen:
gcloud projects delete PROJECT_ID
Löschen Sie den Cloud Storage-Bucket:
gcloud storage buckets delete gs://gpu-checkpoints-PROJECT_ID