HorovodRunner: وزع التعلم العميق باستخدام Horovod

تعرف على كيفية إجراء التدريب الموزع لنماذج التعلم الآلي باستخدام HorovodRunner لإطلاق مهام تدريب Horovod كوظائف Spark على Azure Databricks.

ما هو HorovodRunner؟

HorovodRunner هي واجهة برمجة تطبيقات عامة لتشغيل أحمال عمل التعلم العميق الموزعة على Azure Databricks باستخدام إطار عمل Horovod . من خلال دمج Horovod مع وضع حاجز Spark، يمكن ل Azure Databricks توفير استقرار أعلى لوظائف التدريب على التعلم العميق طويلة الأمد على Spark. يأخذ HorovodRunner أسلوب Python الذي يحتوي على تعليمة برمجية للتدريب على التعلم العميق مع خطافات Horovod. يلتقط HorovodRunner الأسلوب على برنامج التشغيل ويوزعه على عمال Spark. يتم تضمين وظيفة Horovod MPI كوظيفة Spark باستخدام وضع تنفيذ الحاجز. يجمع المنفذ الأول عناوين IP لجميع منفذي المهام باستخدام BarrierTaskContext وتشغيل مهمة Horovod باستخدام mpirun. تقوم كل عملية Python MPI بتحميل برنامج المستخدم الذي تم انتقاءه، وإلغاء تسلسله، وتشغيله.

HorovodRunner

تدريب موزع باستخدام HorovodRunner

يتيح لك HorovodRunner تشغيل مهام تدريب Horovod كوظائف Spark. تدعم واجهة برمجة تطبيقات HorovodRunner الأساليب الموضحة في الجدول. للحصول على التفاصيل، راجع وثائق واجهة برمجة تطبيقات HorovodRunner.

الأسلوب والتوقيع ‏‏الوصف
init(self, np) إنشاء مثيل HorovodRunner.
run(self, main, **kwargs) قم بتشغيل مهمة تدريب Horovod لاستدعاء main(**kwargs). يتم تسلسل الدالة الرئيسية ووسيطات الكلمة الأساسية باستخدام cloudpickle وتوزيعها على عمال نظام المجموعة.

النهج العام لتطوير برنامج تدريب موزع باستخدام HorovodRunner هو:

  1. إنشاء مثيل HorovodRunner تمت تهيئته بعدد العقد.
  2. حدد أسلوب تدريب Horovod وفقا للأساليب الموضحة في استخدام Horovod، مع التأكد من إضافة أي عبارات استيراد داخل الأسلوب.
  3. مرر أسلوب التدريب إلى المثيل HorovodRunner .

على سبيل المثال:

hr = HorovodRunner(np=2)

def train():
  import tensorflow as tf
  hvd.init()

hr.run(train)

لتشغيل HorovodRunner على برنامج التشغيل فقط مع n العمليات الفرعية، استخدم hr = HorovodRunner(np=-n). على سبيل المثال، إذا كان هناك 4 وحدات معالجة الرسومات على عقدة برنامج التشغيل، يمكنك اختيار n ما يصل إلى 4. للحصول على تفاصيل حول المعلمة np، راجع وثائق HorovodRunner API. للحصول على تفاصيل حول كيفية تثبيت وحدة معالجة الرسومات واحدة لكل عملية فرعية ، راجع دليل استخدام Horovod.

خطأ شائع هو أنه لا يمكن العثور على كائنات TensorFlow أو انتقاءها. يحدث هذا عندما لا يتم توزيع عبارات استيراد المكتبة على المنفذين الآخرين. لتجنب هذه المشكلة، قم بتضمين جميع عبارات الاستيراد (على سبيل المثال، import tensorflow as tf) في أعلى أسلوب تدريب Horovod وداخل أي وظائف أخرى معرفة من قبل المستخدم تسمى في أسلوب تدريب Horovod.

تسجيل تدريب Horovod باستخدام Horovod Timeline

لدى Horovod القدرة على تسجيل المخطط الزمني لنشاطه، المسمى Horovod Timeline.

هام

الخط الزمني Horovod له تأثير كبير على الأداء. يمكن أن ينخفض معدل النقل Inception3 بنسبة ~40٪ عند تمكين مخطط Horovod الزمني. لتسريع مهام HorovodRunner، لا تستخدم Horovod Timeline.

لا يمكنك عرض المخطط الزمني Horovod أثناء التدريب قيد التقدم.

لتسجيل مخطط زمني Horovod، قم بتعيين HOROVOD_TIMELINE متغير البيئة إلى الموقع الذي تريد حفظ ملف المخطط الزمني فيه. توصي Databricks باستخدام موقع على التخزين المشترك بحيث يمكن استرداد ملف المخطط الزمني بسهولة. على سبيل المثال، يمكنك استخدام واجهات برمجة التطبيقات للملف المحلي DBFS كما هو موضح:

timeline_dir = "/dbfs/ml/horovod-timeline/%s" % uuid.uuid4()
os.makedirs(timeline_dir)
os.environ['HOROVOD_TIMELINE'] = timeline_dir + "/horovod_timeline.json"
hr = HorovodRunner(np=4)
hr.run(run_training_horovod, params=params)

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

دفتر ملاحظات مثال على المخطط الزمني Horovod

الحصول على دفتر الملاحظات

لتنزيل ملف المخطط الزمني، استخدم Databricks CLI أو FileStore، ثم استخدم مرفق متصفح chrome://tracing Chrome لعرضه. على سبيل المثال:

Horovod timeline

سير عمل التطوير

هذه هي الخطوات العامة في ترحيل التعليمات البرمجية للتعلم العميق للعقدة الواحدة إلى التدريب الموزع. توضح الأمثلة: الترحيل إلى التعلم العميق الموزع باستخدام HorovodRunner في هذا القسم هذه الخطوات.

  1. إعداد التعليمات البرمجية للعقدة الواحدة: إعداد واختبار التعليمات البرمجية للعقدة الواحدة باستخدام TensorFlow أو Keras أو PyTorch.
  2. الترحيل إلى Horovod: اتبع الإرشادات الواردة من استخدام Horovod لترحيل التعليمات البرمجية باستخدام Horovod واختبارها على برنامج التشغيل:
    1. أضف hvd.init() لتهيئة Horovod.
    2. قم بتثبيت وحدة معالجة الرسومات للخادم لاستخدامها من قبل هذه العملية باستخدام config.gpu_options.visible_device_list. مع الإعداد النموذجي لوحدة معالجة الرسومات واحدة لكل عملية، يمكن تعيين هذا إلى الرتبة المحلية. في هذه الحالة، سيتم تخصيص العملية الأولى على الخادم لوحدة معالجة الرسومات الأولى، وسيتم تخصيص العملية الثانية لوحدة معالجة الرسومات الثانية وما إلى ذلك.
    3. تضمين جزء من مجموعة البيانات. عامل تشغيل مجموعة البيانات هذا مفيد جدا عند تشغيل التدريب الموزع، لأنه يسمح لكل عامل بقراءة مجموعة فرعية فريدة.
    4. تحجيم معدل التعلم حسب عدد العاملين. يتم قياس حجم الدفعة الفعالة في التدريب الموزع المتزامن بعدد العمال. زيادة معدل التعلم يعوض عن زيادة حجم الدفعة.
    5. قم بتضمين المحسن في hvd.DistributedOptimizer. يفوض المحسن الموزع حساب التدرج إلى المحسن الأصلي، ويتوسط التدرجات باستخدام allreduce أو allgather، ثم يطبق التدرج المتوسط.
    6. أضف hvd.BroadcastGlobalVariablesHook(0) لبث الحالات المتغيرة الأولية من المرتبة 0 إلى جميع العمليات الأخرى. وهذا ضروري لضمان تهيئة متسقة لجميع العمال عند بدء التدريب بأوزان عشوائية أو استعادته من نقطة تفتيش. بدلا من ذلك، إذا كنت لا تستخدم MonitoredTrainingSession، يمكنك تنفيذ hvd.broadcast_global_variables العملية بعد تهيئة المتغيرات العمومية.
    7. قم بتعديل التعليمات البرمجية لحفظ نقاط التحقق فقط على العامل 0 لمنع العمال الآخرين من إتلافها.
  3. الترحيل إلى HorovodRunner: يقوم HorovodRunner بتشغيل مهمة تدريب Horovod عن طريق استدعاء دالة Python. يجب تضمين إجراء التدريب الرئيسي في دالة Python واحدة. ثم يمكنك اختبار HorovodRunner في الوضع المحلي ووضع التوزيع.

تحديث مكتبات التعلم العميق

إشعار

تحتوي هذه المقالة على مراجع لمصطلح الرقيق، وهو مصطلح لا يستخدمه Azure Databricks. عند إزالة المصطلح من البرنامج، سنزيله من هذه المقالة.

إذا قمت بترقية TensorFlow أو Keras أو PyTorch أو تخفيضه، يجب إعادة تثبيت Horovod بحيث يتم تحويله برمجيا مقابل المكتبة المثبتة حديثا. على سبيل المثال، إذا كنت ترغب في ترقية TensorFlow، فإن Databricks توصي باستخدام البرنامج النصي init من إرشادات تثبيت TensorFlow وإلحاق رمز تثبيت TensorFlow المحدد التالي ب Horovod في نهايته. راجع إرشادات تثبيت Horovod للعمل مع مجموعات مختلفة، مثل ترقية PyTorch والمكتبات الأخرى أو تخفيضها.

add-apt-repository -y ppa:ubuntu-toolchain-r/test
apt update
# Using the same compiler that TensorFlow was built to compile Horovod
apt install g++-7 -y
update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-7 60 --slave /usr/bin/g++ g++ /usr/bin/g++-7

HOROVOD_GPU_ALLREDUCE=NCCL HOROVOD_CUDA_HOME=/usr/local/cuda pip install horovod==0.18.1 --force-reinstall --no-deps --no-cache-dir

أمثلة: الترحيل إلى التعلم العميق الموزع باستخدام HorovodRunner

توضح الأمثلة التالية، استنادا إلى مجموعة بيانات MNIST ، كيفية ترحيل برنامج التعلم العميق أحادي العقدة لتوزيع التعلم العميق باستخدام HorovodRunner.

القيود

  • عند العمل مع ملفات مساحة العمل، لن يعمل HorovodRunner إذا np تم تعيينه إلى أكبر من 1 واستيراد دفتر الملاحظات من ملفات نسبية أخرى. ضع في اعتبارك استخدام horovod.spark بدلا من HorovodRunner.