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

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

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

ジョブをデバッグする

可能な場合は、スタンドアロン VM でジョブをデバッグします。通常、スタンドアロン VM でのデバッグの方が高速です。ただし、組織のポリシーでスタンドアロン VM を使用したデバッグが禁止されている場合は、Dataflow を使用してデバッグできます。

スタンドアロン 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 を使用してデバッグする

組織の制約によりスタンドアロン 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 ワーカーがデータの処理をまったく始めない場合は、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 が使用されていないと思われる場合は、このドキュメントのジョブをデバッグするの手順で、Docker イメージで GPU が使用可能かどうかを確認します。

GPU が使用可能であるものの使用されていない場合は、パイプライン コードに問題がある可能性があります。パイプライン コードをデバッグするには、GPU を正常に使用する簡単なパイプラインから始め、パイプラインにコードを徐々に追加し、新しい追加ごとにパイプラインをテストします。詳細については、このドキュメントの Dataflow でデバッグするをご覧ください。

パイプラインで GPU が検出されない場合は、次のことを確認します。

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

使用可能なデバイスがない場合は、互換性のないソフトウェア構成を使用している可能性があります。イメージ構成を検証するには、GPU が利用可能でワーカーにアクセス可能であることを確認するだけの簡単なパイプラインを実行してください。

TensorFlow の問題のトラブルシューティング

PyTorch がパイプラインで GPU を検出しても TensorFlow が検出しない場合は、次のトラブルシューティング手順をお試しください。

  • TensorFlow、cuDNN のバージョン、CUDA ツールキットのバージョンの組み合わせに互換性があることを確認します。詳細については、TensorFlow ドキュメントのテスト済みのビルド構成をご覧ください。
  • 可能であれば、互換性のある最新の TensorFlow バージョンと CUDA バージョンにアップグレードします。
  • TensorFlow と CUDA の既知の問題を確認して、既知の問題がパイプラインで問題を引き起こしているかどうかを確認します。たとえば、次の既知の問題により、TensorFlow が GPU を検出できない可能性があります(TF 2.17.0 RC0 が GPU で動作しない)。

次のステップ