Skip to main content
NetApp artificial intelligence solutions
본 한국어 번역은 사용자 편의를 위해 제공되는 기계 번역입니다. 영어 버전과 한국어 버전이 서로 어긋나는 경우에는 언제나 영어 버전이 우선합니다.

단일 노드 AI 워크로드 실행

Kubernetes 클러스터에서 단일 노드 AI 및 ML 작업을 실행하려면 배포 점프 호스트에서 다음 작업을 수행하세요. Trident 사용하면 페타바이트 규모의 데이터를 포함하는 데이터 볼륨을 Kubernetes 워크로드에서 쉽고 빠르게 액세스할 수 있습니다. Kubernetes 포드 내에서 이러한 데이터 볼륨에 액세스할 수 있게 하려면 포드 정의에서 PVC를 지정하기만 하면 됩니다.

참고 이 섹션에서는 Kubernetes 클러스터에서 실행하려는 특정 AI 및 ML 워크로드를 이미 컨테이너화(Docker 컨테이너 형식)했다고 가정합니다.
  1. 다음 예제 명령은 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
  2. 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>
  3. 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
  4. 선택 사항: 작업 아티팩트를 정리합니다. 다음 예제 명령은 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.