排查 Dataflow TPU 作业问题

如果您在使用 TPU 运行 Dataflow 作业时遇到问题,请按照以下问题排查步骤解决问题。

排查容器映像问题

在独立虚拟机上调试容器和 TPU 软件可能很有帮助。您可以使用由 GKE 节点池创建的虚拟机进行调试,也可以在正在运行的 Dataflow 工作器虚拟机上进行调试。

使用独立虚拟机进行调试

如需在独立虚拟机上调试容器,您可以创建使用相同 TPU 虚拟机的 GKE 节点池,以便进行本地实验。例如,在 us-west1-c 中创建一个包含一个 TPU V5 Lite 设备的 GKE 节点池,如下所示:

  1. 创建 GKE 集群。

    gcloud container clusters create TPU_CLUSTER_NAME \
      --project PROJECT_ID \
      --release-channel=stable \
      --scopes=cloud-platform \
      --enable-ip-alias \
      --location us-west1-c
    
  2. 创建 GKE 节点池。

    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. 在 GKE 界面中或使用以下命令查找节点池中 TPU 虚拟机的名称。

    gcloud compute instances list --filter='metadata.kube-labels:"cloud.google.com/gke-nodepool=TPU_NODEPOOL_NAME"'
    
  4. 使用 SSH 连接到由 GKE 节点池创建的虚拟机:

    gcloud compute ssh --zone "us-west1-c" "VM_NAME" --project PROJECT_ID
    
  5. 使用 SSH 连接到虚拟机后,为所用的 Artifact Registry 配置 Docker。

    docker-credential-gcr configure-docker --registries=us-west1-docker.pkg.dev
    
  6. 然后,从您使用的映像启动容器。

    docker run --privileged --network=host -it --rm --entrypoint=/bin/bash IMAGE_NAME
    
  7. 在容器内,测试 TPU 是否可访问。

    例如,如果您有一个使用 PyTorch 来利用 TPU 的映像,请打开 Python 解释器:

    python3
    

    然后,在 TPU 设备上执行计算:

    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)
    

    示例输出:

    >>> tensor([[ 0.3355, -1.4628, -3.2610],
    >>>        [-1.4656,  0.3196, -2.8766],
    >>>        [ 0.8667, -1.5060,  0.7125]], device='xla:0')
    
  8. 如果计算失败,则说明您的图片可能未正确配置。

    例如,您可能需要在映像 Dockerfile 中设置所需的环境变量。如需确认,请在手动设置环境变量后重试计算,如下所示:

    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.
    

    如果缺少 PyTorch 或 LibTPU 依赖项,您可以使用以下命令安装这些依赖项,然后重试计算:

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

使用 Dataflow 虚拟机进行调试

或者,您也可以在作业运行时使用 SSH 连接到 Dataflow 工作器虚拟机实例。由于 Dataflow 工作器虚拟机在流水线完成后会关闭,因此您可能需要通过执行长时间等待的计算来人为增加运行时长。

由于 TPU 设备无法在多个进程之间共享,因此您可能需要运行一个不在 TPU 上进行任何计算的流水线。

  1. 在 Google Cloud 控制台搜索栏中搜索 Dataflow 作业 ID,或使用以下 gcloud 命令,找到运行 TPU 作业的虚拟机:

    gcloud compute instances list --project PROJECT_ID --filter "STATUS='RUNNING' AND description ~ 'Created for Dataflow job: JOB_ID'"
    
  2. 使用 SSH 连接到具有 TPU 的虚拟机后,从您使用的映像启动容器。如需查看示例,请参阅使用独立虚拟机进行调试

  3. 在容器内,重新配置 TPU 设置并安装必要的库,以测试您的设置。如需查看示例,请参阅使用独立虚拟机进行调试

工作器无法启动

在进行问题排查之前,请验证以下流水线选项是否已正确设置:

  • --dataflow_service_option=worker_accelerator 选项
  • --worker_zone 选项
  • --machine_type 选项

检查控制台日志是否显示工作器正在启动,但作业失败并显示类似以下内容的消息:

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

这些问题可能与容量或工作器启动问题有关。

  • 容量:如果您使用的是按需 TPU 容量或已用尽的预留容量,则新流水线可能无法启动,直到有可用容量为止。如果您使用预留,请在Google Cloud 控制台的 Compute Reservations(计算预留)页面中或使用以下命令检查其剩余容量:

    gcloud compute reservations describe RESERVATION_NAME --zone ZONE
    

    检查作业是否已启动任何工作器虚拟机。当作业启动工作器时,workerworker_startupkubelet 等记录器通常会提供输出。此外,在 Google Cloud 控制台的作业指标页面上,当前工作器的数量应大于零。

  • 工作器启动:检查 job-messagelauncher 日志。如果流水线启动了工作器,但工作器无法启动,则可能是自定义容器中存在错误

  • 磁盘空间:验证是否有足够的磁盘空间来运行作业。 如需增加磁盘空间,请使用 --disk_size_gb 选项。

作业失败并显示错误

如果作业因错误而失败,请按照以下问题排查建议操作。

工作器池启动失败

如果您看到以下错误,请验证您的流水线是否指定了 --worker_zone,以及可用区是否与预留的可用区一致。

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.

托管实例组不支持 Cloud TPU

如果您看到以下 bug,请联系您的客户团队,验证您的项目是否已注册使用 TPU,或者使用 Google 问题跟踪器提交 bug。

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. '.

相应字段的值无效

如果您看到以下错误,请验证流水线调用是否设置了 worker_accelerator Dataflow 服务选项。

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.'

设备或资源正忙

如果您看到以下错误,则表示处理流水线的 Dataflow worker 可能同时运行多个访问 TPU 的进程。不支持此操作。如需了解详情,请参阅 TPU 和工作器并行

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

如果您在调试虚拟机上的流水线时看到上述错误,可以使用以下命令检查并终止占用 TPU 的进程:

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

包含客机加速器的实例不支持实时迁移

如果您看到以下错误,则可能是流水线启动时明确设置了具有加速器的机器类型,但未正确指定加速器配置。验证流水线调用是否设置了 worker_accelerator Dataflow 服务选项,并确保该选项名称没有拼写错误。

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.

工作流被服务自动拒绝

如果缺少或错误设置了某些必需的流水线选项,系统可能还会显示以下错误:

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

等待工作器更新时超时

如果您在具有大量 vCPU 的 TPU 虚拟机上启动流水线,并且未减少默认的工作器线程数,作业可能会遇到如下所示的错误:

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.

为避免此错误,请减少线程数。例如,您可以设置: --number_of_worker_harness_threads=50

未使用 TPU

如果流水线运行成功,但未使用或无法访问 TPU 设备,请验证您使用的框架(例如 JAX 或 PyTorch)是否可以访问所连接的设备。如需在单个虚拟机上排查容器映像问题,请参阅使用独立虚拟机进行调试