Skip to main content
  • Place orders quickly and easily
  • View orders and track your shipping status
  • Enjoy members-only rewards and discounts
  • Create and access a list of your products
  • Manage your Dell EMC sites, products, and product-level contacts using Company Administration.

Técnicas de optimización para capacitar CheXNet en Dell C4140 con GPU Nvidia V100

Summary: Prácticas recomendadas para lograr el máximo rendimiento en la capacitación de escalamiento horizontal distribuida de CheXNet mediante el uso de GPU Nvidia V100 SXM2 en servidores Dell EMC C4140. ...

This article may have been automatically translated. If you have any feedback regarding its quality, please let us know using the form at the bottom of this page.

Article Content


Symptoms

Artículo escrito por Rakshith Vasudev y John Lockman: Laboratorio de innovación de IA de HPC en octubre del 2019

Cause

  -

Resolution

Como se indicó anteriormente, CheXNet es un modelo de asistente de radiología de IA que utiliza para identificar hasta 14 patologías desde una imagen determinada de rayos X de tórax. Se exploraron varios enfoques para escalar horizontalmente la capacitación de un modelo que podría funcionar tan bien como o mejor que el CheXNet-121 original con ResNet-50, lo que demuestra su promesa tanto en escalabilidad como en mayor precisión de capacitación (AUROC positivo). Los autores demostraron escalabilidad en los sistemas de CPU; sin embargo, estamos interesados en aprovechar el paralelismo de las GPU para acelerar el proceso de capacitación. En este artículo, se describen las prácticas recomendadas para lograr el máximo rendimiento en la capacitación de escalamiento horizontal distribuida de CheXNet mediante el uso de GPU Nvidia V100 SXM2 en servidores Dell EMC C4140. Dell EMC PowerEdge C4140 proporciona densidad y rendimiento con cuatro GPU Nvidia V100 en la configuración SXM2.


 

Configuración de hardware: Configuración del software:
  • 4 PowerEdge C4140
  • 4 Nvidia V100 SXM2 de 32 GB
  • 2 CPU Intel(R) Xeon(R) Gold 6148 de 20 núcleos a 2,40 GHz
  • 384 GB de RAM, DDR4 2666 MHz
  • 1 Mellanox EDR HCA
  • Sistema de archivos Lustre
  • Infraestructura de aprendizaje profundo: tensorflow-gpu
  • Versión de la infraestructura: 1.12.0
  • Versión de Horovod: 0.16.4
  • Versión de MPI: 4.0.0 con soporte de cuda y ucx
  • Versión de CUDA: 10.1.105
  • Versión de CUDNN: 7.6.0
  • Versión de NCCL: 2.4.7
  • Versión de Python: 3.6.8
  • Sistema operativo y versión: RHEL 7.4


 


El pipeline de datos es fundamental para obtener el máximo rendimiento de los aceleradores:



 

¿Qué son los datos del tf, por qué debería esforzarse en usarlos?

 

A medida que los nuevos dispositivos de computación (como GPU y TPU) permiten capacitar las redes neuronales a una velocidad cada vez más rápida, el procesamiento de CPU es propenso a convertirse en el cuello de botella. La API tf.data proporciona a los usuarios componentes básicos para diseñar pipelines de entrada que utilizan eficazmente la CPU, lo que optimiza cada paso del proceso de ETL.

 

Para realizar un paso de capacitación, primero debe extraer y transformar los datos de capacitación y, a continuación, alimentarlos en un modelo que se ejecuta en un acelerador. Sin embargo, en una implementación sincrónica simple, mientras la CPU está preparando los datos, el acelerador está inactivo. Por el contrario, mientras el acelerador está capacitando el modelo, la CPU está inactiva. El tiempo de paso de capacitación es, por lo tanto, la suma del tiempo de procesamiento previo de la CPU y del tiempo de capacitación del acelerador

 

Realizar el pipeline se superpone a la ejecución previa y del modelo de un paso de capacitación. Mientras el acelerador realiza el paso de capacitación N, la CPU está preparando los datos para el paso N+1. Si lo hace, se reduce el tiempo de paso al máximo (en lugar de la suma) de la capacitación y el tiempo necesario para extraer y transformar los datos.

 

Sin la realización del pipeline, la CPU y la GPU/TPU permanecen inactivas la mayor parte del tiempo:

SLN318898_en_US__1Sequantial execution
Fig. 1: Con frecuencia, la ejecución secuencial deja la GPU inactiva

 

Con la realización del pipeline, el tiempo de inactividad disminuye significativamente:

SLN318898_en_US__2Pipelining overlaps
Fig. 2: Realizar el pipeline se superpone a la utilización de CPU y GPU, lo que maximiza la utilización de la GPU

 

La API tf.data proporciona un mecanismo para realizar el pipeline de software a través de la transformación tf.data.Dataset.prefetch, que se puede utilizar para desacoplar la hora en que se producen los datos desde el momento en que se consumen. Específicamente, la transformación utiliza un subproceso en segundo plano y un búfer interno para la captura previa de elementos del conjunto de datos de entrada antes del momento en que se solicitan.

 

Más información aquí: https://www.tensorflow.org/guide/performance/datasets

 

Cuando se siguen las pautas proporcionadas por tensorflow, es posible obtener un pipeline de datos que se vea así (enfoque antiguo):
https://github.com/dellemc-hpc-ai/code-examples/blob/master/cheXNet-snippets/old_approach.py

 

En este enfoque, también conocido como el enfoque antiguo, el pipeline de datos de tf realiza lo siguiente (suponiendo que el conjunto de datos de rayos X de tórax es una secuencia de TFRecords):

 

  1. Obtiene la lista absoluta de nombres de archivo.
  2. Crea un conjunto de datos a partir de la lista de nombres de archivo mediante TFRecordDataset()
  3. Cree un nuevo conjunto de datos que cargue y formatee las imágenes mediante su preprocesamiento.
  4. Particione el conjunto de datos.
  5. Ordene aleatoriamente el conjunto de datos cuando se realice la capacitación.
  6. Repita el conjunto de datos.
  7. Procese por lotes del conjunto de datos.
  8. Capture previamente el conjunto de datos para el batch_size.


 

Sin embargo, este no es el código de mayor rendimiento. Causa estancamientos y utilización frecuente de gpu del 0 %. Básicamente, no utiliza los aceleradores de manera eficaz.

Para configurar correctamente el pipeline de datos de tf, seguimos el enfoque adoptado por los modelos oficiales de TensorFlow específicamente, el de ResNet.  La diferencia entre el enfoque antiguo y el nuevo es la forma en que se configura el pipeline de datos antes de alimentarlo al modelo.

 

Así es como se ve el nuevo enfoque:
https://github.com/dellemc-hpc-ai/code-examples/blob/master/cheXNet-snippets/new_approach.py

 

El enfoque de modelos oficiales de TensorFlow, también conocido como nuevo enfoque, es el siguiente:

 

  1. Obtiene la lista absoluta de nombres de archivo.
  2. Crea un conjunto de datos a partir de la lista de nombres de archivo mediante from_tensor_slices()
  3. El particionamiento se realiza con anticipación.
  4. El conjunto de datos se ordena aleatoriamente durante la capacitación.
  5. A continuación, el conjunto de datos se intercala en paralelo, lo que intercala y procesa varios archivos (definidos por cycle_length) para transformarlos a fin de crear el conjunto de datos TFRecord.
  6. A continuación, se captura previamente el conjunto de datos. El buffer_size define la cantidad de registros que se capturan previamente, que suele ser el mini batch_size del trabajo.
  7. El conjunto de datos se vuelve a ordenar aleatoriamente. Los detalles del orden aleatorio se controlan mediante buffer_size.
  8. El conjunto de datos se repite.  Repite el conjunto de datos hasta num_epochs para la capacitación.
  9. El conjunto de datos se somete a map_and_batch() simultáneos que analizan los archivos de registro de tf, que, a su vez, procesa previamente la imagen y los procesa por lotes.
  10. La imagen procesada previamente está lista como un conjunto de datos y se vuelve a realizar la captura previa.


 

Esta es una comparación del rendimiento de los enfoques antiguos y nuevos, usando los modelos oficiales de TF.

SLN318898_en_US__3image(12053)
Fig. 3: Con el nuevo enfoque, se podría esperar un escalamiento casi lineal.

 

Como se puede ver, hay un impacto significativo en el rendimiento y no hay escalamiento en absoluto con el enfoque antiguo. Con frecuencia, las GPU experimentarían una utilización mínima o nula, lo que provoca que el rendimiento sea plano. Hacer que el cálculo sea más eficiente en una GPU se traduce en hacer que el cálculo sea más eficiente en varias GPU en múltiples nodos, si el cálculo se maneja bien.
Hacer que las CPU realicen el procesamiento previo en paralelo y la captura previa los datos procesados en la memoria, y que las GPU realicen el trabajo pesado de la multiplicación de la matriz con una comunicación rápida es otro aspecto que hace que este nuevo enfoque sea más atractivo de escalar para múltiples nodos.


 


Otras técnicas que se deben analizar para lograr un rendimiento óptimo:



 

Contar con el entorno correcto es importante:

 

El entorno que ejecuta los trabajos es tan importante como sus trabajos, porque contar con las bibliotecas/módulos adecuados es importante, ya que afectarán el rendimiento de la capacitación. Además, contar con las bibliotecas relacionadas con CUDA más recientes puede ayudar a mejorar el rendimiento.

Siga este tutorial para realizar la instalación, si no tiene una configuración de entorno de trabajo.



 

Uso de los parámetros de vinculación correctos para MPI:

 

MPI es una biblioteca de comunicación que ayuda a horovod a distribuir trabajos. Se exploraron diferentes opciones de parámetros de vinculación y asignación, y los mejores parámetros para el C4140 fue la asignación por conector. Lo siguiente son los ajustes recomendados:
mpirun --map-by socket -np x python pyfile.py --pyoptions



 

Asegúrese de que un proceso actúe en una GPU:

 

Si hay más de un proceso que está trabajando una gpu, es muy posible que estén luchando por los recursos de la GPU, consumiendo memoria de la GPU y, efectivamente, no caben más imágenes por lote, por lo que es responsable de que el rendimiento de la GPU se vea afectado. Se exploró Tensorflow 1.13.1, pero parecía tener un error en ese momento. Iniciaba más de un proceso por GPU.


 

En resumen:

  • Tener el pipeline de datos correctamente configurado es fundamental para ver aumentos de rendimiento.
  • Configurar el entorno correcto es un buen factor para mejorar el rendimiento.
  • El uso de los parámetros de vinculación correctos para MPI ayuda a mejorar el rendimiento.
  • Perfile y corrija los cuellos de botella cuando las GPU no se utilicen completamente.


 


Article Properties


Affected Product

High Performance Computing Solution Resources, Poweredge C4140

Last Published Date

17 Sep 2021

Version

5

Article Type

Solution