如果執行含有 GPU 的 Dataflow 工作時遇到問題,請按照下列步驟操作:
- 請按照「使用 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 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 工作站從未開始處理資料,可能是因為您使用自訂容器時發生問題。詳情請參閱自訂容器疑難排解指南。
如果您是 Python 使用者,請確認符合下列條件:
- 容器映像檔中的 Python 解譯器次要版本,與您啟動管道時使用的版本相同。如果不相符,您可能會看到類似
SystemError: unknown opcode
的錯誤, 並包含涉及apache_beam/internal/pickler.py
的堆疊追蹤。 - 如果您使用 Apache Beam SDK 2.29.0 以下版本,映像檔中的
/usr/local/bin/pip
必須可存取pip
。
建議您首次使用自訂映像檔時,盡量減少自訂項目,只保留最基本的運作設定。使用本頁範例中提供的自訂容器映像檔。請確認您可以使用這個容器映像檔執行簡單的 Dataflow 管道,不必要求使用 GPU。然後反覆修正解決方案。
確認工作人員有足夠的磁碟空間可下載容器映像檔。視需要調整磁碟大小。大型圖片需要較長的下載時間,這會增加工作人員的啟動時間。
工作在啟動時立即失敗
如果遇到 ZONE_RESOURCE_POOL_EXHAUSTED
或 ZONE_RESOURCE_POOL_EXHAUSTED_WITH_DETAILS
錯誤,請按照下列步驟操作:
請勿指定工作站區域,讓 Dataflow 為您選取最佳區域。
在其他區域或使用其他加速器類型啟動管道。
工作在執行階段失敗
如果工作在執行階段失敗,請檢查工作站電腦和 GPU 是否發生記憶體不足 (OOM) 錯誤。GPU OOM 錯誤可能會在工作站記錄中顯示為 cudaErrorMemoryAllocation out of memory
錯誤。如果您使用 TensorFlow,請確認只使用一個 TensorFlow 程序存取一個 GPU 裝置。詳情請參閱「GPU 和工作站並行處理」。
沒有 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 使用。