Procedimientos recomendados para el aprendizaje profundo en Azure Databricks

En este artículo se incluyen sugerencias para el aprendizaje profundo en Azure Databricks e información sobre herramientas y bibliotecas integradas, diseñadas para optimizar cargas de trabajo de aprendizaje profundo, como por ejemplo:

Databricks Machine Learning proporciona una infraestructura de aprendizaje profundo pregenerada con Databricks Runtime para Machine Learning, que incluye las bibliotecas de aprendizaje profundo más comunes, como TensorFlow, PyTorch y Keras. También tiene compatibilidad integrada preconfigurada con GPU, incluidos los controladores y las bibliotecas auxiliares.

Databricks Runtime ML también incluye todas las funcionalidades del área de trabajo de Azure Databricks, como la creación y administración de clústeres; la administración de bibliotecas y entornos; la administración de código con carpetas de Git de Databricks; la compatibilidad con automatización, incluidos trabajos y API de Databricks; y MLflow integrado para el seguimiento del desarrollo de modelos y la implementación y el servicio de modelos.

Administración de recursos y entornos

Azure Databricks le ayuda a personalizar el entorno de aprendizaje profundo y a mantener la coherencia del entorno entre los usuarios.

Personalización del entorno de desarrollo

Con Databricks Runtime, puede personalizar el entorno de desarrollo en los niveles de cuaderno, clúster y trabajo.

Uso de directivas de clúster

Puede crear directivas de clúster para guiar a los científicos de datos a las opciones adecuadas, como el uso de un clúster de nodo único para el desarrollo y el uso de un clúster de escalado automático para trabajos de gran tamaño.

Considere la posibilidad de usar GPU A100 para cargas de trabajo de aprendizaje profundo

Las GPU A100 son una opción eficaz para muchas tareas de aprendizaje profundo, como el entrenamiento y la optimización de modelos de lenguaje grandes, procesamiento de lenguaje natural, detección y clasificación de objetos y motores de recomendaciones.

  • Databricks admite GPU A100 en todas las nubes. Para obtener la lista completa de los tipos de GPU admitidos, consulte Tipos de instancia admitidos.
  • Las GPU A100 suelen tener disponibilidad limitada. Póngase en contacto con el proveedor de nube para la asignación de recursos o considere la posibilidad de reservar capacidad de antemano.

Procedimientos recomendados para la carga de datos

El almacenamiento de datos en la nube normalmente no está optimizado para E/S, lo que puede ser un reto para los modelos de aprendizaje profundo que requieren grandes conjuntos de datos. Databricks Runtime ML incluye Delta Lake y Petastorm para optimizar el rendimiento de los datos para las aplicaciones de aprendizaje profundo.

Databricks recomienda usar tablas de Delta Lake para el almacenamiento de datos. Delta Lake simplifica la extracción, transformación y carga de datos (ETL), y le permite acceder a los datos de forma eficaz. En especial para las imágenes, Delta Lake ayuda a optimizar la ingesta para el entrenamiento y la inferencia. La solución de referencia para aplicaciones de imagen proporciona un ejemplo de optimización de ETL para imágenes con Delta Lake.

Petastorm proporciona varias API que le permiten preparar los datos en formato Parquet para su uso por parte de TensorFlow, Keras o PyTorch. SparkConverter API ofrece integración de DataFrame de Spark. Además, Petastorm ofrece particionamiento de datos para el procesamiento distribuido. Consulte Carga de datos mediante Petastorm para obtener más información.

Procedimientos recomendados para entrenar modelos de aprendizaje profundo

Databricks recomienda usar Databricks Runtime for Machine Learning, el seguimiento de MLflow y el registro automático para el entrenamiento de todos los modelos.

Inicio con un clúster de nodo único

Un clúster de nodo único (solo controlador) o GPU suele ser más rápido y rentable para el desarrollo de modelos de aprendizaje profundo. Es probable que un nodo con 4 GPU sea más rápido para el entrenamiento de aprendizaje profundo que 4 nodos de trabajo con 1 GPU cada uno. Esto se debe a que el entrenamiento distribuido incurre en una sobrecarga de comunicación de red.

Un clúster de nodo único es una buena opción durante el desarrollo rápido e iterativo, y para entrenar modelos en datos de tamaño pequeño a medio. Si el conjunto de datos es lo suficientemente grande como para que el entrenamiento sea lento en una sola máquina, considere la posibilidad de pasar a varias GPU e, incluso, a procesos distribuidos.

Uso de TensorBoard y métricas de clúster para supervisar el proceso de entrenamiento

TensorBoard está preinstalado en Databricks Runtime ML. Puede usarlo en un cuaderno o en una pestaña independiente, consulte TensorBoard para obtener más información.

Las métricas de clúster están disponibles en todos los entornos de ejecución de Databricks. Puede usarlo para examinar el uso de la red, el procesador y la memoria para inspeccionar los cuellos de botella. Consulte métricas de clúster para obtener más información.

Optimización del rendimiento para el aprendizaje profundo

En Databricks, puede —y debe— usar técnicas de optimización del rendimiento de aprendizaje profundo.

Detención anticipada

La detención anticipada supervisa el valor de una métrica calculada en el conjunto de validación y detiene el entrenamiento cuando la métrica deja de mejorar. Este es un enfoque mejor que adivinar un buen número de épocas hasta completarse. Cada biblioteca de aprendizaje profundo proporciona una API nativa para la detención anticipada. Por ejemplo, consulte las API de devolución de llamada de EarlyStopping para TensorFlow/Keras y PyTorch Lightning. Para obtener un cuaderno de ejemplo, consulte la sección sobre el cuaderno de ejemplo de TensorFlow Keras.

Ajuste del tamaño de lote

El ajuste del tamaño de lote ayuda a optimizar el uso de GPU. Si el tamaño del lote es demasiado pequeño, los cálculos no pueden usar por completo las funcionalidades de GPU. Puede usar las métricas del clúster para ver las métricas de GPU.

Ajuste el tamaño de lote junto con la velocidad de aprendizaje. Una buena regla general es que, al aumentar el tamaño del lote en n, la velocidad de aprendizaje aumente sqrt(n). Al ajustar manualmente, intente cambiar el tamaño de lote por un factor de 2 o 0,5. A continuación, continúe con el ajuste para optimizar el rendimiento, ya sea manualmente o probando diversos hiperparámetros mediante una herramienta automatizada, como Hyperopt.

Transferencia de aprendizaje

Con el aprendizaje por transferencia, comienza con un modelo entrenado previamente y lo modifica según sea necesario para la aplicación. El aprendizaje por transferencia puede reducir significativamente el tiempo necesario para entrenar y ajustar un modelo nuevo. Consulte Caracterización para el aprendizaje por transferencia para obtener más información y un ejemplo.

Cambio al entrenamiento distribuido

Databricks Runtime ML incluye HorovodRunner, spark-tensorflow-distributor, TorchDistributor e Hyperopt para facilitar el pasaje desde un nodo único al entrenamiento distribuido.

HorovodRunner

Horovod es un proyecto de código abierto que escala el entrenamiento de aprendizaje profundo al cálculo distribuido o de varias GPU. HorovodRunner, creado por Databricks e incluido en Databricks Runtime ML, es un contenedor de Horovod que proporciona compatibilidad con Spark. La API permite escalar código de nodo único con un mínimo de cambios. HorovodRunner funciona con TensorFlow, Keras y PyTorch.

spark-tensorflow-distributor

spark-tensorflow-distributor es un paquete nativo de código abierto de TensorFlow para el entrenamiento distribuido con TensorFlow en los clústeres de Spark. Consulte el cuaderno de ejemplo.

TorchDistributor

TorchDistributor es un módulo de código abierto en PySpark que facilita el entrenamiento distribuido con PyTorch en clústeres de Spark, lo que permite iniciar trabajos de entrenamiento de PyTorch como trabajos de Spark. Vea Entrenamiento distribuido con TorchDistributor.

Hyperopt

Hyperopt proporciona ajuste adaptable de hiperparámetros para el aprendizaje automático. Con la clase SparkTrials, puede ajustar de forma iterativa los parámetros de los modelos de aprendizaje profundo en paralelo a lo largo de un clúster.

Procedimientos recomendados para la inferencia

Esta sección contiene sugerencias generales sobre el uso de modelos para la inferencia con Azure Databricks.

  • Para minimizar los costos, tenga en cuenta las CPU y las GPU optimizadas para inferencia, como la serie NC T4_v3. No hay ninguna recomendación clara, ya que la mejor opción depende del tamaño del modelo, las dimensiones de datos y otras variables.

  • Use MLflow para simplificar la implementación y el servicio de modelos. MLflow puede registrar cualquier modelo de aprendizaje profundo, incluida la lógica personalizada de preprocesamiento y posprocesamiento. Los modelos en Unity Catalog o los modelos registrados en el Registro de modelos del área de trabajo pueden implementarse para la inferencia por lotes, en streaming o en línea.

Servicio en línea

La mejor opción para el servicio de baja latencia es el servicio en línea detrás de una API REST. Databricks ofrece Servicio de modelos para la inferencia en línea. El servicio de modelos proporciona una interfaz unificada para implementar, controlar y consultar modelos de IA y admite el siguiente servicio:

  • Modelos personalizados. Estos son modelos de Python empaquetados en el formato MLflow. Algunos ejemplos son los modelos de transformador scikit-learn, XGBoost, PyTorch y Hugging Face.
  • Modelos abiertos de última generación disponibles por las API de Foundation Model. Estos modelos son arquitecturas de modelos fundamentales mantenidos que admiten la inferencia optimizada. Por ejemplo, los modelos base como Llama-2-70B-chat, BGE-Large y Mistral-7B están disponibles para su uso inmediato con precios de pago por token. En el caso de las cargas de trabajo que requieren garantías de rendimiento y variantes de modelo optimizadas, puede implementarlas con rendimiento aprovisionado.
  • Modelos externos. Estos son modelos hospedados fuera de Databricks. Por ejemplo, los modelos de base como GPT-4 de OpenAI, Claude de Anthropic y otros. Los puntos de conexión que atienden estos modelos se pueden regular de forma centralizada y los clientes pueden establecer límites de velocidad y controles de acceso para ellos.

Como alternativa, MLflow proporciona API para implementar en varios servicios administrados para la inferencia en línea, así como API para crear contenedores de Docker para soluciones de servicio personalizadas.

Otros servicios administrados comunes para la inferencia en línea incluyen:

Inferencia por lotes y de streaming

La puntuación por lotes y streaming admite puntuaciones de alto rendimiento y bajo costo con latencias de tan solo minutos. Para obtener más información, consulte Uso de MLflow para la inferencia de modelos.

  • Si espera tener acceso a los datos para la inferencia más de una vez, considere la posibilidad de crear un trabajo de preprocesamiento para la extracción, transformación y carga de datos de los datos en una tabla de Delta Lake antes de ejecutar el trabajo de inferencia. De este modo, el costo de ingerir y preparar los datos se distribuye entre varias lecturas de los datos. La separación del preprocesamiento de la inferencia también permite seleccionar hardware diferente para cada trabajo a fin de optimizar el costo y el rendimiento. Por ejemplo, puede usar las CPU para ETL y las GPU para la inferencia.
  • Use UDF de Spark Pandas para escalar la inferencia por lotes y de streaming en un clúster.