排查 Dataflow GPU 作业问题

如果您在使用 GPU 运行 Dataflow 作业时遇到问题,请按照以下步骤操作:

  1. 遵循使用 Dataflow GPU 的最佳实践中的工作流,确保您的流水线配置正确。
  2. 确认您的 Dataflow 作业正在使用 GPU。请参阅“使用 GPU 运行流水线”中的验证 Dataflow 作业
  3. 使用独立虚拟机进行调试
  4. 如果问题仍然存在,请按照本页面上的其余问题排查步骤操作。

使用独立虚拟机进行调试

在设计和迭代适合您的容器映像时,通过在独立虚拟机上试用容器映像可以更快地缩短反馈环。

您可以在具有 GPU 的独立虚拟机上调试自定义容器,方法是,创建在 Container-Optimized OS 上运行 GPU 的 Compute Engine 虚拟机、安装驱动程序并如下所示启动容器。

  1. 创建虚拟机实例。

    gcloud compute instances create INSTANCE_NAME \
      --project "PROJECT" \
      --image-family cos-stable \
      --image-project=cos-cloud  \
      --zone=us-central1-f \
      --accelerator type=nvidia-tesla-t4,count=1 \
      --maintenance-policy TERMINATE \
      --restart-on-failure  \
      --boot-disk-size=200G \
      --scopes=cloud-platform
    
  2. 使用 ssh 连接到虚拟机。

    gcloud compute ssh INSTANCE_NAME --project "PROJECT"
    
  3. 安装 GPU 驱动程序。使用 ssh 连接到虚拟机后,请在虚拟机上运行以下命令:

    # Run these commands on the virtual machine
    cos-extensions install gpu
    sudo mount --bind /var/lib/nvidia /var/lib/nvidia
    sudo mount -o remount,exec /var/lib/nvidia
    /var/lib/nvidia/bin/nvidia-smi
    
  4. 启动自定义容器。

    Apache Beam SDK 容器使用 /opt/apache/beam/boot 入口点。出于调试目的,您可以使用其他入口点手动启动容器:

    docker-credential-gcr configure-docker
    docker run --rm \
      -it \
      --entrypoint=/bin/bash \
      --volume /var/lib/nvidia/lib64:/usr/local/nvidia/lib64 \
      --volume /var/lib/nvidia/bin:/usr/local/nvidia/bin \
      --privileged \
      IMAGE
    

    IMAGE 替换为 Docker 映像的 Artifact Registry 路径。

  5. 验证容器中安装的 GPU 库是否可以访问 GPU 设备。

    如果您使用的是 TensorFlow,则可以使用以下代码输出 Python 解释器中的可用设备:

    >>> import tensorflow as tf
    >>> print(tf.config.list_physical_devices("GPU"))
    

    如果您使用的是 PyTorch,则可以使用以下命令检查 Python 解释器中的可用设备:

    >>> import torch
    >>> print(torch.cuda.is_available())
    >>> print(torch.cuda.device_count())
    >>> print(torch.cuda.get_device_name(0))
    

如需迭代流水线,您可以在 Direct Runner 上启动流水线。您还可以在此环境中启动 Dataflow Runner 上的流水线。

工作器无法启动

如果您的作业卡住,并且 Dataflow 工作器一直不开始处理数据,则可能是使用自定义容器和 Dataflow 时出现问题。如需了解详情,请参阅自定义容器问题排查指南

如果您是 Python 用户,请验证是否满足以下条件:

  • 容器映像中的 Python 解释器次要版本与您启动流水线时使用的版本相同。如果存在不匹配现象,您可能会看到类似 SystemError: unknown opcode 的错误,并且堆栈轨迹涉及 apache_beam/internal/pickler.py
  • 如果您使用的是 Apache Beam SDK 2.29.0 或更低版本,则必须能够在 /usr/local/bin/pip 中的映像上访问 pip

我们建议您在第一次使用自定义映像时,将自定义设置降至最低有效配置。使用本页面的示例中提供的示例自定义容器映像。确保无需请求 GPU 即可使用此容器映像运行简单的 Dataflow 流水线。然后,迭代解决方案。

验证工作器是否有足够的磁盘空间来下载容器映像。根据需要调整磁盘大小。下载大型映像需要更长的时间,这会增加工作器启动时间。

作业在启动时立即失败

如果遇到 ZONE_RESOURCE_POOL_EXHAUSTEDZONE_RESOURCE_POOL_EXHAUSTED_WITH_DETAILS 错误,则可以执行以下步骤:

  • 请勿指定工作器可用区,以便 Dataflow 为您选择最佳可用区。

  • 在其他可用区或使用其他加速器类型启动流水线。

作业在运行时失败

如果作业在运行时失败,请检查工作器机器和 GPU 上是否存在内存不足 (OOM) 错误。GPU OOM 错误可能会在工作器日志中表现为 cudaErrorMemoryAllocation out of memory 错误。如果您使用的是 TensorFlow,请验证只使用一个 TensorFlow 进程访问一个 GPU 设备。如需了解详情,请参阅 GPU 和工作器并行

未使用 GPU

如果流水线运行成功,但未使用 GPU,请验证以下内容:

  • 容器映像中安装的 NVIDIA 库符合流水线用户代码和它使用的库的要求。
  • 容器映像中已安装的 NVIDIA 库可作为共享库访问。

如果这些设备不可用,则您使用的软件配置可能不兼容。例如,如果您使用 TensorFlow,请验证您是否使用了 TensorFlow、cuDNN 版本和 CUDA 工具包版本的兼容组合

如需验证映像配置,建议运行一个简单明确的流水线,该流水线只会检查 GPU 是否可用并可供工作器访问。

后续步骤