排解 Dataflow GPU 工作問題

如果執行 Dataflow 工作時遇到 GPU 相關問題,請按照下列步驟操作:

  1. 請按照「使用 Dataflow GPU 的最佳做法」一文中的工作流程操作,確保管道設定正確。
  2. 確認 Dataflow 工作使用 GPU。請參閱「使用 GPU 執行管道」一文中的「驗證 Dataflow 工作」。
  3. 偵錯工作,可使用獨立 VM 或 Dataflow。
  4. 如果問題仍未解決,請按照本頁面的其他疑難排解步驟操作。

偵錯工作

如果可以,請使用獨立 VM 偵錯工作,因為使用獨立 VM 偵錯通常會比較快。不過,如果機構政策禁止您使用獨立 VM 進行偵錯,可以使用 Dataflow 進行偵錯

使用獨立 VM 進行偵錯

設計及疊代適合的容器映像檔時,在獨立 VM 上試用容器映像檔,可縮短意見回饋循環,加快作業速度。

如要在搭載 GPU 的獨立 VM 上偵錯自訂容器,請建立在 Container-Optimized OS 上執行 GPU 的 Compute Engine VM、安裝驅動程式,然後啟動容器,步驟如下:

  1. 建立 VM 執行個體。

    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 連線至 VM。

    gcloud compute ssh INSTANCE_NAME --project "PROJECT"
    
  3. 安裝 GPU 驅動程式。使用 ssh 連線至 VM 後,請在 VM 上執行下列指令:

    # 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 -include-artifact-registry
    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 進行偵錯

如果機構限制導致您無法在獨立 VM 上進行偵錯,可以使用 Dataflow 偵錯。

簡化管道,讓管道只偵測是否有 GPU,然後在 Dataflow 上執行管道。以下範例說明這個管道的程式碼可能樣貌:

def check_if_gpus_present(element):
  import torch
  import tensorflow as tf

  tensorflow_detects_gpus = tf.config.list_physical_devices("GPU")
  torch_detects_gpus = torch.cuda.is_available()
  if tensorflow_detects_gpus and torch_detects_gpus:
    return element

  if tensorflow_detects_gpus:
    raise Exception('PyTorch failed to detect GPUs with your setup')
  if torch_detects_gpus:
    raise Exception('Tensorflow failed to detect GPUs with your setup')
  raise Exception('Both Tensorflow and PyTorch failed to detect GPUs with your setup')

with beam.Pipeline() as p:
  _ = (p | beam.Create([1,2,3]) # Create a PCollection of the prompts.
         | beam.Map(check_if_gpus_present)
  )

如果管道成功執行,表示程式碼可以存取 GPU。如要找出有問題的程式碼,請逐步將越來越大的範例插入管道程式碼,並在每次變更後執行管道。

如果管道無法偵測到 GPU,請按照本文「沒有 GPU 用量」一節中的步驟操作。

工作人員未啟動

如果工作停滯不前,且 Dataflow worker 從未開始處理資料,很可能是因為您使用自訂容器搭配 Dataflow 時發生問題。詳情請參閱自訂容器疑難排解指南

如果您是 Python 使用者,請確認符合下列條件:

  • 容器映像檔中的 Python 解譯器子版本,與啟動管道時使用的版本相同。如果不相符,您可能會看到類似 SystemError: unknown opcode 的錯誤,以及涉及 apache_beam/internal/pickler.py 的堆疊追蹤記錄。
  • 如果您使用 Apache Beam SDK 2.29.0 以下版本,則必須在 /usr/local/bin/pip 的映像檔中存取 pip

建議您首次使用自訂映像檔時,盡量減少自訂項目,只保留最基本的運作設定。使用本頁範例中提供的自訂容器映像檔。請確認您可以使用這個容器映像檔執行簡單的 Dataflow 管道,而不需要求 GPU。然後反覆修正解決方案。

確認工作人員有足夠的磁碟空間可下載容器映像檔。視需要調整磁碟大小。下載大型圖片需要較長時間,這會增加 worker 啟動時間。

工作在啟動時立即失敗

如果遇到「ZONE_RESOURCE_POOL_EXHAUSTED」或「ZONE_RESOURCE_POOL_EXHAUSTED_WITH_DETAILS」錯誤,請按照下列步驟操作:

  • 請勿指定工作站區域,讓 Dataflow 為您選取最佳區域。

  • 在其他區域啟動管道,或使用其他加速器類型。

  • 設定佈建模式,例如「彈性啟動」。詳情請參閱「設定佈建模型」。

工作在執行階段失敗

如果工作在執行階段失敗,請檢查工作站和 GPU 是否發生記憶體不足 (OOM) 錯誤。GPU 記憶體不足錯誤可能會在工作站記錄中顯示為 cudaErrorMemoryAllocation out of memory 錯誤。如果您使用 TensorFlow,請確認只使用一個 TensorFlow 程序存取一個 GPU 裝置。詳情請參閱「GPU 和 worker 平行處理」。

沒有 GPU 用量

如果工作似乎未使用 GPU,請按照本文「偵錯工作」一節中的步驟操作,確認 Docker 映像檔是否提供 GPU。

如果 GPU 可用但未派上用場,問題可能出在管道程式碼。如要偵錯管道程式碼,請先使用可順利運用 GPU 的簡單管道,然後逐步將程式碼新增至管道,並在每次新增後測試管道。詳情請參閱本文的「在 Dataflow 上偵錯」一節。

如果管道無法偵測到 GPU,請確認下列事項:

  • 容器映像檔中安裝的 NVIDIA 程式庫符合管道使用者程式碼和所用程式庫的需求。
  • 容器映像檔中安裝的 NVIDIA 程式庫可做為共用程式庫存取。

如果裝置無法使用,可能是因為軟體設定不相容。如要驗證映像檔設定,請執行簡單的管道,確認 GPU 可供工作人員使用及存取。

排解 TensorFlow 問題

如果 PyTorch 在管道中偵測到 GPU,但 TensorFlow 沒有, 請嘗試下列疑難排解步驟:

  • 確認 TensorFlow、cuDNN 版本和 CUDA Toolkit 版本是否相容。詳情請參閱 TensorFlow 說明文件的「經過測試的建構設定」。
  • 如有可能,請升級至最新相容的 TensorFlow 和 CUDA 版本。
  • 請查看 TensorFlow 和 CUDA 的已知問題,確認已知問題是否導致管道發生問題。舉例來說,下列已知問題可能會導致 TensorFlow 無法偵測到 GPU:「TF 2.17.0 RC0 無法搭配 GPU 運作」。

後續步驟