Computación distribuida con las prácticas recomendadas de SageMaker AI
Esta página de prácticas recomendadas presenta varios tipos de computación distribuida para los trabajos de machine learning (ML) en general. El término computación distribuida en esta página abarca el entrenamiento distribuido para tareas de machine learning y la computación paralela para el procesamiento de datos, la generación de datos, la ingeniería de características y el aprendizaje por refuerzo. En esta página, analizamos los desafíos comunes de la computación distribuida y las opciones disponibles en el entrenamiento de SageMaker y el procesamiento de SageMaker. Si quiere obtener materiales de lectura adicionales sobre la computación distribuida, consulte ¿Qué es la computación distribuida?
Puede configurar las tareas de machine learning para que se ejecuten de forma distribuida en varios nodos (instancias), aceleradores (GPU NVIDIA, chips Trainium de AWS) y núcleos de vCPU. Al ejecutar la computación distribuida, puede lograr diversos objetivos, como procesar las operaciones con mayor rapidez, gestionar conjuntos de datos de gran tamaño o entrenar modelos de machine learning de gran tamaño.
En la siguiente lista se describen los desafíos más comunes a los que puede enfrentarse al realizar un trabajo de entrenamiento en machine learning a gran escala.
-
Debe tomar decisiones sobre cómo distribuir la computación en función de las tareas de machine learning, las bibliotecas de software que desee utilizar y los recursos informáticos.
-
No todas las tareas de machine learning son fáciles de distribuir. Además, no todas las bibliotecas de machine learning admiten la computación distribuida.
-
Es posible que la computación distribuida no siempre dé como resultado un aumento lineal de la eficiencia informática. En concreto, es necesario identificar si la E/S de datos y la comunicación entre GPU presentan cuellos de botella o si provocan sobrecargas.
-
La computación distribuida puede alterar los procesos numéricos y cambiar la precisión de los modelos. Sobre todo con el entrenamiento de redes neuronales con datos paralelos, cuando cambia el tamaño del lote global y, al mismo tiempo, lo escala a un clúster de cómputo más grande, también necesita ajustar la tasa de aprendizaje de acuerdo a ello.
SageMaker AI proporciona soluciones de entrenamiento distribuido para aliviar estos desafíos en varios casos de uso. Elija una de las siguientes opciones que mejor se adapte a su caso de uso.
Temas
Opción 1: utilizar un algoritmo integrado de SageMaker AI que admita el entrenamiento distribuido
SageMaker AI proporciona algoritmos integrados listos para usar a través de la consola de SageMaker AI o el SageMaker Python SDK. Al usar los algoritmos integrados, no necesita dedicar tiempo a personalizar el código, comprender la ciencia detrás de los modelos o ejecutar Docker en instancias de Amazon EC2 aprovisionadas.
Un subconjunto de los algoritmos integrados de SageMaker AI admiten el entrenamiento distribuido. Para comprobar si el algoritmo de su elección admite el entrenamiento distribuido, consulte la columna Paralelizable de la tabla Información común sobre los algoritmos integrados. Algunos de los algoritmos admiten el entrenamiento distribuido en varias instancias, mientras que el resto de los algoritmos paralelizables admiten la paralelización entre varias GPU en una sola instancia, como se indica en la columna Paralelizable.
Opción 2: ejecutar un código de machine learning personalizado en el entorno de procesamiento o entrenamiento administrado por SageMaker AI
Los trabajos de SageMaker AI pueden crear instancias de un entorno de entrenamiento distribuido para marcos y casos de uso específicos. Este entorno actúa como una pizarra blanca lista para usar, en la que puede incorporar y ejecutar su propio código de machine learning.
Si su código de machine learning utiliza un marco de aprendizaje profundo
Puede lanzar trabajos de entrenamiento distribuido mediante los contenedores de aprendizaje profundo (DLC)
-
Las bibliotecas de entrenamiento distribuido de SageMaker AI
Las bibliotecas de entrenamiento distribuido de SageMaker AI proponen código administrado por AWS para el paralelismo de datos de redes neuronales y el paralelismo de modelos. El entrenamiento de SageMaker AI también incluye clientes lanzadores integrados en el SageMaker Python SDK, y no es necesario crear código de lanzamiento paralelo. Para obtener más información, consulte la biblioteca de paralelismo de datos de SageMaker AI y la biblioteca de paralelismo de modelos de SageMaker AI.
-
Bibliotecas de entrenamiento distribuido de código abierto
Los marcos de código abierto tienen sus propios mecanismos de distribución, como DistributedDataParallelism (DDP) en PyTorch
o los tf.distributemódulos en TensorFlow. Puede optar por ejecutar estos marcos de entrenamiento distribuido en los contenedores de marcos administrados por SageMaker AI. Por ejemplo, el código de ejemplo para entrenar MaskRCNN en SageMaker AImuestra cómo usar PyTorch DDP en el contenedor del marco PyTorch de SageMaker AI y Horovod en el contenedor del marco TensorFlow de SageMaker.
Los contenedores de machine learning de SageMaker AI también vienen con MPI
Notas para el entrenamiento de redes neuronales de paralelismo de datos en las GPU
-
Amplíe el sistema a un paralelismo entre varias GPU y varias máquinas cuando sea necesario
A menudo realizamos trabajos de entrenamiento de redes neuronales en instancias de varias CPU o GPU. Por lo general, cada instancia basada en GPU contiene varios dispositivos de GPU. Por lo tanto, la computación distribuida con GPU puede realizarse en una sola instancia de GPU con varias GPU (entrenamiento de un solo nodo y varias GPU) o en varias instancias de GPU con varios núcleos de GPU en cada una (entrenamiento de múltiples nodos y múltiples GPU). El entrenamiento en una sola instancia permite escribir código y depurar más fácilmente, y el rendimiento de GPU a GPU entre nodos suele ser más rápido que el rendimiento GPU-GPU entre nodos. Por lo tanto, es una buena idea escalar primero el paralelismo de datos verticalmente (utilice una instancia de GPU con varias GPU) y ampliarlo a varias instancias de GPU si es necesario. Es posible que esto no se aplique a los casos en los que el presupuesto de la CPU sea elevado (por ejemplo, una carga de trabajo enorme para el preprocesamiento de datos) y cuando la relación GPU-GPU de una instancia con varias GPU sea demasiado baja. En todos los casos, tendrá que experimentar con diferentes combinaciones de tipos de instancias en función de sus propias necesidades de entrenamiento en machine learning y de su carga de trabajo.
-
Supervisa la calidad de la convergencia
Al entrenar una red neuronal con paralelismo de datos, si se aumenta el número de GPU y se mantiene constante el tamaño de los minilotes por GPU, se aumenta el tamaño del minilote global para el proceso de descenso de gradiente estocástico (MSGD) de los minilotes. Se sabe que el tamaño de los minilotes del MSGD afecta al ruido de descenso y a la convergencia. Para escalar correctamente y, al mismo tiempo, preservar la precisión, es necesario ajustar otros hiperparámetros, como la tasa de aprendizaje [Goyal et al.
(2017)]. -
Monitorear los cuellos de botella de E/S
A medida que aumente la cantidad de GPU, también aumentará el rendimiento del almacenamiento de lectura y escritura. Asegúrese de que la fuente de datos y la canalización no se conviertan en cuellos de botella.
-
Modifique su script de entrenamiento según sea necesario
Los scripts de entrenamiento escritos para el entrenamiento con una sola GPU deben modificarse para el entrenamiento con varios nodos y varias GPU. En la mayoría de las bibliotecas de paralelismo de datos, es necesario modificar los scripts para hacer lo siguiente.
-
Asignar lotes de datos de entrenamiento a cada GPU.
-
Utilizar un optimizador que pueda realizar cálculos de gradientes y actualizaciones de parámetros en varias GPU.
-
Asignar la responsabilidad de los puntos de control a un host y a una GPU específicos.
-
Si su código de machine learning implica el procesamiento de datos tabulares
PySpark es un frontend de Python de Apache Spark, que es un marco de computación distribuida de código abierto. PySpark se ha adoptado ampliamente para el procesamiento distribuido de datos tabulares para cargas de trabajo de producción a gran escala. Si quiere ejecutar código de procesamiento de datos tabulares, considere la posibilidad de utilizar los contenedores PySpark de procesamiento de SageMaker y ejecutar trabajos paralelos. También puede ejecutar trabajos de procesamiento de datos en paralelo mediante las API de entrenamiento de SageMaker y procesamiento de SageMaker de Amazon SageMaker Studio Classic, que está integrado con Amazon EMR
Opción 3: escribir su propio código de entrenamiento distribuido y personalizado
Cuando envía un trabajo de entrenamiento o procesamiento a SageMaker AI, las API de entrenamiento de SageMaker AI y procesamiento de SageMaker lanzan instancias de procesamiento de Amazon EC2. Puede personalizar el entorno de entrenamiento y procesamiento de las instancias ejecutando su propio contenedor de Docker o instalando bibliotecas adicionales en los contenedores gestionados por AWS. Para obtener más información sobre Docker con el entrenamiento de SageMaker, consulte Adaptar su propio contenedor de Docker para que funcione con SageMaker AI y Crear un contenedor con sus propios algoritmos y modelos. Para obtener más información sobre Docker con el procesamiento de SageMaker AI, consulte Utilizar su propio código de procesamiento.
Todos los entornos de trabajo de entrenamiento de SageMaker contienen un archivo de configuración en /opt/ml/input/config/resourceconfig.json y todos los entornos de trabajos de procesamiento de SageMaker contienen un archivo de configuración similar en /opt/ml/config/resourceconfig.json. El código puede leer este archivo para buscar hostnames y establecer comunicaciones entre nodos. Para obtener más información, incluido el esquema del archivo JSON, consulte Configuración de entrenamiento distribuido y Cómo el procesamiento de Amazon SageMaker configura su contenedor de procesamiento. También puede instalar y utilizar bibliotecas de computación distribuida de terceros, como Ray
También puede utilizar el entrenamiento de SageMaker y procesamiento de SageMaker para ejecutar cálculos distribuidos personalizados que no requieren comunicación entre trabajadores. En la literatura sobre computación, esas tareas a menudo se describen como vergonzosamente paralelas o donde no se comparte nada. Los ejemplos incluyen el procesamiento paralelo de archivos de datos, el entrenamiento de modelos en paralelo en diferentes configuraciones o la ejecución de inferencias por lotes en una colección de registros. Puede paralelizar trivialmente estos casos de uso en los que no se comparte nada con Amazon SageMaker AI. Al lanzar un trabajo del entrenamiento de SageMaker o el procesamiento de SageMaker en un clúster con varios nodos, SageMaker AI replica y lanza de forma predeterminada el código de entrenamiento (en Python o Docker) en todos los nodos. Las tareas que requieren una distribución aleatoria de los datos de entrada entre estos múltiples nodos se pueden facilitar estableciendo S3DataDistributionType=ShardedByS3Key en la configuración de entrada de datos de la API TrainingInput de SageMaker AI.
Opción 4: lanzar varios trabajos en paralelo o secuencialmente
También puede distribuir un flujo de trabajo de procesamiento de machine learning en tareas informáticas secuenciales o paralelas más pequeñas, cada una representada por su propio trabajo de entrenamiento de SageMaker o procesamiento de SageMaker. Dividir una tarea en varios trabajos puede resultar beneficioso para las siguientes situaciones o tareas:
-
Cuando tiene canales de datos y entradas de metadatos específicos (como hiperparámetros, configuración de modelos o tipos de instancias) para cada subtarea.
-
Cuando implementa los pasos de reintento a nivel de subtarea.
-
Cuando varía la configuración de las subtareas a lo largo de la carga de trabajo, por ejemplo, cuando se entrena sobre cómo aumentar el tamaño de los lotes.
-
Cuando necesita ejecutar una tarea de machine learning que lleva más tiempo que el tiempo máximo de entrenamiento permitido para un solo trabajo de entrenamiento (28 días como máximo).
-
Cuando los distintos pasos de un flujo de trabajo informático requieren distintos tipos de instancias.
Para el caso específico de la búsqueda de hiperparámetros, utilice Ajuste de modelos automatizados de SageMaker AI. El ajuste de modelos automatizados de SageMaker AI es un orquestador de búsqueda de parámetros sin servidor que lanza varios trabajos de entrenamiento en su nombre, según una lógica de búsqueda que puede ser aleatoria, bayesiana o HyperBand.
Además, para organizar varios trabajos de entrenamiento, también puede utilizar herramientas de orquestación de flujos de trabajo, como SageMaker Pipelines