ACK基於Scheduling Framework機制,實現GPU拓撲感知調度,即在節點的GPU組合中選擇具有最優訓練速度的組合。本文介紹如何使用GPU拓撲感知調度來提升Tensorflow分布式訓練的訓練速度。
前提條件
已建立ACK Pro叢集,且叢集的執行個體規格類型選擇為GPU雲端服務器。更多資訊,請參見建立Kubernetes託管版叢集。
已安裝Arena。
系統組件版本滿足以下要求。
組件
版本要求
Kubernetes
1.18.8及以上版本
Nvidia
418.87.01及以上版本
訓練架構NCCL版本
2.7+
作業系統
CentOS 7.6
CentOS 7.7
Ubuntu 16.04
Ubuntu 18.04
Alibaba Cloud Linux 2
Alibaba Cloud Linux 3
顯卡
V100
注意事項
僅支援MPI作業的分布式訓練。
只有當提交作業的所有Pod對資源請求都滿足條件時,才能建立Pod並啟動作業,否則請求會處於資源等待狀態。
操作步驟
節點配置
執行以下命令,設定節點Label,顯式啟用節點GPU拓撲感知調度。
kubectl label node <Your Node Name> ack.node.gpu.schedule=topology
當節點啟用GPU拓撲感知調度後,不再支援普通GPU資源調度。可執行以下命令更改Label,恢複普通GPU資源調度功能。
kubectl label node <Your Node Name> ack.node.gpu.schedule=default --overwrite
提交作業
提交MPI作業,並設定--gputopology為true
。
arena submit --gputopology=true --gang ***
樣本一:訓練Vgg16
本樣本測試叢集有2台8卡V100機器。
使用GPU拓撲感知調度訓練Vgg16
執行以下命令,向叢集提交作業。
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"
執行以下命令,查看當前作業運行情況。
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
執行以下命令,查看當前日誌資訊。
arena logs -f tensorflow-topo-4-vgg16
預期輸出:
total images/sec: 991.92
使用普通GPU調度訓練Vgg16
執行以下命令,向叢集提交作業。
arena submit mpi \ --name=tensorflow-4-vgg16 \ --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=vgg16 --batch_size=64 --variable_update=horovod"
執行以下命令,查看當前作業運行情況。
arena get tensorflow-4-vgg16 --type mpijob
預期輸出:
Name: tensorflow-4-vgg16 Status: RUNNING Namespace: default Priority: N/A Trainer: MPIJOB Duration: 9s Instances: NAME STATUS AGE IS_CHIEF GPU(Requested) NODE ---- ------ --- -------- -------------- ---- tensorflow-4-vgg16-launcher-xc28k Running 9s true 0 cn-shanghai.192.168.16.172 tensorflow-4-vgg16-worker-0 Running 9s false 1 cn-shanghai.192.168.16.172 tensorflow-4-vgg16-worker-1 Running 9s false 1 cn-shanghai.192.168.16.173 tensorflow-4-vgg16-worker-2 Running 9s false 1 cn-shanghai.192.168.16.172 tensorflow-4-vgg16-worker-3 Running 9s false 1 cn-shanghai.192.168.16.173
執行以下命令,查看當前日誌資訊。
arena logs -f tensorflow-4-vgg16
預期輸出:
total images/sec: 200.47
樣本二:訓練Resnet50
使用GPU拓撲感知調度訓練Resnet50
執行以下命令,向叢集提交作業。
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"
執行以下命令,查看當前作業運行情況。
arena get tensorflow-topo-4-resnet50 --type mpijob
預期輸出:
Name: tensorflow-topo-4-resnet50 Status: RUNNING Namespace: default Priority: N/A Trainer: MPIJOB Duration: 8s Instances: NAME STATUS AGE IS_CHIEF GPU(Requested) NODE ---- ------ --- -------- -------------- ---- tensorflow-topo-4-resnet50-launcher-7ln8j Running 8s true 0 cn-shanghai.192.168.16.172 tensorflow-topo-4-resnet50-worker-0 Running 8s false 1 cn-shanghai.192.168.16.173 tensorflow-topo-4-resnet50-worker-1 Running 8s false 1 cn-shanghai.192.168.16.173 tensorflow-topo-4-resnet50-worker-2 Running 8s false 1 cn-shanghai.192.168.16.173 tensorflow-topo-4-resnet50-worker-3 Running 8s false 1 cn-shanghai.192.168.16.173
執行以下命令,查看當前日誌資訊。
arena logs -f tensorflow-topo-4-resnet50
預期輸出:
total images/sec: 1471.55
使用普通GPU調度訓練Resnet50
執行以下命令,向叢集提交作業。
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"
執行以下命令,查看當前作業運行情況。
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
執行以下命令,查看當前日誌資訊。
arena logs -f tensorflow-4-resnet50
預期輸出:
total images/sec: 745.38
效能對比
基於以上4個測試案例效能對比結果如下:
基於對比圖,可知經過GPU拓撲感知調度後,Tensorflow分布式訓練的效果有了很大的提升。
本文提供的效能資料僅為理論值,GPU拓撲感知調度提升結果與您使用的模型以及叢集的環境有一定關係,實際資料以您的作業環境為準。您可以參考上述使用樣本,評測自己的模型。