GPU パフォーマンスの最適化

次のオプションを使用して、仮想マシン(VM)インスタンスの GPU のパフォーマンスを向上させることができます。

自動ブーストの無効化

NVIDIA K80 の GPU で自動ブースト機能を使用すると、自動的にクロック速度を調整し、指定のアプリケーションに最適な速度を検出します。ただし、クロック速度を常に調整すると、GPU のパフォーマンスが低下することもあります。自動ブーストの詳細については、Increase Performance with GPU Boost and K80 Autoboost をご覧ください。

Compute Engine で NVIDIA K80 の GPU を実行する場合は、自動ブーストを無効にすることをおすすめします。

NVIDIA K80 GPU が接続されているインスタンスで自動ブーストを無効にするには、次のコマンドを実行します。

sudo nvidia-smi --auto-boost-default=DISABLED

出力は次のようになります。

All done.

GPU クロック速度を最大周波数に設定

NVIDIA K80 GPU が接続されたインスタンスで GPU クロック速度を最大周波数に設定するには、次のコマンドを実行します。

sudo nvidia-smi --applications-clocks=2505,875

最大 100 Gbps のネットワーク帯域幅の使用

より高い帯域幅を使用する VM の作成

より高いネットワーク帯域幅を使用すると、Compute Engine 上で NVIDIA A100、T4、または V100 GPU を使用する VM で分散ワークロードのパフォーマンスを向上させることができます。

GPU インスタンスでサポートされているネットワーク帯域幅の詳細については、ネットワーク帯域幅と GPU をご覧ください。

GPU が接続され、最大 100 Gbps のネットワーク帯域幅を持つ VM を作成するには:

  1. 使用可能な最大帯域幅を取得するために必要な CPU、GPU、メモリの最小構成を確認する。
  2. A100、T4、または V100 GPU がアタッチされた VM を作成します。GPU を接続した VM の作成をご覧ください。この GPU VM には、次の設定も必要です。

    あるいは、Deep Learning VM(DLVM)イメージ プロジェクトにある GPU 対応イメージを使用して VM を作成することもできます。GPU 対応の DLVM イメージには、GPU ドライバ、ML ソフトウェア、gVNIC がプリインストールされています。DLVM イメージの一覧については、イメージの選択をご覧ください。

    たとえば、最大帯域幅が 100 Gbps で、8 個の V100 GPU が接続され、tf-latest-gpu DLVM イメージを使用する VM を作成するには、次のコマンドを実行します。

     gcloud compute instances create VM_NAME \
       --project PROJECT_ID \
       --custom-cpu 96 \
       --custom-memory 624 \
       --image-project=deeplearning-platform-release \
       --image-family=tf-latest-gpu \
       --accelerator type=nvidia-tesla-v100,count=8 \
       --maintenance-policy TERMINATE \
       --metadata="install-nvidia-driver=True"  \
       --boot-disk-size 200GB \
       --network-interface=nic-type=GVNIC \
       --zone=ZONE
    

    たとえば、最大帯域幅が 100 Gbps で、8 個の A100 GPU が接続され、tf-latest-gpu DLVM イメージを使用する VM を作成するには、次のコマンドを実行します。

    gcloud compute instances create VM_NAME \
       --project=PROJECT_ID \
       --zone=ZONE \
       --machine-type=a2-highgpu-8g \
       --maintenance-policy=TERMINATE --restart-on-failure \
       --image-family=tf-latest-gpu \
       --image-project=deeplearning-platform-release \
       --boot-disk-size=200GB \
       --network-interface=nic-type=GVNIC \
       --metadata="install-nvidia-driver=True,proxy-mode=project_editors" \
       --scopes=https://www.googleapis.com/auth/cloud-platform
    

    次のように置き換えます。

    • VM_NAME: VM の名前。
    • PROJECT_ID: プロジェクト ID
    • ZONE: VM のゾーン。このゾーンは、特定の GPU タイプをサポートしている必要があります。ゾーンの詳細については、GPU のリージョンとゾーンをご覧ください。
  3. VM を作成すると、ネットワーク帯域幅を確認できます。

ネットワーク帯域幅の確認

高帯域幅の GPU を使用する場合、iperf2 などのネットワーク トラフィック ツールを使用してネットワーク帯域幅を測定できます。

帯域幅速度を確認するには、GPU が接続されていて、テストしている帯域幅速度をサポートしている少なくとも 2 つの VM が必要です。特定の帯域幅の VM の最小構成の推奨については、VM の構成をご覧ください。

Debian ベースのシステムで iPerf を使用してベンチマークを実行します。

  1. 必要な帯域幅速度に対応できる 2 つの VM を作成します。

  2. 両方の VM を実行したら、SSH を使用していずれかの VM に接続します。

    gcloud compute ssh VM_NAME \
        --project=PROJECT_ID
    

    次のように置き換えます。

    • VM_NAME: 最初の VM の名前
    • PROJECT_ID: プロジェクト ID
  3. 最初の VM で次の手順を行います。

    1. iperf をインストールします。

      sudo apt-get update && sudo apt-get install iperf
      
    2. この VM の内部 IP アドレスを取得します。アドレスを書き留めておいてください。

      ip a
      
    3. iPerf サーバーを起動します。

      iperf -s
      

      これにより、ベンチマークを実行するために接続をリッスンするサーバーが起動します。テスト中は稼働したままにします。

  4. 新しいクライアント ターミナルから、SSH を使用して 2 番目の VM に接続します。

    gcloud compute ssh VM_NAME \
       --project=PROJECT_ID
    

    次のように置き換えます。

    • VM_NAME: 2 番目の VM の名前
    • PROJECT_ID: プロジェクト ID
  5. 2 番目の VM で次の手順を行います。

    1. iPerf をインストールします。

      sudo apt-get update && sudo apt-get install iperf
      
    2. iperf テストを実行し、最初の VM の IP アドレスをターゲットとして指定します。

      iperf -t 30 -c internal_ip_of_instance_1 -P 16
      

      これにより、30 秒のテストが開始し、次のような出力が生成されます。iPerf が他の VM に到達できない場合は、VM 上、またはコンソールでネットワークやファイアウォール設定の調整が必要になることがあります。

最大 100 Gbps の帯域幅を使用する場合は、次の点に留意してください。

  • 仮想化スタック上のイーサネット、IP、TCP などのプロトコルのヘッダーのオーバーヘッドにより、netperf で測定されたスループットは約 90 Gbps が上限となります。

    TCP では 100 Gbps のネットワーク速度を実現できます。UDP などのその他のプロトコルは現時点でより低速です。

  • プロトコルのオーバーヘッドやネットワークの輻輳などの理由により、データ ストリームのエンドツーエンドのパフォーマンスは 100 Gbps よりわずかに低い場合があります。

  • VM インスタンス間で最大帯域幅を実現するには、複数の TCP ストリームを使用する必要があります。Google では 4~16 ストリームを推奨しています。16 のフローでは、スループットが最大限に達することがよくあります。アプリケーションやソフトウェア スタックに応じて、設定やコードを調整して複数のストリームを設定する必要があります。

  • 100 Gbps のネットワーク帯域幅は一方向にのみ実現できます。TX + RX の合計は約 100 Gbps と予測されます。

Fast Socket でより高速のネットワーク帯域幅を使用する

NVIDIA Collective Communications Library(NCCL)は、TensorFlow、PyTorch、Holoods などのディープ ラーニング フレームワークでマルチ GPU やマルチノード トレーニングを行う場合に使用されます。

Fast Socket は NCCL 用の Google 独自のネットワーク トランスポートです。Compute Engine で Fast Socket を使用すると、複数の TCP 接続間の競合が減り、100 Gbps ネットワーク上の NCCL パフォーマンスが向上します。NCCL の操作の詳細については、NCCL ユーザーガイドをご覧ください。

現在の評価では、Fast Socket を使用すると、all-reduce のスループットがメッセージのサイズに応じて 30%~60% 向上します。

Fast Socket 環境を設定するには、Deep Learning VM Image または Compute Engine 公開イメージを使用します。

Deep Learning VM Image の使用

Fast Socket を設定するには、Deep Learning VM を使用します。Deep Learning VM イメージには、GPU ドライバ、ML ソフトウェア、Fast Socket、gVNIC がプリインストールされています。

これらのイメージには次のものが含まれます。

  • tf-latest-gpu-debian-10
  • tf-latest-gpu-ubuntu-1804

V100 の例

たとえば、最大帯域幅が 100 Gbps で V100 GPU が接続された Debian 10 VM を作成し、Fast Socket で Deep Learning VM Image を使用する場合は、次のコマンドを実行します。

gcloud compute instances create VM_NAME \
    --project=PROJECT_ID \
    --zone=ZONE \
    --custom-cpu=96 \
    --custom-memory=624 \
    --image-project=deeplearning-platform-release \
    --image-family=tf-latest-gpu-debian-10 \
    --accelerator=type=nvidia-tesla-v100,count=8 \
    --maintenance-policy=TERMINATE \
    --metadata="install-nvidia-driver=True"  \
    --network-interface=nic-type=GVNIC \
    --boot-disk-size=200GB

A100 の例

たとえば、最大帯域幅が 100 Gbps で、8 個の A100 GPU が接続され、Fast Socket で Deep Learning VM Image を使用する Ubuntu 18.04 VM を作成する場合は、次のコマンドを実行します。

gcloud compute instances create VM_NAME \
    --project=PROJECT_ID \
    --zone=ZONE \
    --machine-type=a2-highgpu-8g \
    --maintenance-policy=TERMINATE --restart-on-failure \
    --image-family=tf-latest-gpu-ubuntu-1804 \
    --image-project=deeplearning-platform-release \
    --boot-disk-size=200GB \
    --network-interface=nic-type=GVNIC \
    --metadata="install-nvidia-driver=True,proxy-mode=project_editors" \
    --scopes=https://www.googleapis.com/auth/cloud-platform

次のように置き換えます。

  • VM_NAME: VM の名前。
  • PROJECT_ID: プロジェクト ID。
  • ZONE: VM のゾーン。このゾーンは、特定の GPU タイプをサポートしている必要があります。ゾーンの詳細については、GPU のリージョンとゾーンをご覧ください。

環境を設定したら、Fast Socket が有効であることを確認できます。

Compute Engine の公開イメージの使用

Fast Socket を設定するには、Compute Engine の公開イメージを使用できます。Compute Engine の公開イメージを使用するには、次の手順を行います。

  1. A100、T4、または V100 GPU がアタッチされた VM を作成します。GPU を接続した VM の作成をご覧ください。

  2. このイメージを使用して、A100、T4、または V100 GPU が接続された VM を作成します。詳細については、GPU が接続された VM を作成するをご覧ください。

  3. GPU ドライバをインストールします。詳細については、GPU ドライバのインストールをご覧ください。

  4. Fast Socket をインストールします。手順については、Fast Socket を手動でインストールするをご覧ください。

  5. Fast Socket が有効になっていることを確認します。手順については、Fast Socket が有効になっていることを確認するをご覧ください。

Fast Socket を手動でインストールする

Linux VM に Fast Socket をインストールする前に、NCCL をインストールする必要があります。詳細な手順については、NVIDIA NCCL のドキュメントをご覧ください。

CentOS / RHEL

CentOS または RHEL VM で Fast Socket をダウンロードしてインストールするには、次の手順を行います。

  1. パッケージ リポジトリを追加し、公開鍵をインポートします。

    sudo tee /etc/yum.repos.d/google-fast-socket.repo << EOM
    [google-fast-socket]
    name=Fast Socket Transport for NCCL
    baseurl=https://packages.cloud.google.com/yum/repos/google-fast-socket
    enabled=1
    gpgcheck=0
    repo_gpgcheck=0
    gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg
          https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
    EOM
    
  2. Fast Socket をインストールします。

    sudo yum install google-fast-socket
    
  3. Fast Socket が有効になっていることを確認します。

SLES

SLES VM に Fast Socket をダウンロードしてインストールするには、次の手順を行います。

  1. パッケージ リポジトリを追加します。

    sudo zypper addrepo https://packages.cloud.google.com/yum/repos/google-fast-socket google-fast-socket
    
  2. リポジトリキーを追加します。

    sudo rpm --import https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
    
  3. Fast Socket をインストールします。

    sudo zypper install google-fast-socket
    
  4. Fast Socket が有効になっていることを確認します。

Debian / Ubuntu

Debian または Ubuntu VM で Fast Socket をダウンロードしてインストールするには、次の手順を行います。

  1. パッケージ リポジトリを追加します。

    echo "deb https://packages.cloud.google.com/apt google-fast-socket main" | sudo tee /etc/apt/sources.list.d/google-fast-socket.list
    
  2. リポジトリキーを追加します。

    curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
    
  3. Fast Socket をインストールします。

    sudo apt update && sudo apt install google-fast-socket
    
  4. Fast Socket が有効になっていることを確認します。

Fast Socket が有効になっていることを確認する

VM で、次の手順を行います。

  1. NCCL ホーム ディレクトリを探します。

    sudo ldconfig -p | grep nccl

    たとえば、DLVM イメージの場合、次の出力が表示されます。

    libnccl.so.2 (libc6,x86-64) => /usr/local/nccl2/lib/libnccl.so.2
    libnccl.so (libc6,x86-64) => /usr/local/nccl2/lib/libnccl.so
    libnccl-net.so (libc6,x86-64) => /usr/local/nccl2/lib/libnccl-net.so

    この例では、NCCL ホーム ディレクトリが /usr/local/nccl2 になっています。

  2. NCCL が Fast Socket プラグインを読み込むことを確認します。確認するには、NCCL テスト パッケージをダウンロードする必要があります。テスト パッケージをダウンロードするには、次のコマンドを実行します。

    git clone https://github.com/NVIDIA/nccl-tests.git && \
    cd nccl-tests && make NCCL_HOME=NCCL_HOME_DIRECTORY

    NCCL_HOME_DIRECTORY は NCCL ホーム ディレクトリに置き換えます。

  3. nccl-tests ディレクトリから all_reduce_perf プロセスを実行します。

    NCCL_DEBUG=INFO build/all_reduce_perf

    Fast Socket が有効になっている場合、出力ログに FastSocket plugin initialized メッセージが表示されます。

    # nThread 1 nGpus 1 minBytes 33554432 maxBytes 33554432 step: 1048576(bytes) warmup iters: 5 iters: 20 validation: 1
    #
    # Using devices
    #   Rank  0 Pid  63324 on fast-socket-gpu device  0 [0x00] Tesla V100-SXM2-16GB
    .....
    fast-socket-gpu:63324:63324 [0] NCCL INFO NET/FastSocket : Flow placement enabled.
    fast-socket-gpu:63324:63324 [0] NCCL INFO NET/FastSocket : queue skip: 0
    fast-socket-gpu:63324:63324 [0] NCCL INFO NET/FastSocket : Using [0]ens12:10.240.0.24
    fast-socket-gpu:63324:63324 [0] NCCL INFO NET/FastSocket plugin initialized
    ......
    

次のステップ