Tendencias del momento
#
Bonk Eco continues to show strength amid $USELESS rally
#
Pump.fun to raise $1B token sale, traders speculating on airdrop
#
Boop.Fun leading the way with a new launchpad on Solana.
Estás en una entrevista para Ingeniero de ML en Google.
Entrevistador: Necesitamos entrenar un LLM en 1,000 GPUs. ¿Cómo te asegurarías de que todas las GPUs compartan lo que aprenden?
Tú: Usa un servidor de parámetros central para agregar y redistribuir los pesos.
Entrevista terminada.
Esto es lo que te perdiste:
Un importante cuello de botella en tiempo de ejecución en el entrenamiento multi-GPU ocurre durante la sincronización de GPUs.
Por ejemplo, en el entrenamiento multi-GPU a través de paralelismo de datos:
- El mismo modelo se distribuye a diferentes GPUs.
- Cada GPU procesa un subconjunto diferente de todo el conjunto de datos.
Revisa esto 👇
Esto lleva a diferentes gradientes en diferentes dispositivos.
Así que, antes de actualizar los parámetros del modelo en cada dispositivo GPU, debemos comunicar los gradientes a todos los demás dispositivos para sincronizarlos.
¡Entendamos 2 estrategias comunes a continuación!
Algoritmo 1) All-reduce
Una forma obvia es enviar los gradientes de un dispositivo a todos los demás dispositivos para sincronizarlos.
Pero esto utiliza un alto ancho de banda.
Si cada GPU tiene “N” elementos y hay “G” GPUs, resulta en una transferencia total de G*(G-1)*N elementos 👇
Podemos optimizar esto transfiriendo todos los elementos a una sola GPU, calculando el valor final y enviándolo de vuelta a todas las demás GPUs.
Esta es una mejora significativa.
Pero ahora una sola GPU debe recibir, calcular y comunicar de vuelta los gradientes, por lo que esto no escala.
Algoritmo 2) Reducción en anillo
Fase #1) Reducción por compartición
Primero, los gradientes se dividen en G segmentos en cada GPU (G = número total de GPUs).
Revisa esto 👇
En una iteración, cada GPU envía un segmento a la siguiente GPU:
- GPU1 envía a₁ a GPU2, donde se suma a b₁
- GPU2 envía b₂ a GPU3, donde se suma a c₂
- GPU3 envía c₃ a GPU4, donde se suma a d₃
- GPU4 envía d₄ a GPU1, donde se suma a a₄
Revisa esto 👇
Este proceso se repite:
- GPU1 envía (d₄+a₄) a GPU2, donde se suma a b₄.
- GPU2 envía (a₁+b₁) a GPU3, donde se suma a c₁.
- GPU3 envía (b₂+c₂) a GPU4, donde se suma a d₂.
- GPU4 envía (c₃+d₃) a GPU1, donde se suma a a₃.
Revisa esto 👇
En la iteración final, los siguientes segmentos se transfieren a la siguiente GPU.
Esto lleva a un estado donde cada GPU tiene un segmento completo, y podemos transferir estos segmentos completos a todas las demás GPUs.
Revisa esto 👇
Fase #2) Solo compartir
Ahora que cada GPU tiene un segmento completo, podemos transferir estos segmentos completos a todas las demás GPUs.
El proceso se lleva a cabo de manera similar a lo que discutimos anteriormente, así que no entraremos en detalles completos.
La iteración 1 se muestra a continuación👇
A continuación, realizamos las iteraciones 2 y 3.
Estas se llevan a cabo de manera similar a lo que aprendimos en la Fase 1.
Revisa esto 👇
¡Y ahí lo tienes!
Los pesos del modelo entre GPUs han sido sincronizados.
Aunque el total de elementos transferidos sigue siendo el mismo que teníamos en el enfoque de "máster de una sola GPU", este enfoque en anillo es mucho más escalable ya que no pone toda la carga en una sola GPU.
Revisa esto 👇

Por defecto, los modelos de aprendizaje profundo solo utilizan una única GPU para el entrenamiento, incluso si hay múltiples GPUs disponibles.
Una forma ideal de entrenar modelos es distribuir la carga de trabajo de entrenamiento entre múltiples GPUs.
La gráfica muestra cuatro estrategias para el entrenamiento en múltiples GPUs👇
364,81K
Parte superior
Clasificación
Favoritos

