Artículo escrito por Rakshith Vasudev y John Lockman: Laboratorio de innovación de IA de HPC en octubre del 2019
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: |
---|---|
|
|
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:
Fig. 1: Con frecuencia, la ejecución secuencial deja la GPU inactiva
Con la realización del pipeline, el tiempo de inactividad disminuye significativamente:
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):
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:
Esta es una comparación del rendimiento de los enfoques antiguos y nuevos, usando los modelos oficiales de TF.
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.
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.
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
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: