全部产品
Search
文档中心

Container Service for Kubernetes:Bekerja dengan penjadwalan GPU yang sadar topologi (edisi PyTorch)

更新时间:Jul 02, 2025

Container Service for Kubernetes (ACK) mendukung penjadwalan GPU yang sadar topologi berdasarkan kerangka penjadwalan. Fitur ini memilih kombinasi GPU dari node yang dipercepat GPU untuk mencapai percepatan GPU optimal pada pekerjaan pelatihan. Topik ini menjelaskan cara menggunakan penjadwalan GPU yang sadar topologi untuk mencapai percepatan GPU optimal pada pekerjaan terdistribusi PyTorch.

Prasyarat

Catatan penggunaan

  • Penjadwalan GPU yang sadar topologi hanya berlaku untuk pekerjaan Message Passing Interface (MPI) yang dilatih menggunakan kerangka kerja terdistribusi.

  • Sumber daya yang diminta oleh pod harus memenuhi persyaratan tertentu sebelum pod dapat dibuat untuk mengirimkan dan menjalankan pekerjaan. Jika tidak, permintaan akan tetap menunggu sumber daya.

Prosedur

Konfigurasikan node

Jalankan perintah berikut untuk menetapkan label node dan secara eksplisit mengaktifkan penjadwalan GPU yang sadar topologi untuk node:

kubectl label node <Nama Node Anda> ack.node.gpu.schedule=topology
Catatan

Setelah penjadwalan GPU yang sadar topologi diaktifkan untuk node, penjadwalan GPU reguler tidak dapat diaktifkan. Anda dapat menjalankan perintah berikut untuk mengubah label dan mengaktifkan penjadwalan GPU reguler:

kubectl label node <Nama Node Anda> ack.node.gpu.schedule=default --overwrite

Kirim pekerjaan

Kirim pekerjaan Message Passing Interface (MPI) dan atur --gputopology ke true.

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

Contoh 1: Latih VGG16

Catatan

Kluster yang digunakan dalam contoh ini terdiri dari dua node. Setiap node menyediakan delapan GPU V100.

Gunakan penjadwalan GPU yang sadar topologi untuk melatih VGG16

  1. Jalankan perintah berikut untuk mengirim pekerjaan ke kluster:

    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. Jalankan perintah berikut untuk memeriksa status pekerjaan:

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

    Output yang Diharapkan:

    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. Jalankan perintah berikut untuk mencetak log pekerjaan:

    arena logs -f pytorch-topo-4-vgg16

    Output yang Diharapkan:

    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

Gunakan penjadwalan GPU reguler untuk melatih VGG16

  1. Jalankan perintah berikut untuk mengirim pekerjaan ke kluster:

    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. Jalankan perintah berikut untuk memeriksa status pekerjaan:

    arena get pytorch-4-vgg16 --type mpijob

    Output yang Diharapkan:

    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. Jalankan perintah berikut untuk mencetak log pekerjaan:

    arena logs -f pytorch-4-vgg16

    Output yang Diharapkan:

    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

Contoh 2: Latih ResNet50

Gunakan penjadwalan GPU yang sadar topologi untuk melatih ResNet50

  1. Jalankan perintah berikut untuk mengirim pekerjaan ke kluster:

    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. Jalankan perintah berikut untuk memeriksa status pekerjaan:

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

    Output yang Diharapkan:

    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. Jalankan perintah berikut untuk mencetak log pekerjaan:

    arena logs -f pytorch-topo-4-resnet50

    Output yang Diharapkan:

    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

Gunakan penjadwalan GPU reguler untuk melatih ResNet50

  1. Jalankan perintah berikut untuk mengirim pekerjaan ke kluster:

    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. Jalankan perintah berikut untuk memeriksa status pekerjaan:

    arena get pytorch-4-resnet50 --type mpijob

    Output yang Diharapkan:

    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. Jalankan perintah berikut untuk mencetak log pekerjaan:

    arena logs -f pytorch-4-resnet50

    Output yang Diharapkan:

    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

Perbandingan performa

Gambar berikut menunjukkan perbandingan performa antara penjadwalan GPU yang sadar topologi dan penjadwalan GPU reguler berdasarkan contoh-contoh sebelumnya.gpu32

Gambar tersebut menunjukkan bahwa setelah penjadwalan GPU yang sadar topologi diaktifkan, pekerjaan terdistribusi PyTorch dipercepat secara signifikan.

Penting

Nilai performa dalam topik ini adalah nilai teoretis. Performa penjadwalan GPU yang sadar topologi bervariasi berdasarkan model dan lingkungan kluster Anda. Statistik performa aktual yang sebenarnya harus diutamakan. Anda dapat mengulangi langkah-langkah sebelumnya untuk mengevaluasi model Anda.