Dataflow GPU ジョブのトラブルシューティング

GPU を使用した Dataflow ジョブの実行で問題が発生した場合は、次の操作を行います。

  1. Dataflow GPU の操作に関するベスト プラクティスのワークフローに従って、パイプラインが正しく構成されていることを確認します。
  2. Dataflow ジョブが GPU を使用していることを確認します。「GPU を使用してパイプラインを実行する」の Dataflow ジョブを確認するをご覧ください。
  3. スタンドアロン VM でデバッグします
  4. 問題が解決しない場合は、このページの残りのトラブルシューティング手順を実施します。

スタンドアロン VM でデバッグする

コンテナ イメージを設計して繰り返し作業を行う間は、スタンドアロン VM でコンテナ イメージを試用することで、フィードバック ループを短縮して高速化できます。

スタンドアロン 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
    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 インタープリタのマイナー バージョンは、パイプラインの起動時に使用するバージョンと同じであること。不一致があると、apache_beam/internal/pickler.py を含むスタック トレースで SystemError: unknown opcode のようなエラーが発生しています。
  • Apache Beam SDK 2.29.0 以前を使用している場合は、イメージ上で /usr/local/bin/pippip にアクセスできる必要があります。

初めてカスタム イメージを使用する場合は、カスタマイズを最小限の動作構成に抑えることをおすすめします。このページの例で示されているサンプルのカスタム コンテナ イメージを使用します。GPU をリクエストせずに、このコンテナ イメージで簡単な Dataflow パイプラインを実行できることを確認します。その後、解決策を繰り返します。

コンテナ イメージのダウンロードに十分なディスク容量がワーカーにあることを確認します。必要に応じてディスクサイズを調整します。イメージが大きいとダウンロードに時間がかかり、ワーカーの起動時間が長くなります。

起動時にジョブがすぐに失敗する

ZONE_RESOURCE_POOL_EXHAUSTED エラーや ZONE_RESOURCE_POOL_EXHAUSTED_WITH_DETAILS エラーが発生する場合は、次の手順を行います。

  • Dataflow が最適なゾーンを選択するように、ワーカーゾーンを指定しないようにします。

  • パイプラインを異なるゾーンで起動するか、別のアクセラレータ タイプで起動します。

実行時にジョブが失敗する

ジョブが実行時に失敗した場合は、ワーカーマシンと GPU のメモリ不足(OOM)エラーを確認します。GPU の OOM エラーは、ワーカーのログで cudaErrorMemoryAllocation out of memory エラーとして現れる場合があります。TensorFlow を使用している場合は、1 つの GPU デバイスへのアクセスに 1 つの TensorFlow プロセスのみ使用していることを確認します。詳細については、GPU とワーカーの並列処理をご覧ください。

GPU の使用状況がない

パイプラインは問題なく実行されていても、GPU が使用されていない場合は、次の点を確認します。

  • コンテナ イメージにインストールされている NVIDIA ライブラリが、パイプラインのユーザーコードと使用するライブラリの要件と一致する。
  • コンテナ イメージにインストールされた NVIDIA ライブラリが、共有ライブラリとしてアクセスできる。

使用可能なデバイスがない場合は、互換性のないソフトウェア構成を使用している可能性があります。たとえば、TensorFlow を使用している場合は、TensorFlow、cuDNN のバージョン、CUDA ツールキットのバージョンが互換性のある組み合わせになっていることを確認します。

イメージ構成を検証するには、GPU が利用可能でワーカーにアクセス可能であることを確認するだけの簡単なパイプラインを実行することを検討してください。

次のステップ