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
Kluster ACK yang dikelola telah dibuat di Konsol Container Service for Kubernetes (ACK) dengan tipe instans diatur ke Elastic GPU Service.
Arena telah diinstal.
Komponen penjadwalan GPU yang sadar topologi telah diinstal.
Versi komponen sistem harus memenuhi persyaratan berikut:
Komponen
Versi
Kubernetes
1.18.8 dan lebih baru
Nvidia
418.87.01 dan lebih baru
Pustaka Komunikasi Kolektif NVIDIA (NCCL)
2.7+
Sistem operasi
CentOS 7.6
CentOS 7.7
Ubuntu 16.04
Ubuntu 18.04
Alibaba Cloud Linux 2
Alibaba Cloud Linux 3
GPU
V100
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=topologySetelah 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 --overwriteKirim pekerjaan
Kirim pekerjaan Message Passing Interface (MPI) dan atur --gputopology ke true.
arena submit --gputopology=true --gang ***Contoh 1: Latih VGG16
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
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"Jalankan perintah berikut untuk memeriksa status pekerjaan:
arena get pytorch-topo-4-vgg16 --type mpijobOutput 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.173Jalankan perintah berikut untuk mencetak log pekerjaan:
arena logs -f pytorch-topo-4-vgg16Output 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
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"Jalankan perintah berikut untuk memeriksa status pekerjaan:
arena get pytorch-4-vgg16 --type mpijobOutput 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.173Jalankan perintah berikut untuk mencetak log pekerjaan:
arena logs -f pytorch-4-vgg16Output 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
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"Jalankan perintah berikut untuk memeriksa status pekerjaan:
arena get pytorch-topo-4-resnet50 --type mpijobOutput 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.173Jalankan perintah berikut untuk mencetak log pekerjaan:
arena logs -f pytorch-topo-4-resnet50Output 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
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"Jalankan perintah berikut untuk memeriksa status pekerjaan:
arena get pytorch-4-resnet50 --type mpijobOutput 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.173Jalankan perintah berikut untuk mencetak log pekerjaan:
arena logs -f pytorch-4-resnet50Output 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.
Gambar tersebut menunjukkan bahwa setelah penjadwalan GPU yang sadar topologi diaktifkan, pekerjaan terdistribusi PyTorch dipercepat secara signifikan.
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.