Monitoring und Debugging für Training mit einer interaktiven Shell

Während des Trainings können Sie mit einer interaktiven Shell den Container prüfen, in dem der Trainingscode ausgeführt wird. Sie können das Dateisystem durchsuchen und Dienstprogramme zur Fehlerbehebung in jeder Laufzeitversion oder in benutzerdefinierten Containern ausführen, die in AI Platform Training ausgeführt werden.

Wenn Sie Ihren Trainingscontainer mit einer interaktiven Shell prüfen, können Sie Probleme mit Ihrem Trainingscode oder Ihrer AI Platform Training-Konfiguration debuggen. Beispielsweise können Sie mit einer interaktiven Shell Folgendes tun:

  • Tracing-Tools und Tools zur Profilerstellung ausführen
  • GPU-Nutzung analysieren
  • Für den Container verfügbare Google Cloud-Berechtigungen prüfen

Hinweis

Sie können eine interaktive Shell verwenden, wenn Sie einen Trainings- oder Hyperparameter-Abstimmungsjob ausführen. Achten Sie bei der Vorbereitung Ihres Trainingscodes und dem Trainingsjob darauf, dass Sie die folgenden Anforderungen erfüllen:

  • In Ihrem Trainingscontainer muss bash installiert sein.

  • Auf allen Laufzeitversionscontainern ist bash installiert. Wenn Sie einen benutzerdefinierten Container für das Training erstellen, verwenden Sie einen Basiscontainer mit bash oder installieren Sie bash in Ihrem Dockerfile.

  • Führen Sie das Training in einer Region aus, die interaktive Shells unterstützt.

  • Sorgen Sie dafür, dass jeder Nutzer mit Zugriff auf eine interaktive Shell die folgenden Berechtigungen für das Google Cloud-Projekt hat, in dem das Training ausgeführt wird:

    • ml.jobs.create
    • ml.jobs.get
    • ml.jobs.cancel

    Wenn Sie das Training selbst starten, haben Sie wahrscheinlich bereits diese Berechtigungen und können auf eine interaktive Shell zugreifen. Wenn Sie jedoch eine interaktive Shell verwenden möchten, um einen Trainingsjob zu prüfen, der von einer anderen Person in Ihrer Organisation erstellt wurde, benötigen Sie möglicherweise diese Berechtigungen.

    Eine Möglichkeit, diese Berechtigungen zu erhalten, ist, einen Administrator Ihrer Organisation zu bitten, Ihnen die Rolle AI Platform Training-Administrator (roles/ml.admin) zuzuweisen. Wenn Sie die Rolle AI Platform Training-Entwickler (roles/ml.developer) erhalten, haben Sie Zugriff auf die interaktive Shell für von Ihnen erstellte Jobs.

Anforderungen für erweiterte Fälle

Wenn Sie bestimmte erweiterte Features verwenden, müssen Sie die folgenden zusätzlichen Anforderungen erfüllen:

  • Wenn Sie einem Trainingsjob ein benutzerdefiniertes Dienstkonto anhängen, achten Sie darauf, dass jeder Nutzer, der auf eine interaktive Shell zugreifen möchte, die Berechtigung iam.serviceAccounts.actAs für das angehängte Dienstkonto hat.

    In der Anleitung zu benutzerdefinierten Dienstkonten ist angegeben, dass Sie diese Berechtigung zum Anhängen eines Dienstkontos benötigen. Sie benötigen diese Berechtigung auch, um während des benutzerdefinierten Trainings eine interaktive Shell aufzurufen.

    Wenn Sie beispielsweise einen Job mit einem angehängten Dienstkonto erstellen möchten, benötigen Sie die Berechtigung iam.serviceAccounts.actAs für das Dienstkonto. Wenn einer Ihrer Kollegen dann eine interaktive Shell für diesen Job ansehen möchte, muss er dieselbe Berechtigung iam.serviceAccounts.actAs haben.

  • Wenn Sie Ihr Projekt für die Verwendung von VPC Service Controls mit AI Platform Training konfiguriert haben, berücksichtigen Sie die folgenden zusätzlichen Einschränkungen:

    • Sie können VPC Service Controls nicht mit VPC-Netzwerk-Peering verwenden.

    • Innerhalb einer interaktiven Shell können Sie nicht auf das öffentliche Internet oder Google Cloud-Ressourcen außerhalb Ihres Dienstperimeters zugreifen.

    • Für einen sicheren Zugriff auf interaktive Shells müssen Sie notebooks.googleapis.com zusätzlich zu ml.googleapis.com als eingeschränkten Dienst zu Ihrem Dienstperimeter hinzufügen. Wenn Sie nur ml.googleapis.com und nicht notebooks.googleapis.com einschränken, können Nutzer über Maschinen außerhalb des Dienstperimeters auf interaktive Shells zugreifen. Dadurch wird der Sicherheitsvorteil einer Verwendung von VPC Service Controls reduziert.

Interaktive Shells aktivieren

Zur Aktivierung interaktiver Shells für einen Trainingsjob legen Sie das API-Feld enableWebAccess beim Erstellen eines Trainingsjobs im Feld trainingInput Ihres Jobs auf true fest.

Im folgenden Beispiel wird gezeigt, wie Sie dies tun, indem Sie das Flag --enable-web-access hinzufügen, wenn Sie die gcloud CLI verwenden. Sie können derzeit keinen Trainingsjob mit einer interaktiven Shell erstellen, die in der Google Cloud Console aktiviert ist.

In diesem Beispiel wird davon ausgegangen, dass Sie eine Trainingsanwendung in Ihrem lokalen Dateisystem in einem Verzeichnis mit dem Namen trainer mit dem Modul task haben.

Führen Sie den folgenden Befehl aus, um den Trainingsjob zu erstellen:

  gcloud ai-platform jobs submit training JOB_ID \
    --enable-web-access \
    --job-dir=JOB_DIR \
    --module-name=trainer.task \
    --package-path=trainer \
    --python-version=3.7 \
    --region=REGION \
    --runtime-version=2.11 \
    --scale-tier=CUSTOM \
    --master-machine-type=n1-highmem-8

Ersetzen Sie in diesem Befehl die folgenden Platzhalter:

  • JOB_ID: Ein Name, den Sie für den Job auswählen.
  • JOB_DIR: Ein Pfad zu einem Cloud Storage-Verzeichnis, in das Ihre Trainingsanwendung hochgeladen wird.
  • REGION: Die Region, in der Sie den Trainingsjob erstellen möchten. Beachten Sie, dass es sich um eine Region handeln muss, die interaktive Shells unterstützt.

    Der Befehl erzeugt bei Erfolg folgende Ausgabe:

    Job [JOB_ID] submitted successfully.
    Your job is still active. You may view the status of your job with the command
    
      $ gcloud ai-platform jobs describe JOB_ID
    
    or continue streaming the logs with the command
    
      $ gcloud ai-platform jobs stream-logs JOB_ID
    jobId: JOB_ID
    state: QUEUED
    

Webzugriff-URI abrufen

Nachdem Sie das Training gemäß der Anleitung im vorherigen Abschnitt gestartet haben, verwenden Sie die Google Cloud Console oder das gcloud-Befehlszeilentool, um die URIs anzuzeigen, mit denen Sie auf interaktive Shells zugreifen können. AI Platform Training stellt einen URI für jeden Trainingsknoten bereit, der Teil Ihres Jobs ist.

Wählen Sie je nach erstelltem Trainingsjob einen der folgenden Tabs aus, um Beispiele zu sehen, wie Sie das API-Feld webAccessUris finden, das einen interaktiven Shell-URI für jeden Knoten in Ihrem Job enthält.

Trainingsjob

Auf den folgenden Tabs finden Sie verschiedene Möglichkeiten, auf TrainingOutput für einen Standardtrainingsjob zuzugreifen.

gcloud

Führen Sie den Befehl gcloud ai-platform jobs describe aus:

gcloud ai-platform jobs describe JOB_ID

Dabei gilt:

  • JOB_ID: Die ID Ihres Jobs. Sie legen diese ID beim Erstellen des Jobs fest. Wenn Sie die ID Ihres Jobs nicht kennen, können Sie den Befehl gcloud ai-platform jobs list ausführen und nach dem entsprechenden Job suchen.

Suchen Sie in der Ausgabe nach Folgendem:

trainingOutput:
  webAccessUris:
    master-replica-0: INTERACTIVE_SHELL_URI

Console

  1. Öffnen Sie in der Google Cloud Console die AI Platform Training-Seite Jobs.

    Jobs in der Google Cloud Console öffnen

  2. Klicken Sie in der Liste auf den Namen des jeweiligen Jobs, um die Seite mit den Jobdetails zu öffnen.

  3. Klicken Sie auf die Schaltfläche Json anzeigen im Abschnitt Trainingsausgabe, um eine JSON-Ansicht des TrainingOutput für den Job zu maximieren.

Suchen Sie in der Ausgabe nach Folgendem:

{
  "webAccessUris": {
    "master-replica-0": "INTERACTIVE_SHELL_URI"
  }
}

Wenn das Feld webAccessUris nicht angezeigt wird, hat AI Platform Training möglicherweise noch nicht mit der Ausführung des Jobs oder Tests begonnen. Prüfen Sie, ob RUNNING das Feld state enthält. Wenn der Status QUEUED oder PREPARING lautet, warten Sie eine Minute und versuchen Sie dann noch einmal, die Jobinformationen abzurufen.

Hyperparameter-Abstimmungsjob

Auf den folgenden Tabs finden Sie verschiedene Möglichkeiten, auf TrainingOutput für einen Hyperparameter-Abstimmungsjob zuzugreifen.

gcloud

Führen Sie den Befehl gcloud ai-platform jobs describe aus:

gcloud ai-platform jobs describe JOB_ID

Dabei gilt:

  • JOB_ID: Die ID Ihres Jobs. Sie legen diese ID beim Erstellen des Jobs fest. Wenn Sie die ID Ihres Jobs nicht kennen, können Sie den Befehl gcloud ai-platform jobs list ausführen und nach dem entsprechenden Job suchen.

Suchen Sie in der Ausgabe nach Folgendem:

trainingOutput:
  trials:
  - trialId: '1'
    webAccessUris:
      master-replica-0: INTERACTIVE_SHELL_URI

Console

  1. Öffnen Sie in der Google Cloud Console die AI Platform Training-Seite Jobs.

    Jobs in der Google Cloud Console öffnen

  2. Klicken Sie in der Liste auf den Namen des jeweiligen Jobs, um die Seite mit den Jobdetails zu öffnen.

  3. Klicken Sie auf die Schaltfläche Json anzeigen im Abschnitt Trainingsausgabe, um eine JSON-Ansicht des TrainingOutput für den Job zu maximieren.

Suchen Sie in der Ausgabe nach Folgendem:

{
  "trials": [
    {
      ...
      "webAccessUris": {
        "master-replica-0": "INTERACTIVE_SHELL_URI"
      }
    },
    ...
  ]
}

Wenn das Feld webAccessUris nicht angezeigt wird, hat AI Platform Training möglicherweise noch nicht mit der Ausführung des Jobs oder Tests begonnen. Prüfen Sie, ob RUNNING das Feld state enthält. Wenn der Status QUEUED oder PREPARING lautet, warten Sie eine Minute und versuchen Sie dann noch einmal, die Jobinformationen abzurufen.

AI Platform Training bietet eine Reihe interaktiver Shell-URIs für jeden Hyperparameter-Abstimmungstest, während der Test in den Status RUNNING wechselt. Wenn Sie die interaktive Shell-URIs für spätere Tests abrufen möchten, rufen Sie die Jobinformationen nach Beginn der Tests noch einmal ab.

Das vorherige Beispiel zeigt die erwartete Ausgabe für das Training mit einem einzigen Replikat: einen URI für den primären Trainingsknoten. Wenn Sie ein verteiltes Training ausführen, enthält die Ausgabe für jeden Trainingsknoten einen URI, identifiziert durch den Aufgabennamen.

Wenn Ihr Job beispielsweise einen Master und zwei Worker hat, sieht das Feld webAccessUris in etwa so aus:

{
  "master-replica-0": "URI_FOR_PRIMARY",
  "worker-replica-0": "URI_FOR_FIRST_SECONDARY",
  "worker-replica-1": "URI_FOR_SECOND_SECONDARY"
}

Verfügbare Regionen

Die Verwendung einer interaktiven Shell für AI Platform Training wird in den folgenden Regionen unterstützt:

Amerika

  • Oregon (us-west1)
  • Los Angeles (us-west2)
  • Iowa (us-central1)
  • South Carolina (us-east1)
  • N. Virginia (us-east4)
  • Montreal (northamerica-northeast1)

Europa

  • London (europe-west2)
  • Belgien (europe-west1)
  • Zürich (europe-west6)
  • Frankfurt (europe-west3)

Asiatisch-pazifischer Raum

  • Singapur (asia-southeast1)
  • Taiwan (asia-east1)
  • Tokio (asia-northeast1)
  • Sydney (australia-southeast1)
  • Seoul (asia-northeast3)

AI Platform Training bietet auch zusätzliche Regionen für das Training.

Interaktive Shell verwenden

Rufen Sie einen der URIs aus dem vorherigen Abschnitt auf, um die interaktive Shell für einen Trainingsknoten zu verwenden. In Ihrem Browser wird eine Bash-Shell angezeigt, die Ihnen Zugriff auf das Dateisystem des Containers ermöglicht, in dem AI Platform Training Ihren Trainingscode ausführt.

In den folgenden Abschnitten werden einige Dinge beschrieben, die Sie bei der Verwendung der Shell berücksichtigen sollten. Außerdem werden Beispiele für Monitoringtools aufgeführt, die Sie in der Shell verwenden können.

Beenden des Jobs verhindern

Wenn AI Platform Training den Job oder die Testphase ausführt, verlieren Sie sofort den Zugriff auf die interaktive Shell. In diesem Fall wird möglicherweise die Meldung command terminated with exit code 137 angezeigt oder die Shell reagiert möglicherweise nicht mehr. Wenn Sie Dateien im Dateisystem des Containers erstellt haben, bleiben diese nach Beendigung des Jobs nicht bestehen.

In einigen Fällen kann es sinnvoll sein, den Job gezielt länger auszuführen, um Fehler in einer interaktiven Shell zu beheben. Sie können dem Trainingscode beispielsweise Code wie den folgenden hinzufügen, damit der Job mindestens eine Stunde nach einer Ausnahme weiter ausgeführt wird:

import time
import traceback

try:
    # Replace with a function that runs your training code
    train_model()
except Exception as e:
    traceback.print_exc()
    time.sleep(60 * 60)  # 1 hour

Beachten Sie jedoch, dass Ihnen AI Platform Training-Trainingsgebühren berechnet werden, solange der Job weiter ausgeführt wird.

Berechtigungsprobleme prüfen

Die interaktive Shell-Umgebung wird mithilfe von Standardanmeldedaten für Anwendungen für das Dienstkonto authentifiziert, mit dem AI Platform Training Ihren Trainingscode ausführt. Sie können gcloud auth list in der Shell ausführen, um weitere Details zu sehen.

In der Shell können Sie gcloud storage, bq und andere Tools verwenden, die ADC unterstützen. Dadurch können Sie prüfen, ob der Job auf einen bestimmten Cloud Storage-Bucket, eine BigQuery-Tabelle oder eine andere Google Cloud-Ressource zugreifen kann, die Ihr Trainingscode benötigt.

Python-Ausführung mit py-spy visualisieren

Mit py-spy können Sie das Profil eines ausgeführten Python-Programms erstellen, ohne es ändern zu müssen. So verwenden Sie py-spy in einer interaktiven Shell:

  1. Installieren Sie py-spy:

    pip3 install py-spy
    
  2. Führen Sie ps aux in der Shell aus und suchen Sie nach der PID des Python-Trainingsprogramms.

  3. Führen Sie alle in der Dokumentation zu py-spy beschriebenen Unterbefehle mit der PID aus, die Sie im vorherigen Schritt ermittelt haben.

  4. Wenn Sie mit py-spy record eine SVG-Datei erstellen, kopieren Sie diese Datei in einen Cloud Storage-Bucket, damit Sie sie später auf Ihrem lokalen Computer ansehen können. Beispiel:

    gcloud storage cp profile.svg gs://BUCKET
    

    Ersetzen Sie BUCKET durch den Namen eines Buckets, auf den Sie Zugriff haben.

Leistung mit perf analysieren

Mit perf können Sie die Leistung des Trainingsknotens analysieren. Führen Sie die folgenden Befehle aus, um die für den Linux-Kernel Ihres Knotens geeignete Version von perf zu installieren:

apt-get update
apt-get install -y linux-tools-generic
rm /usr/bin/perf
LINUX_TOOLS_VERSION=$(ls /usr/lib/linux-tools | tail -n 1)
ln -s "/usr/lib/linux-tools/${LINUX_TOOLS_VERSION}/perf" /usr/bin/perf

Danach können Sie alle in der Dokumentation zu perf beschriebenen Unterbefehle ausführen.

Informationen zur GPU-Nutzung abrufen

Für GPU-fähige Container, die auf Knoten mit GPUs ausgeführt werden, sind in der Regel mehrere Befehlszeilentools vorinstalliert, mit denen Sie die GPU-Nutzung überwachen können. Beispiel:

  • Mit nvidia-smi können Sie die GPU-Nutzung verschiedener Prozesse überwachen.

  • Verwenden Sie nvprof, um verschiedene GPU-Profilinformationen zu erfassen. Da sich nvprof nicht an einen vorhandenen Prozess anhängen lässt, sollten Sie das Tool verwenden, um einen zusätzlichen Prozess zu starten, der den Trainingscode ausführt. (Dies bedeutet, dass der Trainingscode auf dem Knoten zweimal ausgeführt wird.) Beispiel:

    nvprof -o prof.nvvp python3 -m MODULE_NAME
    

    Ersetzen Sie MODULE_NAME durch den vollständig qualifizierten Namen des Einstiegspunktmoduls für Ihre Trainingsanwendung, z. B. trainer.task.

    Übertragen Sie dann die Ausgabedatei in einen Cloud Storage-Bucket, um sie später auf Ihrem lokalen Computer zu analysieren. Beispiel:

    gcloud storage cp prof.nvvp gs://BUCKET
    

    Ersetzen Sie BUCKET durch den Namen eines Buckets, auf den Sie Zugriff haben.

  • Wenn ein GPU-Fehler auftritt (nicht ein Problem mit Ihrer Konfiguration oder mit AI Platform Training), erstellen Sie mit nvidia-bug-report.sh einen Fehlerbericht.

    Übertragen Sie dann den Bericht in einen Cloud Storage-Bucket, um ihn später auf Ihrem lokalen Computer zu analysieren oder an NVIDIA zu senden. Beispiel:

    gcloud storage cp nvidia-bug-report.log.gz gs://BUCKET
    

    Ersetzen Sie BUCKET durch den Namen eines Buckets, auf den Sie Zugriff haben.

Wenn bash keinen dieser NVIDIA-Befehle finden kann, fügen Sie /usr/local/nvidia/bin und /usr/local/cuda/bin zum PATH der Shell hinzu:

export PATH="/usr/local/nvidia/bin:/usr/local/cuda/bin:${PATH}"

Nächste Schritte