مساعدة في حماية الحاجز المرجاني العظيم مع TensorFlow على Kaggle تاريخ التحدي

التدريب الموزع مع TensorFlow

عرض على TensorFlow.org تشغيل في Google Colab عرض المصدر على جيثب تحميل دفتر

ملخص

tf.distribute.Strategy هو API TensorFlow لتوزيع تدريب عبر وحدات معالجة الرسومات المتعددة، وآلات متعددة، أو TPUs. باستخدام واجهة برمجة التطبيقات هذه ، يمكنك توزيع النماذج الحالية ورمز التدريب الخاص بك مع الحد الأدنى من التغييرات في التعليمات البرمجية.

tf.distribute.Strategy وقد صمم مع هذه الأهداف الرئيسية في الاعتبار:

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

يمكنك توزيع التدريب باستخدام tf.distribute.Strategy مع API رفيعة المستوى مثل Keras Model.fit ، فضلا عن الحلقات التدريبية المخصصة (وبصفة عامة، فإن أي حساب باستخدام TensorFlow).

في TensorFlow الإصدار 2.x، يمكنك تنفيذ البرامج بفارغ الصبر، أو في الرسم البياني باستخدام tf.function . tf.distribute.Strategy تعتزم دعم كل هذه الأوضاع التنفيذ، ولكن يعمل بشكل أفضل مع tf.function . ويوصى وضع حريصة فقط لأغراض التصحيح وغير معتمدة ل tf.distribute.TPUStrategy . على الرغم من أن التدريب هو محور هذا الدليل ، إلا أنه يمكن أيضًا استخدام واجهة برمجة التطبيقات هذه لتوزيع التقييم والتنبؤ على منصات مختلفة.

يمكنك استخدام tf.distribute.Strategy مع تغييرات قليلة جدا من التعليمات البرمجية، لأن المكونات الأساسية للTensorFlow تم تغيير لتصبح استراتيجية بين علم. يتضمن ذلك المتغيرات والطبقات والنماذج والمحسِّنون والمقاييس والملخصات ونقاط التحقق.

في هذا الدليل ، ستتعرف على أنواع مختلفة من الاستراتيجيات وكيف يمكنك استخدامها في مواقف مختلفة. لمعرفة كيفية مشكلات في الأداء التصحيح، وتحقق من الأداء الأمثل TensorFlow GPU دليل.

قم بإعداد TensorFlow

import tensorflow as tf

أنواع الاستراتيجيات

tf.distribute.Strategy تعتزم تغطية عدد من حالات الاستخدام على طول محاور مختلفة. بعض هذه المجموعات مدعومة حاليًا وستتم إضافة البعض الآخر في المستقبل. بعض هذه المحاور هي:

  • متزامن مقابل التدريب غير متزامن: هذه هي اثنين من الطرق الشائعة لتوزيع التدريب مع التوازي البيانات. في التدريب المتزامن ، يتدرب جميع العمال على شرائح مختلفة من بيانات الإدخال المتزامنة ، ويجمعون التدرجات في كل خطوة. في التدريب غير المتزامن ، يتم تدريب جميع العمال بشكل مستقل على بيانات الإدخال وتحديث المتغيرات بشكل غير متزامن. عادةً ما يتم دعم تدريب المزامنة عبر تقليل الكل وغير المتزامن من خلال بنية خادم المعلمات.
  • منصة الأجهزة: قد تحتاج إلى توسيع نطاق التدريب الخاص بك على وحدات معالجة الرسومات متعددة على جهاز واحد، أو عدة آلات في الشبكة (مع 0 أو أكثر وحدات معالجة الرسومات لكل منهما)، أو على الغيمة TPUs.

من أجل دعم هذه حالات الاستخدام، TensorFlow ديه MirroredStrategy ، TPUStrategy ، MultiWorkerMirroredStrategy ، ParameterServerStrategy ، CentralStorageStrategy ، فضلا عن غيرها من الاستراتيجيات المتاحة. يوضح القسم التالي أيًا منها مدعوم في أي سيناريوهات في TensorFlow. فيما يلي نظرة عامة سريعة:

تدريب API MirroredStrategy TPUStrategy MultiWorkerMirroredStrategy CentralStorageStrategy ParameterServerStrategy
Keras Model.fit أيد أيد أيد دعم تجريبي دعم تجريبي
حلقة تدريب مخصصة أيد أيد أيد دعم تجريبي دعم تجريبي
مقدر API دعم محدود غير مدعوم دعم محدود دعم محدود دعم محدود

استراتيجية

tf.distribute.MirroredStrategy الدعم متزامن توزيع التدريب على وحدات معالجة الرسومات متعددة على جهاز واحد. يقوم بإنشاء نسخة متماثلة واحدة لكل جهاز GPU. يتم عكس كل متغير في النموذج عبر جميع النسخ المتماثلة. معا، وهذه المتغيرات تشكل متغير المفاهيمي واحد يسمى MirroredVariable . يتم الاحتفاظ بهذه المتغيرات متزامنة مع بعضها البعض من خلال تطبيق تحديثات متطابقة.

تُستخدم خوارزميات فعالة لتقليل كل شيء لتوصيل التحديثات المتغيرة عبر الأجهزة. كل ذلك يقلل من موترات الركام عبر جميع الأجهزة عن طريق إضافتها وإتاحتها على كل جهاز. إنها خوارزمية مدمجة وفعالة للغاية ويمكن أن تقلل من عبء المزامنة بشكل كبير. تتوفر العديد من الخوارزميات والتطبيقات التي تعمل بتقليل الاختصار ، اعتمادًا على نوع الاتصال المتاح بين الأجهزة. افتراضيا، فإنه يستخدم مكتبة الاتصالات الجماعية NVIDIA ( NCCL )، وتنفيذ جميع تقليل. يمكنك الاختيار من بين عدد قليل من الخيارات الأخرى أو الكتابة الخاصة بك.

هنا هو أبسط وسيلة لخلق MirroredStrategy :

mirrored_strategy = tf.distribute.MirroredStrategy()
INFO:tensorflow:Using MirroredStrategy with devices ('/job:localhost/replica:0/task:0/device:GPU:0',)

وهذا خلق MirroredStrategy سبيل المثال، والتي سوف تستخدم جميع وحدات معالجة الرسومات التي هي واضحة إلى TensorFlow، وNCCL-مثل الاتصالات عبر الجهاز.

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

mirrored_strategy = tf.distribute.MirroredStrategy(devices=["/gpu:0", "/gpu:1"])
WARNING:tensorflow:Some requested devices in `tf.distribute.Strategy` are not visible to TensorFlow: /job:localhost/replica:0/task:0/device:GPU:1,/job:localhost/replica:0/task:0/device:GPU:0
INFO:tensorflow:Using MirroredStrategy with devices ('/job:localhost/replica:0/task:0/device:GPU:0', '/job:localhost/replica:0/task:0/device:GPU:1')

إذا كنت ترغب في تجاوز جهاز الاتصالات عبر، يمكنك القيام بذلك باستخدام cross_device_ops الحجة توريد مثيل tf.distribute.CrossDeviceOps . حاليا، tf.distribute.HierarchicalCopyAllReduce و tf.distribute.ReductionToOneDevice خياران أخرى من tf.distribute.NcclAllReduce ، الذي هو الافتراضي.

mirrored_strategy = tf.distribute.MirroredStrategy(
    cross_device_ops=tf.distribute.HierarchicalCopyAllReduce())
INFO:tensorflow:Using MirroredStrategy with devices ('/job:localhost/replica:0/task:0/device:GPU:0',)

TPUS الإستراتيجية

tf.distribute.TPUStrategy يتيح لك تشغيل التدريب TensorFlow الخاصة بك على وحدات معالجة التنسور (TPUs) . TPUs هي ASICs المتخصصة من Google والمصممة لتسريع أعباء عمل التعلم الآلي بشكل كبير. وهي متاحة على جوجل Colab ، و الغيمة البحوث TPU ، و الغيمة TPU .

من حيث الهندسة المعمارية التدريب الموزعة، TPUStrategy هو نفسه MirroredStrategy -من الأدوات متزامن التدريب الموزعة. TPUs توفير تنفيذها للعمليات الجماعية كفاءة كل خفض وغيرها عبر النوى TPU متعددة، والتي تستخدم في TPUStrategy .

هنا هو كيف سيكون مثيل TPUStrategy :

cluster_resolver = tf.distribute.cluster_resolver.TPUClusterResolver(
    tpu=tpu_address)
tf.config.experimental_connect_to_cluster(cluster_resolver)
tf.tpu.experimental.initialize_tpu_system(cluster_resolver)
tpu_strategy = tf.distribute.TPUStrategy(cluster_resolver)

و TPUClusterResolver المثال يساعد على تحديد موقع TPUs. في Colab ، لا تحتاج إلى تحديد أي حجج لها.

إذا كنت تريد استخدام هذا لـ Cloud TPU:

  • يجب عليك تحديد اسم مورد TPU الخاصة بك في tpu حجة.
  • يجب تهيئة نظام TPU صراحة في بداية البرنامج. هذا مطلوب قبل استخدام TPUs للحساب. يؤدي بدء تشغيل نظام TPU أيضًا إلى مسح ذاكرة TPU ، لذلك من المهم إكمال هذه الخطوة أولاً لتجنب فقدان الحالة.

MultiWorkerMirroredStrategy

tf.distribute.MultiWorkerMirroredStrategy هي مشابهة جدا ل MirroredStrategy . ينفذ تدريبًا موزعًا متزامنًا عبر عدة عمال ، لكل منهم وحدات معالجة رسومات متعددة محتملة. على غرار tf.distribute.MirroredStrategy ، فإنه يخلق نسخ من كل المتغيرات في النموذج على كل جهاز في جميع العمال.

هنا هو أبسط وسيلة لخلق MultiWorkerMirroredStrategy :

strategy = tf.distribute.MultiWorkerMirroredStrategy()
WARNING:tensorflow:Collective ops is not configured at program startup. Some performance features may not be enabled.
INFO:tensorflow:Single-worker MultiWorkerMirroredStrategy with local_devices = ('/device:GPU:0',), communication = CommunicationImplementation.AUTO

MultiWorkerMirroredStrategy اثنين من تطبيقات الاتصالات عبر الجهاز. CommunicationImplementation.RING هو RPC مقرها ويدعم كلا من وحدات المعالجة المركزية وحدات معالجة الرسومات. CommunicationImplementation.NCCL يستخدم NCCL ويوفر للدولة من الفن الأداء على وحدات معالجة الرسومات لكنها لا تدعم وحدات المعالجة المركزية. CollectiveCommunication.AUTO يرجئ خيار Tensorflow. يمكنك تحديدها بالطريقة التالية:

communication_options = tf.distribute.experimental.CommunicationOptions(
    implementation=tf.distribute.experimental.CommunicationImplementation.NCCL)
strategy = tf.distribute.MultiWorkerMirroredStrategy(
    communication_options=communication_options)
WARNING:tensorflow:Collective ops is not configured at program startup. Some performance features may not be enabled.
INFO:tensorflow:Single-worker MultiWorkerMirroredStrategy with local_devices = ('/device:GPU:0',), communication = CommunicationImplementation.NCCL

أحد الاختلافات الرئيسية للحصول على تدريب متعدد العمال ، مقارنةً بالتدريب على وحدات معالجة الرسومات المتعددة ، هو الإعداد متعدد العمال. و 'TF_CONFIG' متغير البيئة هو طريقة قياسية في TensorFlow لتحديد تكوين الكتلة إلى كل عامل الذي هو جزء من الكتلة. مزيد من المعلومات في إنشاء قسم TF_CONFIG من هذه الوثيقة.

لمزيد من التفاصيل حول MultiWorkerMirroredStrategy ، والنظر في الدروس التالية:

ParameterServerStrategy

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

في TensorFlow 2، يستخدم التدريب الخادم المعلمة بنية المركزية على أساس منسق عبر tf.distribute.experimental.coordinator.ClusterCoordinator الصف.

في هذا التطبيق، و worker و parameter server تشغيل المهام tf.distribute.Server الصورة أن الاستماع للمهام من منسق. ينشئ المنسق الموارد ويرسل مهام التدريب ويكتب نقاط التفتيش ويتعامل مع فشل المهام.

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

strategy = tf.distribute.experimental.ParameterServerStrategy(
    tf.distribute.cluster_resolver.TFConfigClusterResolver(),
    variable_partitioner=variable_partitioner)
coordinator = tf.distribute.experimental.coordinator.ClusterCoordinator(
    strategy)

لمعرفة المزيد عن ParameterServerStrategy ، وتحقق من التدريب الخادم المعلمة مع Keras Model.fit والتدريب المخصصة حلقة البرنامج التعليمي.

في TensorFlow 1، ParameterServerStrategy لا تتوفر إلا مع مقدر عبر tf.compat.v1.distribute.experimental.ParameterServerStrategy الرمز.

إستراتيجية CentralStorage

tf.distribute.experimental.CentralStorageStrategy يفعل التدريب متزامن أيضا. لا يتم عكس المتغيرات ، بدلاً من ذلك يتم وضعها على وحدة المعالجة المركزية ويتم تكرار العمليات عبر جميع وحدات معالجة الرسومات المحلية. إذا كان هناك GPU واحد فقط ، فسيتم وضع جميع المتغيرات والعمليات على GPU.

إنشاء مثيل من CentralStorageStrategy حسب:

central_storage_strategy = tf.distribute.experimental.CentralStorageStrategy()
INFO:tensorflow:ParameterServerStrategy (CentralStorageStrategy if you are using a single machine) with compute_devices = ['/job:localhost/replica:0/task:0/device:GPU:0'], variable_device = '/job:localhost/replica:0/task:0/device:GPU:0'

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

استراتيجيات أخرى

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

الإستراتيجية الافتراضية

الإستراتيجية الافتراضية هي إستراتيجية توزيع تكون موجودة عندما لا توجد إستراتيجية توزيع واضحة في النطاق. فإنه يطبق tf.distribute.Strategy اجهة ولكن تمريرة من خلال ولا يقدم أي التوزيع الفعلي. على سبيل المثال، Strategy.run(fn) ومجرد دعوة fn . يجب أن يتصرف الكود المكتوب باستخدام هذه الإستراتيجية تمامًا مثل الكود المكتوب بدون أي استراتيجية. يمكنك التفكير في الأمر على أنه إستراتيجية "عدم التشغيل".

الإستراتيجية الافتراضية هي إستراتيجية مفردة - ولا يمكن للمرء إنشاء المزيد منها. ويمكن الحصول عليها باستخدام tf.distribute.get_strategy خارج نطاق أي استراتيجية واضحة في (نفس API التي يمكن استخدامها للحصول على الاستراتيجية الحالية داخل نطاق استراتيجية واضحة ل).

default_strategy = tf.distribute.get_strategy()

تخدم هذه الاستراتيجية غرضين رئيسيين:

  • يسمح لكتابة كود مكتبة مدرك للتوزيع دون قيد أو شرط. على سبيل المثال، في tf.optimizer يالي يمكنك استخدام tf.distribute.get_strategy واستخدام هذه الاستراتيجية للحد من التدرجات-سيكون دائما إرجاع كائن استراتيجية التي يمكنك استدعاء Strategy.reduce API.
# In optimizer or other library code
# Get currently active strategy
strategy = tf.distribute.get_strategy()
strategy.reduce("SUM", 1., axis=None)  # reduce some values
1.0
  • على غرار رمز المكتبة ، يمكن استخدامه لكتابة برامج المستخدمين النهائيين للعمل مع استراتيجية التوزيع وبدونها ، دون الحاجة إلى منطق شرطي. إليك نموذج مقتطف رمز يوضح هذا:
if tf.config.list_physical_devices('GPU'):
  strategy = tf.distribute.MirroredStrategy()
else:  # Use the Default Strategy
  strategy = tf.distribute.get_strategy()

with strategy.scope():
  # Do something interesting
  print(tf.Variable(1.))
INFO:tensorflow:Using MirroredStrategy with devices ('/job:localhost/replica:0/task:0/device:GPU:0',)
MirroredVariable:{
  0: <tf.Variable 'Variable:0' shape=() dtype=float32, numpy=1.0>
}

OneDeviceStrategy

tf.distribute.OneDeviceStrategy هي استراتيجية لوضع كافة المتغيرات والحساب على جهاز معين واحد.

strategy = tf.distribute.OneDeviceStrategy(device="/gpu:0")

تختلف هذه الإستراتيجية عن الإستراتيجية الافتراضية بعدة طرق. في الإستراتيجية الافتراضية ، يظل منطق الموضع المتغير بدون تغيير عند مقارنته بتشغيل TensorFlow بدون أي استراتيجية توزيع. ولكن عند استخدام OneDeviceStrategy ، كل المتغيرات التي تم إنشاؤها في نطاقه يتم وضعها بشكل واضح على الجهاز المحدد. وعلاوة على ذلك، فإن أي وظائف دعا عبر OneDeviceStrategy.run كما سيتم وضعها على الجهاز المحدد.

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

على غرار الإستراتيجية الافتراضية ، يمكن أيضًا استخدام هذه الإستراتيجية لاختبار التعليمات البرمجية الخاصة بك قبل التبديل إلى الاستراتيجيات الأخرى التي توزع فعليًا على أجهزة / أجهزة متعددة. وستكون هذه العملية آلية استراتيجية التوزيع إلى حد ما أكثر من استراتيجية افتراضي، ولكن ليس على المدى الكامل للاستخدام، على سبيل المثال، MirroredStrategy أو TPUStrategy . إذا كنت تريد رمزًا يتصرف كما لو لم تكن هناك استراتيجية ، فاستخدم الإستراتيجية الافتراضية.

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

استخدم tf.distribute.Strategy مع Keras Model.fit

tf.distribute.Strategy ودمجها tf.keras ، وهو تنفيذ TensorFlow للل مواصفات API Keras . tf.keras هو API رفيع المستوى لبناء وتدريب النماذج. بواسطة الاندماج في tf.keras الخلفية، انها سلس بالنسبة لك لتوزيع التدريب الخاص بك مكتوب في إطار التدريب Keras باستخدام Model.fit .

إليك ما تحتاج إلى تغييره في التعليمات البرمجية الخاصة بك:

  1. إنشاء مثيل من المناسب tf.distribute.Strategy .
  2. نقل إنشاء Keras نموذج، محسن والمقاييس داخل strategy.scope .

استراتيجيات التوزيع TensorFlow تدعم جميع أنواع Keras models- متسلسل ، وظيفية ، و subclassed .

وفيما يلي مقتطف من رمز للقيام بذلك لنموذج Keras بسيط جدا مع واحد Dense طبقة:

mirrored_strategy = tf.distribute.MirroredStrategy()

with mirrored_strategy.scope():
  model = tf.keras.Sequential([tf.keras.layers.Dense(1, input_shape=(1,))])

model.compile(loss='mse', optimizer='sgd')
INFO:tensorflow:Using MirroredStrategy with devices ('/job:localhost/replica:0/task:0/device:GPU:0',)
INFO:tensorflow:Reduce to /job:localhost/replica:0/task:0/device:CPU:0 then broadcast to ('/job:localhost/replica:0/task:0/device:CPU:0',).
INFO:tensorflow:Reduce to /job:localhost/replica:0/task:0/device:CPU:0 then broadcast to ('/job:localhost/replica:0/task:0/device:CPU:0',).
INFO:tensorflow:Reduce to /job:localhost/replica:0/task:0/device:CPU:0 then broadcast to ('/job:localhost/replica:0/task:0/device:CPU:0',).
INFO:tensorflow:Reduce to /job:localhost/replica:0/task:0/device:CPU:0 then broadcast to ('/job:localhost/replica:0/task:0/device:CPU:0',).

يستخدم هذا المثال MirroredStrategy ، حتى تتمكن من تشغيل هذا على جهاز مع وحدات معالجة الرسومات المتعددة. strategy.scope() يشير إلى Keras التي استراتيجية لاستخدام لتوزيع التدريب. يتيح لك إنشاء النماذج / المُحسِّنون / المقاييس داخل هذا النطاق إنشاء متغيرات موزعة بدلاً من المتغيرات العادية. بمجرد إعداد هذا ، يمكنك ملاءمة النموذج الخاص بك كما تفعل عادةً. MirroredStrategy يعتني تكرار التدريب للنموذج على وحدات معالجة الرسومات المتاحة، تجميع التدرجات، وأكثر من ذلك.

dataset = tf.data.Dataset.from_tensors(([1.], [1.])).repeat(100).batch(10)
model.fit(dataset, epochs=2)
model.evaluate(dataset)
Epoch 1/2
INFO:tensorflow:Reduce to /job:localhost/replica:0/task:0/device:CPU:0 then broadcast to ('/job:localhost/replica:0/task:0/device:CPU:0',).
INFO:tensorflow:Reduce to /job:localhost/replica:0/task:0/device:CPU:0 then broadcast to ('/job:localhost/replica:0/task:0/device:CPU:0',).
2021-10-26 01:27:56.527729: W tensorflow/core/grappler/optimizers/data/auto_shard.cc:695] AUTO sharding policy will apply DATA sharding policy as it failed to apply FILE sharding policy because of the following reason: Found an unshardable source dataset: name: "TensorDataset/_2"
op: "TensorDataset"
input: "Placeholder/_0"
input: "Placeholder/_1"
attr {
  key: "Toutput_types"
  value {
    list {
      type: DT_FLOAT
      type: DT_FLOAT
    }
  }
}
attr {
  key: "output_shapes"
  value {
    list {
      shape {
        dim {
          size: 1
        }
      }
      shape {
        dim {
          size: 1
        }
      }
    }
  }
}
INFO:tensorflow:Reduce to /job:localhost/replica:0/task:0/device:CPU:0 then broadcast to ('/job:localhost/replica:0/task:0/device:CPU:0',).
INFO:tensorflow:Reduce to /job:localhost/replica:0/task:0/device:CPU:0 then broadcast to ('/job:localhost/replica:0/task:0/device:CPU:0',).
10/10 [==============================] - 3s 2ms/step - loss: 2.2552
INFO:tensorflow:Reduce to /job:localhost/replica:0/task:0/device:CPU:0 then broadcast to ('/job:localhost/replica:0/task:0/device:CPU:0',).
INFO:tensorflow:Reduce to /job:localhost/replica:0/task:0/device:CPU:0 then broadcast to ('/job:localhost/replica:0/task:0/device:CPU:0',).
Epoch 2/2
10/10 [==============================] - 0s 2ms/step - loss: 0.9968
2021-10-26 01:27:59.372113: W tensorflow/core/grappler/optimizers/data/auto_shard.cc:695] AUTO sharding policy will apply DATA sharding policy as it failed to apply FILE sharding policy because of the following reason: Found an unshardable source dataset: name: "TensorDataset/_2"
op: "TensorDataset"
input: "Placeholder/_0"
input: "Placeholder/_1"
attr {
  key: "Toutput_types"
  value {
    list {
      type: DT_FLOAT
      type: DT_FLOAT
    }
  }
}
attr {
  key: "output_shapes"
  value {
    list {
      shape {
        dim {
          size: 1
        }
      }
      shape {
        dim {
          size: 1
        }
      }
    }
  }
}
10/10 [==============================] - 1s 2ms/step - loss: 0.6190
0.6190494298934937

هنا tf.data.Dataset يوفر التدريب وإدخال حدة التقييم. يمكنك أيضًا استخدام مصفوفات NumPy:

import numpy as np

inputs, targets = np.ones((100, 1)), np.ones((100, 1))
model.fit(inputs, targets, epochs=2, batch_size=10)
Epoch 1/2
2021-10-26 01:28:00.609977: W tensorflow/core/grappler/optimizers/data/auto_shard.cc:695] AUTO sharding policy will apply DATA sharding policy as it failed to apply FILE sharding policy because of the following reason: Did not find a shardable source, walked to a node which is not a dataset: name: "FlatMapDataset/_9"
op: "FlatMapDataset"
input: "PrefetchDataset/_8"
attr {
  key: "Targuments"
  value {
    list {
    }
  }
}
attr {
  key: "f"
  value {
    func {
      name: "__inference_Dataset_flat_map_slice_batch_indices_997"
    }
  }
}
attr {
  key: "output_shapes"
  value {
    list {
      shape {
        dim {
          size: 10
        }
      }
    }
  }
}
attr {
  key: "output_types"
  value {
    list {
      type: DT_INT64
    }
  }
}
. Consider either turning off auto-sharding or switching the auto_shard_policy to DATA to shard this dataset. You can do this by creating a new `tf.data.Options()` object then setting `options.experimental_distribute.auto_shard_policy = AutoShardPolicy.DATA` before applying the options object to the dataset via `dataset.with_options(options)`.
10/10 [==============================] - 1s 2ms/step - loss: 0.4406
Epoch 2/2
10/10 [==============================] - 0s 2ms/step - loss: 0.1947
<keras.callbacks.History at 0x7fb81813d2d0>

في كلتا الحالتين مع Dataset أو نمباي-كل دفعة من مدخلات معينة وتنقسم بالتساوي بين عدة نسخ متماثلة. على سبيل المثال، إذا كنت تستخدم MirroredStrategy مع 2 وحدات معالجة الرسومات، كل دفعة من حجم 10 وسيتم تقسيم بين وحدات معالجة الرسومات 2، مع كل المتلقي 5 أمثلة الإدخال في كل خطوة. ستتدرب كل فترة بعد ذلك بشكل أسرع كلما أضفت المزيد من وحدات معالجة الرسومات. عادة ، قد ترغب في زيادة حجم الدفعة الخاصة بك مع إضافة المزيد من المسرعات ، وذلك للاستفادة الفعالة من قوة الحوسبة الإضافية. ستحتاج أيضًا إلى إعادة ضبط معدل التعلم الخاص بك ، اعتمادًا على النموذج. يمكنك استخدام strategy.num_replicas_in_sync للحصول على عدد من النسخ المتماثلة.

# Compute a global batch size using a number of replicas.
BATCH_SIZE_PER_REPLICA = 5
global_batch_size = (BATCH_SIZE_PER_REPLICA *
                     mirrored_strategy.num_replicas_in_sync)
dataset = tf.data.Dataset.from_tensors(([1.], [1.])).repeat(100)
dataset = dataset.batch(global_batch_size)

LEARNING_RATES_BY_BATCH_SIZE = {5: 0.1, 10: 0.15}
learning_rate = LEARNING_RATES_BY_BATCH_SIZE[global_batch_size]

ما الذي يتم دعمه الآن؟

تدريب API MirroredStrategy TPUStrategy MultiWorkerMirroredStrategy ParameterServerStrategy CentralStorageStrategy
Keras Model.fit أيد أيد أيد دعم تجريبي دعم تجريبي

أمثلة ودروس

وهنا لائحة من الدروس والأمثلة التي توضح التكامل أعلاه نهاية إلى نهاية مع Keras Model.fit :

  1. البرنامج التعليمي : التدريب مع Model.fit و MirroredStrategy .
  2. البرنامج التعليمي : التدريب مع Model.fit و MultiWorkerMirroredStrategy .
  3. دليل : يحتوي على مثال باستخدام Model.fit و TPUStrategy .
  4. البرنامج التعليمي : التدريب الخادم المعلمة مع Model.fit و ParameterServerStrategy .
  5. البرنامج التعليمي : بيرت صقل للعديد من المهام من المؤشر الغراء مع Model.fit و TPUStrategy .
  6. TensorFlow نموذج حديقة مستودع يحتوي على مجموعات من دولة من أحدث نماذج تنفيذها باستخدام استراتيجيات مختلفة.

استخدم tf.distribute.Strategy مع حلقات تدريب مخصصة

كما هو موضح أعلاه، باستخدام tf.distribute.Strategy مع Keras Model.fit يتطلب تغيير فقط بضعة خطوط من التعليمات البرمجية. مع جهد أكثر قليلا، ويمكنك أيضا استخدام tf.distribute.Strategy مع حلقات التدريب المخصصة .

إذا كنت بحاجة إلى مزيد من المرونة والتحكم في حلقات التدريب الخاصة بك أكثر مما هو ممكن مع Estimator أو Keras ، فيمكنك كتابة حلقات تدريب مخصصة. على سبيل المثال ، عند استخدام GAN ، قد ترغب في اتخاذ عدد مختلف من خطوات المولد أو أداة التمييز في كل جولة. وبالمثل ، فإن الأطر عالية المستوى ليست مناسبة جدًا للتدريب على التعلم المعزز.

و tf.distribute.Strategy توفر فصول مجموعة أساسية من وسائل لدعم حلقات التدريب المخصصة. قد يتطلب استخدام هذه إعادة هيكلة بسيطة للرمز في البداية ، ولكن بمجرد الانتهاء من ذلك ، يجب أن تكون قادرًا على التبديل بين وحدات معالجة الرسومات (GPU) و (TPU) والأجهزة المتعددة ببساطة عن طريق تغيير مثيل الإستراتيجية.

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

أولاً ، قم بإنشاء النموذج والمحسن داخل نطاق الإستراتيجية. هذا يضمن أن أي متغيرات تم إنشاؤها باستخدام النموذج والمحسن هي متغيرات معكوسة.

with mirrored_strategy.scope():
  model = tf.keras.Sequential([tf.keras.layers.Dense(1, input_shape=(1,))])
  optimizer = tf.keras.optimizers.SGD()

بعد ذلك، إنشاء مجموعة البيانات المدخلات وندعو tf.distribute.Strategy.experimental_distribute_dataset لتوزيع بيانات على أساس استراتيجية.

dataset = tf.data.Dataset.from_tensors(([1.], [1.])).repeat(100).batch(
    global_batch_size)
dist_dataset = mirrored_strategy.experimental_distribute_dataset(dataset)
2021-10-26 01:28:01.831942: W tensorflow/core/grappler/optimizers/data/auto_shard.cc:695] AUTO sharding policy will apply DATA sharding policy as it failed to apply FILE sharding policy because of the following reason: Found an unshardable source dataset: name: "TensorDataset/_2"
op: "TensorDataset"
input: "Placeholder/_0"
input: "Placeholder/_1"
attr {
  key: "Toutput_types"
  value {
    list {
      type: DT_FLOAT
      type: DT_FLOAT
    }
  }
}
attr {
  key: "output_shapes"
  value {
    list {
      shape {
        dim {
          size: 1
        }
      }
      shape {
        dim {
          size: 1
        }
      }
    }
  }
}

ثم حدد خطوة واحدة من التدريب. استخدام tf.GradientTape إلى التدرجات حساب ومحسن لتطبيق تلك التدرجات لتحديث المتغيرات النموذج الخاص بك. لتوزيع هذه الخطوة التدريب، ووضعها في وظيفة train_step وتمريرها إلى tf.distribute.Strategy.run جنبا إلى جنب مع مدخلات مجموعة البيانات التي حصلت عليها من dist_dataset إنشاؤها قبل:

loss_object = tf.keras.losses.BinaryCrossentropy(
  from_logits=True,
  reduction=tf.keras.losses.Reduction.NONE)

def compute_loss(labels, predictions):
  per_example_loss = loss_object(labels, predictions)
  return tf.nn.compute_average_loss(per_example_loss, global_batch_size=global_batch_size)

def train_step(inputs):
  features, labels = inputs

  with tf.GradientTape() as tape:
    predictions = model(features, training=True)
    loss = compute_loss(labels, predictions)

  gradients = tape.gradient(loss, model.trainable_variables)
  optimizer.apply_gradients(zip(gradients, model.trainable_variables))
  return loss

@tf.function
def distributed_train_step(dist_inputs):
  per_replica_losses = mirrored_strategy.run(train_step, args=(dist_inputs,))
  return mirrored_strategy.reduce(tf.distribute.ReduceOp.SUM, per_replica_losses,
                         axis=None)

بعض الأشياء الأخرى التي يجب ملاحظتها في الكود أعلاه:

  1. يمكنك استخدام tf.nn.compute_average_loss لحساب الخسارة. tf.nn.compute_average_loss يلخص نصيب سبيل المثال فقدان ويقسم المبلغ على global_batch_size . هذا مهم جدا لأنه في وقت لاحق بعد أن يتم احتساب التدرجات على كل طبق الأصل، يتم تجميع ما عبر النسخ المتماثلة عن طريق جمع لهم.
  2. يمكنك أيضا أن تستخدم tf.distribute.Strategy.reduce API لتجميع النتائج التي تم إرجاعها من قبل tf.distribute.Strategy.run . tf.distribute.Strategy.run يعود النتائج من كل متماثلة محلية في الاستراتيجية، وهناك طرق متعددة لتستهلك هذه النتيجة. يمكنك reduce لهم للحصول على قيمة مجمعة. يمكنك أيضا القيام tf.distribute.Strategy.experimental_local_results للحصول على قائمة من القيم الواردة في النتيجة، واحد لكل متماثلة محلية.
  3. عند استدعاء apply_gradients ضمن نطاق استراتيجية التوزيع، يتم تعديل سلوكها. على وجه التحديد ، قبل تطبيق التدرجات اللونية على كل مثيل متوازي أثناء التدريب المتزامن ، فإنه يقوم بإجراء نسخ متماثلة من مجموع التدرجات.

وأخيرا، مرة واحدة كنت قد حددت الخطوة التدريب، ويمكنك تكرار عبر dist_dataset وتشغيل التدريب في حلقة:

for dist_inputs in dist_dataset:
  print(distributed_train_step(dist_inputs))
tf.Tensor(0.18686396, shape=(), dtype=float32)
tf.Tensor(0.18628375, shape=(), dtype=float32)
tf.Tensor(0.18570684, shape=(), dtype=float32)
tf.Tensor(0.18513316, shape=(), dtype=float32)
tf.Tensor(0.1845627, shape=(), dtype=float32)
tf.Tensor(0.18399543, shape=(), dtype=float32)
tf.Tensor(0.18343134, shape=(), dtype=float32)
tf.Tensor(0.18287037, shape=(), dtype=float32)
tf.Tensor(0.18231256, shape=(), dtype=float32)
tf.Tensor(0.18175781, shape=(), dtype=float32)
tf.Tensor(0.18120615, shape=(), dtype=float32)
tf.Tensor(0.18065754, shape=(), dtype=float32)
tf.Tensor(0.18011193, shape=(), dtype=float32)
tf.Tensor(0.17956935, shape=(), dtype=float32)
tf.Tensor(0.17902976, shape=(), dtype=float32)
tf.Tensor(0.17849308, shape=(), dtype=float32)
tf.Tensor(0.17795937, shape=(), dtype=float32)
tf.Tensor(0.17742859, shape=(), dtype=float32)
tf.Tensor(0.17690066, shape=(), dtype=float32)
tf.Tensor(0.17637561, shape=(), dtype=float32)

في المثال أعلاه، يمكنك كرر خلال dist_dataset لتوفير مدخلات التدريب الخاص بك. وتقدم لك أيضا مع tf.distribute.Strategy.make_experimental_numpy_dataset لدعم مدخلات نمباي. يمكنك استخدام هذا API لإنشاء قاعدة بيانات قبل استدعاء tf.distribute.Strategy.experimental_distribute_dataset .

هناك طريقة أخرى للتكرار على بياناتك وهي استخدام التكرارات بشكل صريح. قد ترغب في القيام بذلك عندما تريد إجراء عدد معين من الخطوات بدلاً من التكرار على مجموعة البيانات بأكملها. ما سبق التكرار يمكن الآن تعديل لإنشاء أول مكرر ومن ثم تدعو صراحة next على ذلك للحصول على البيانات المدخلة.

iterator = iter(dist_dataset)
for _ in range(10):
  print(distributed_train_step(next(iterator)))
tf.Tensor(0.17585339, shape=(), dtype=float32)
tf.Tensor(0.17533402, shape=(), dtype=float32)
tf.Tensor(0.17481743, shape=(), dtype=float32)
tf.Tensor(0.17430364, shape=(), dtype=float32)
tf.Tensor(0.17379259, shape=(), dtype=float32)
tf.Tensor(0.17328428, shape=(), dtype=float32)
tf.Tensor(0.17277871, shape=(), dtype=float32)
tf.Tensor(0.17227581, shape=(), dtype=float32)
tf.Tensor(0.17177561, shape=(), dtype=float32)
tf.Tensor(0.17127804, shape=(), dtype=float32)

هذا يغطي أبسط حالة استخدام tf.distribute.Strategy API لتوزيع حلقات التدريب المخصصة.

ما الذي يتم دعمه الآن؟

تدريب API MirroredStrategy TPUStrategy MultiWorkerMirroredStrategy ParameterServerStrategy CentralStorageStrategy
حلقة تدريب مخصصة أيد أيد أيد دعم تجريبي دعم تجريبي

أمثلة ودروس

فيما يلي بعض الأمثلة لاستخدام استراتيجيات التوزيع مع حلقات تدريب مخصصة:

  1. البرنامج التعليمي : التدريب مع حلقة التدريب المخصصة و MirroredStrategy .
  2. البرنامج التعليمي : التدريب مع حلقة التدريب المخصصة و MultiWorkerMirroredStrategy .
  3. دليل : يحتوي على مثال حلقة تدريبية مخصصة مع TPUStrategy .
  4. البرنامج التعليمي : المعلمة التدريب الخادم مع حلقة التدريب المخصصة و ParameterServerStrategy .
  5. TensorFlow نموذج حديقة مستودع يحتوي على مجموعات من دولة من أحدث نماذج تنفيذها باستخدام استراتيجيات مختلفة.

موضوعات أخرى

يغطي هذا القسم بعض الموضوعات ذات الصلة بحالات الاستخدام المتعددة.

إعداد متغير البيئة TF_CONFIG

للتدريب متعددة عامل، كما ذكر من قبل، تحتاج إلى إعداد 'TF_CONFIG' متغير البيئة لكل تشغيل ثنائي في المجموعة الخاصة بك. و 'TF_CONFIG' متغير البيئة هو سلسلة JSON الذي يحدد ما المهام تشكل كتلة عناوينهم ودور كل مهمة في الكتلة. و tensorflow/ecosystem الريبو توفر نموذجا Kubernetes، الذي يضع 'TF_CONFIG' للقيام بمهام التدريب الخاص بك.

هناك نوعان من مكونات 'TF_CONFIG' : مجموعة ومهمة.

  • توفر المجموعة معلومات حول مجموعة التدريب ، وهي عبارة عن إملاء يتكون من أنواع مختلفة من الوظائف مثل العمال. في التدريب متعدد العمال ، عادة ما يكون هناك عامل واحد يتحمل مسؤولية أكبر قليلاً مثل حفظ نقطة التفتيش وكتابة ملف ملخص لـ TensorBoard بالإضافة إلى ما يفعله العامل العادي. ويشار إلى هذا العامل باسم "الرئيس" عامل، ومن المعتاد أن العامل مع مؤشر 0 تم تعيينه رئيسا لمجلس الرئيس عامل (في الواقع هذه هي الطريقة tf.distribute.Strategy ينفذ).
  • من ناحية أخرى ، توفر المهمة معلومات حول المهمة الحالية. مجموعة المكون الأول هي نفسها لجميع العمال ، ومهمة المكون الثاني مختلفة لكل عامل وتحدد نوع وفهرس ذلك العامل.

وأحد الأمثلة على 'TF_CONFIG' هو:

os.environ["TF_CONFIG"] = json.dumps({
    "cluster": {
        "worker": ["host1:port", "host2:port", "host3:port"],
        "ps": ["host4:port", "host5:port"]
    },
   "task": {"type": "worker", "index": 1}
})

هذا 'TF_CONFIG' يحدد أن هناك ثلاثة عمال واثنين من "ps" المهام في "cluster" جنبا إلى جنب مع مضيفيهم والموانئ. في "task" يحدد إطار دور المهمة الحالية في "cluster" -worker 1 (العامل الثاني). الأدوار صالحة في كتلة هي "chief" ، "worker" ، "ps" ، و "evaluator" . ينبغي أن يكون هناك أي "ps" العمل إلا عند استخدام tf.distribute.experimental.ParameterServerStrategy .

ماذا بعد؟

tf.distribute.Strategy غير نشط قيد التطوير. جربه وتقديم التغذية الراجعة باستخدام القضايا جيثب .