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.
|
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. |
-
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 ummedium
valor deMemory
é 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 umemptyDir
volume como no exemplo a seguir fornece um suficientemente grande/dev/shm
volume virtual. Para mais informações sobreemptyDir
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 detrue
. 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ãoprivileged: 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
-
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>
-
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
-
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.