Hay un par de formas de usar múltiples GPU para el entrenamiento: paralelismo de datos y paralelismo de modelos. Hay diferentes formas de implementarlos. Voy a tratar de explicar el paralelismo del modelo utilizando el patrón de software consumidor-productor. Espero que te dé una idea de cómo funciona.
En el enfoque de paralelismo modelo, tiene N procesos de consumo, donde N es el número total de GPU, M productores y un proceso de controlador. La comunicación entre consumidores y productores se produce a través de una cola FIFO.
Imaginemos que estamos entrenando un clasificador de imágenes. El controlador inicia los productores, consumidores y colas. Por un lado, los productores leen las imágenes en bruto, las procesan previamente y las ponen en cola por lotes. Por otro lado, los consumidores están esperando que los productores llenen la cola con un lote. Los consumidores solo esperan en la primera iteración. Ya habrá datos esperando en la cola en las iteraciones posteriores porque el procesamiento previo de un lote requiere menos que entrenar un lote. Si ese no es el caso, bifurca a más productores.
- ¿Está nuestro cerebro conectado para reconocer y admirar la simetría o otros animales también muestran rasgos similares?
- ¿Cuál es la intuición para SVM-Rank y cuándo debo usarla?
- ¿Qué es el preprocesamiento de audio?
- Cómo construir un motor de recomendación en tiempo real
- ¿Dónde aplicarías algoritmos de aprendizaje automático en tu vida diaria? ¿Por qué?
Los consumidores toman lotes y ejecutan una iteración de entrenamiento en paralelo. Paralelo a eso, los productores ya están haciendo los próximos lotes utilizando la CPU. Por lo tanto, la lectura y el preprocesamiento se realizan sobre la marcha y computacionalmente gratis porque los productores usan las CPU y los consumidores usan las GPU.
Una vez que los consumidores terminan de entrenar sus respectivos lotes, obtenemos todos los parámetros de cada modelo y los promediamos. Luego actualice cada modelo (consumidor) con los parámetros promediados. Podemos usar otra cola para asegurarnos de que los parámetros se actualicen al mismo tiempo al final de cada iteración para todos los consumidores.
Este enfoque le dará una velocidad de 3.75x usando 4 GPU. ¡No está mal! Supongo que no es exactamente 4x porque a veces los consumidores necesitan esperar a que los otros terminen al final de cada iteración.
Jeff Dean habla sobre “Aprendizaje automático a gran escala para tareas predictivas”, donde explica un enfoque para el paralelismo de datos y otro enfoque para el paralelismo modelo. Hay una buena explicación del paralelismo de datos en el siguiente video.
También hay un documento al respecto.