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 で機能しない

次のステップ