如果您在使用 TPU 运行 Dataflow 作业时遇到问题,请按照以下问题排查步骤解决问题。
排查容器映像问题
在独立虚拟机上调试容器和 TPU 软件可能很有帮助。您可以使用由 GKE 节点池创建的虚拟机进行调试,也可以在正在运行的 Dataflow 工作器虚拟机上进行调试。
使用独立虚拟机进行调试
如需在独立虚拟机上调试容器,您可以创建使用相同 TPU 虚拟机的 GKE 节点池,以便进行本地实验。例如,在 us-west1-c
中创建一个包含一个 TPU V5 Lite 设备的 GKE 节点池,如下所示:
创建 GKE 集群。
gcloud container clusters create TPU_CLUSTER_NAME \ --project PROJECT_ID \ --release-channel=stable \ --scopes=cloud-platform \ --enable-ip-alias \ --location us-west1-c
创建 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 ]
在 GKE 界面中或使用以下命令查找节点池中 TPU 虚拟机的名称。
gcloud compute instances list --filter='metadata.kube-labels:"cloud.google.com/gke-nodepool=TPU_NODEPOOL_NAME"'
使用 SSH 连接到由 GKE 节点池创建的虚拟机:
gcloud compute ssh --zone "us-west1-c" "VM_NAME" --project PROJECT_ID
使用 SSH 连接到虚拟机后,为所用的 Artifact Registry 配置 Docker。
docker-credential-gcr configure-docker --registries=us-west1-docker.pkg.dev
然后,从您使用的映像启动容器。
docker run --privileged --network=host -it --rm --entrypoint=/bin/bash IMAGE_NAME
在容器内,测试 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')
如果计算失败,则说明您的图片可能未正确配置。
例如,您可能需要在映像 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 上进行任何计算的流水线。
在 Google Cloud 控制台搜索栏中搜索 Dataflow 作业 ID,或使用以下
gcloud
命令,找到运行 TPU 作业的虚拟机:gcloud compute instances list --project PROJECT_ID --filter "STATUS='RUNNING' AND description ~ 'Created for Dataflow job: JOB_ID'"
使用 SSH 连接到具有 TPU 的虚拟机后,从您使用的映像启动容器。如需查看示例,请参阅使用独立虚拟机进行调试。
在容器内,重新配置 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
检查作业是否已启动任何工作器虚拟机。当作业启动工作器时,
worker
、worker_startup
、kubelet
等记录器通常会提供输出。此外,在 Google Cloud 控制台的作业指标页面上,当前工作器的数量应大于零。工作器启动:检查
job-message
和launcher
日志。如果流水线启动了工作器,但工作器无法启动,则可能是自定义容器中存在错误。磁盘空间:验证是否有足够的磁盘空间来运行作业。 如需增加磁盘空间,请使用
--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)是否可以访问所连接的设备。如需在单个虚拟机上排查容器映像问题,请参阅使用独立虚拟机进行调试。