Home
Login

Horovod ist ein verteiltes Deep-Learning-Trainingsframework für TensorFlow, Keras, PyTorch und Apache MXNet.

NOASSERTIONPython 14.5khorovod Last Updated: 2025-04-22

Horovod: Ein Framework für verteiltes Deep Learning

Einführung

Horovod ist ein Open-Source-Framework für verteiltes Deep-Learning-Training, das von Uber entwickelt wurde. Sein Ziel ist es, das verteilte Deep-Learning-Training einfacher, schneller und benutzerfreundlicher zu gestalten. Horovod unterstützt beliebte Deep-Learning-Frameworks wie TensorFlow, Keras, PyTorch und Apache MXNet.

Kernfunktionen

  • Einfache Bedienung: Horovod bietet eine einfache API, mit der sich Single-Machine-Trainingscode problemlos in verteilten Trainingscode umwandeln lässt.
  • Hohe Leistung: Horovod verwendet effiziente Kommunikationsmechanismen (z. B. MPI und NCCL), um ein schnelles verteiltes Training zu ermöglichen.
  • Skalierbarkeit: Horovod kann auf Hunderte von GPU- oder CPU-Knoten skaliert werden, um umfangreiche Deep-Learning-Modelle und Datensätze zu verarbeiten.
  • Flexibilität: Horovod unterstützt verschiedene Deep-Learning-Frameworks und kann in verschiedene Hardwareplattformen integriert werden.
  • Open Source: Horovod ist ein Open-Source-Projekt mit aktiver Community-Unterstützung.

Hauptvorteile

  • Schnellere Trainingsgeschwindigkeit: Durch das parallele Trainieren von Modellen auf mehreren GPU- oder CPU-Knoten kann Horovod die Trainingszeit erheblich verkürzen.
  • Größere Modellkapazität: Horovod ermöglicht das Trainieren größerer Modelle als in einer Single-Machine-Umgebung, da das Modell auf den Speicher mehrerer Knoten verteilt werden kann.
  • Höherer Datendurchsatz: Horovod kann größere Datensätze verarbeiten, da es Daten parallel auf mehreren Knoten laden und verarbeiten kann.
  • Bessere Ressourcenauslastung: Horovod kann Rechenressourcen effizienter nutzen, da es die Arbeitslast auf mehrere Knoten verteilen kann.

Unterstützte Frameworks

Horovod unterstützt hauptsächlich die folgenden Deep-Learning-Frameworks:

  • TensorFlow: Ein von Google entwickeltes, beliebtes Deep-Learning-Framework.
  • Keras: Eine High-Level-Neural-Network-API, die auf TensorFlow, Theano und CNTK ausgeführt werden kann.
  • PyTorch: Ein weiteres beliebtes Deep-Learning-Framework, das von Facebook entwickelt wurde.
  • Apache MXNet: Ein flexibles und effizientes Deep-Learning-Framework, das von der Apache Foundation entwickelt wurde.

Kommunikationsmechanismen

Horovod unterstützt die folgenden Kommunikationsmechanismen:

  • MPI (Message Passing Interface): Ein Standardprotokoll für die Kommunikation zwischen mehreren Knoten. Horovod verwendet MPI, um den verteilten Trainingsprozess zu koordinieren.
  • NCCL (NVIDIA Collective Communications Library): Eine von NVIDIA entwickelte Bibliothek für die Hochleistungs-Kommunikation zwischen GPUs. Horovod verwendet NCCL, um das verteilte Training auf GPUs zu beschleunigen.
  • gloo: Eine von Facebook entwickelte kollektive Kommunikationsbibliothek, die verschiedene Hardwareplattformen unterstützt.
  • TCP/IP: Horovod kann auch TCP/IP zur Kommunikation verwenden, aber die Leistung ist in der Regel geringer als bei MPI oder NCCL.

Installation

Der Installationsprozess von Horovod hängt von dem verwendeten Deep-Learning-Framework und dem Kommunikationsmechanismus ab. In der Regel müssen Sie zuerst MPI oder NCCL installieren und dann Horovod mit pip installieren.

Um beispielsweise Horovod mit pip zu installieren und TensorFlow und NCCL zu unterstützen, können Sie den folgenden Befehl ausführen:

pip install horovod[tensorflow,gpu]

Detailliertere Installationsanweisungen finden Sie in der offiziellen Horovod-Dokumentation: https://github.com/horovod/horovod

Verwendung

Die Verwendung von Horovod für verteiltes Training umfasst in der Regel die folgenden Schritte:

  1. Horovod initialisieren: Rufen Sie am Anfang des Trainingsskripts horovod.init() auf, um Horovod zu initialisieren.
  2. GPU fixieren (optional): Um die Leistung zu verbessern, kann jeder Prozess an eine bestimmte GPU gebunden werden.
  3. Lernrate skalieren: Da mehrere Knoten für das Training verwendet werden, muss die Lernrate entsprechend der Anzahl der Knoten angepasst werden.
  4. DistributedOptimizer verwenden: Verwenden Sie den von Horovod bereitgestellten DistributedOptimizer, um den ursprünglichen Optimierer zu umschließen.
  5. Anfangszustand übertragen: Übertragen Sie den Anfangszustand des Modells von Rang 0 an alle anderen Ränge.
  6. Checkpoint speichern (nur auf Rang 0): Um doppelte Speicherung zu vermeiden, werden Modell-Checkpoints in der Regel nur auf Rang 0 gespeichert.

Im Folgenden finden Sie ein einfaches Beispiel für die Verwendung von Horovod für verteiltes TensorFlow-Training:

import tensorflow as tf
import horovod.tensorflow as hvd

# 1. Horovod initialisieren
hvd.init()

# 2. GPU fixieren
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. Datensatz laden
(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. Modell erstellen
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. Optimierer definieren
opt = tf.keras.optimizers.Adam(0.001 * hvd.size()) # Lernrate skalieren

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

# 7. Verlustfunktion und Metriken definieren
loss_fn = tf.keras.losses.SparseCategoricalCrossentropy()
metric = tf.keras.metrics.SparseCategoricalAccuracy()

# 8. Trainingsschritt definieren
@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. Anfangsvariablen übertragen
@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. Trainingsschleife
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()))

Best Practices

  • Geeigneten Kommunikationsmechanismus wählen: Wählen Sie den geeigneten Kommunikationsmechanismus (MPI, NCCL, Gloo) basierend auf Ihrer Hardwareplattform und Netzwerkumgebung.
  • Lernrate anpassen: Passen Sie die Lernrate entsprechend der Anzahl der Knoten an, um optimale Trainingsergebnisse zu erzielen.
  • Trainingsprozess überwachen: Verwenden Sie TensorBoard oder andere Tools, um den Trainingsprozess zu überwachen und Probleme zu erkennen und zu beheben.
  • Data Parallelism verwenden: Horovod wird hauptsächlich für Data Parallelism verwendet, d. h. der Datensatz wird in mehrere Teile aufgeteilt und Modellkopien werden auf verschiedenen Knoten trainiert.
  • Data Skew vermeiden: Stellen Sie sicher, dass der Datensatz gleichmäßig auf die einzelnen Knoten verteilt ist, um zu vermeiden, dass Data Skew die Trainingseffizienz beeinträchtigt.

Zusammenfassung

Horovod ist ein leistungsstarkes Framework für verteiltes Deep Learning, mit dem Sie umfangreiche Deep-Learning-Modelle einfacher und schneller trainieren können. Durch die Nutzung mehrerer GPU- oder CPU-Knoten kann Horovod die Trainingszeit erheblich verkürzen und die Genauigkeit des Modells verbessern.

Ressourcen

Alle Details sind der offiziellen Website zu entnehmen (https://github.com/horovod/horovod)