高いネットワーク帯域幅を使用する


100 Gbps 以上の高いネットワーク帯域幅を使用すると、GPU VM で実行する分散ワークロードのパフォーマンスを向上させることができます。

NVIDIA T4 または V100 GPU がアタッチされた N1 汎用 VM の一部の VM 構成と、一部のアクセラレータ最適化マシンタイプは、高いネットワーク帯域幅に対応しています。

これらの高いネットワーク帯域幅レートに対応している構成またはマシンタイプを確認するには、ネットワーク帯域幅と GPU をご覧ください。

Compute Engine のネットワーク帯域幅に関する一般的な情報については、ネットワーク帯域幅をご覧ください。

概要

各 GPU VM で利用可能な高いネットワーク帯域幅を使用するには、次の推奨手順に沿って操作します。

  1. Google Virtual NIC(gVNIC)をサポートする OS イメージを使用して、GPU VM を作成します。A3 VM の場合は、Container-Optimized OS イメージの使用をおすすめします。
  2. 省略可: Fast Socket をインストールします。Fast Socket を使用すると、複数の TCP 接続間の競合が軽減され、100 Gbps 以上のネットワークでの NCCL のパフォーマンスが向上します。一部の Deep Learning VM Image(DLVM)には Fast Socket がプリインストールされています。

Deep Learning VM Image を使用する

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

Fast Socket を使用する場合、tf-latest-gpu-debian-10tf-latest-gpu-ubuntu-1804 などの DLVM イメージを選択できます。

高いネットワーク帯域幅を使用する VM を作成する

ネットワーク帯域幅が高い場合、Google Virtual NIC(gVNIC)を有効にすることが推奨されます。詳細については、Google Virtual NIC の使用をご覧ください。

A3 VM では、gVNIC バージョン 1.4.0rc3 以降が必要です。このドライバ バージョンは Container-Optimized OS で使用できます。他のすべてのオペレーティング システムでは、gVNIC バージョン 1.4.0rc3 以降をインストールする必要があります。

GPU がアタッチされた、高いネットワーク帯域幅の VM を作成するには、次の操作を行います。

  1. 次の作業を行います。

    • T4 または V100 GPU がアタッチされた N1 GPU VM の場合: CPU、GPU、メモリ構成の最大帯域幅を確認する
    • A3、A2、G2 アクセラレータ最適化 VM の場合: マシンタイプの最大帯域幅を確認する

    詳細については、利用可能な最大帯域幅をご覧ください。

  2. GPU VM を作成します。次の例は、V100 VM がアタッチされた A3、A2、N1 を作成する方法を示しています。

    これらの例では、Google Cloud CLI を使用して VM を作成します。ただし、Google Cloud コンソールまたは Compute Engine API を使用して、これらの VM を作成することもできます。GPU VM の作成について詳しくは、GPU が接続された VM を作成するをご覧ください。

    A2(A100)

    たとえば、最大帯域幅が 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 のリージョンとゾーンをご覧ください。

    A3(H100)

    ネットワーク パフォーマンスが向上した A3 VM の設定方法について詳しくは、GPUDirect-TCPX を使用してネットワーク パフォーマンスを改善するをご覧ください。

    N1(V100)

    たとえば、最大帯域幅が 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
    
  3. GPU 対応の Deep Learning VM Image または Container-Optimized OS を使用していない場合は、GPU ドライバをインストールします。詳細については、GPU ドライバのインストールをご覧ください。

  4. 省略可。VM で、Fast Socket をインストールします。

  5. VM を設定すると、ネットワーク帯域幅を確認できます。

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 環境を設定するには、Fast Socket がプリインストールされている Deep Learning VM Image を使用するか、Linux VM に 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
    ......
    

ネットワーク帯域幅を確認する

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

帯域幅速度を確認するには、GPU がアタッチされていて、テストしている帯域幅速度に対応している VM が少なくとも 2 つ必要です。

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 または Google Cloud コンソールで、ネットワークやファイアウォール設定の調整が必要になることがあります。

100 Gbps または 1,000 Gbps(A3)の最大帯域幅を使用する場合は、次の点に留意してください。

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

    TCP では 100 Gbps または 1,000 Gbps のネットワーク速度を実現できます。UDP などの他のプロトコルはより遅くなります。

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

  • VM インスタンス間で最大帯域幅を実現するには、複数の TCP ストリームを使用する必要があります。ストリームの数は 4~16 個が推奨されます。フローが 16 個になると、スループットが最大化されることがよくあります。アプリケーションとソフトウェア スタックによっては、複数のストリームを設定するために、アプリケーションまたはコードの設定の調整が必要になる場合があります。

次のステップ