Técnicas de Entrenamiento de Grandes Redes Neuronales PlatoBlockchain Data Intelligence. Búsqueda vertical. Ai.

Técnicas para entrenar grandes redes neuronales

Técnicas para entrenar grandes redes neuronales

Las grandes redes neuronales son el núcleo de muchos avances recientes en IA, pero entrenarlas es un desafío difícil de ingeniería e investigación que requiere orquestar un grupo de GPU para realizar un único cálculo sincronizado. A medida que crecieron los tamaños de los clústeres y los modelos, los profesionales del aprendizaje automático desarrollaron una variedad cada vez mayor de técnicas para paralelizar el entrenamiento de modelos en muchas GPU. A primera vista, comprender estas técnicas de paralelismo puede parecer desalentador, pero con solo unas pocas suposiciones sobre la estructura de la computación, estas técnicas se vuelven mucho más claras; en ese punto, solo está transportando bits opacos de A a B como una red. cambiar los transbordadores alrededor de los paquetes.

Paralelismo de datos

Técnicas para entrenar grandes redes neuronales

Paralelismo de tuberías

Técnicas para entrenar grandes redes neuronales

Paralelismo tensorial

Técnicas para entrenar grandes redes neuronales

Paralelismo experto

Técnicas para entrenar grandes redes neuronales

Paralelismo de datos

Técnicas para entrenar grandes redes neuronales

Paralelismo de tuberías

Técnicas para entrenar grandes redes neuronales

Paralelismo tensorial

Técnicas para entrenar grandes redes neuronales

Paralelismo experto

Técnicas para entrenar grandes redes neuronales

Una ilustración de varias estrategias de paralelismo en un modelo de tres capas. Cada color se refiere a una capa y las líneas discontinuas separan diferentes GPU.

sin paralelismo

El entrenamiento de una red neuronal es un proceso iterativo. En cada iteración, hacemos un avance a través de un modelo ponedoras para calcular una salida para cada ejemplo de entrenamiento en un lote de datos. Luego procede otro pase hacia atrás a través de las capas, propagando cuánto afecta cada parámetro al resultado final calculando un gradiente con respecto a cada parámetro. El gradiente promedio para el lote, los parámetros y algún estado de optimización por parámetro se pasa a un algoritmo de optimización, como Adam, que calcula los parámetros de la próxima iteración (que deberían tener un rendimiento ligeramente mejor en sus datos) y el nuevo estado de optimización por parámetro. A medida que el entrenamiento itera sobre lotes de datos, el modelo evoluciona para producir resultados cada vez más precisos.

Varias técnicas de paralelismo dividen este proceso de entrenamiento en diferentes dimensiones, que incluyen:

  • Paralelismo de datos: ejecute diferentes subconjuntos del lote en diferentes GPU;
  • Paralelismo de canalización: ejecute diferentes capas del modelo en diferentes GPU;
  • Paralelismo tensorial: divida las matemáticas para una sola operación, como una multiplicación de matriz, para dividirla entre las GPU;
  • Mezcla de expertos: procese cada ejemplo por solo una fracción de cada capa.

(En esta publicación, asumiremos que está usando GPU para entrenar sus redes neuronales, pero las mismas ideas se aplican a aquellos que usan cualquier otro acelerador de redes neuronales.)

Paralelismo de datos

Paralelo de datos el entrenamiento significa copiar los mismos parámetros en múltiples GPU (a menudo llamados "trabajadores") y asignar diferentes ejemplos a cada uno para que se procesen simultáneamente. El paralelismo de datos por sí solo aún requiere que su modelo encaje en la memoria de una sola GPU, pero le permite utilizar la computación de muchas GPU a costa de almacenar muchas copias duplicadas de sus parámetros. Dicho esto, existen estrategias para aumentar la RAM efectiva disponible para su GPU, como la descarga temporal de parámetros a la memoria de la CPU entre usos.

A medida que cada trabajador paralelo de datos actualiza su copia de los parámetros, deben coordinarse para garantizar que cada trabajador siga teniendo parámetros similares. El enfoque más simple es introducir el bloqueo de la comunicación entre los trabajadores: (1) calcular de forma independiente el gradiente de cada trabajador; (2) promediar los gradientes entre los trabajadores; y (3) calcular de forma independiente los mismos parámetros nuevos en cada trabajador. El paso (2) es un promedio de bloqueo que requiere la transferencia de una gran cantidad de datos (proporcional a la cantidad de trabajadores multiplicada por el tamaño de sus parámetros), lo que puede afectar el rendimiento de su capacitación. Hay varios esquemas de sincronización asíncrona para eliminar esta sobrecarga, pero perjudican la eficiencia del aprendizaje; en la práctica, la gente generalmente se apega al enfoque sincrónico.

Paralelismo de tuberías

Con Pipeline Paralelo entrenamiento, dividimos fragmentos secuenciales del modelo en GPU. Cada GPU contiene solo una fracción de los parámetros y, por lo tanto, el mismo modelo consume proporcionalmente menos memoria por GPU.

Es sencillo dividir un modelo grande en partes de capas consecutivas. Sin embargo, existe una dependencia secuencial entre las entradas y salidas de las capas, por lo que una implementación ingenua puede generar una gran cantidad de tiempo de inactividad mientras un trabajador espera que las salidas de la máquina anterior se utilicen como entradas. Estos fragmentos de tiempo de espera se conocen como "burbujas", desperdiciando el cálculo que podrían realizar las máquinas inactivas.

Técnicas para entrenar grandes redes neuronales adelante
Técnicas para entrenar grandes redes neuronales Hacia atrás
Técnicas para entrenar grandes redes neuronales Actualización de gradiente
Técnicas para entrenar grandes redes neuronales Idle
Técnicas para entrenar grandes redes neuronales

Ilustración de una configuración de paralelismo de tubería ingenua donde el modelo se divide verticalmente en 4 particiones por capa. El trabajador 1 aloja los parámetros del modelo de la primera capa de la red (más cercana a la entrada), mientras que el trabajador 4 aloja la capa 4 (que está más cerca de la salida). "F", "B" y "U" representan operaciones de avance, retroceso y actualización, respectivamente. Los subíndices indican en qué trabajador se ejecuta una operación. Los datos son procesados ​​por un trabajador a la vez debido a la dependencia secuencial, lo que genera grandes "burbujas" de tiempo de inactividad.

Podemos reutilizar las ideas del paralelismo de datos para reducir el costo de la burbuja al hacer que cada trabajador solo procese un subconjunto de elementos de datos a la vez, lo que nos permite superponer inteligentemente nuevos cálculos con tiempo de espera. La idea central es dividir un lote en varios microlotes; cada microlote debe ser proporcionalmente más rápido de procesar y cada trabajador comienza a trabajar en el siguiente microlote tan pronto como esté disponible, lo que acelera la ejecución de la canalización. Con suficientes microlotes, los trabajadores se pueden utilizar la mayor parte del tiempo con una burbuja mínima al principio y al final del paso. Los gradientes se promedian entre los microlotes y las actualizaciones de los parámetros se producen solo una vez que se han completado todos los microlotes.

El número de trabajadores en los que se divide el modelo se conoce comúnmente como profundidad de la tubería.

Durante el pase de avance, los trabajadores solo necesitan enviar la salida (llamadas activaciones) de su porción de capas al siguiente trabajador; durante el paso hacia atrás, solo envía los gradientes de esas activaciones al trabajador anterior. Hay un gran espacio de diseño sobre cómo programar estos pases y cómo agregar los gradientes a través de microlotes. Tubo G tiene cada proceso de trabajo hacia adelante y hacia atrás pasa consecutivamente y luego agrega gradientes de múltiples microlotes sincrónicamente al final. pipasueño en cambio, programa a cada trabajador para que procese alternativamente pases hacia adelante y hacia atrás.

Técnicas para entrenar grandes redes neuronales adelante
Técnicas para entrenar grandes redes neuronales Hacia atrás
Técnicas para entrenar grandes redes neuronales Actualizar
Técnicas para entrenar grandes redes neuronales Idle
Tubo G

Técnicas para entrenar grandes redes neuronales

pipasueño

Técnicas para entrenar grandes redes neuronales

Comparación de los esquemas de canalización de GPipe y PipeDream, utilizando 4 microlotes por lote. Los microlotes 1-8 corresponden a dos lotes de datos consecutivos. En la imagen, “(número)” indica en qué microlote se realiza una operación y el subíndice marca la identificación del trabajador. Tenga en cuenta que PipeDream obtiene más eficiencia al realizar algunos cálculos con parámetros obsoletos.

Paralelismo tensorial

El paralelismo de tubería divide un modelo "verticalmente" por capa. También es posible dividir "horizontalmente" ciertas operaciones dentro de una capa, que generalmente se llama tensor paralelo capacitación. Para muchos modelos modernos (como el transformador), el cuello de botella de cálculo es multiplicar una matriz de lotes de activación con una matriz de gran peso. Multiplicación de matrices se puede considerar como productos escalares entre pares de filas y columnas; es posible calcular productos de puntos independientes en diferentes GPU, o calcular partes de cada producto de puntos en diferentes GPU y resumir los resultados. Con cualquiera de las dos estrategias, podemos dividir la matriz de peso en "fragmentos" de tamaño uniforme, alojar cada fragmento en una GPU diferente y usar ese fragmento para calcular la parte relevante del producto de matriz general antes de comunicarnos más tarde para combinar los resultados.

Un ejemplo es Megatrón-LM, que paraleliza las multiplicaciones de matrices dentro de las capas de autoatención y MLP de Transformer. DPT-P utiliza paralelismo de tensor, datos y tubería; su cronograma de canalización asigna varias capas no consecutivas a cada dispositivo, lo que reduce la sobrecarga de burbujas a costa de más comunicación de red.

A veces, la entrada a la red se puede paralelizar en una dimensión con un alto grado de cómputo paralelo en relación con la comunicación cruzada. paralelismo de secuencias es una de esas ideas, donde una secuencia de entrada se divide a lo largo del tiempo en múltiples subejemplos, lo que reduce proporcionalmente el consumo máximo de memoria al permitir que el cálculo continúe con ejemplos de tamaño más granular.

Mezcla de expertos (MoE)

Con la Mezcla de expertos (MoE) enfoque, sólo una fracción de la red se utiliza para calcular la salida de cualquier entrada. Un enfoque de ejemplo es tener muchos conjuntos de pesos y la red puede elegir qué conjunto usar a través de un mecanismo de activación en el momento de la inferencia. Esto permite muchos más parámetros sin un mayor costo de cálculo. Cada conjunto de ponderaciones se denomina "expertos", con la esperanza de que la red aprenda a asignar habilidades y cálculos especializados a cada experto. Se pueden alojar diferentes expertos en diferentes GPU, lo que proporciona una forma clara de aumentar la cantidad de GPU utilizadas para un modelo.

Técnicas para entrenar grandes redes neuronales

Ilustración de una capa de mezcla de expertos (MoE). Solo 2 de los n los expertos son seleccionados por la red de puertas. (Imagen adaptada de: Shazeer y otros, 2017)

Ghard escala un MoE Transformer hasta 600 mil millones de parámetros con un esquema en el que solo las capas de MoE se dividen en varios dispositivos de TPU y otras capas se duplican por completo. Transformador de interruptor escala el tamaño del modelo a billones de parámetros con una escasez aún mayor al enrutar una entrada a un solo experto.

Otros diseños de ahorro de memoria

Hay muchas otras estrategias computacionales para hacer que el entrenamiento de redes neuronales cada vez más grandes sea más manejable. Por ejemplo:

  • Para calcular el gradiente, debe haber guardado las activaciones originales, lo que puede consumir una gran cantidad de memoria RAM del dispositivo. Punto de control (también conocido como recálculo de activación) almacena cualquier subconjunto de activaciones y vuelve a calcular las intermedias justo a tiempo durante el paso hacia atrás. Esto ahorra una gran cantidad de memoria con el costo computacional de, como máximo, un paso de avance completo adicional. También se puede negociar continuamente entre el costo de cómputo y el de memoria al recálculo de activación selectiva, que es subconjuntos de puntos de control de las activaciones que son relativamente más caros de almacenar pero más baratos de calcular.

  • Entrenamiento mixto de precisión es entrenar modelos usando números de menor precisión (más comúnmente FP16). Los aceleradores modernos pueden alcanzar recuentos de FLOP mucho más altos con números de menor precisión, y también ahorra en RAM del dispositivo. Con el cuidado adecuado, el modelo resultante casi no puede perder precisión.

  • Descarga es descargar temporalmente los datos no utilizados a la CPU o entre diferentes dispositivos y luego leerlos cuando sea necesario. Las implementaciones ingenuas ralentizarán mucho el entrenamiento, pero las implementaciones sofisticadas obtendrán previamente los datos para que el dispositivo nunca tenga que esperarlos. Una implementación de esta idea es Cero que divide los parámetros, gradientes y estados del optimizador en todo el hardware disponible y los materializa según sea necesario.

  • Optimizadores de uso eficiente de la memoria se han propuesto para reducir la huella de memoria del estado de ejecución mantenido por el optimizador, Tales como adafactor.

  • Compresión también se puede utilizar para almacenar resultados intermedios en la red. Por ejemplo, Esencia comprime las activaciones que se guardan para el pase hacia atrás; DALL · E comprime los gradientes antes de sincronizarlos.


En OpenAI, estamos entrenando y mejorando modelos grandes desde la infraestructura subyacente hasta implementarlos para problemas del mundo real. Si desea poner en práctica las ideas de esta publicación, especialmente relevantes para nuestros equipos de Escalamiento e Investigación aplicada, estamos contratación!


AGRADECIMIENTOS
Gracias a Nikolas Tezak, Sam Altman, Daniel Gackle, Ilya Sutskever y Steven Adler por sus comentarios sobre los borradores. Gracias a Justin Jay Wang, Bianca Martin y Steve Dowling por las comunicaciones y el diseño.

Sello de tiempo:

Mas de OpenAI