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

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

最終更新日:Nov 14, 2024

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

ジョブの送信

Message Passing Interface (MPI) ジョブを送信し、-- gputopologytrueに設定します。

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

例1: VGG16のトレーニング

説明

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

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

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

    arena submit mpi \
      --name=pytorch-topo-4-vgg16 \
      --gpus=1 \
      --workers=4 \
      --gang \
      --gputopology=true \
      --image=registry.cn-hangzhou.aliyuncs.com/kubernetes-image-hub/pytorch-benchmark:torch1.6.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 /examples/pytorch_synthetic_benchmark.py --model=vgg16 --batch-size=64"
  2. 次のコマンドを実行して、ジョブのステータスを照会します。

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

    期待される出力:

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

    arena logs -f pytorch-topo-4-vgg16

    期待される出力:

    Model: vgg16
    Batch size: 64
    Number of GPUs: 4
    Running warmup...
    Running benchmark...
    Iter #0: 205.5 img/sec per GPU
    Iter #1: 205.2 img/sec per GPU
    Iter #2: 205.1 img/sec per GPU
    Iter #3: 205.5 img/sec per GPU
    Iter #4: 205.1 img/sec per GPU
    Iter #5: 205.1 img/sec per GPU
    Iter #6: 205.3 img/sec per GPU
    Iter #7: 204.3 img/sec per GPU
    Iter #8: 205.0 img/sec per GPU
    Iter #9: 204.9 img/sec per GPU
    Img/sec per GPU: 205.1 +-0.6
    Total img/sec on 4 GPU(s): 820.5 +-2.5

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

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

    arena submit mpi \
      --name=pytorch-4-vgg16 \
      --gpus=1 \
      --workers=4 \
      --image=registry.cn-hangzhou.aliyuncs.com/kubernetes-image-hub/pytorch-benchmark:torch1.6.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 /examples/pytorch_synthetic_benchmark.py --model=vgg16 --batch-size=64"
  2. 次のコマンドを実行して、ジョブのステータスを照会します。

    arena get pytorch-4-vgg16 --type mpijob

    期待される出力:

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

    arena logs -f pytorch-4-vgg16

    期待される出力:

    Model: vgg16
    Batch size: 64
    Number of GPUs: 4
    Running warmup...
    Running benchmark...
    Iter #0: 113.1 img/sec per GPU
    Iter #1: 109.5 img/sec per GPU
    Iter #2: 106.5 img/sec per GPU
    Iter #3: 108.5 img/sec per GPU
    Iter #4: 108.1 img/sec per GPU
    Iter #5: 111.2 img/sec per GPU
    Iter #6: 110.7 img/sec per GPU
    Iter #7: 109.8 img/sec per GPU
    Iter #8: 102.8 img/sec per GPU
    Iter #9: 107.9 img/sec per GPU
    Img/sec per GPU: 108.8 +-5.3
    Total img/sec on 4 GPU(s): 435.2 +-21.1

例2: ResNet50のトレーニング

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

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

    arena submit mpi \
      --name=pytorch-topo-4-resnet50 \
      --gpus=1 \
      --workers=4 \
      --gang \
      --gputopology=true \
      --image=registry.cn-hangzhou.aliyuncs.com/kubernetes-image-hub/pytorch-benchmark:torch1.6.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 /examples/pytorch_synthetic_benchmark.py --model=resnet50 --batch-size=64"
  2. 次のコマンドを実行して、ジョブのステータスを照会します。

    arena get pytorch-topo-4-resnet50 --type mpijob

    期待される出力:

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

    arena logs -f pytorch-topo-4-resnet50

    期待される出力:

    Model: resnet50
    Batch size: 64
    Number of GPUs: 4
    Running warmup...
    Running benchmark...
    Iter #0: 331.0 img/sec per GPU
    Iter #1: 330.6 img/sec per GPU
    Iter #2: 330.9 img/sec per GPU
    Iter #3: 330.4 img/sec per GPU
    Iter #4: 330.7 img/sec per GPU
    Iter #5: 330.8 img/sec per GPU
    Iter #6: 329.9 img/sec per GPU
    Iter #7: 330.5 img/sec per GPU
    Iter #8: 330.4 img/sec per GPU
    Iter #9: 329.7 img/sec per GPU
    Img/sec per GPU: 330.5 +-0.8
    Total img/sec on 4 GPU(s): 1321.9 +-3.2

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

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

    arena submit mpi \
      --name=pytorch-4-resnet50 \
      --gpus=1 \
      --workers=4 \
      --image=registry.cn-hangzhou.aliyuncs.com/kubernetes-image-hub/pytorch-benchmark:torch1.6.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 /examples/pytorch_synthetic_benchmark.py --model=resnet50 --batch-size=64"
  2. 次のコマンドを実行して、ジョブのステータスを照会します。

    arena get pytorch-4-resnet50 --type mpijob

    期待される出力:

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

    arena logs -f pytorch-4-resnet50

    期待される出力:

    Model: resnet50
    Batch size: 64
    Number of GPUs: 4
    Running warmup...
    Running benchmark...
    Iter #0: 313.1 img/sec per GPU
    Iter #1: 312.8 img/sec per GPU
    Iter #2: 313.0 img/sec per GPU
    Iter #3: 312.2 img/sec per GPU
    Iter #4: 313.7 img/sec per GPU
    Iter #5: 313.2 img/sec per GPU
    Iter #6: 313.6 img/sec per GPU
    Iter #7: 313.0 img/sec per GPU
    Iter #8: 311.3 img/sec per GPU
    Iter #9: 313.6 img/sec per GPU
    Img/sec per GPU: 313.0 +-1.3
    Total img/sec on 4 GPU(s): 1251.8 +-5.3

性能比較

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

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

重要

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