Training mit interaktiver Shell überwachen und Fehler beheben

Auf dieser Seite wird gezeigt, wie Sie mit einer interaktiven Shell den Container prüfen, in dem Ihr Trainingscode ausgeführt wird. Sie können das Dateisystem durchsuchen und Debugging-Dienstprogramme in jedem vordefinierten Container oder benutzerdefinierten Container ausführen, der in Vertex AI ausgeführt wird.

Wenn Sie Ihren Trainingscontainer mit einer interaktiven Shell prüfen, können Sie Probleme mit Ihrem Trainingscode oder Ihrer Vertex AI-Konfiguration beheben. 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

Vertex AI ist auch in TensorFlow Profiler eingebunden, mit dem Sie die Leistung des Modelltrainings für Ihre benutzerdefinierten Trainingsjobs debuggen können. Weitere Informationen finden Sie unter Leistung des Profilmodelltrainings mit Profiler bestimmen.

Vorbereitung

Sie können eine interaktive Shell verwenden, wenn Sie ein benutzerdefiniertes Training mit einer CustomJob-Ressource, einer HyperparameterTuningJob-Ressource oder einer benutzerdefinierten TrainingPipeline-Ressource ausführen. Achten Sie beim Vorbereiten des Trainingscodes und beim Konfigurieren der benutzerdefinierten Trainingsressource Ihrer Wahl darauf, dass Sie die folgenden Anforderungen erfüllen:

  • In Ihrem Trainingscontainer muss bash installiert sein.

    Auf allen vordefinierten Trainingscontainern 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 benutzerdefiniertes 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 benutzerdefinierte Training ausgeführt wird:

    • aiplatform.customJobs.create
    • aiplatform.customJobs.get
    • aiplatform.customJobs.cancel

    Wenn Sie das benutzerdefinierte 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 eine benutzerdefinierte Trainingsressource zu prüfen, die von einer anderen Person in Ihrer Organisation erstellt wurde, benötigen Sie diese Berechtigungen möglicherweise.

    Eine Möglichkeit, diese Berechtigungen zu erhalten, besteht darin, einen Administrator Ihrer Organisation um die Rolle Vertex AI-Nutzer (roles/aiplatform.user) zu bitten.

Anforderungen für erweiterte Fälle

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

  • Wenn Sie einer benutzerdefinierten Trainingsressource 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 CustomJob 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 CustomJob ansehen möchte, muss er dieselbe Berechtigung iam.serviceAccounts.actAs haben.

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

    • Sie können private IP-Adressen nicht für benutzerdefiniertes Training 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 aiplatform.googleapis.com als eingeschränkten Dienst zu Ihrem Dienstperimeter hinzufügen. Wenn Sie nur aiplatform.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 eine benutzerdefinierte Trainingsressource legen Sie das API-Feld enableWebAccess auf true fest, wenn Sie einen CustomJob, einen HyperparameterTuningJob oder eine benutzerdefinierte TrainingPipeline erstellen.

In den folgenden Beispielen wird gezeigt, wie Sie dazu verschiedene Tools verwenden können:

Console

Folgen Sie dem Leitfaden zum Erstellen einer benutzerdefinierten TrainingPipeline in der Google Cloud Console. Gehen Sie im Bereich Neues Modell trainieren im Schritt Modelldetails so vor:

  1. Klicken Sie auf Erweiterte Optionen.

  2. Klicken Sie auf das Kästchen Trainings-Debugging aktivieren.

Führen Sie dann den Rest des Workflows Neues Modell trainieren aus.

gcloud

Informationen zur Verwendung dieser Befehle finden Sie in den Anleitungen CustomJob erstellen und HyperparameterTuningJob erstellen.

API

Die folgenden partiellen REST-Anfragetexte zeigen, wo das Feld enableWebAccess für jeden Typ einer benutzerdefinierten Trainingsressource angegeben wird:

CustomJob

Das folgende Beispiel zeigt einen partiellen Anfragetext für die API-Methode projects.locations.customJobs.create:

{
  ...
  "jobSpec": {
    ...
    "enableWebAccess": true
  }
  ...
}

Ein Beispiel zum Senden einer API-Anfrage zum Erstellen eines CustomJob finden Sie unter Benutzerdefinierte Trainingsjobs erstellen.

HyperparameterTuningJob

Das folgende Beispiel zeigt einen partiellen Anfragetext für die API-Methode projects.locations.hyperparameterTuningJobs.create:

{
  ...
  "trialJobSpec": {
    ...
    "enableWebAccess": true
  }
  ...
}

Ein Beispiel für das Senden einer API-Anfrage zum Erstellen einer HyperparameterTuningJob finden Sie unter Hyperparameter-Abstimmung verwenden.

Benutzerdefinierte TrainingPipeline

Die folgenden Beispiele zeigen partielle Anfragetexte für die API-Methode projects.locations.trainingPipelines.create. Wählen Sie einen der folgenden Tabs aus, je nachdem, ob Sie die Hyperparameter-Abstimmung verwenden:

Ohne Hyperparameter-Abstimmung

{
  ...
  "trainingTaskInputs": {
    ...
    "enableWebAccess": true
  }
  ...
}

Mit Hyperparameter-Abstimmung

{
  ...
  "trainingTaskInputs": {
    ...
    "trialJobSpec": {
      ...
      "enableWebAccess": true
    }
  }
  ...
}

Ein Beispiel für das Senden einer API-Anfrage zum Erstellen einer benutzerdefinierten TrainingPipeline finden Sie unter Trainingspipelines erstellen.

Python

Informationen zum Installieren oder Aktualisieren von Python finden Sie unter Vertex AI SDK für Python installieren. Weitere Informationen finden Sie in der Referenzdokumentation zur Python API.

Legen Sie den Parameter enable_web_access auf true fest, wenn Sie eine der folgenden Methoden ausführen:

Nachdem Sie das benutzerdefinierte Training gemäß der Anleitung im vorherigen Abschnitt gestartet haben, generiert Vertex AI einen oder mehrere URIs, mit denen Sie auf interaktive Shells zugreifen können. Vertex AI generiert für jeden Trainingsknoten in Ihrem Job einen eindeutigen URI.

Sie haben folgende Möglichkeiten, um eine interaktive Shell aufzurufen:

  • Klicken Sie auf einen Link in der Google Cloud Console
  • Verwenden Sie die Vertex AI API, um den Webzugriffs-URI der Shell abzurufen.
  1. Rufen Sie in der Google Cloud Console im Abschnitt Vertex AI eine der folgenden Seiten auf:

  2. Klicken Sie auf den Namen Ihrer benutzerdefinierten Trainingsressource.

    Wenn Sie eine TrainingPipeline für das benutzerdefinierte Training erstellt haben, klicken Sie auf den Namen des CustomJob oder HyperparameterTuningJob, der von der TrainingPipeline erstellt wurde. Wenn die Pipeline beispielsweise den Namen PIPELINE_NAME hat, könnte dieser PIPELINE_NAME-custom-job oder PIPELINE_NAME-hyperparameter-tuning-job lauten.

  3. Klicken Sie auf der Seite für den Job auf Webterminal starten. Wenn der Job mehrere Knoten verwendet, klicken Sie neben dem Knoten, für den Sie eine interaktive Shell wünschen, auf Webterminal starten.

    Sie können nur während der Jobausführung auf eine interaktive Shell zugreifen. Wenn Web-Terminal starten nicht angezeigt wird, hat Vertex AI unter Umständen noch nicht mit der Ausführung des Jobs begonnen oder der Job ist bereits abgeschlossen oder fehlgeschlagen. Wenn der Status des Jobs Queued oder Pending ist, warten Sie eine Minute. Versuchen Sie dann, die Seite zu aktualisieren.

    Wenn Sie die Hyperparameter-Abstimmung verwenden, gibt es für jeden Test separate Links zum Starten des Webterminals.

URI für Webzugriff über die API erhalten

Verwenden Sie die API-Methode projects.locations.customJobs.get oder die API-Methode projects.locations.hyperparameterTuningJobs.get, um die URIs aufzurufen, die Sie für den Zugriff auf interaktive Shells verwenden können.

Je nachdem, welche Art von benutzerdefinierter Trainingsressource Sie verwenden, wählen Sie einen der folgenden Tabs aus, um zu sehen, wie Sie das API-Feld webAccessUris ermitteln, das einen interaktiven Shell-URI für jeden Knoten in Ihrem Job enthält.

CustomJob

Die folgenden Tabs zeigen verschiedene Möglichkeiten zum Senden einer projects.locations.customJobs.get-Anfrage:

gcloud

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

gcloud ai custom-jobs describe JOB_ID \
  --region=LOCATION \
  --format=json

Ersetzen Sie Folgendes:

  • JOB_ID: Die numerische ID Ihres Jobs. Diese ID ist der letzte Teil des Feldes name des Jobs. Diese ID haben Sie möglicherweise beim Erstellen des Jobs gesehen. Wenn Sie die ID Ihres Jobs nicht kennen, können Sie den Befehl gcloud ai custom-jobs list ausführen und nach dem entsprechenden Job suchen.

  • LOCATION: Die Region, in der Sie den Job erstellt haben.

REST

Ersetzen Sie dabei folgende Werte für die Anfragedaten:

  • LOCATION: Die Region, in der Sie den Job erstellt haben.

  • PROJECT_ID: Ihre Projekt-ID.

  • JOB_ID: Die numerische ID Ihres Jobs. Diese ID ist der letzte Teil des Feldes name des Jobs. Diese ID haben Sie möglicherweise beim Erstellen des Jobs gesehen.

HTTP-Methode und URL:

GET https://LOCATION-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/customJobs/JOB_ID

Wenn Sie die Anfrage senden möchten, maximieren Sie eine der folgenden Optionen:

 

Suchen Sie in der Ausgabe nach Folgendem:

{
  ...
  "state": "JOB_STATE_RUNNING",
  ...
  "webAccessUris": {
    "workerpool0-0": "INTERACTIVE_SHELL_URI"
  }
}

Wenn das Feld webAccessUris nicht angezeigt wird, wurde der Job von Vertex AI möglicherweise noch nicht ausgeführt. Prüfen Sie, ob im Feld state der Wert JOB_STATE_RUNNING angezeigt wird. Wenn der Status JOB_STATE_QUEUED oder JOB_STATE_PENDING lautet, warten Sie eine Minute und versuchen Sie dann noch einmal, die Projektinformationen abzurufen.

HyperparameterTuningJob

Die folgenden Tabs zeigen verschiedene Möglichkeiten zum Senden einer projects.locations.hyperparameterTuningJobs.get-Anfrage:

gcloud

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

gcloud ai hp-tuning-jobs describe JOB_ID \
  --region=LOCATION \
  --format=json

Ersetzen Sie Folgendes:

  • JOB_ID: Die numerische ID Ihres Jobs. Diese ID ist der letzte Teil des Feldes name des Jobs. Diese ID haben Sie möglicherweise beim Erstellen des Jobs gesehen. Wenn Sie die ID Ihres Jobs nicht kennen, können Sie den Befehl gcloud ai hp-tuning-jobs list ausführen und nach dem entsprechenden Job suchen.

  • LOCATION: Die Region, in der Sie den Job erstellt haben.

REST

Ersetzen Sie dabei folgende Werte für die Anfragedaten:

  • LOCATION: Die Region, in der Sie den Job erstellt haben.

  • PROJECT_ID: Ihre Projekt-ID.

  • JOB_ID: Die numerische ID Ihres Jobs. Diese ID ist der letzte Teil des Feldes name des Jobs. Diese ID haben Sie möglicherweise beim Erstellen des Jobs gesehen.

HTTP-Methode und URL:

GET https://LOCATION-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/hyperparameterTuningJobs/JOB_ID

Wenn Sie die Anfrage senden möchten, maximieren Sie eine der folgenden Optionen:

 

Suchen Sie in der Ausgabe nach Folgendem:

{
  ...
  "state": "JOB_STATE_RUNNING",
  ...
  "trials": [
    ...
    {
      ...
      "state": "ACTIVE",
      ...
      "webAccessUris": {
        "workerpool0-0": "INTERACTIVE_SHELL_URI"
      }
    }
  ],
}

Wenn das Feld webAccessUris nicht angezeigt wird, wurde der Job von Vertex AI möglicherweise noch nicht ausgeführt. Prüfen Sie, ob im Feld state der Wert JOB_STATE_RUNNING angezeigt wird. Wenn der Status JOB_STATE_QUEUED oder JOB_STATE_PENDING lautet, warten Sie eine Minute und versuchen Sie dann noch einmal, die Projektinformationen abzurufen.

Vertex AI bietet eine Reihe interaktiver Shell-URIs für jeden Hyperparameter-Abstimmungstest, wenn der Test in den Status ACTIVE wechselt. Wenn Sie 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 einen URI für jeden Trainingsknoten, der durch einen Worker-Pool identifiziert wird.

Wenn Ihr Job beispielsweise einen primären Worker-Pool mit einem Replikat und einen sekundären Worker-Pool mit zwei Replikaten hat, sieht das Feld webAccessUris in etwa so aus:

{
  "workerpool0-0": "URI_FOR_PRIMARY",
  "workerpool1-0": "URI_FOR_FIRST_SECONDARY",
  "workerpool1-1": "URI_FOR_SECOND_SECONDARY"
}

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 Vertex AI 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 Vertex AI 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 Vertex AI-Trainingsgebühren anfallen, solange der Job ausgeführt wird.

Berechtigungsprobleme prüfen

Die interaktive Shell-Umgebung wird mithilfe von Standardanmeldedaten für Anwendungen für das Dienstkonto authentifiziert, das Vertex AI zum Ausführen Ihres Trainingscodes verwendet. Sie können gcloud auth list in der Shell ausführen, um weitere Details zu sehen.

In der Shell können Sie gsutil, 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:

    gsutil 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. (Das bedeutet, dass der Trainingscode zweimal auf dem Knoten 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:

    gsutil 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 Vertex AI), 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:

    gsutil 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