執行同步分散式 AI 工作負載
若要在 Kubernetes 叢集中執行同步多節點 AI 和 ML 作業,請在部署跳轉主機上執行下列任務。此過程使您能夠利用儲存在NetApp磁碟區上的數據,並使用比單一工作節點所能提供的更多的 GPU。請參考下圖以了解同步分散式 AI 作業的描述。
|
與非同步分散式作業相比,同步分散式作業可以幫助提高效能和訓練準確性。關於同步作業與非同步作業的優缺點的討論超出了本文檔的範圍。 |
-
以下範例指令顯示如何建立一個工作器,該工作器參與本節範例中在單一節點上執行的相同 TensorFlow 基準測試作業的同步分散式執行"執行單節點 AI 工作負載"。在這個特定的例子中,只部署了一個工作器,因為作業是在兩個工作器節點上執行的。
此範例工作器部署請求八個 GPU,因此可以在具有八個或更多 GPU 的單一 GPU 工作器節點上執行。如果您的 GPU 工作節點具有超過 8 個 GPU,為了最大限度地提高效能,您可能需要將此數字增加到等於您的工作節點所具有的 GPU 數量。有關 Kubernetes 部署的更多信息,請參閱 "Kubernetes 官方文檔"。
在此範例中建立了 Kubernetes 部署,因為這個特定的容器化工作程式永遠無法自行完成。因此,使用 Kubernetes 作業建構來部署它是沒有意義的。如果您的工作者被設計或編寫為自行完成,那麼使用作業建構來部署您的工作者可能是有意義的。
此範例部署規範中指定的 pod 被賦予
hostNetwork`的價值 `true
。此值表示 pod 使用主機工作節點的網路堆疊,而不是 Kubernetes 通常為每個 pod 建立的虛擬網路堆疊。在這種情況下使用此註釋,因為特定的工作負載依賴 Open MPI、NCCL 和 Horovod 以同步分散式方式執行工作負載。因此,它需要存取主機網路堆疊。有關 Open MPI、NCCL 和 Horovod 的討論超出了本文檔的範圍。不管這是否 `hostNetwork: true`註釋是否必要取決於您正在執行的特定工作負載的要求。有關 `hostNetwork`字段,請參閱 "Kubernetes 官方文檔"。$ cat << EOF > ./netapp-tensorflow-multi-imagenet-worker.yaml apiVersion: apps/v1 kind: Deployment metadata: name: netapp-tensorflow-multi-imagenet-worker spec: replicas: 1 selector: matchLabels: app: netapp-tensorflow-multi-imagenet-worker template: metadata: labels: app: netapp-tensorflow-multi-imagenet-worker spec: hostNetwork: true volumes: - name: dshm emptyDir: medium: Memory - name: testdata-iface1 persistentVolumeClaim: claimName: pb-fg-all-iface1 - name: testdata-iface2 persistentVolumeClaim: claimName: pb-fg-all-iface2 - name: results persistentVolumeClaim: claimName: tensorflow-results containers: - name: netapp-tensorflow-py2 image: netapp/tensorflow-py2:19.03.0 command: ["bash", "/netapp/scripts/start-slave-multi.sh", "22122"] resources: limits: nvidia.com/gpu: 8 volumeMounts: - mountPath: /dev/shm name: dshm - mountPath: /mnt/mount_0 name: testdata-iface1 - mountPath: /mnt/mount_1 name: testdata-iface2 - mountPath: /tmp name: results securityContext: privileged: true EOF $ kubectl create -f ./netapp-tensorflow-multi-imagenet-worker.yaml deployment.apps/netapp-tensorflow-multi-imagenet-worker created $ kubectl get deployments NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE netapp-tensorflow-multi-imagenet-worker 1 1 1 1 4s
-
確認您在步驟 1 中建立的工作程序部署已成功啟動。以下範例命令確認已為部署建立了一個工作程序 pod(如部署定義所示),並且該 pod 目前正在其中一個 GPU 工作程序節點上執行。
$ kubectl get pods -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE netapp-tensorflow-multi-imagenet-worker-654fc7f486-v6725 1/1 Running 0 60s 10.61.218.154 10.61.218.154 <none> $ kubectl logs netapp-tensorflow-multi-imagenet-worker-654fc7f486-v6725 22122
-
為主伺服器建立一個 Kubernetes 作業,該主伺服器啟動、參與並追蹤同步多節點作業的執行。以下範例指令建立一個主伺服器,該主伺服器啟動、參與並追蹤在本節範例中在單一節點上執行的相同 TensorFlow 基準測試作業的同步分散式執行"執行單節點 AI 工作負載"。
此範例主作業請求八個 GPU,因此可以在具有八個或更多 GPU 的單一 GPU 工作節點上執行。如果您的 GPU 工作節點具有超過 8 個 GPU,為了最大限度地提高效能,您可能需要將此數字增加到等於您的工作節點所具有的 GPU 數量。
此範例作業定義中指定的主 Pod 被賦予 `hostNetwork`的價值 `true`就像工作艙被賦予了 `hostNetwork`的價值 `true`在步驟 1 中。有關為什麼需要此值的詳細信息,請參閱步驟 1。
$ cat << EOF > ./netapp-tensorflow-multi-imagenet-master.yaml apiVersion: batch/v1 kind: Job metadata: name: netapp-tensorflow-multi-imagenet-master spec: backoffLimit: 5 template: spec: hostNetwork: true volumes: - name: dshm emptyDir: medium: Memory - name: testdata-iface1 persistentVolumeClaim: claimName: pb-fg-all-iface1 - name: testdata-iface2 persistentVolumeClaim: claimName: pb-fg-all-iface2 - name: results persistentVolumeClaim: claimName: tensorflow-results containers: - name: netapp-tensorflow-py2 image: netapp/tensorflow-py2:19.03.0 command: ["python", "/netapp/scripts/run.py", "--dataset_dir=/mnt/mount_0/dataset/imagenet", "--port=22122", "--num_devices=16", "--dgx_version=dgx1", "--nodes=10.61.218.152,10.61.218.154"] resources: limits: nvidia.com/gpu: 8 volumeMounts: - mountPath: /dev/shm name: dshm - mountPath: /mnt/mount_0 name: testdata-iface1 - mountPath: /mnt/mount_1 name: testdata-iface2 - mountPath: /tmp name: results securityContext: privileged: true restartPolicy: Never EOF $ kubectl create -f ./netapp-tensorflow-multi-imagenet-master.yaml job.batch/netapp-tensorflow-multi-imagenet-master created $ kubectl get jobs NAME COMPLETIONS DURATION AGE netapp-tensorflow-multi-imagenet-master 0/1 25s 25s
-
確認您在步驟 3 中建立的主作業正在正確執行。下列範例指令確認已為該作業建立了一個主 pod(如作業定義所示),而該 pod 目前正在其中一個 GPU 工作節點上執行。您還應該看到,您在步驟 1 中最初看到的工作 pod 仍在運行,並且主 pod 和工作 pod 在不同的節點上運行。
$ kubectl get pods -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE netapp-tensorflow-multi-imagenet-master-ppwwj 1/1 Running 0 45s 10.61.218.152 10.61.218.152 <none> netapp-tensorflow-multi-imagenet-worker-654fc7f486-v6725 1/1 Running 0 26m 10.61.218.154 10.61.218.154 <none>
-
確認您在步驟 3 中建立的主作業已成功完成。以下範例指令確認作業已成功完成。
$ kubectl get jobs NAME COMPLETIONS DURATION AGE netapp-tensorflow-multi-imagenet-master 1/1 5m50s 9m18s $ kubectl get pods NAME READY STATUS RESTARTS AGE netapp-tensorflow-multi-imagenet-master-ppwwj 0/1 Completed 0 9m38s netapp-tensorflow-multi-imagenet-worker-654fc7f486-v6725 1/1 Running 0 35m $ kubectl logs netapp-tensorflow-multi-imagenet-master-ppwwj [10.61.218.152:00008] WARNING: local probe returned unhandled shell:unknown assuming bash rm: cannot remove '/lib': Is a directory [10.61.218.154:00033] PMIX ERROR: NO-PERMISSIONS in file gds_dstore.c at line 702 [10.61.218.154:00033] PMIX ERROR: NO-PERMISSIONS in file gds_dstore.c at line 711 [10.61.218.152:00008] PMIX ERROR: NO-PERMISSIONS in file gds_dstore.c at line 702 [10.61.218.152:00008] PMIX ERROR: NO-PERMISSIONS in file gds_dstore.c at line 711 Total images/sec = 12881.33875 ================ Clean Cache !!! ================== mpirun -allow-run-as-root -np 2 -H 10.61.218.152:1,10.61.218.154:1 -mca pml ob1 -mca btl ^openib -mca btl_tcp_if_include enp1s0f0 -mca plm_rsh_agent ssh -mca plm_rsh_args "-p 22122" bash -c 'sync; echo 1 > /proc/sys/vm/drop_caches' ========================================= mpirun -allow-run-as-root -np 16 -H 10.61.218.152:8,10.61.218.154:8 -bind-to none -map-by slot -x NCCL_DEBUG=INFO -x LD_LIBRARY_PATH -x PATH -mca pml ob1 -mca btl ^openib -mca btl_tcp_if_include enp1s0f0 -x NCCL_IB_HCA=mlx5 -x NCCL_NET_GDR_READ=1 -x NCCL_IB_SL=3 -x NCCL_IB_GID_INDEX=3 -x NCCL_SOCKET_IFNAME=enp5s0.3091,enp12s0.3092,enp132s0.3093,enp139s0.3094 -x NCCL_IB_CUDA_SUPPORT=1 -mca orte_base_help_aggregate 0 -mca plm_rsh_agent ssh -mca plm_rsh_args "-p 22122" python /netapp/tensorflow/benchmarks_190205/scripts/tf_cnn_benchmarks/tf_cnn_benchmarks.py --model=resnet50 --batch_size=256 --device=gpu --force_gpu_compatible=True --num_intra_threads=1 --num_inter_threads=48 --variable_update=horovod --batch_group_size=20 --num_batches=500 --nodistortions --num_gpus=1 --data_format=NCHW --use_fp16=True --use_tf_layers=False --data_name=imagenet --use_datasets=True --data_dir=/mnt/mount_0/dataset/imagenet --datasets_parallel_interleave_cycle_length=10 --datasets_sloppy_parallel_interleave=False --num_mounts=2 --mount_prefix=/mnt/mount_%d --datasets_prefetch_buffer_size=2000 -- datasets_use_prefetch=True --datasets_num_private_threads=4 --horovod_device=gpu > /tmp/20190814_161609_tensorflow_horovod_rdma_resnet50_gpu_16_256_b500_imagenet_nodistort_fp16_r10_m2_nockpt.txt 2>&1
-
當您不再需要工作部署時,請刪除它。以下範例指令顯示刪除在步驟 1 中建立的工作程序部署物件。
當您刪除工作部署物件時,Kubernetes 會自動刪除任何關聯的工作容器。
$ kubectl get deployments NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE netapp-tensorflow-multi-imagenet-worker 1 1 1 1 43m $ kubectl get pods NAME READY STATUS RESTARTS AGE netapp-tensorflow-multi-imagenet-master-ppwwj 0/1 Completed 0 17m netapp-tensorflow-multi-imagenet-worker-654fc7f486-v6725 1/1 Running 0 43m $ kubectl delete deployment netapp-tensorflow-multi-imagenet-worker deployment.extensions "netapp-tensorflow-multi-imagenet-worker" deleted $ kubectl get deployments No resources found. $ kubectl get pods NAME READY STATUS RESTARTS AGE netapp-tensorflow-multi-imagenet-master-ppwwj 0/1 Completed 0 18m
-
*可選:*清理主作業工件。以下範例指令顯示刪除在步驟 3 中建立的主作業物件。
當您刪除主作業物件時,Kubernetes 會自動刪除任何關聯的主 pod。
$ kubectl get jobs NAME COMPLETIONS DURATION AGE netapp-tensorflow-multi-imagenet-master 1/1 5m50s 19m $ kubectl get pods NAME READY STATUS RESTARTS AGE netapp-tensorflow-multi-imagenet-master-ppwwj 0/1 Completed 0 19m $ kubectl delete job netapp-tensorflow-multi-imagenet-master job.batch "netapp-tensorflow-multi-imagenet-master" deleted $ kubectl get jobs No resources found. $ kubectl get pods No resources found.