Fehlerbehebung bei Dataflow-TPU-Jobs

Wenn beim Ausführen Ihres Dataflow-Jobs mit TPUs Probleme auftreten, folgen Sie den folgenden Schritten zur Fehlerbehebung.

Fehlerbehebung bei Container-Images

Es kann hilfreich sein, Ihre Container- und TPU-Software auf einer eigenständigen VM zu debuggen. Sie können mit einer VM debuggen, die von einem GKE-Knotenpool erstellt wurde, oder auf einer laufenden Dataflow-Worker-VM.

Fehler mit einer eigenständigen VM beheben

Wenn Sie Ihren Container auf einer eigenständigen VM debuggen möchten, können Sie einen GKE-Knotenpool erstellen, der dieselbe TPU-VM für lokale Tests verwendet. Wenn Sie beispielsweise einen GKE-Knotenpool mit einem TPU V5 Lite-Gerät in us-west1-c erstellen möchten, sieht das so aus:

  1. GKE-Cluster erstellen

    gcloud container clusters create TPU_CLUSTER_NAME \
      --project PROJECT_ID \
      --release-channel=stable \
      --scopes=cloud-platform \
      --enable-ip-alias \
      --location us-west1-c
    
  2. Erstellen Sie einen GKE-Knotenpool.

    gcloud container node-pools create TPU_NODE_POOL_NAME \
      --project PROJECT_ID \
      --location=us-west1-c \
      --cluster=TPU_CLUSTER_NAME \
      --node-locations=us-west1-c \
      --machine-type=ct5lp-hightpu-1t \
      --num-nodes=1 \
      [ --reservation RESERVATION_NAME \
      --reservation-affinity=specific ]
    
  3. Suchen Sie in der GKE-Benutzeroberfläche oder mit dem folgenden Befehl nach dem VM-Namen des TPU-Knotens im Knotenpool.

    gcloud compute instances list --filter='metadata.kube-labels:"cloud.google.com/gke-nodepool=TPU_NODEPOOL_NAME"'
    
  4. Stellen Sie SSH eine Verbindung zu einer VM her, die vom GKE-Knotenpool erstellt wurde:

    gcloud compute ssh --zone "us-west1-c" "VM_NAME" --project PROJECT_ID
    
  5. Nachdem Sie eine Verbindung zu einer VM über SSH hergestellt haben, konfigurieren Sie Docker für die Artifact Registry, die Sie verwenden.

    docker-credential-gcr configure-docker --registries=us-west1-docker.pkg.dev
    
  6. Starten Sie dann einen Container mit dem verwendeten Image.

    docker run --privileged --network=host -it --rm --entrypoint=/bin/bash IMAGE_NAME
    
  7. Testen Sie im Container, ob auf TPUs zugegriffen werden kann.

    Wenn Sie beispielsweise ein Bild haben, das PyTorch verwendet, um TPUs zu nutzen, öffnen Sie einen Python-Interpreter:

    python3
    

    Führen Sie dann eine Berechnung auf einem TPU-Gerät aus:

    import torch
    import torch_xla.core.xla_model as xm
    dev = xm.xla_device()
    t1 = torch.randn(3,3,device=dev)
    t2 = torch.randn(3,3,device=dev)
    print(t1 + t2)
    

    Beispielausgabe:

    >>> tensor([[ 0.3355, -1.4628, -3.2610],
    >>>        [-1.4656,  0.3196, -2.8766],
    >>>        [ 0.8667, -1.5060,  0.7125]], device='xla:0')
    
  8. Wenn die Berechnung fehlschlägt, ist Ihr Bild möglicherweise nicht richtig konfiguriert.

    Möglicherweise müssen Sie beispielsweise die erforderlichen Umgebungsvariablen im Dockerfile des Images festlegen. Um dies zu bestätigen, wiederholen Sie die Berechnung, nachdem Sie die Umgebungsvariablen manuell wie folgt festgelegt haben:

    export TPU_SKIP_MDS_QUERY=1 # Don't query metadata
    export TPU_HOST_BOUNDS=1,1,1 # There's only one host
    export TPU_CHIPS_PER_HOST_BOUNDS=1,1,1 # 1 chips per host
    export TPU_WORKER_HOSTNAMES=localhost
    export TPU_WORKER_ID=0 # Always 0 for single-host TPUs
    export TPU_ACCELERATOR_TYPE=v5litepod-1 # Since we use v5e 1x1 accelerator.
    

    Wenn PyTorch- oder LibTPU-Abhängigkeiten fehlen, können Sie die Berechnung noch einmal versuchen, nachdem Sie sie mit dem folgenden Befehl installiert haben:

    # Install PyTorch with TPU support
    pip install torch torch_xla[tpu] torchvision -f https://storage.googleapis.com/libtpu-releases/index.html
    

Fehlerbehebung mit einer Dataflow-VM

Alternativ können Sie während der Ausführung eines Jobs eine SSH-Verbindung zur Dataflow-Worker-VM-Instanz herstellen. Da Dataflow-Worker-VMs nach Abschluss der Pipeline heruntergefahren werden, müssen Sie die Laufzeit möglicherweise künstlich verlängern, indem Sie eine Berechnung durchführen, die über einen längeren Zeitraum wartet.

Da ein TPU-Gerät nicht von mehreren Prozessen gemeinsam genutzt werden kann, müssen Sie möglicherweise eine Pipeline ausführen, bei der keine Berechnungen auf einer TPU erfolgen.

  1. Suchen Sie nach einer VM für den laufenden TPU-Job, indem Sie in der Google Cloud -Suchleiste der Console nach der Dataflow-Job-ID suchen oder den folgenden gcloud-Befehl verwenden:

    gcloud compute instances list --project PROJECT_ID --filter "STATUS='RUNNING' AND description ~ 'Created for Dataflow job: JOB_ID'"
    
  2. Nachdem Sie über SSH eine Verbindung zu einer VM mit TPUs hergestellt haben, starten Sie einen Container aus dem verwendeten Image. Ein Beispiel finden Sie unter Fehler mit einer eigenständigen VM beheben.

  3. Konfigurieren Sie im Container die TPU-Einstellungen neu und installieren Sie die erforderlichen Bibliotheken, um die Einrichtung zu testen. Ein Beispiel finden Sie unter Fehler mit einer eigenständigen VM beheben.

Worker starten nicht

Prüfen Sie vor der Fehlerbehebung, ob die folgenden Pipelineoptionen richtig eingestellt sind:

  • die Option --dataflow_service_option=worker_accelerator
  • die Option --worker_zone
  • die Option --machine_type

Prüfen Sie, ob in den Konsolenlogs angezeigt wird, dass Worker gestartet werden, der Job aber mit einer Meldung ähnlich der folgenden fehlschlägt:

  Workflow failed. Causes: The Dataflow job appears to be stuck because no worker
  activity has been seen in the last 25m.

Die Ursache dieser Probleme kann mit Kapazitäts- oder Worker-Startproblemen zusammenhängen.

  • Kapazität: Wenn Sie On-Demand-TPU-Kapazität oder eine Reservierung verwenden, die erschöpft ist, werden neue Pipelines möglicherweise erst gestartet, wenn Kapazität verfügbar ist. Wenn Sie eine Reservierung verwenden, können Sie die verbleibende Kapazität auf der Seite Compute Reservations (Compute-Reservierungen) in derGoogle Cloud -Konsole oder mit dem folgenden Befehl prüfen:

    gcloud compute reservations describe RESERVATION_NAME --zone ZONE
    

    Prüfen Sie, ob für Ihren Job Worker-VMs gestartet wurden. Wenn für Ihren Job ein Worker gestartet wird, geben Logger wie worker, worker_startup, kubelet und andere in der Regel eine Ausgabe aus. Außerdem sollte auf der Seite Job-Messwerte in der Google Cloud -Konsole die Anzahl der aktuellen Worker größer als null sein.

  • Worker-Start: Prüfen Sie die job-message- und launcher-Logs. Wenn in Ihrer Pipeline Worker gestartet werden, diese aber nicht hochfahren können, haben Sie möglicherweise Fehler in Ihrem benutzerdefinierten Container.

  • Festplattenspeicher: Prüfen Sie, ob für Ihren Job genügend Festplattenspeicher verfügbar ist. Verwenden Sie die Option --disk_size_gb, um den Speicherplatz zu erhöhen.

Job schlägt mit einem Fehler fehl

Wenn Ihr Job mit einem Fehler fehlschlägt, können Sie die folgenden Tipps zur Fehlerbehebung nutzen.

Start des Worker-Pools fehlgeschlagen

Wenn der folgende Fehler angezeigt wird, prüfen Sie, ob in Ihrer Pipeline --worker_zone angegeben ist und ob die Zone mit der Zone für Ihre Reservierung übereinstimmt.

JOB_MESSAGE_ERROR: Startup of the worker pool in zone ZONE failed to
bring up any of the desired 1 workers. [...] INVALID_FIELD_VALUE:
Instance 'INSTANCE_NAME' creation failed: Invalid value for field
'resource.reservationAffinity': '{ "consumeReservationType":
"SPECIFIC_ALLOCATION", "key":
"compute.googleapis.com/RESERVATION_NAME...'. Specified reservations
[RESERVATION_NAME] do not exist.

Verwaltete Instanzgruppen unterstützen keine Cloud TPUs

Wenn der folgende Fehler angezeigt wird, wenden Sie sich an Ihr Kontoteam, um zu prüfen, ob Ihr Projekt für die Verwendung von TPUs registriert wurde, oder melden Sie einen Fehler über den Google Issue Tracker.

apache_beam.runners.dataflow.dataflow_runner.DataflowRuntimeException: Dataflow
pipeline failed. State: FAILED, Error: Workflow failed. Causes: One or more
operations had an error [...]: [INVALID_FIELD_VALUE] 'Invalid value
for field 'resource.instanceTemplate': Managed Instance Groups do not support
Cloud TPUs. '.

Ungültiger Wert für das Feld

Wenn der folgende Fehler angezeigt wird, prüfen Sie, ob beim Aufrufen der Pipeline die Dataflow-Dienstoption worker_accelerator festgelegt ist.

JOB_MESSAGE_ERROR: Workflow failed. Causes: One or more operations had an error:
'operation-[...]': [INVALID_FIELD_VALUE] 'Invalid value for field
'resource.instanceTemplate': 'projects/[...]-harness'. Regional
Managed Instance Groups do not support Cloud TPUs.'

Gerät oder Ressource ist beschäftigt

Wenn der folgende Fehler angezeigt wird, führt ein Dataflow-Worker, der Ihre Pipeline verarbeitet, wahrscheinlich mehr als einen Prozess aus, der gleichzeitig auf die TPU zugreift. Dies wird nicht unterstützt. Weitere Informationen finden Sie unter TPUs und Worker-Parallelität.

RuntimeError: TPU initialization failed: open(/dev/vfio/0): Device or resource
busy: Device or resource busy; Couldn't open iommu group /dev/vfio/0

Wenn der oben genannte Fehler beim Debuggen Ihrer Pipeline auf einer VM auftritt, können Sie den Prozess, der die TPU blockiert, mit den folgenden Befehlen untersuchen und beenden:

apt update ; apt install lsof
lsof -w /dev/vfio/0
kill -9 PROCESS_ID    # to terminate the process.

Instanzen mit Gastbeschleunigern unterstützen keine Live-Migration

Wenn Sie den folgenden Fehler sehen, wurde die Pipeline wahrscheinlich mit einem explizit festgelegten Maschinentyp mit Beschleunigern gestartet, aber die Beschleunigerkonfiguration wurde nicht korrekt angegeben. Prüfen Sie, ob beim Aufrufen Ihrer Pipeline die Dataflow-Dienstoption worker_accelerator festgelegt ist, und achten Sie darauf, dass der Optionsname keine Tippfehler enthält.

JOB_MESSAGE_ERROR: Startup of the worker pool in zone ZONE failed to
bring up any of the desired 1 workers. [...] UNSUPPORTED_OPERATION:
Instance INSTANCE_ID creation failed: Instances with guest
accelerators do not support live migration.

Der Workflow wurde vom Dienst automatisch abgelehnt.

Die folgenden Fehler können auch auftreten, wenn einige der erforderlichen Pipelineoptionen fehlen oder falsch sind:

The workflow was automatically rejected by the service. The requested
accelerator type tpu-v5-lite-podslice;topology:1x1 requires setting
the worker machine type to ct5lp-hightpu-1t. Learn more at:
https://cloud.google.com/dataflow/docs/guides/configure-worker-vm

Zeitüberschreitung beim Warten auf eine Aktualisierung durch den Worker

Wenn Sie Pipelines auf TPU-VMs mit vielen vCPUs starten und die Standardanzahl der Worker-Threads nicht reduzieren, kann es zu Fehlern wie den folgenden kommen:

Workflow failed. Causes WORK_ITEM failed.
The job failed because a work item has failed 4 times.
Root cause: Timed out waiting for an update from the worker.

Um diesen Fehler zu vermeiden, reduzieren Sie die Anzahl der Threads. Sie könnten beispielsweise Folgendes festlegen: --number_of_worker_harness_threads=50.

Keine TPU-Nutzung

Wenn Ihre Pipeline erfolgreich ausgeführt wird, aber keine TPU-Geräte verwendet werden oder nicht darauf zugegriffen werden kann, prüfen Sie, ob die von Ihnen verwendeten Frameworks wie JAX oder PyTorch auf die angeschlossenen Geräte zugreifen können. Informationen zum Beheben von Fehlern in Ihrem Container-Image auf einer einzelnen VM finden Sie unter Fehler mit einer eigenständigen VM beheben.