Dataflow GPU の使用に関するベスト プラクティス

このページでは、GPU を使用してパイプラインをビルドするためのベスト プラクティスについて説明します。

Dataflow ジョブで GPU を有効にする方法と例については、GPU を使用してパイプラインを実行するGPU を使用した Landsat 衛星画像の処理をご覧ください。

Dataflow で GPU を使用するための前提条件

考慮事項

テスト環境と本番環境の両方を設計する場合は、次の要素を考慮してください。

ローカルでの開発

Apache Beam を NVIDIA GPU とともに使用すると、前処理と推論を処理する大規模なデータ処理パイプラインを作成できます。ローカル開発に GPU を使用する場合は、次の情報を検討してください。

  • 多くの場合、データ処理ワークフローでは追加ライブラリを使用します。このようなライブラリは、Dataflow ワーカーの起動環境と実行環境にインストールする必要があります。この構成により、パイプライン要件を構成したり、Dataflow でカスタム コンテナを使用するための開発ワークフローに手順が追加されます。本番環境を可能な限り再現するローカル開発環境を用意することでメリットが得られます。

  • ワークフローが次の両方の条件を満たしている場合は、カスタム コンテナをビルドする、または開発ワークフローを変更してパイプライン要件を構成する必要はありません。

    • NVIDIA GPU を暗黙的に使用するライブラリを使用している。
    • GPU をサポートするためにコードを変更する必要がない。
  • 一部のライブラリでは CPU 使用率と GPU 使用量が透過的に切り替わらないため、特定のビルドやさまざまなコードパスが必要になります。このシナリオように code-run-code 開発のライフサイクルを複製するには、追加の手順が必要です。

  • ローカルテストを実行する場合は、Dataflow ワーカーの環境を可能な限り頻繁に複製します。ライブラリによっては、GPU を備えたマシンと必要な GPU ライブラリがインストールされている場合があります。このタイプのマシンは、ローカル環境に対応していない可能性があります。GPU を搭載した Google Cloud 仮想マシンで実行されているコンテナを使用して、Dataflow ランナー環境をエミュレートできます。

マシンタイプの仕様

各 GPU モデルに対するマシンタイプのサポートの詳細については、GPU プラットフォームをご覧ください。N1 マシンタイプでサポートされている GPU は、カスタム N1 マシンタイプもサポートしています。

GPU のタイプと数により、ワーカーが使用できる vCPU とメモリの上限が決まります。対応する制限については、可用性をご覧ください。

より多くの CPU またはメモリを指定する場合は、より多くの GPU の数の指定が必要になることがあります。

詳細については、Compute Engine の GPU をご覧ください。

リソース使用量を最適化する

ほとんどのパイプラインは、GPU を必要とする変換のみで構成されることはありません。一般的なパイプラインには、Apache Beam が提供する多くのソースの一つを使用する取り込みステージがあります。そのステージの後に、データ操作またはシェーピング変換が GPU 変換にフィードされます。

Right Fitting は、Apache Beam リソースヒントを使用して、バッチ パイプラインのワーカー リソースをカスタマイズします。Right Fitting が有効になっている場合、Dataflow は GPU を必要とするパイプラインのステージでのみ GPU を使用します。このため、この機能はパイプラインの柔軟性と機能を向上させ、コストを削減する可能性があります。

詳細については、Right Fitting をご覧ください。

GPU とワーカーの並列処理

Dataflow Runner v2 アーキテクチャを使用する Python パイプラインの場合、Dataflow は VM コアごとに 1 つの Apache Beam SDK プロセスを起動します。各 SDK プロセスは、固有の Docker コンテナで実行され、多数のスレッドを生成します。各スレッドは受信データを処理します。

GPU は複数のプロセス アーキテクチャを使用し、Dataflow ワーカーの GPU はすべてのプロセスとスレッドに表示されます。

共有 GPU で複数の SDK プロセスを実行している場合は、NVIDIA マルチプロセス サービス(MPS)を有効にして、GPU の効率と使用率を改善できます。MPS は、特に GPU リソースの使用量が少ないワークロードに対し、GPU パイプラインのワーカー並列処理と全体的なスループットを向上させます。詳細については、NVIDIA MPS を使用して共有 GPU のパフォーマンスを改善するをご覧ください。

GPU メモリのオーバーサブスクリプションを回避するために、GPU のアクセス管理が必要になる場合があります。TensorFlow を使用している場合は、次のいずれかの方法を使用して GPU メモリのオーバーサブスクリプションを回避できます。

  • ワーカー vCPU の数に関係なく、1 つのコンテナ化された Python プロセスのみを開始するように Dataflow ワーカーを構成する。これを構成するには、ジョブの起動時に次のパイプライン オプションを使用します。

    • --experiments=no_use_multiple_sdk_containers
    • --number_of_worker_harness_threads

    使用するスレッド数の詳細については、スレッド数の削減をご覧ください。

  • MPS を有効にする

推論ワークロード

ML モデルを使用してローカルとリモートの推論を行う場合は、組み込みの Apache Beam RunInference 変換を使用します。RunInference API は、ML 推論用に最適化された PTransform です。RunInference 変換を使用すると、パイプラインで ML モデルを使用する際の効率が向上します。

ワークフロー

次の 2 段階のワークフローは、GPU を使用してパイプラインを構築する方法を示しています。このフローでは、GPU と非 GPU の問題を別々に処理し、フィードバック ループを短縮します。

  1. パイプラインを作成する

    Dataflow で実行できるパイプラインを作成します。GPU を必要とする変換を、GPU を使用しない機能的に同等の変換に置き換えます。

    1. データの取り込みや操作など、GPU の使用に関連するすべての変換を作成します。

    2. パススルーにより、またはスキーマ変更を行い GPU 変換のスタブを作成します。

  2. ローカルでテストする

    Dataflow ワーカーの実行環境を模倣した環境で、パイプライン コードの GPU 部分をテストします。次の手順では、このテストを実行する 1 つの方法について説明します。

    1. 必要なすべてのライブラリを含む Docker イメージを作成します。

    2. GPU コードの開発を開始します。

    3. Docker イメージを含む Google Cloud 仮想マシンを使用して code-run-code サイクルを開始します。ライブラリの非互換性を排除するには、Apache Beam パイプラインとは別にローカルの Python プロセスで GPU コードを実行します。次に、ダイレクト ランナーでパイプライン全体を実行するか、Dataflow でパイプラインを起動します。

コンテナ用に最適化されたオペレーティング システムを実行している VM を使用する

最小環境の場合は、コンテナ用に最適化された仮想マシン(VM)を使用します。詳細については、GPU が接続された VM を作成するをご覧ください。

一般的なフローは次のとおりです。

  1. VM を作成します。

  2. VM に接続して、次のコマンドを実行します。

    sudo cos-extensions install gpu -- -version latest
    sudo mount --bind /var/lib/nvidia /var/lib/nvidia
    sudo mount -o remount,exec /var/lib/nvidia
    
  3. GPU が使用可能であることを確認します。

    ./nvidia-smi
    
  4. VM から GPU ドライバをボリュームとしてマウントして、Docker コンテナを起動します。次に例を示します。

    sudo 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 gcr.io/bigdatapivot/image_process_example:latest
    

サンプル Dockerfile については、カスタム コンテナ イメージのビルドをご覧ください。パイプラインに必要なすべての依存関係を Dockerfile に追加します。

GPU を使用するために事前に構成されている Docker イメージの使用については、GPU を使用するために構成された既存のイメージの使用をご覧ください。

コンテナ用に最適化されたシステムを使用するツール

  • docker-credential-gcr を Google Container Registry(GCR)のデフォルト セットの認証情報ヘルパーとして使用するように Docker CLI を構成するには、次のコマンドを使用します。

    sudo docker-credential-gcr configure-docker
    

    Docker 認証情報の設定の詳細については、docker-credential-gcr をご覧ください。

  • VM 間でパイプライン コードなどのファイルをコピーするには、toolbox を使用します。この方法は、カスタム最適化イメージを使用する場合に便利です。次に例を示します。

    toolbox /google-cloud-sdk/bin/gsutil cp gs://bucket/gpu/image_process/* /media/root/home/<userid>/opencv/
    

    詳細については、ツールボックスを使用したノードの問題のデバッグをご覧ください。

次のステップ