Tecnologías de comunicación distribuida GPU: PCle, NVLink, NVSwitch

Después de entrar en la era de los modelos grandes, el desarrollo de modelos grandes se ha convertido en el núcleo de la inteligencia artificial, pero entrenar modelos grandes es en realidad una tarea complicada porque requiere una gran cantidad de recursos de GPU y un largo tiempo de entrenamiento.

Además, un único subproceso de trabajo de GPU tiene memoria limitada y el tamaño de muchos modelos grandes excede el alcance de una sola GPU. Por lo tanto, es necesario implementar el entrenamiento de modelos en múltiples GPU. Este método de formación implica comunicación distribuida y NVLink.

Cuando hablamos de comunicaciones distribuidas y NVLink, nos encontramos en un campo técnico fascinante y en evolución. A continuación presentaremos brevemente los principios de la comunicación distribuida y la evolución de NVLink, la tecnología que ayuda a lograr una comunicación distribuida eficiente.

La comunicación distribuida se refiere a conectar múltiples nodos en un sistema informático para que puedan comunicarse y colaborar entre sí para completar tareas comunes. NVLink es una tecnología de comunicación de alta velocidad y baja latencia que normalmente se utiliza para conectar GPU o GPU a otros dispositivos para lograr una transmisión de datos y computación de alto rendimiento.

Paralelismo distribuido

Actualmente, el aprendizaje profundo ha entrado en la era de los grandes modelos, es decir, los modelos básicos. El modelo grande, como su nombre indica, se centra en lo "grande". Incluye principalmente los siguientes aspectos:

  • Tamaño de datos grande

Los modelos grandes suelen utilizar métodos de aprendizaje autosupervisados, lo que reduce la anotación de datos y los costos de capacitación e I + D, mientras que grandes cantidades de datos pueden mejorar la capacidad de generalización y el rendimiento del modelo.

  • Gran escala de parámetros

A medida que la escala de los parámetros del modelo continúa aumentando, el modelo puede capturar mejor las relaciones y patrones complejos en los datos, y se espera que supere aún más las limitaciones de precisión de la estructura del modelo existente.

  • Altos requisitos de potencia informática 

Los datos y parámetros a gran escala hacen imposible que el modelo se ejecute y calcule en una sola máquina. Por un lado, esto requiere un avance continuo del hardware informático y, por otro lado, también requiere que el marco de IA tenga capacidades de entrenamiento paralelas distribuidas.

Por lo tanto, para resolver los problemas anteriores, necesitamos introducir una estrategia paralela distribuida.

Paralelismo de datos

Data Parallel (DP) es una estrategia de entrenamiento de aprendizaje profundo de uso común que logra el procesamiento paralelo mediante la distribución de datos entre múltiples GPU. En un marco de datos paralelo, cada GPU (o unidad de trabajo) almacena una copia completa del modelo para que cada GPU pueda realizar de forma independiente cálculos de propagación hacia adelante y hacia atrás en su subconjunto de datos asignado.

Flujo de trabajo paralelo de datos:

  • Sincronización de parámetros: Antes de comenzar el entrenamiento, todas las unidades de trabajo sincronizan los parámetros del modelo para garantizar que las copias del modelo en cada GPU sean idénticas.
  • Distribución de datos: Los datos de entrenamiento se dividen en lotes, cada lote se divide en subconjuntos y cada GPU es responsable de procesar un subconjunto de datos.
  • Cálculo de gradiente independiente: Cada GPU realiza de forma independiente la propagación hacia adelante y hacia atrás en su subconjunto de datos y calcula los gradientes correspondientes.
  • Agregación de gradiente: Una vez completado el cálculo, se deben agregar las pendientes de todas las unidades de trabajo. Esto generalmente se logra a través de la comunicación de red, por ejemplo, utilizando un algoritmo All-Reduce, que permite promediar de manera eficiente los gradientes en diferentes GPU.
  • Actualización de parámetros: Una vez que se promedian los gradientes, cada GPU utiliza este gradiente promediado para actualizar los parámetros de su copia del modelo.
  • Repetición del proceso: Este proceso se repite en cada lote de datos hasta que el modelo esté entrenado en todo el conjunto de datos.

Ventajas y desafíos del paralelismo de datos:

El paralelismo de datos puede permitir que el proceso de capacitación se escale horizontalmente a más GPU, acelerando así la capacitación. Sus ventajas radican en una implementación simple y la capacidad de ajustar de manera flexible la cantidad de unidades de trabajo para adaptarse a los recursos de hardware disponibles. Actualmente, muchos marcos de aprendizaje profundo brindan soporte integrado.

Sin embargo, a medida que aumenta el número de GPU paralelas, es necesario almacenar más copias de parámetros, lo que genera una sobrecarga de memoria significativa. Además, el paso de agregación de gradiente requiere sincronizar una gran cantidad de datos entre GPU, lo que puede convertirse en un cuello de botella para el sistema, especialmente cuando aumenta la cantidad de unidades de trabajo.

Aplicación del esquema de sincronización asíncrona en paralelismo de datos:

Para resolver el problema del cuello de botella en la comunicación en el paralelismo de datos, los investigadores han propuesto varios esquemas de sincronización asincrónica. En estos esquemas, cada subproceso de trabajo de GPU puede procesar datos independientemente de otros subprocesos, sin esperar a que otros subprocesos de trabajo completen sus cálculos de gradiente y sincronización. Este enfoque puede reducir significativamente el tiempo muerto causado por la comunicación, mejorando así el rendimiento del sistema.

El principio de implementación es que en la etapa de cálculo del gradiente, después de que cada GPU completa su propia propagación hacia adelante y hacia atrás, actualiza inmediatamente el gradiente sin esperar a otras GPU. Además, cada GPU lee los últimos pesos globales disponibles cuando es necesario sin tener que esperar a que todas las GPU alcancen un punto de sincronización.

Sin embargo, este enfoque también tiene sus desventajas. Dado que es posible que los pesos del modelo en diferentes GPU no estén sincronizados, los subprocesos de trabajo pueden utilizar pesos obsoletos para los cálculos de gradiente, lo que puede provocar una disminución de la eficiencia estadística, es decir, no se puede garantizar estrictamente la precisión.

Modelo de paralelismo

Model Parallel (MP) generalmente se refiere al entrenamiento de un gran modelo de aprendizaje profundo de manera distribuida en múltiples nodos informáticos, donde cada nodo es responsable de una parte del modelo. Este método se utiliza principalmente para resolver situaciones en las que un solo nodo informático no puede acomodar todo el modelo. El paralelismo de modelos se puede subdividir en varias estrategias, que incluyen, entre otras, el paralelismo de canalización (PP) y el paralelismo tensorial (TP).

El paralelismo del modelo es un método para resolver el problema de que un solo nodo informático no puede acomodar todos los parámetros del modelo. A diferencia del paralelismo de datos, donde cada nodo procesa un subconjunto diferente de datos para el modelo completo, el paralelismo de modelos distribuye diferentes partes del modelo entre múltiples nodos, siendo cada nodo responsable solo de una parte de los parámetros del modelo. Esto puede reducir efectivamente los requisitos de memoria y la carga computacional de un solo nodo.

En el paralelismo de modelos, se pueden dividir varias capas de una red neuronal profunda y asignarlas a diferentes nodos. Por ejemplo, podemos agrupar varias capas consecutivas y asignar el grupo de capas a un nodo. Esta estrategia jerárquica permite que cada nodo procese solo una parte de los parámetros del modelo que se le asignan, lo que reduce el uso de memoria y recursos informáticos.

Sin embargo, las implementaciones simples de modelos paralelos pueden generar un tiempo de espera significativo y una utilización ineficiente de los recursos computacionales, ya que las capas con dependencias secuenciales deben esperar a que se complete el cálculo de la capa anterior.

Para reducir esta pérdida de eficiencia, se propuso Pipeline Parallel (PP). En el paralelismo de canalización, un gran lote de datos se divide en múltiples microlotes pequeños. Cada microlote debe procesarse proporcionalmente más rápido, y cada trabajador comienza a procesar el siguiente microlote tan pronto como esté disponible, acelerando así la ejecución del proceso. Si hay suficientes microlotes, los trabajadores (tarjetas GPU) se pueden utilizar por completo y se pueden minimizar las "burbujas" de tiempo de inactividad al principio y al final de los pasos.

En el paralelismo de canalización, cada nodo procesa una capa de modelo diferente de forma secuencial y los microlotes fluyen entre los nodos como en una canalización. Los gradientes se promedian en todos los minilotes y luego se usan para actualizar los parámetros del modelo.

El paralelismo de canalización divide el modelo "verticalmente" en capas. También podemos dividir ciertas operaciones dentro de una capa "horizontalmente", lo que a menudo se denomina entrenamiento Tensor Parallel (TP) para mejorar aún más la eficiencia.

En el paralelismo tensorial, las operaciones de multiplicación de matrices grandes en un modelo se dividen en partes más pequeñas que se pueden ejecutar en paralelo en múltiples nodos de cálculo. Por ejemplo, en el modelo Transformer, la multiplicación de matrices es un importante cuello de botella computacional. Con el paralelismo tensorial, podemos dividir la matriz de pesos en bloques más pequeños, cada uno de los cuales se procesa en paralelo en diferentes nodos.

En la práctica, el paralelismo de modelos puede incluir una combinación de paralelismo de canalización y paralelismo tensorial. Un nodo puede ser responsable de parte del modelo (paralelismo del modelo) y procesar diferentes microlotes simultáneamente (paralelismo de canalización), y dentro de este nodo, las operaciones matriciales grandes se pueden dividir aún más en múltiples procesadores (paralelismo tensorial). Esta combinación puede aprovechar al máximo los recursos informáticos distribuidos y mejorar la eficiencia del entrenamiento de modelos a gran escala.

Distribución del marco de IA

Para el entrenamiento de modelos, sin importar qué estrategia paralela se utilice, su esencia incluye dividir el modelo "verticalmente" u "horizontalmente" y luego colocar las divisiones separadas en diferentes máquinas para realizar cálculos y aprovechar al máximo los recursos informáticos.

En los marcos de IA actuales, generalmente se adopta un enfoque paralelo mixto de múltiples estrategias para acelerar el entrenamiento del modelo. Para respaldar el modelo de capacitación de múltiples estrategias paralelas, es necesario involucrar cómo se comunican las diferentes partes del modelo "dividido".

Segmentación del gráfico de entrenamiento de IA

Segmentación del gráfico de entrenamiento de IA

Como se muestra en la figura anterior, en el marco informático de IA, necesitamos dividir el modelo de red original y distribuirlo en diferentes máquinas para la informática. Aquí, la comunicación se lleva a cabo insertando nodos de envío y recepción en el modelo.

Además, en el entrenamiento de modelos distribuidos, debido a la segmentación del modelo, también necesitamos colocar los parámetros del modelo en las máquinas donde se encuentran las diferentes partes del modelo. Durante el proceso de capacitación, involucraremos la interacción y sincronización de parámetros de diferentes nodos del modelo, lo que también requiere sincronización de datos y parámetros entre nodos. Esta es una formación distribuida.

Lo que hemos introducido anteriormente son estrategias y algoritmos distribuidos a nivel de software. A continuación, echemos un vistazo a cómo se implementa la comunicación en el hardware.

Hardware de comunicación

La comunicación distribuida es fundamental en el entrenamiento de IA, especialmente cuando se trata de modelos grandes y cantidades masivas de datos. La comunicación distribuida implica la transmisión de datos y la coordinación entre diferentes dispositivos o nodos para lograr computación paralela y sincronización de parámetros del modelo, como se muestra en la siguiente figura.

Estructura de servicio de GPU

Estructura de servicio de GPU

Cuando se trata de comunicación dentro de una máquina, existen varios hardware comunes:

  • Memoria compartida: Varios procesadores o subprocesos pueden acceder a la misma memoria física para poder comunicarse leyendo y escribiendo datos en la memoria. La memoria compartida es adecuada para computación paralela en la misma máquina.
  • PCIe (Interconexión Express de Componentes Periféricos): El bus PCIe es una interfaz estándar para conectar dispositivos informáticos, que normalmente se utiliza para conectar GPU, tarjetas aceleradoras u otros dispositivos externos. A través del bus PCIe, se pueden transferir datos entre diferentes dispositivos informáticos para lograr una informática distribuida.
  • NVEnlace: NVLink es una tecnología de interconexión de alta velocidad desarrollada por NVIDIA que permite la comunicación directa entre GPU. NVLink puede proporcionar mayor ancho de banda y menor latencia que PCIe, lo que es adecuado para tareas que requieren un mayor rendimiento de comunicación.

En términos de comunicación de máquina a máquina, el hardware común incluye:

  • Red TCP / IP: El protocolo TCP/IP es la base de la comunicación por Internet, que permite la transmisión de datos entre diferentes máquinas a través de la red. En la informática distribuida, las redes TCP/IP se pueden utilizar para la comunicación y la transferencia de datos entre máquinas.
  • Red RDMA (Acceso remoto directo a memoria): RDMA es una tecnología de comunicación de red de alto rendimiento que permite transferir datos directamente de un área de memoria a otra sin involucrar a la CPU. Las redes RDMA se utilizan a menudo para construir clústeres informáticos de alto rendimiento para proporcionar una transmisión de datos de baja latencia y alto rendimiento.

Después de comprender el hardware, la biblioteca que proporciona funciones de comunicación colectiva es indispensable para realizar la comunicación. Entre ellas, una de las bibliotecas de comunicación colectiva más utilizadas es MPI (Message Passing Interface), que se utiliza ampliamente en la CPU. En las GPU NVIDIA, la biblioteca de comunicaciones colectivas más utilizada es NCCL (Biblioteca de comunicaciones colectivas de NVIDIA).

NVLink y NVSwitch

NVLink y NVSwitch

Como se muestra en la figura anterior, a través de la biblioteca NCCL, podemos usar NVLink o NVSwitch para conectar diferentes GPU entre sí. NCCL proporciona API externas a nivel de algoritmo, a través de las cuales podemos realizar fácilmente operaciones de comunicación colectiva en múltiples GPU. La API de NCCL cubre operaciones de comunicación colectiva comunes, como transmisión, reducción, reducción global, sincronización global, etc., proporcionando a los desarrolladores herramientas informáticas paralelas ricas y eficientes.

Comunicación colectiva

Las comunicaciones colectivas son una operación de comunicación global que involucra todos los procesos en un grupo de procesos. Incluye una serie de operaciones básicas, como envío, recepción, copia, sincronización de barrera de procesos intragrupo (Barrera) y sincronización de procesos entre nodos (señal + espera). Estas operaciones básicas se pueden combinar para formar un conjunto de plantillas de comunicación, también llamadas primitivas de comunicación. Por ejemplo, transmisión de uno a muchos, recopilación de muchos a uno, recopilación de muchos a muchos (reunión total), dispersión de uno a muchos (dispersión), reducción de muchos a uno, reducción de muchos a uno muchos reducen (reducen todos), reducen y dispersan combinados (reducen-dispersión), muchos a muchos (todos a todos), etc. A continuación presentaremos brevemente algunos de ellos.

Comunicación colectiva

Comunicación colectiva

La operación Gather es una primitiva de comunicación de muchos a uno con múltiples remitentes de datos y un receptor de datos. Puede recopilar datos de varios nodos en un nodo del clúster. Su funcionamiento inverso corresponde al Scatter.

La transmisión es una comunicación primitiva de uno a muchos, con un remitente de datos y múltiples receptores de datos. Puede transmitir los datos propios de un nodo a otros nodos del clúster. Como se muestra en la figura anterior, cuando el nodo maestro 0 ejecuta la transmisión, los datos se transmiten desde el nodo maestro 0 a otros nodos.

La dispersión es una distribución de datos de uno a muchos. Divide los datos de una tarjeta GPU en fragmentos y los distribuye a todas las demás tarjetas GPU.

AllReduce es una primitiva de comunicación de muchos a muchos con múltiples remitentes de datos y múltiples receptores de datos. Realiza la misma operación de reducción en todos los nodos del clúster y puede enviar los resultados de las operaciones de reducción de datos en todos los nodos del clúster a todos los nodos. En pocas palabras, AllReduce es una operación de reducción de datos de muchos a muchos, que reduce los datos en todas las tarjetas GPU (como SUM) a cada tarjeta GPU en el clúster.

AllGather es una primitiva de comunicación de muchos a muchos con múltiples remitentes y múltiples receptores de datos. Puede recopilar datos de varios nodos del clúster a un nodo maestro (Reunir) y luego distribuir los datos recopilados a otros nodos.

La operación AllToAll distribuye los datos de cada nodo a todos los nodos del clúster, y cada nodo también recopila los datos de todos los nodos del clúster. AllToAll es una extensión de AllGather. La diferencia es que en la operación AllGather, los datos recopilados de un determinado nodo por diferentes nodos son los mismos, mientras que en AllToAll, los datos recopilados de un determinado nodo por diferentes nodos son diferentes.

NVLink y NVSwitch son dos tecnologías revolucionarias introducidas por NVIDIA que están redefiniendo la forma en que las CPU y las GPU, así como las GPU y las GPU, trabajan juntas y se comunican de manera eficiente.

NVLink es un protocolo de comunicación y bus avanzado. NVLink utiliza una estructura punto a punto y transmisión en serie para conectar la unidad central de procesamiento (CPU) y la unidad de procesamiento de gráficos (GPU). También se puede utilizar para conectar varias unidades de procesamiento de gráficos (GPU).

NVSwitch: una tecnología de interconexión de alta velocidad. Como chip NVLink independiente, proporciona hasta 18 interfaces NVLink, que pueden lograr una transmisión de datos de alta velocidad entre múltiples GPU.

La introducción de estas dos tecnologías aporta un mayor ancho de banda de comunicación y una menor latencia a escenarios de aplicaciones como clústeres de GPU y sistemas de aprendizaje profundo, mejorando así el rendimiento general y la eficiencia del sistema.

Desarrollo NVLink

Desarrollo NVLink

Como se muestra en la figura anterior, NVLink ha pasado por cuatro generaciones de desarrollo y evolución desde la arquitectura Pascal hasta la arquitectura Hoppe. En la conferencia GTC de 2024, NVIDIA lanzó la arquitectura Blackwell, en la que se actualizó nuevamente NVLink y se lanzó el NVLink de quinta generación, con un ancho de banda de interconexión de 1800GB/s.

Con cada actualización de NVLink, el ancho de banda de interconexión de cada GPU mejora continuamente. La cantidad de GPU que se pueden interconectar entre NVLink también ha aumentado de 4 en la primera generación a 18 en la cuarta generación. La última arquitectura de Blackwell no ha aumentado el número máximo de GPU interconectadas.

Desarrollo NVLink2

Desarrollo NVLink

Como se puede ver en la figura anterior, cada NVLink en P100 tiene solo 40 GB/s, mientras que desde el V100 de segunda generación al H100, cada enlace NVLink tiene 50 GB/s. El ancho de banda general aumenta al aumentar el número de enlaces.

Desarrollo de NVSwitch

La tecnología NVSwitch ha pasado por tres generaciones de evolución y desarrollo desde la arquitectura Volta hasta la arquitectura Hopper. El número de chiplets interconectados por GPU se ha mantenido constante en ocho en cada generación, lo que significa que la estructura básica de la interconexión sigue siendo estable y consistente. Con la actualización de la arquitectura NVLink, el ancho de banda entre GPU ha logrado un aumento significativo, porque NVSwitch es el módulo de chip que lleva NVLink específicamente, de 300 GB/s en la arquitectura Volta a 900 GB/s en la arquitectura Hopper.

A continuación, echemos un vistazo a la relación entre NVLink y NVSwitch en el servidor.

Desarrollo de NVSwitch

Desarrollo de NVSwitch

Como se muestra en la figura anterior, solo hay NVLink en P100 y las GPU están interconectadas a través de CubeMesh. En P100, cada GPU tiene 4 interconexiones y cada 4 forman un CubeMesh.

Mientras que en V100, cada GPU se puede interconectar con otra GPU a través de NVSwitch. En A100, NVSwitch se actualizó nuevamente, ahorrando muchos enlaces. Cada GPU se puede interconectar con cualquier otra GPU a través de NVSwitch.

En H100 se ha producido un nuevo avance tecnológico. Hay 8 tarjetas GPU H100 en una sola máquina y hay un ancho de banda de interconexión bidireccional de 900 GB/s entre dos tarjetas H100 cualesquiera. Vale la pena señalar que en el sistema DGX H100, cuatro NVSwitches reservan 72 conexiones NVLink4 para conectarse a otros sistemas DGX H100 a través del NVLink-Network Switch, lo que facilita la formación de un sistema DGX H100 SuperPod. El ancho de banda bidireccional total de las 72 conexiones NVLink4 es de ~3.6 TB/s.

Resumen

En la era de los grandes modelos, el desarrollo de la inteligencia artificial depende cada vez más de potentes recursos informáticos, especialmente los recursos de GPU. Para entrenar estos modelos grandes, debemos adoptar una estrategia paralela distribuida para distribuir las tareas de entrenamiento del modelo en múltiples GPU o nodos informáticos. Esto no solo implica estrategias como el paralelismo de datos y el paralelismo de modelos, sino que también requiere tecnologías de comunicación distribuida eficientes, como NVLink y NVSwitch, para garantizar una rápida transmisión y sincronización de datos entre diferentes unidades informáticas.

Los marcos de IA en la era de los grandes modelos no solo deben admitir diferentes estrategias paralelas distribuidas, sino que también deben involucrar y tener en cuenta tecnologías de comunicación distribuida como NVLink y NVSwitch para respaldar una comunicación eficiente entre nodos.

A medida que el tamaño del modelo siga creciendo en el futuro, la demanda de recursos informáticos seguirá aumentando. Necesitamos optimizar continuamente las estrategias paralelas distribuidas y desarrollar tecnologías de comunicación distribuida más eficientes. Esto no es sólo una actualización de optimización estratégica en el software, sino que también implica actualizaciones de optimización a nivel de hardware.

NVLink y NVSwitch se actualizan constantemente para mejorar aún más la velocidad y la eficiencia del entrenamiento de modelos de aprendizaje profundo. Comprender estas innovaciones y avances en la tecnología de la comunicación puede ayudarnos a entrenar mejor modelos más grandes e impulsar la inteligencia artificial a un nivel más profundo.

Deja un comentario

Ir al Inicio