Home
Login
horovod/horovod

Horovod es un framework de entrenamiento de aprendizaje profundo distribuido para TensorFlow, Keras, PyTorch y Apache MXNet.

NOASSERTIONPython 14.5khorovod Last Updated: 2025-04-22
https://github.com/horovod/horovod

Horovod: Framework de Aprendizaje Profundo Distribuido

Introducción

Horovod es un framework de entrenamiento de aprendizaje profundo distribuido de código abierto desarrollado por Uber. Su objetivo es hacer que el entrenamiento de aprendizaje profundo distribuido sea más simple, rápido y fácil de usar. Horovod es compatible con frameworks de aprendizaje profundo populares como TensorFlow, Keras, PyTorch y Apache MXNet.

Características Principales

  • Fácil de usar: Horovod proporciona una API sencilla que facilita la conversión de código de entrenamiento de una sola máquina a código de entrenamiento distribuido.
  • Alto rendimiento: Horovod utiliza mecanismos de comunicación eficientes (por ejemplo, MPI y NCCL) para lograr un entrenamiento distribuido rápido.
  • Escalabilidad: Horovod puede escalar a cientos de nodos GPU o CPU para manejar modelos y conjuntos de datos de aprendizaje profundo a gran escala.
  • Flexibilidad: Horovod admite múltiples frameworks de aprendizaje profundo y se puede integrar con varias plataformas de hardware.
  • Código abierto: Horovod es un proyecto de código abierto con un soporte activo de la comunidad.

Principales Ventajas

  • Mayor velocidad de entrenamiento: Al entrenar modelos en paralelo en múltiples nodos GPU o CPU, Horovod puede reducir significativamente el tiempo de entrenamiento.
  • Mayor capacidad del modelo: Horovod permite entrenar modelos más grandes que en un entorno de una sola máquina, ya que el modelo se puede distribuir en la memoria de múltiples nodos.
  • Mayor rendimiento de datos: Horovod puede manejar conjuntos de datos más grandes, ya que puede cargar y procesar datos en paralelo en múltiples nodos.
  • Mejor utilización de recursos: Horovod puede utilizar los recursos computacionales de manera más eficiente, ya que puede distribuir la carga de trabajo en múltiples nodos.

Frameworks Soportados

Horovod es compatible principalmente con los siguientes frameworks de aprendizaje profundo:

  • TensorFlow: Un framework de aprendizaje profundo popular desarrollado por Google.
  • Keras: Una API de red neuronal de alto nivel que puede ejecutarse sobre TensorFlow, Theano y CNTK.
  • PyTorch: Otro framework de aprendizaje profundo popular desarrollado por Facebook.
  • Apache MXNet: Un framework de aprendizaje profundo flexible y eficiente desarrollado por la Fundación Apache.

Mecanismos de Comunicación

Horovod admite los siguientes mecanismos de comunicación:

  • MPI (Message Passing Interface): Un protocolo estándar para la comunicación entre múltiples nodos. Horovod utiliza MPI para coordinar el proceso de entrenamiento distribuido.
  • NCCL (NVIDIA Collective Communications Library): Una biblioteca desarrollada por NVIDIA para la comunicación de alto rendimiento entre GPU. Horovod utiliza NCCL para acelerar el entrenamiento distribuido en GPU.
  • gloo: Una biblioteca de comunicación colectiva desarrollada por Facebook que admite múltiples plataformas de hardware.
  • TCP/IP: Horovod también puede usar TCP/IP para la comunicación, pero generalmente el rendimiento no es tan bueno como MPI o NCCL.

Instalación

El proceso de instalación de Horovod depende del framework de aprendizaje profundo y el mecanismo de comunicación que esté utilizando. Por lo general, primero debe instalar MPI o NCCL y luego instalar Horovod usando pip.

Por ejemplo, para instalar Horovod usando pip y admitir TensorFlow y NCCL, puede ejecutar el siguiente comando:

pip install horovod[tensorflow,gpu]

Consulte la documentación oficial de Horovod para obtener instrucciones de instalación más detalladas: https://github.com/horovod/horovod

Uso

El uso de Horovod para el entrenamiento distribuido generalmente implica los siguientes pasos:

  1. Inicializar Horovod: Al comienzo del script de entrenamiento, llame a horovod.init() para inicializar Horovod.
  2. Fijar la GPU (opcional): Para mejorar el rendimiento, puede fijar cada proceso a una GPU específica.
  3. Escalar la tasa de aprendizaje: Debido a que se utilizan múltiples nodos para el entrenamiento, es necesario ajustar la tasa de aprendizaje según el número de nodos.
  4. Usar DistributedOptimizer: Utilice el DistributedOptimizer proporcionado por Horovod para envolver el optimizador original.
  5. Difundir el estado inicial: Difunda el estado inicial del modelo desde el rango 0 a todos los demás rangos.
  6. Guardar puntos de control (solo en el rango 0): Para evitar guardar duplicados, generalmente solo se guardan los puntos de control del modelo en el rango 0.

El siguiente es un ejemplo simple de cómo usar Horovod para el entrenamiento distribuido de TensorFlow:

import tensorflow as tf
import horovod.tensorflow as hvd

# 1. Inicializar Horovod
hvd.init()

# 2. Fijar la GPU
gpus = tf.config.experimental.list_physical_devices('GPU')
for gpu in gpus:
    tf.config.experimental.set_memory_growth(gpu, True)
if gpus:
    tf.config.experimental.set_visible_devices(gpus[hvd.local_rank()], 'GPU')

# 3. Cargar el conjunto de datos
(mnist_images, mnist_labels), _ = tf.keras.datasets.mnist.load_data()

dataset = tf.data.Dataset.from_tensor_slices(
    (tf.cast(mnist_images[..., None] / 255.0, tf.float32),
     tf.cast(mnist_labels, tf.int64)))
dataset = dataset.repeat().shuffle(10000).batch(128)

# 4. Construir el modelo
model = tf.keras.models.Sequential([
    tf.keras.layers.Conv2D(32, [3, 3], activation='relu'),
    tf.keras.layers.Conv2D(64, [3, 3], activation='relu'),
    tf.keras.layers.MaxPooling2D(pool_size=(2, 2)),
    tf.keras.layers.Dropout(0.25),
    tf.keras.layers.Flatten(),
    tf.keras.layers.Dense(128, activation='relu'),
    tf.keras.layers.Dropout(0.5),
    tf.keras.layers.Dense(10, activation='softmax')
])

# 5. Definir el optimizador
opt = tf.keras.optimizers.Adam(0.001 * hvd.size()) # Escalar la tasa de aprendizaje

# 6. Usar DistributedOptimizer
opt = hvd.DistributedOptimizer(opt)

# 7. Definir la función de pérdida y las métricas
loss_fn = tf.keras.losses.SparseCategoricalCrossentropy()
metric = tf.keras.metrics.SparseCategoricalAccuracy()

# 8. Definir el paso de entrenamiento
@tf.function
def train_step(images, labels):
    with tf.GradientTape() as tape:
        probs = model(images, training=True)
        loss = loss_fn(labels, probs)

    tape = hvd.DistributedGradientTape(tape)
    gradients = tape.gradient(loss, model.trainable_variables)
    opt.apply_gradients(zip(gradients, model.trainable_variables))
    metric.update_state(labels, probs)
    return loss

# 9. Difundir las variables iniciales
@tf.function
def initialize_vars():
    if hvd.rank() == 0:
        model(tf.zeros((1, 28, 28, 1)))
        hvd.broadcast_variables(model.variables, root_rank=0)
        hvd.broadcast_variables(opt.variables(), root_rank=0)

initialize_vars()

# 10. Bucle de entrenamiento
for batch, (images, labels) in enumerate(dataset.take(10000 // hvd.size())):
    loss = train_step(images, labels)

    if batch % 10 == 0 and hvd.rank() == 0:
        print('batch: %d, loss: %.4f, accuracy: %.2f' % (batch, loss, metric.result()))

Mejores Prácticas

  • Elegir el mecanismo de comunicación adecuado: Elija el mecanismo de comunicación adecuado (MPI, NCCL, Gloo) según su plataforma de hardware y entorno de red.
  • Ajustar la tasa de aprendizaje: Ajuste la tasa de aprendizaje según el número de nodos para obtener los mejores resultados de entrenamiento.
  • Monitorear el proceso de entrenamiento: Utilice TensorBoard u otras herramientas para monitorear el proceso de entrenamiento para detectar y resolver problemas.
  • Usar paralelismo de datos: Horovod se utiliza principalmente para el paralelismo de datos, que consiste en dividir el conjunto de datos en múltiples partes y entrenar copias del modelo en diferentes nodos.
  • Evitar el sesgo de datos: Asegúrese de que el conjunto de datos esté distribuido uniformemente entre los nodos para evitar que el sesgo de datos reduzca la eficiencia del entrenamiento.

Resumen

Horovod es un potente framework de aprendizaje profundo distribuido que puede ayudarle a entrenar modelos de aprendizaje profundo a gran escala de forma más fácil y rápida. Al aprovechar múltiples nodos GPU o CPU, Horovod puede reducir significativamente el tiempo de entrenamiento y mejorar la precisión del modelo.

Recursos

Para obtener todos los detalles, consulte el sitio web oficial (https://github.com/horovod/horovod)