단일 노드 AI 워크로드 실행
Kubernetes 클러스터에서 단일 노드 AI 및 ML 작업을 실행하려면 배포 점프 호스트에서 다음 작업을 수행하세요. Trident 사용하면 페타바이트 규모의 데이터를 포함하는 데이터 볼륨을 Kubernetes 워크로드에서 쉽고 빠르게 액세스할 수 있습니다. Kubernetes 포드 내에서 이러한 데이터 볼륨에 액세스할 수 있게 하려면 포드 정의에서 PVC를 지정하기만 하면 됩니다.
|
이 섹션에서는 Kubernetes 클러스터에서 실행하려는 특정 AI 및 ML 워크로드를 이미 컨테이너화(Docker 컨테이너 형식)했다고 가정합니다. |
-
다음 예제 명령은 ImageNet 데이터 세트를 사용하는 TensorFlow 벤치마크 워크로드에 대한 Kubernetes 작업을 생성하는 방법을 보여줍니다. ImageNet 데이터 세트에 대한 자세한 내용은 다음을 참조하세요. "ImageNet 웹사이트" .
이 예제 작업은 8개의 GPU를 요청하므로 8개 이상의 GPU를 갖춘 단일 GPU 워커 노드에서 실행될 수 있습니다. 이 예제 작업은 8개 이상의 GPU를 갖춘 작업자 노드가 없거나 현재 다른 작업 부하로 인해 사용 중인 클러스터에 제출될 수 있습니다. 그렇다면 해당 작업은 해당 작업자 노드가 사용 가능해질 때까지 보류 상태로 유지됩니다.
또한, 저장 대역폭을 최대화하기 위해 이 작업이 생성하는 포드 내에 필요한 학습 데이터가 포함된 볼륨이 두 번 마운트됩니다. 또 다른 볼륨도 포드에 마운트됩니다. 두 번째 볼륨은 결과와 측정 항목을 저장하는 데 사용됩니다. 이러한 볼륨은 PVC의 이름을 사용하여 작업 정의에 참조됩니다. Kubernetes 작업에 대한 자세한 내용은 다음을 참조하세요. "공식 Kubernetes 문서" .
안
emptyDir
볼륨이 있는medium
의 가치Memory
에 마운트됩니다/dev/shm
이 예제 작업이 생성하는 포드에서. 기본 크기/dev/shm
Docker 컨테이너 런타임에서 자동으로 생성되는 가상 볼륨은 때때로 TensorFlow의 요구 사항을 충족하지 못할 수 있습니다. 장착emptyDir
다음 예와 같이 볼륨은 충분히 큰 크기를 제공합니다./dev/shm
가상 볼륨. 더 많은 정보를 원하시면emptyDir
볼륨을 참조하십시오 "공식 Kubernetes 문서" .이 예제 작업 정의에 지정된 단일 컨테이너에는 다음이 제공됩니다.
securityContext > privileged
의 가치true
. 이 값은 컨테이너가 호스트에 대한 루트 액세스 권한을 효과적으로 가지고 있음을 의미합니다. 이 주석은 실행되는 특정 작업 부하에 루트 액세스가 필요하기 때문에 이 경우에 사용됩니다. 구체적으로, 워크로드가 수행하는 캐시 지우기 작업에는 루트 액세스가 필요합니다. 이것이든 아니든privileged: true
주석이 필요한지는 실행 중인 특정 작업 부하의 요구 사항에 따라 달라집니다.$ cat << EOF > ./netapp-tensorflow-single-imagenet.yaml apiVersion: batch/v1 kind: Job metadata: name: netapp-tensorflow-single-imagenet spec: backoffLimit: 5 template: spec: 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", "--dgx_version=dgx1", "--num_devices=8"] 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-single-imagenet.yaml job.batch/netapp-tensorflow-single-imagenet created $ kubectl get jobs NAME COMPLETIONS DURATION AGE netapp-tensorflow-single-imagenet 0/1 24s 24s
-
1단계에서 생성한 작업이 올바르게 실행되는지 확인하세요. 다음 예제 명령은 작업 정의에 지정된 대로 작업에 대한 단일 포드가 생성되었으며, 이 포드가 현재 GPU 워커 노드 중 하나에서 실행 중인지 확인합니다.
$ kubectl get pods -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE netapp-tensorflow-single-imagenet-m7x92 1/1 Running 0 3m 10.233.68.61 10.61.218.154 <none>
-
1단계에서 생성한 작업이 성공적으로 완료되는지 확인하세요. 다음 예제 명령은 작업이 성공적으로 완료되었음을 확인합니다.
$ kubectl get jobs NAME COMPLETIONS DURATION AGE netapp-tensorflow-single-imagenet 1/1 5m42s 10m $ kubectl get pods NAME READY STATUS RESTARTS AGE netapp-tensorflow-single-imagenet-m7x92 0/1 Completed 0 11m $ kubectl logs netapp-tensorflow-single-imagenet-m7x92 [netapp-tensorflow-single-imagenet-m7x92:00008] PMIX ERROR: NO-PERMISSIONS in file gds_dstore.c at line 702 [netapp-tensorflow-single-imagenet-m7x92:00008] PMIX ERROR: NO-PERMISSIONS in file gds_dstore.c at line 711 Total images/sec = 6530.59125 ================ Clean Cache !!! ================== mpirun -allow-run-as-root -np 1 -H localhost:1 bash -c 'sync; echo 1 > /proc/sys/vm/drop_caches' ========================================= mpirun -allow-run-as-root -np 8 -H localhost:8 -bind-to none -map-by slot -x NCCL_DEBUG=INFO -x LD_LIBRARY_PATH -x PATH 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_105450_tensorflow_horovod_rdma_resnet50_gpu_8_256_b500_imagenet_nodistort_fp16_r10_m2_nockpt.txt 2>&1
-
선택 사항: 작업 아티팩트를 정리합니다. 다음 예제 명령은 1단계에서 생성된 작업 객체를 삭제하는 방법을 보여줍니다.
작업 객체를 삭제하면 Kubernetes는 연관된 모든 Pod를 자동으로 삭제합니다.
$ kubectl get jobs NAME COMPLETIONS DURATION AGE netapp-tensorflow-single-imagenet 1/1 5m42s 10m $ kubectl get pods NAME READY STATUS RESTARTS AGE netapp-tensorflow-single-imagenet-m7x92 0/1 Completed 0 11m $ kubectl delete job netapp-tensorflow-single-imagenet job.batch "netapp-tensorflow-single-imagenet" deleted $ kubectl get jobs No resources found. $ kubectl get pods No resources found.