すべてのプロダクト
Search
ドキュメントセンター

Container Service for Kubernetes:トポロジ対応のGPUスケジューリングの操作 (TensorFlowエディション)

最終更新日:Dec 13, 2024

Container Service for Kubernetes (ACK) は、スケジューリングフレームワークに基づくトポロジ対応GPUスケジューリングをサポートしています。 この機能は、GPUアクセラレーションノードからGPUの組み合わせを選択して、トレーニングジョブに最適なGPUアクセラレーションを実現します。 このトピックでは、トポロジ対応のGPUスケジューリングを使用して、TensorFlow分散ジョブに最適なGPUアクセラレーションを実現する方法について説明します。

前提条件

  • Container Service for Kubernetes (ACK) Proクラスターが作成され、クラスターのインスタンスタイプがElastic GPU Serviceに設定されます。 詳細については、「ACK管理クラスターの作成」をご参照ください。

  • Arenaがインストールされています。

  • トポロジ対応GPUスケジューリングコンポーネントがインストールされています

  • システムコンポーネントのバージョンは、次の要件を満たしています。

    コンポーネント

    バージョン

    Kubernetes

    1.18.8以降

    Nvidia

    418.87.01以降

    NVIDIA Collective Communications Library (NCCL)

    2.7 +

    オペレーティングシステム

    • CentOS 7.6

    • CentOS 7.7

    • Ubuntu 16.04

    • Ubuntu 18.04

    • Alibaba Cloud Linux 2

    • Alibaba Cloud Linux 3

    GPU

    V100

使用上の注意

  • トポロジ認識GPUスケジューリングは、分散フレームワークを使用してトレーニングされたMessage Passing Interface (MPI) ジョブにのみ適用できます。

  • ポッドによって要求されるリソースは、ジョブを送信して実行するためにポッドを作成する前に、特定の要件を満たす必要があります。 それ以外の場合、リクエストはリソースに対して保留のままです。

手順

ノードの設定

次のコマンドを実行してノードラベルを設定し、ノードのトポロジ認識GPUスケジューリングを明示的に有効にします。

kubectl label node <Your Node Name> ack.node.gpu.schedule=topology
説明

ノードでトポロジ対応のGPUスケジューリングを有効にすると、通常のGPUスケジューリングを有効にすることはできません。 次のコマンドを実行して、ラベルを変更し、通常のGPUスケジューリングを有効にします。

kubectl label node <Your Node Name> ack.node.gpu.schedule=default --overwrite

ジョブの送信

MPIジョブを提出し、-- gputopologytrueに設定します。

arena submit --gputopology=true --gang ***

例1: VGG16のトレーニング

説明

この例で使用されるクラスタは、2つのノードからなる。 各ノードは8つのV100 GPUを提供する。

トポロジ認識GPUスケジューリングを使用してVGG16をトレーニングする

  1. 次のコマンドを実行して、ジョブをクラスターに送信します。

    arena submit mpi \
      --name=tensorflow-topo-4-vgg16 \
      --gpus=1 \
      --workers=4 \
      --gang \
      --gputopology=true \
      --image=registry.cn-hangzhou.aliyuncs.com/kubernetes-image-hub/tensorflow-benchmark:tf2.3.0-py3.7-cuda10.1 \
      "mpirun --allow-run-as-root -np "4" -bind-to none -map-by slot -x NCCL_DEBUG=INFO -x NCCL_SOCKET_IFNAME=eth0 -x LD_LIBRARY_PATH -x PATH --mca pml ob1 --mca btl_tcp_if_include eth0 --mca oob_tcp_if_include eth0 --mca orte_keep_fqdn_hostnames t --mca btl ^openib python /tensorflow/benchmarks/scripts/tf_cnn_benchmarks/tf_cnn_benchmarks.py --model=vgg16 --batch_size=64 --variable_update=horovod"
  2. 次のコマンドを実行して、ジョブのステータスを照会します。

    arena get tensorflow-topo-4-vgg16 --type mpijob

    期待される出力:

    Name:      tensorflow-topo-4-vgg16
    Status:    RUNNINGNamespace: default
    Priority:  N/A
    Trainer:   MPIJOB
    Duration:  2m
    
    Instances:
      NAME                                    STATUS   AGE  IS_CHIEF  GPU(Requested)  NODE
      ----                                    ------   ---  --------  --------------  ----
      tensorflow-topo-4-vgg16-launcher-lmhjl  Running  2m   true      0               cn-shanghai.192.168.16.172
      tensorflow-topo-4-vgg16-worker-0        Running  2m   false     1               cn-shanghai.192.168.16.173
      tensorflow-topo-4-vgg16-worker-1        Running  2m   false     1               cn-shanghai.192.168.16.173
      tensorflow-topo-4-vgg16-worker-2        Running  2m   false     1               cn-shanghai.192.168.16.173
      tensorflow-topo-4-vgg16-worker-3        Running  2m   false     1               cn-shanghai.192.168.16.173
  3. 次のコマンドを実行して、ジョブログを印刷します。

    arena logs -f tensorflow-topo-4-vgg16

    期待される出力:

    total images/sec: 991.92

通常のGPUスケジューリングを使用してVGG16をトレーニングする

  1. 次のコマンドを実行して、ジョブをクラスターに送信します。

    アリーナ送信mpi \
      -- name=tensorflow-4-vgg16 \
      -- gpus=1 \
      -- workers=4 \
      -- imag e=registry.cn-hangzhou.aliyuncs.com/kubernetes-image-hub/tensorflow-benchmark:tf2.3.0-py3.7-cuda10.1 \
      "mpirun -- allow-run-as-root-npy" 4 " -bind-to none -map-by slot -x NCCL_benchseg16 DEBUG=INFO -x NCCL_SOCKET_if_IFNAME=eth0 -x LD_LIBRARY_PATH-m-- mca pta_neb_eptemarks /mot_ethnモデル1-mca-mot_nad_m_n// mobdname 64 -- variable_update=horovod" 
  2. 次のコマンドを実行して、ジョブのステータスを照会します。

    アリーナ取得tensorflow-4-vgg16-タイプmpijob

    期待される出力:

    名: tensorflow-4-vgg16
    ステータス: RUNNING
    名前空間: デフォルト
    優先順位: N/A
    トレーナー: MPIJOB
    期間: 9s
    
    インスタンス:
      名前ステータス年齢IS_CHIEF GPU (要求された) ノード
      ----                               ------   ---  --------  --------------  ----
      tensorflow-4-vgg16-launcher-xc28kランニング9s true 0 cn-shanghai.192.168.16.172
      tensorflow-4-vgg16-worker-0実行9s false 1 cn-shanghai.192.168.16.172
      tensorflow-4-vgg16-worker-1実行9s false 1 cn-shanghai.192.168.16.173
      tensorflow-4-vgg16-worker-2実行9s false 1 cn-shanghai.192.168.16.172
      tensorflow-4-vgg16-worker-3実行9s false 1 cn-shanghai.192.168.16.173 
  3. 次のコマンドを実行して、ジョブログを印刷します。

    アリーナログ-f tensorflow-4-vgg16

    期待される出力:

    合計画像 /秒: 200.47

例2: ResNet50のトレーニング

トポロジ対応GPUスケジューリングを使用したResNet50のトレーニング

  1. 次のコマンドを実行して、ジョブをクラスターに送信します。

    arena submit mpi \
      --name=tensorflow-topo-4-resnet50 \
      --gpus=1 \
      --workers=4 \
      --gang \
      --gputopology=true \
      --image=registry.cn-hangzhou.aliyuncs.com/kubernetes-image-hub/tensorflow-benchmark:tf2.3.0-py3.7-cuda10.1 \
      "mpirun --allow-run-as-root -np "4" -bind-to none -map-by slot -x NCCL_DEBUG=INFO -x NCCL_SOCKET_IFNAME=eth0 -x LD_LIBRARY_PATH -x PATH --mca pml ob1 --mca btl_tcp_if_include eth0 --mca oob_tcp_if_include eth0 --mca orte_keep_fqdn_hostnames t --mca btl ^openib python /tensorflow/benchmarks/scripts/tf_cnn_benchmarks/tf_cnn_benchmarks.py --model=resnet50 --batch_size=64  --variable_update=horovod"
  2. 次のコマンドを実行して、ジョブのステータスを照会します。

    アリーナ取得tensorflow-topo-4-resnet50-タイプmpijob

    期待される出力:

    名: tensorflow-topo-4-resnet50
    ステータス: RUNNING
    名前空間: デフォルト
    優先順位: N/A
    トレーナー: MPIJOB
    期間: 8s
    
    インスタンス:
      名前ステータス年齢IS_CHIEF GPU (要求された) ノード
      ----                                       ------   ---  --------  --------------  ----
      tensorflow-topo-4-resnet50-launcher-7ln8jランニング8s true 0 cn-shanghai.192.168.16.172
      tensorflow-topo-4-resnet50-worker-0ランニング8s false 1 cn-shanghai.192.168.16.173
      tensorflow-topo-4-resnet50-worker-1ランニング8s false 1 cn-shanghai.192.168.16.173
      tensorflow-topo-4-resnet50-worker-2ランニング8s false 1 cn-shanghai.192.168.16.173
      tensorflow-topo-4-resnet50-worker-3実行8s false 1 cn-shanghai.192.168.16.173 
  3. 次のコマンドを実行して、ジョブログを印刷します。

    アリーナログ-f tensorflow-topo-4-resnet50

    期待される出力:

    合計画像 /秒: 1471.55

通常のGPUスケジューリングを使用してResNet50をトレーニングする

  1. 次のコマンドを実行して、ジョブをクラスターに送信します。

    arena submit mpi \
      --name=tensorflow-4-resnet50 \
      --gpus=1 \
      --workers=4 \
      --image=registry.cn-hangzhou.aliyuncs.com/kubernetes-image-hub/tensorflow-benchmark:tf2.3.0-py3.7-cuda10.1 \
      "mpirun --allow-run-as-root -np "4" -bind-to none -map-by slot -x NCCL_DEBUG=INFO -x NCCL_SOCKET_IFNAME=eth0 -x LD_LIBRARY_PATH -x PATH --mca pml ob1 --mca btl_tcp_if_include eth0 --mca oob_tcp_if_include eth0 --mca orte_keep_fqdn_hostnames t --mca btl ^openib python /tensorflow/benchmarks/scripts/tf_cnn_benchmarks/tf_cnn_benchmarks.py --model=resnet50 --batch_size=64  --variable_update=horovod"
  2. 次のコマンドを実行して、ジョブのステータスを照会します。

    arena get tensorflow-4-resnet50 --type mpijob

    期待される出力:

    Name:      tensorflow-4-resnet50
    Status:    RUNNING
    Namespace: default
    Priority:  N/A
    Trainer:   MPIJOB
    Duration:  9s
    
    Instances:
      NAME                                  STATUS   AGE  IS_CHIEF  GPU(Requested)  NODE
      ----                                  ------   ---  --------  --------------  ----
      tensorflow-4-resnet50-launcher-q24hv  Running  9s   true      0               cn-shanghai.192.168.16.172
      tensorflow-4-resnet50-worker-0        Running  9s   false     1               cn-shanghai.192.168.16.172
      tensorflow-4-resnet50-worker-1        Running  9s   false     1               cn-shanghai.192.168.16.173
      tensorflow-4-resnet50-worker-2        Running  9s   false     1               cn-shanghai.192.168.16.172
      tensorflow-4-resnet50-worker-3        Running  9s   false     1               cn-shanghai.192.168.16.173
  3. 次のコマンドを実行して、ジョブログを印刷します。

    arena logs -f tensorflow-4-resnet50

    期待される出力:

    total images/sec: 745.38

性能比較

次の図は、上記の例に基づくトポロジ対応のGPUスケジューリングと通常のGPUスケジューリングのパフォーマンスの違いを示しています。GPU31

この図は、トポロジ対応のGPUスケジューリングを有効にすると、TensorFlow分散ジョブが高速化されることを示しています。

重要

このトピックのパフォーマンス値は理論値です。 トポロジ対応のGPUスケジューリングのパフォーマンスは、モデルとクラスター環境によって異なります。 実際のパフォーマンス統計が優先されます。 上記の手順を繰り返して、モデルを評価できます。