Home
Login

هوروفود هو إطار عمل تدريب التعلم العميق الموزع لـ TensorFlow و Keras و PyTorch و Apache MXNet.

NOASSERTIONPython 14.5khorovod Last Updated: 2025-04-22

هوروفود: إطار عمل للتعلم العميق الموزع

مقدمة

هوروفود هو إطار عمل مفتوح المصدر لتدريب التعلم العميق الموزع، تم تطويره بواسطة Uber. يهدف إلى جعل تدريب التعلم العميق الموزع أكثر بساطة وسرعة وسهولة في الاستخدام. يدعم هوروفود أطر عمل التعلم العميق الشائعة مثل TensorFlow و Keras و PyTorch و Apache MXNet.

الميزات الأساسية

  • سهولة الاستخدام: يوفر هوروفود واجهات برمجة تطبيقات (APIs) بسيطة تجعل من السهل تحويل كود التدريب على جهاز واحد إلى كود تدريب موزع.
  • أداء عالي: يستخدم هوروفود آليات اتصال فعالة (مثل MPI و NCCL) لتحقيق تدريب موزع سريع.
  • قابلية التوسع: يمكن توسيع نطاق هوروفود ليشمل مئات من وحدات معالجة الرسوميات (GPUs) أو وحدات المعالجة المركزية (CPUs) للتعامل مع نماذج ومجموعات بيانات التعلم العميق واسعة النطاق.
  • المرونة: يدعم هوروفود مجموعة متنوعة من أطر عمل التعلم العميق ويمكن دمجه مع مختلف منصات الأجهزة.
  • مفتوح المصدر: هوروفود هو مشروع مفتوح المصدر يتمتع بدعم مجتمعي نشط.

المزايا الرئيسية

  • سرعة تدريب أسرع: من خلال تدريب النماذج بالتوازي على وحدات معالجة الرسوميات أو وحدات المعالجة المركزية متعددة، يمكن لهوروفود تقليل وقت التدريب بشكل كبير.
  • سعة نموذج أكبر: يسمح هوروفود بتدريب نماذج أكبر من تلك التي يمكن تدريبها في بيئة جهاز واحد، حيث يمكن توزيع النموذج عبر ذاكرة العديد من العقد.
  • إنتاجية بيانات أعلى: يمكن لهوروفود معالجة مجموعات بيانات أكبر لأنه يمكنه تحميل ومعالجة البيانات بالتوازي على العديد من العقد.
  • استخدام أفضل للموارد: يمكن لهوروفود استخدام موارد الحوسبة بشكل أكثر كفاءة لأنه يمكنه توزيع أعباء العمل عبر العديد من العقد.

الأطر المدعومة

يدعم هوروفود بشكل أساسي أطر عمل التعلم العميق التالية:

  • TensorFlow: إطار عمل التعلم العميق الشهير الذي طورته Google.
  • Keras: واجهة برمجة تطبيقات (API) للشبكات العصبية عالية المستوى يمكن تشغيلها فوق TensorFlow و Theano و CNTK.
  • PyTorch: إطار عمل آخر شهير للتعلم العميق طورته Facebook.
  • Apache MXNet: إطار عمل مرن وفعال للتعلم العميق طورته مؤسسة Apache.

آليات الاتصال

يدعم هوروفود آليات الاتصال التالية:

  • MPI (واجهة تمرير الرسائل): بروتوكول قياسي للاتصال بين العقد المتعددة. يستخدم هوروفود MPI لتنسيق عملية التدريب الموزع.
  • NCCL (مكتبة NVIDIA للاتصالات الجماعية): مكتبة طورتها NVIDIA للاتصالات عالية الأداء بين وحدات معالجة الرسوميات. يستخدم هوروفود NCCL لتسريع التدريب الموزع على وحدات معالجة الرسوميات.
  • gloo: مكتبة اتصالات جماعية طورتها Facebook، تدعم العديد من منصات الأجهزة.
  • TCP/IP: يمكن لهوروفود أيضًا استخدام TCP/IP للاتصال، ولكن عادةً ما يكون الأداء أقل من MPI أو NCCL.

التثبيت

تعتمد عملية تثبيت هوروفود على إطار عمل التعلم العميق وآلية الاتصال التي تستخدمها. بشكل عام، تحتاج أولاً إلى تثبيت MPI أو NCCL، ثم استخدام pip لتثبيت هوروفود.

على سبيل المثال، لتثبيت هوروفود باستخدام pip ودعم TensorFlow و NCCL، يمكنك تشغيل الأمر التالي:

pip install horovod[tensorflow,gpu]

يرجى الرجوع إلى وثائق هوروفود الرسمية للحصول على تعليمات تثبيت أكثر تفصيلاً: https://github.com/horovod/horovod

كيفية الاستخدام

يتضمن استخدام هوروفود للتدريب الموزع عادةً الخطوات التالية:

  1. تهيئة هوروفود: في بداية برنامج التدريب النصي، قم باستدعاء horovod.init() لتهيئة هوروفود.
  2. تثبيت وحدة معالجة الرسوميات (اختياري): لتحسين الأداء، يمكن تثبيت كل عملية على وحدة معالجة رسوميات معينة.
  3. توسيع نطاق معدل التعلم: نظرًا لاستخدام العديد من العقد للتدريب، يجب تعديل معدل التعلم وفقًا لعدد العقد.
  4. استخدام DistributedOptimizer: استخدم DistributedOptimizer الذي يوفره هوروفود لتغليف المحسن الأصلي.
  5. بث الحالة الأولية: قم ببث الحالة الأولية للنموذج من الرتبة 0 إلى جميع الرتب الأخرى.
  6. حفظ نقاط التفتيش (فقط على الرتبة 0): لتجنب الحفظ المتكرر، عادةً ما يتم حفظ نقاط تفتيش النموذج فقط على الرتبة 0.

فيما يلي مثال بسيط لاستخدام هوروفود للتدريب الموزع باستخدام TensorFlow:

import tensorflow as tf
import horovod.tensorflow as hvd

# 1. تهيئة هوروفود
hvd.init()

# 2. تثبيت وحدة معالجة الرسوميات
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. تحميل مجموعة البيانات
(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. بناء النموذج
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. تعريف المحسن
opt = tf.keras.optimizers.Adam(0.001 * hvd.size()) # توسيع نطاق معدل التعلم

# 6. استخدام DistributedOptimizer
opt = hvd.DistributedOptimizer(opt)

# 7. تعريف دالة الخسارة والمقاييس
loss_fn = tf.keras.losses.SparseCategoricalCrossentropy()
metric = tf.keras.metrics.SparseCategoricalAccuracy()

# 8. تعريف خطوة التدريب
@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. بث المتغيرات الأولية
@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. حلقة التدريب
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()))

أفضل الممارسات

  • اختيار آلية الاتصال المناسبة: اختر آلية الاتصال المناسبة (MPI, NCCL, Gloo) بناءً على منصة الأجهزة وبيئة الشبكة الخاصة بك.
  • تعديل معدل التعلم: قم بتعديل معدل التعلم وفقًا لعدد العقد للحصول على أفضل نتائج التدريب.
  • مراقبة عملية التدريب: استخدم TensorBoard أو أدوات أخرى لمراقبة عملية التدريب للكشف عن المشكلات وحلها.
  • استخدام التوازي في البيانات: يستخدم هوروفود بشكل أساسي للتوازي في البيانات، أي تقسيم مجموعة البيانات إلى أجزاء متعددة وتدريب نسخ من النموذج على عقد مختلفة.
  • تجنب انحراف البيانات: تأكد من توزيع مجموعة البيانات بالتساوي بين العقد لتجنب انحراف البيانات الذي يؤدي إلى انخفاض كفاءة التدريب.

ملخص

هوروفود هو إطار عمل قوي للتعلم العميق الموزع يمكن أن يساعدك على تدريب نماذج التعلم العميق واسعة النطاق بسهولة وسرعة أكبر. من خلال الاستفادة من وحدات معالجة الرسوميات أو وحدات المعالجة المركزية المتعددة، يمكن لهوروفود تقليل وقت التدريب بشكل كبير وتحسين دقة النموذج.

مصادر

جميع التفاصيل، يرجى الرجوع إلى الموقع الرسمي (https://github.com/horovod/horovod)