Entrenamiento distribuido de modelos de aprendizaje profundo en Azure

Blob Storage
Container Registry
Machine Learning

Esta arquitectura de referencia muestra cómo llevar a cabo el entrenamiento distribuido de modelos de aprendizaje profundo en clústeres de máquinas virtuales habilitadas para GPU. El escenario es la clasificación de imágenes, pero la solución puede aplicarse a otros escenarios de aprendizaje profundo, como la segmentación y la detección de objetos.

Hay disponible una implementación de referencia de esta arquitectura en GitHub.

Architecture

Arquitectura para el aprendizaje profundo distribuido

Flujo de trabajo

La arquitectura consta de los siguientes servicios:

El servicio Proceso de Azure Machine Learning desempeña el papel central en esta arquitectura al escalar y reducir verticalmente los recursos según sea necesario. Proceso de Azure Machine Learning es un servicio que ayuda a aprovisionar y administrar clústeres de máquinas virtuales, programar trabajos, recopilar resultados, escalar recursos y controlar errores. Es compatible con máquinas virtuales habilitadas para GPU para cargas de trabajo de aprendizaje profundo.

Blob Storage estándar se utiliza para almacenar los registros y los resultados. Blob Storage prémium se usa para almacenar los datos de entrenamiento y se monta en los nodos del clúster de entrenamiento mediante blobfuse. El nivel Prémium de Blob Storage ofrece un mejor rendimiento que el nivel Estándar y se recomienda para escenarios de entrenamiento distribuido. Cuando se monta mediante blobfuse, durante la primera época, los datos de entrenamiento se descargan en los discos locales del clúster de entrenamiento y se almacenan en caché. En cada época sucesiva, los datos se leen de los discos locales, que es la opción de mayor rendimiento.

Azure Container Registry se usa para almacenar la imagen de Docker que Proceso de Azure Machine Learning utiliza para ejecutar el entrenamiento.

Componentes

  • Azure Machine Learning es una plataforma abierta para administrar el desarrollo y la implementación de modelos de aprendizaje automático a gran escala. La plataforma admite marcos abiertos de uso frecuente y ofrece caracterización automatizada y selección de algoritmos. Puede usar Machine Learning para implementar modelos en varios destinos, incluidos Azure Container Instances.
  • Azure Blob Storage es un servicio que forma parte de Azure Storage. Blob Storage ofrece almacenamiento optimizado de objetos en la nube para grandes cantidades de datos no estructurados.
  • Container Registry es un servicio de registro privado basado en la nube. Puede usar Container Registry para almacenar y administrar las imágenes de contenedor privadas de Docker y los artefactos relacionados.

Detalles del escenario

Escenario: La clasificación de imágenes es una técnica ampliamente utilizada en el campo de la visión artificial, a menudo mediante el entrenamiento de una red neuronal convolucional (CNN). Para modelos especialmente grandes con conjuntos de datos de gran tamaño, el proceso de entrenamiento puede tardar semanas o meses en una sola GPU. En algunas situaciones, los modelos son tan grandes que no es posible ajustar tamaños de lotes razonables en la GPU. El uso del aprendizaje distribuido en estas situaciones puede reducir el tiempo de entrenamiento.

En este escenario concreto, se entrena un modelo de CNN ResNet50 mediante Horovod en el conjunto de datos Imagenet y en datos sintéticos. La implementación de referencia muestra cómo realizar esta tarea mediante TensorFlow.

Hay varias maneras de entrenar un modelo de aprendizaje profundo de forma distribuida, incluidos los enfoques de datos en paralelo y modelo en paralelo basados en actualizaciones sincrónicas o asincrónicas. Actualmente, el escenario más común es el de entrenamiento de datos en paralelo con actualizaciones sincrónicas. Este enfoque es el más sencillo de implementar y es suficiente en la mayoría de los casos.

En el entrenamiento distribuido de datos en paralelo con actualizaciones sincrónicas, el modelo se replica en n dispositivos de hardware. Un pequeño lote de ejemplos de entrenamiento se divide en n microlotes. Cada dispositivo lleva a cabo los pases hacia adelante y hacia atrás de un microlote. Cuando un dispositivo termina el proceso, comparte las actualizaciones con los demás dispositivos. Estos valores se utilizan para calcular las ponderaciones actualizadas de todo el lote pequeño y las ponderaciones se sincronizan en todos los modelos. Este escenario se explica en el repositorio de GitHub asociado.

Entrenamiento distribuido de datos en paralelo

Esta arquitectura también puede usarse para actualizaciones asincrónicas y para el enfoque de modelo en paralelo. En el entrenamiento distribuido de modelo en paralelo, el modelo se divide en n dispositivos de hardware, con una parte del modelo en cada dispositivo. En la implementación más sencilla, cada dispositivo contiene una capa de la red y se transfiere información entre dispositivos durante el pase hacia adelante y hacia atrás. De esta manera se pueden entrenar redes neuronales de mayor tamaño, pero a costa del rendimiento, puesto que los dispositivos están constantemente esperándose entre sí para completar el pase hacia adelante o hacia atrás. Algunas técnicas avanzadas intentan mitigar parcialmente este problema mediante el uso de degradados sintéticos.

Los pasos del entrenamiento son los siguientes:

  1. Crear los scripts que se ejecutan en el clúster y entrenar el modelo
  2. Escribir los datos de entrenamiento en Blob Storage
  3. Creación de un área de trabajo de Machine Learning. Este paso también crea una instancia de Container Registry para hospedar las imágenes de Docker.
  4. Crear un clúster habilitado para GPU de Machine Learning
  5. Enviar los trabajos de entrenamiento Para cada trabajo con dependencias únicas, se crea una nueva imagen de Docker, que se inserta en el registro de contenedor. Durante la ejecución, se ejecuta la imagen de Docker adecuada, que ejecuta el script.
  6. Todos los resultados y registros se escriben en Blob Storage.

Consideraciones sobre el entrenamiento de los clústeres

Azure proporciona varios tipos de máquinas virtuales habilitadas para GPU que son adecuadas para el entrenamiento de modelos de aprendizaje profundo. A continuación, se enumeran por precio y velocidad en orden ascendente:

Serie de máquinas virtuales de Azure GPU NVIDIA
NC K80
NDs P40
NCsv2 P100
NCsv3 V100
NDv2 8x V100 (NVLink)
ND A100 v4 8x A100 (NVLink)

Se recomienda escalar verticalmente el entrenamiento antes de escalarlo horizontalmente. Por ejemplo, use una única máquina virtual V100 antes de probar un clúster de varias K80. Del mismo modo, considere la posibilidad de usar una única NDv2 en lugar de ocho máquinas virtuales NCsv3.

El siguiente gráfico muestra las diferencias de rendimiento para los distintos tipos de GPU según las pruebas comparativas realizadas con TensorFlow y Horovod. El gráfico muestra la capacidad de proceso de 32 clústeres de GPU en varios modelos, con diferentes tipos GPU y versiones de MPI. Los modelos se implementaron en TensorFlow 1.9.

Resultados de la capacidad de proceso de modelos de TensorFlow en clústeres de GPU

Cada serie de máquinas virtuales de la tabla anterior incluye una configuración con InfiniBand. Utilice las configuraciones de InfiniBand al ejecutar el entrenamiento distribuido para una comunicación más rápida entre los nodos. InfiniBand también incrementa la eficiencia de escalado del entrenamiento para los marcos que pueden aprovecharlo. Para obtener más información, consulte la prueba comparativa de InfiniBand.

Consideraciones

Estas consideraciones implementan los pilares del Azure Well-Architected Framework, que es un conjunto de principios rectores que puede utilizar para mejorar la calidad de una carga de trabajo. Para más información, consulte Marco de buena arquitectura de Microsoft Azure.

Storage

Al entrenar modelos de aprendizaje profundo, un aspecto que se suele pasar por alto es dónde se almacenan los datos de entrenamiento. Si el almacenamiento es demasiado lento para satisfacer la demanda de las GPU, el rendimiento del entrenamiento puede verse afectado negativamente.

Proceso de Azure Machine Learning admite muchas opciones de almacenamiento. Para obtener el mejor rendimiento, descargue los datos localmente en cada nodo. Sin embargo, este proceso puede resultar complicado, ya que tiene que descargar los datos en cada nodo de Blob Storage. Con el conjunto de datos ImageNet, este proceso puede tardar un tiempo considerable. De forma predeterminada, Machine Learning monta el almacenamiento de modo que almacene localmente los datos en la caché. Como resultado, en la práctica, después de la primera época, los datos se leen desde el almacenamiento local. Combinado con Premium Blob Storage, esta disposición ofrece un buen arreglo entre facilidad de uso y rendimiento.

Aunque en Proceso de Azure Machine Learning se puede montar Blob Storage de nivel Estándar mediante el adaptador blobfuse, no se recomienda usar el nivel Estándar en el entrenamiento distribuido, ya que el rendimiento normalmente no es lo suficientemente bueno como para controlar la capacidad de proceso necesaria. Use el nivel Prémium como almacenamiento para los datos de entrenamiento, tal como se muestra anteriormente en el diagrama de arquitectura. Para obtener una entrada de blog con una comparación del rendimiento y la latencia entre los dos niveles, consulte Premium Block Blob Storage - a new level of performance.

Container Registry

Siempre que se aprovisiona un área de trabajo de Machine Learning, se aprovisiona también un conjunto de recursos dependientes: Blob Storage, Key Vault, Container Registry y Application Insights. Como alternativa, puede usar los recursos de Azure existentes y asociarlos a la nueva área de trabajo de Machine Learning durante su creación.

De forma predeterminada, se aprovisiona el nivel básico de Container Registry. Para realizar aprendizaje profundo a gran escala, se recomienda personalizar el área de trabajo para que use Container Registry de nivel Prémium. Ofrece un ancho de banda bastante superior que le permite extraer imágenes de Docker de forma más rápida entre los nodos del clúster de entrenamiento.

Formato de datos

Con conjuntos de datos grandes, a menudo se recomienda usar formatos de datos como TFRecords o Petastorm, que proporcionan un rendimiento de E/S mejor que varios archivos de imagen pequeños.

Seguridad

La seguridad proporciona garantías contra ataques deliberados y el abuso de datos y sistemas valiosos. Para más información, consulte Introducción al pilar de seguridad.

Uso de un área de trabajo habilitada para un alto impacto de negocio

En escenarios en los que se usan datos confidenciales, considere la posibilidad de designar un área de trabajo de Machine Learning como de alto impacto de negocio (HBI) estableciendo la marca hbi_workspace en true al crearla. Un área de trabajo habilitada para HBI cifra los discos vacíos locales de los clústeres de proceso, permite el filtrado de IP y reduce la cantidad de datos de diagnóstico que Microsoft recopila, entre otras cosas. Para más información, consulte Cifrado de datos con Azure Machine Learning.

Cifrado de datos en reposo y en movimiento

Cifre los datos confidenciales en reposo, es decir, que están en Blob Storage. Cada vez que los datos se muevan de una ubicación a la siguiente, use SSL para proteger la transferencia de datos. Para obtener más información, vea la Guía de seguridad de Azure Storage.

Protección de datos de una red virtual

Para las implementaciones de producción, considere la posibilidad de implementar el clúster de Machine Learning en una subred de una red virtual que especifique. Con esta configuración, los nodos de proceso del clúster se comunican de forma segura con otras máquinas virtuales o con una red local. También puede usar puntos de conexión de servicio o privados en todos los recursos asociados para conceder acceso desde una red virtual.

Optimización de costos

La optimización de costos trata de buscar formas de reducir los gastos innecesarios y mejorar las eficiencias operativas. Para más información, vea Información general del pilar de optimización de costos.

Use la calculadora de precios de Azure para calcular el costo de ejecutar la carga de trabajo de aprendizaje profundo. Para obtener consideraciones de planeamiento y administración de costos específicas de Machine Learning, consulte Planificación para administrar costos de Azure Machine Learning. Para más información, vea Información general del pilar de optimización de costos.

Premium Blob Storage

El nivel Prémium de Blob Storage tiene un mayor costo de almacenamiento de datos, pero el de las transacciones es menor que el de almacenamiento de datos en el nivel de acceso frecuente de Blob Storage estándar. Por lo tanto, el nivel Prémium de Blob Storage puede ser menos costoso para las cargas de trabajo con altas tasas de transacciones. Para obtener más información, consulte Precios de Azure Blob Storage.

Container Registry

Container Registry se ofrece con los niveles Básico, Estándar y Prémium. Elija un nivel según el almacenamiento que necesite. Elija prémium si necesita replicación geográfica o si ha mejorado el rendimiento de las extracciones de Docker entre nodos simultáneos. Además, se aplican cargos de red estándar. Para más información, consulte Precios de Azure Container Registry.

Proceso de Azure Machine Learning

En esta arquitectura, Proceso de Azure Machine Learning es probablemente el principal factor determinante del costo. La implementación necesita un clúster de nodos de proceso de GPU. El precio de esos nodos viene determinado por su número y el tamaño de VM que seleccione. Para más información sobre los tamaños de VM que incluyen GPU, consulte Tamaños de máquinas virtuales optimizadas para GPU y Precios de Azure Virtual Machines.

Normalmente, las cargas de trabajo de aprendizaje profundo realizan un seguimiento del progreso después de cada época o cada pocas épocas. Esta práctica limita el impacto de interrupciones inesperadas en el entrenamiento. Puede emparejar esta práctica con el uso de máquinas virtuales de prioridad baja para clústeres de proceso de Machine Learning. Las máquinas virtuales de prioridad baja usan el exceso de capacidad de Azure a unas tarifas bastante reducidas, pero se pueden reemplazar si las demandas de capacidad aumentan.

Excelencia operativa

La excelencia operativa abarca los procesos de las operaciones que implementan una aplicación y la mantienen en ejecución en producción. Para más información, consulte Introducción al pilar de excelencia operativa.

Mientras se ejecuta el trabajo, es importante supervisar el progreso y asegurarse de que todo funciona según lo previsto. Sin embargo, puede resultar complicado supervisar un clúster de nodos activos.

Machine Learning ofrece muchas maneras de instrumentar los experimentos. Los flujos stdout y stderr de los scripts se registran automáticamente. Estos registros se sincronizan automáticamente con la instancia de Blob Storage de su área de trabajo. Puede ver estos archivos a través de Azure Portal, o bien descargarlos o transmitirlos mediante el SDK de Python o la CLI de Machine Learning. Si registra los experimentos mediante Tensorboard, estos registros se sincronizan automáticamente. Pueden acceder a ellos directamente o usar el SDK de Machine Learning para transmitirlos a una sesión de Tensorboard.

Eficiencia del rendimiento

La eficiencia del rendimiento es la capacidad de la carga de trabajo para escalar con el fin de satisfacer de manera eficiente las demandas que los usuarios hayan ejercido sobre ella. Para obtener más información, vea Resumen del pilar de eficiencia del rendimiento.

La eficiencia de escalado del entrenamiento distribuido siempre es inferior al 100 % debido a la sobrecarga de la red, ya que al sincronizar todo el modelo entre los dispositivos se origina un cuello de botella. Por lo tanto, el entrenamiento distribuido es el más adecuado para:

  • Modelos grandes que no se pueden entrenar con un tamaño de lote razonable en una sola GPU.
  • Problemas que no se pueden solucionar mediante la distribución del modelo de una manera sencilla y paralela.

El entrenamiento distribuido no se recomienda para ejecutar búsquedas de hiperparámetros. La eficiencia de escalado afecta al rendimiento y hace que un enfoque distribuido resulte menos eficiente que entrenar varias configuraciones del modelo por separado.

Una manera de mejorar la eficiencia de escalado es aumentar el tamaño del lote. No obstante, realice este ajuste con cuidado. El aumento del tamaño del lote sin ajustar los demás parámetros puede afectar al rendimiento final del modelo.

Implementación de este escenario

Hay disponible una implementación de referencia de esta arquitectura en GitHub. Siga los pasos descritos ahí para llevar a cabo el entrenamiento distribuido de modelos de aprendizaje profundo en clústeres de máquinas virtuales habilitadas para GPU.

Pasos siguientes

El resultado de esta arquitectura es un modelo entrenado que se guarda en Blob Storage. Puede utilizar este modelo para puntuación en tiempo real o puntuación de Batch. Para más información, consulte las siguientes arquitecturas de referencia:

Para arquitecturas que implican un entrenamiento distribuido o aprendizaje profundo, consulte los siguientes recursos: