如果執行 Dataflow 工作時遇到 GPU 相關問題,請按照下列步驟操作:
- 請按照「使用 Dataflow GPU 的最佳做法」一文中的工作流程操作,確保管道設定正確。
- 確認 Dataflow 工作使用 GPU。請參閱「使用 GPU 執行管道」一文中的「驗證 Dataflow 工作」。
- 偵錯工作,可使用獨立 VM 或 Dataflow。
- 如果問題仍未解決,請按照本頁面的其他疑難排解步驟操作。
偵錯工作
如果可以,請使用獨立 VM 偵錯工作,因為使用獨立 VM 偵錯通常會比較快。不過,如果機構政策禁止您使用獨立 VM 進行偵錯,可以使用 Dataflow 進行偵錯。
使用獨立 VM 進行偵錯
設計及疊代適合的容器映像檔時,在獨立 VM 上試用容器映像檔,可縮短意見回饋循環,加快作業速度。
如要在搭載 GPU 的獨立 VM 上偵錯自訂容器,請建立在 Container-Optimized OS 上執行 GPU 的 Compute Engine VM、安裝驅動程式,然後啟動容器,步驟如下:
建立 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使用
ssh連線至 VM。gcloud compute ssh INSTANCE_NAME --project "PROJECT"安裝 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啟動自訂容器。
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 路徑。
確認容器中安裝的 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 運作」。