هوروفود هو إطار عمل مفتوح المصدر لتدريب التعلم العميق الموزع، تم تطويره بواسطة Uber. يهدف إلى جعل تدريب التعلم العميق الموزع أكثر بساطة وسرعة وسهولة في الاستخدام. يدعم هوروفود أطر عمل التعلم العميق الشائعة مثل TensorFlow و Keras و PyTorch و Apache MXNet.
يدعم هوروفود بشكل أساسي أطر عمل التعلم العميق التالية:
يدعم هوروفود آليات الاتصال التالية:
تعتمد عملية تثبيت هوروفود على إطار عمل التعلم العميق وآلية الاتصال التي تستخدمها. بشكل عام، تحتاج أولاً إلى تثبيت MPI أو NCCL، ثم استخدام pip لتثبيت هوروفود.
على سبيل المثال، لتثبيت هوروفود باستخدام pip ودعم TensorFlow و NCCL، يمكنك تشغيل الأمر التالي:
pip install horovod[tensorflow,gpu]
يرجى الرجوع إلى وثائق هوروفود الرسمية للحصول على تعليمات تثبيت أكثر تفصيلاً: https://github.com/horovod/horovod
يتضمن استخدام هوروفود للتدريب الموزع عادةً الخطوات التالية:
horovod.init()
لتهيئة هوروفود.DistributedOptimizer
: استخدم DistributedOptimizer
الذي يوفره هوروفود لتغليف المحسن الأصلي.فيما يلي مثال بسيط لاستخدام هوروفود للتدريب الموزع باستخدام 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()))
هوروفود هو إطار عمل قوي للتعلم العميق الموزع يمكن أن يساعدك على تدريب نماذج التعلم العميق واسعة النطاق بسهولة وسرعة أكبر. من خلال الاستفادة من وحدات معالجة الرسوميات أو وحدات المعالجة المركزية المتعددة، يمكن لهوروفود تقليل وقت التدريب بشكل كبير وتحسين دقة النموذج.