Skip to main content
NetApp artificial intelligence solutions
O português é fornecido por meio de tradução automática para sua conveniência. O inglês precede o português em caso de inconsistências.

Executar uma carga de trabalho de IA de nó único

Para executar uma tarefa de IA e ML de nó único no seu cluster Kubernetes, execute as seguintes tarefas no host de salto de implantação. Com o Trident, você pode tornar um volume de dados, potencialmente contendo petabytes de dados, acessível de forma rápida e fácil a uma carga de trabalho do Kubernetes. Para tornar esse volume de dados acessível de dentro de um pod do Kubernetes, basta especificar um PVC na definição do pod.

Observação Esta seção pressupõe que você já tenha conteinerizado (no formato de contêiner do Docker) a carga de trabalho específica de IA e ML que está tentando executar no seu cluster Kubernetes.
  1. Os comandos de exemplo a seguir mostram a criação de um trabalho do Kubernetes para uma carga de trabalho de benchmark do TensorFlow que usa o conjunto de dados ImageNet. Para obter mais informações sobre o conjunto de dados ImageNet, consulte o "Site ImageNet" .

    Este trabalho de exemplo solicita oito GPUs e, portanto, pode ser executado em um único nó de trabalho de GPU que apresenta oito ou mais GPUs. Este trabalho de exemplo pode ser enviado em um cluster para o qual um nó de trabalho com oito ou mais GPUs não está presente ou está atualmente ocupado com outra carga de trabalho. Se for esse o caso, o trabalho permanecerá em estado pendente até que o nó de trabalho fique disponível.

    Além disso, para maximizar a largura de banda de armazenamento, o volume que contém os dados de treinamento necessários é montado duas vezes dentro do pod criado por essa tarefa. Outro volume também é montado no pod. Este segundo volume será usado para armazenar resultados e métricas. Esses volumes são referenciados na definição do trabalho usando os nomes dos PVCs. Para obter mais informações sobre os trabalhos do Kubernetes, consulte o "documentação oficial do Kubernetes" .

    Um emptyDir volume com um medium valor de Memory é montado em /dev/shm no pod que este trabalho de exemplo cria. O tamanho padrão do /dev/shm O volume virtual criado automaticamente pelo tempo de execução do contêiner do Docker às vezes pode ser insuficiente para as necessidades do TensorFlow. Montando um emptyDir volume como no exemplo a seguir fornece um suficientemente grande /dev/shm volume virtual. Para mais informações sobre emptyDir volumes, veja o "documentação oficial do Kubernetes" .

    O único contêiner especificado neste exemplo de definição de trabalho recebe um securityContext > privileged valor de true . Este valor significa que o contêiner efetivamente tem acesso root no host. Esta anotação é usada neste caso porque a carga de trabalho específica que está sendo executada requer acesso root. Especificamente, uma operação de limpeza de cache executada pela carga de trabalho requer acesso root. Se isso é verdade ou não privileged: true a anotação é necessária depende dos requisitos da carga de trabalho específica que você está executando.

    $ 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. Confirme se o trabalho que você criou na etapa 1 está sendo executado corretamente. O comando de exemplo a seguir confirma que um único pod foi criado para o trabalho, conforme especificado na definição do trabalho, e que esse pod está atualmente em execução em um dos nós de trabalho da 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. Confirme se o trabalho que você criou na etapa 1 foi concluído com sucesso. Os comandos de exemplo a seguir confirmam que o trabalho foi concluído com sucesso.

    $ 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. Opcional: Limpe artefatos de trabalho. Os comandos de exemplo a seguir mostram a exclusão do objeto de trabalho que foi criado na etapa 1.

    Quando você exclui o objeto de trabalho, o Kubernetes exclui automaticamente todos os pods associados.

    $ 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.