این صفحه به‌وسیله ‏Cloud Translation API‏ ترجمه شده است.
Switch to English

آموزش توزیع شده با TensorFlow

مشاهده در TensorFlow.org در Google Colab اجرا کنید مشاهده منبع در GitHub بارگیری نوت بوک

بررسی اجمالی

tf.distribute.Strategy یک API tf.distribute.Strategy برای توزیع آموزش در چندین GPU ، چندین ماشین یا TPU است. با استفاده از این API ، می توانید مدل های موجود و کد آموزش خود را با حداقل تغییرات کد توزیع کنید.

tf.distribute.Strategy با استفاده از این اهداف اصلی طراحی شده است:

  • استفاده و پشتیبانی از چندین بخش کاربر از جمله محققان ، مهندسان ML و غیره آسان است.
  • عملکرد خوبی را از کادر ارائه دهید.
  • جابجایی آسان بین استراتژی ها.

tf.distribute.Strategy می توان با یک API سطح بالا مانند Keras استفاده کرد ، همچنین می تواند برای توزیع حلقه های آموزش سفارشی (و به طور کلی هر محاسبه ای با استفاده از TensorFlow) استفاده شود.

در TensorFlow 2.x ، می توانید برنامه خود را مشتاقانه یا با استفاده از tf.function ، در یک نمودار tf.function . tf.distribute.Strategy نظر دارد از هر دو روش اجرای پشتیبانی پشتیبانی کند ، اما با tf.function بهترین کار می کند. حالت مشتاق فقط برای هدف اشکال زدایی توصیه می شود و برای TPUStrategy پشتیبانی نمی شود. اگرچه ما بیشتر اوقات در این راهنما درباره آموزش صحبت می کنیم ، اما این API همچنین می تواند برای توزیع ارزیابی و پیش بینی در سیستم عامل های مختلف استفاده شود.

شما می توانید با تغییر بسیار کمی در کد خود از tf.distribute.Strategy استفاده کنید ، زیرا ما اجزای اساسی tf.distribute.Strategy را تغییر داده ایم تا استراتژی آگاه شویم. این شامل متغیرها ، لایه ها ، مدل ها ، بهینه سازها ، معیارها ، خلاصه ها و پست های بازرسی است.

در این راهنما انواع استراتژی ها و نحوه استفاده از آنها را در موقعیت های مختلف توضیح می دهیم.

 # Import TensorFlow
import tensorflow as tf
 

انواع استراتژی ها

tf.distribute.Strategy نظر دارد تعدادی از موارد استفاده را در محورهای مختلف پوشش دهد. برخی از این ترکیب ها در حال حاضر پشتیبانی می شوند و برخی دیگر در آینده اضافه می شوند. برخی از این محورها عبارتند از:

  • آموزش همزمان و غیر همزمان: این دو روش متداول توزیع آموزش با موازی سازی داده ها هستند. در آموزش همگام سازی ، همه کارگران برش های مختلف داده های ورودی را در همگام سازی آموزش می دهند و شیب ها را در هر مرحله جمع می کنند. در آموزش async ، همه کارگران بطور مستقل آموزش داده های ورودی را انجام داده و متغیرها را بصورت غیر همزمان به روز می کنند. به طور معمول ، آموزش همگام سازی از طریق معماری سرور پارامتر از طریق همه کاهش و همگام سازی پشتیبانی می شود.
  • سکوی سخت افزاری: ممکن است بخواهید آموزش خود را بر روی چندین GPU در یک دستگاه یا چندین دستگاه در یک شبکه (با 0 یا بیشتر GPU) یا در Cloud TPU انجام دهید.

برای حمایت از این موارد استفاده ، شش راهکار در دسترس است. در بخش بعدی توضیح خواهیم داد که در این زمان کدام یک از سناریوها در TF 2.2 پشتیبانی می شوند. در اینجا یک مرور اجمالی وجود دارد:

API آموزش MirroredStrategy TPUStrategy MultiWorkerMirroredStrategy CentralStorageStrategy ParameterServerStrategy
Keras API پشتیبانی پشتیبانی پشتیبانی تجربی پشتیبانی تجربی پست برنامه ریزی شده پشتیبانی شده 2.3
حلقه آموزش سفارشی پشتیبانی پشتیبانی پشتیبانی تجربی پشتیبانی تجربی پست برنامه ریزی شده پشتیبانی شده 2.3
برآوردگر API پشتیبانی محدود پشتیبانی نشده پشتیبانی محدود پشتیبانی محدود پشتیبانی محدود

MirroredStrategy

tf.distribute.MirroredStrategy از آموزش توزیع همزمان در چندین GPU در یک دستگاه پشتیبانی می کند. در هر دستگاه 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 ایجاد می کند که از تمام GPU هایی که برای TensorFlow قابل مشاهده هستند استفاده می کند و از NCCL به عنوان ارتباطات متقاطع استفاده می کند.

اگر مایل به استفاده از برخی از GPU های دستگاه خود هستید ، می توانید اینگونه عمل کنید:

 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:0,/job:localhost/replica:0/task:0/device:GPU:1
INFO:tensorflow:Using MirroredStrategy with devices ('/job:localhost/replica:0/task:0/device:GPU:0', '/job:localhost/replica:0/task:0/device:GPU:1')

اگر می خواهید ارتباط دستگاه صلیب را نادیده بگیرید ، می توانید با تهیه نمونه ای از tf.distribute.CrossDeviceOps با استفاده از استدلال cross_device_ops این کار را انجام دهید. در حال حاضر 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',)

TPUStrategy

tf.distribute.TPUStrategy شما امکان می دهد آموزش tf.distribute.TPUStrategy خود را در واحد پردازش Tensor ( tf.distribute.TPUStrategy اجرا کنید. TPU ها ASIC های تخصصی گوگل هستند که برای افزایش چشمگیر حجم کار یادگیری ماشین طراحی شده اند. آنها در Google Colab ، TensorFlow Research Cloud و Cloud TPU در دسترس هستند .

از نظر معماری آموزش توزیع شده، TPUStrategy همان است MirroredStrategy - آن را پیاده سازی آموزش توزیع همزمان. TPU اجرای خاص خود را در زمینه كاهش همه جانبه و سایر فعالیتهای جمعی در چندین هسته TPU فراهم می كند ، كه در TPUStrategy مورد استفاده قرار می 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 یافتن TPU ها کمک می کند. در Colab ، نیازی به استدلال برای آن ندارید.

اگر می خواهید از این برای Cloud TPU استفاده کنید:

  • شما باید نام منبع TPU خود را در آرگومان tpu مشخص کنید.
  • شما باید سیستم TPU به صراحت در آغاز برنامه مقداردهی اولیه. این مورد قبل از استفاده TPU برای محاسبه مورد نیاز است. اولیه سازی سیستم tpu همچنین حافظه TPU را از بین می برد ، بنابراین مهم است که ابتدا این مرحله را انجام دهید تا حالت از دست ندهید.

MultiWorkerMirroredStrategy

tf.distribute.experimental.MultiWorkerMirroredStrategy بسیار شبیه به MirroredStrategy . این برنامه آموزش توزیع همزمان را در بین چندین کارگر ، هر کدام با GPU های بالقوه متعدد اجرا می کند. مشابه MirroredStrategy ، این نسخه از کلیه متغیرهای موجود در مدل را در هر دستگاه در همه کارگران ایجاد می کند.

این از CollectiveOps به عنوان یک روش ارتباطی همه کاره با همه کاره استفاده می کند که برای همگام سازی متغیرها استفاده می شود. یک مجموعه جمعی یک گزینه واحد در نمودار TensorFlow است که می تواند به طور خودکار یک الگوریتم همه کاهش در زمان اجرا TensorFlow را با توجه به سخت افزار ، توپولوژی شبکه و اندازه تانسور انتخاب کند.

همچنین بهینه سازی عملکرد اضافی را پیاده سازی می کند. به عنوان مثال ، این شامل یک بهینه سازی استاتیک است که چندین کاهش همه در تنورهای کوچک را به کمتر کردن همه در تنش های بزرگتر تبدیل می کند. علاوه بر این ، ما در حال طراحی آن هستیم تا یک معماری افزونه داشته باشد - به گونه ای که در آینده قادر خواهید بود الگوریتم هایی را که برای سخت افزار شما بهتر تنظیم شده است ، وصل کنید. توجه داشته باشید که گزینه های جمعی سایر عملیات جمعی مانند پخش و جمع آوری را نیز انجام می دهند.

در اینجا ساده ترین روش ایجاد MultiWorkerMirroredStrategy :

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

MultiWorkerMirroredStrategy در حال حاضر به شما اجازه می دهد بین دو پیاده سازی مختلف گزینه های جمعی را انتخاب کنید. CollectiveCommunication.RING communication.RING مجموعه های مبتنی بر حلقه را با استفاده از gRPC به عنوان لایه ارتباطی پیاده سازی می کند. CollectiveCommunication.NCCL communication.NCCL از NCCL Nvidia برای پیاده سازی جمعی استفاده می کند. CollectiveCommunication.AUTO communication.AUTO انتخاب را به زمان اجرا معطل می کند. بهترین انتخاب برای اجرای جمعی بستگی به تعداد و نوع GPU و اتصال شبکه در خوشه دارد. شما می توانید آنها را به روش زیر مشخص کنید:

 multiworker_strategy = tf.distribute.experimental.MultiWorkerMirroredStrategy(
    tf.distribute.experimental.CollectiveCommunication.NCCL)
 
WARNING:tensorflow:Collective ops is not configured at program startup. Some performance features may not be enabled.
INFO:tensorflow:Using MirroredStrategy with devices ('/device:GPU:0',)
INFO:tensorflow:Single-worker MultiWorkerMirroredStrategy with local_devices = ('/device:GPU:0',), communication = CollectiveCommunication.NCCL

یکی از تفاوت های مهم برای رفتن به آموزش چند کارگر ، در مقایسه با آموزش چند GPU ، راه اندازی چند کارگر است. متغیر محیط TF_CONFIG یک روش استاندارد در TensorFlow برای تعیین پیکربندی خوشه به هر کارگر است که بخشی از خوشه است. درباره تنظیم TF_CONFIG بیشتر بیاموزید.

CentralStorageStrategy

tf.distribute.experimental.CentralStorageStrategy همچنین آموزش همزمان را انجام می دهد. در عوض ، آنها بر روی CPU قرار می گیرند و عملیات در کلیه GPU های محلی تکرار می شود. اگر فقط یک 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 ایجاد می کند که از تمام GPU ها و CPU های قابل مشاهده استفاده می کند. به روزرسانی به متغیرهای موجود در ماکت ها قبل از استفاده در متغیرها جمع می شود.

ParameterServerStrategy

tf.distribute.experimental.ParameterServerStrategy از سرورهای پارامتر در چندین ماشین پشتیبانی می کند. در این راه اندازی ، برخی از دستگاه ها به عنوان کارگر و برخی به عنوان سرور پارامتر معرفی می شوند. هر متغیر مدل روی یک سرور پارامتر قرار می گیرد. محاسبات در تمام GPU های همه کارگران تکرار می شود.

از نظر کد ، شبیه سایر استراتژی ها است:

 ps_strategy = tf.distribute.experimental.ParameterServerStrategy()
 

برای آموزش چند کارگر ، TF_CONFIG باید پیکربندی سرورهای پارامتر و کارگران را در خوشه شما مشخص کند ، که می توانید در مورد TF_CONFIG در زیر بخوانید .

راهکارهای دیگر

علاوه بر استراتژی های فوق ، دو استراتژی دیگر وجود دارد که ممکن است برای نمونه سازی و اشکال زدایی هنگام استفاده از API های tf.distribute مفید باشد.

استراتژی پیش فرض

استراتژی پیش فرض یک استراتژی توزیع است که در صورت عدم وجود استراتژی توزیع صریح موجود ، وجود دارد. این رابط tf.distribute.Strategy را پیاده سازی می کند اما یک گذر است و هیچ توزیع واقعی ارائه نمی دهد. به عنوان مثال ، strategy.run(fn) به سادگی fn . کد نوشته شده با استفاده از این استراتژی باید دقیقاً مانند کد نوشته شده و بدون هیچگونه استراتژی رفتار کند. می توانید از آن به عنوان یک استراتژی "بدون کار" فکر کنید.

استراتژی پیش فرض یک مجموعه است - و نمی توان نمونه های بیشتری از آن ایجاد کرد. می توان آن را با استفاده از tf.distribute.get_strategy() خارج از محدوده هر استراتژی صریح (همان API که می تواند برای دستیابی به استراتژی فعلی در دامنه یک استراتژی صریح استفاده شود) بدست آورد.

 default_strategy = tf.distribute.get_strategy()
 

این استراتژی در خدمت دو هدف اصلی است:

  • این اجازه می دهد تا نوشتن کد کتابخانه آگاهانه بدون قید و شرط. به عنوان مثال ، در بهینه ساز ، می توانیم tf.distribute.get_strategy() را انجام tf.distribute.get_strategy() و از آن استراتژی برای کاهش شیب ها استفاده کنیم - همواره یک شیء استراتژی را برمی گرداند که می توانیم آن را کاهش 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 default strategy
  strategy = tf.distribute.get_strategy() 

with strategy.scope():
  # do something interesting
  print(tf.Variable(1.))
 
<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 با tf.keras.Model.fit

ما tf.distribute.Strategy را در tf.distribute.Strategy ادغام tf.distribute.Strategy tf.keras که اجرای tf.distribute.Strategy در مشخصات Keras API است . tf.keras یک API با سطح بالا برای ساخت و آموزش مدل است. با ادغام در پس tf.keras ، ما این کار را برای شما فراهم کرده ایم که آموزش های خود را که در چارچوب آموزش Keras نوشته شده است با استفاده از model.fit .

در اینجا نیاز به تغییر کد خود آورده شده است:

  1. نمونه ای از tf.distribute.Strategy مناسب tf.distribute.Strategy .
  2. ایجاد مدل Keras ، بهینه ساز و اندازه گیری ها را در داخل strategy.scope .

ما از انواع مدلهای Keras پشتیبانی می کنیم - متوالی ، کاربردی و فرعی.

در اینجا مختصری از کد برای انجام این کار برای مدل بسیار ساده Keras با یک لایه متراکم آورده شده است:

 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',)

در این مثال ما از MirroredStrategy استفاده کردیم تا بتوانیم این کار را بر روی یک دستگاه با چند GPU اجرا کنیم. strategy.scope() به Keras نشان می دهد که کدام استراتژی برای توزیع آموزش استفاده می کند. ایجاد مدل / بهینه ساز / اندازه گیری در این محدوده به ما امکان می دهد به جای متغیرهای منظم ، متغیرهای توزیع شده ایجاد کنیم. پس از راه اندازی این کار ، می توانید مدل خود را مانند حالت معمول متناسب کنید. MirroredStrategy مراقب تکرار آموزش مدل در GPU های موجود ، شیب های جمع شده و موارد دیگر است.

 dataset = tf.data.Dataset.from_tensors(([1.], [1.])).repeat(100).batch(10)
model.fit(dataset, epochs=2)
model.evaluate(dataset)
 
Epoch 1/2
WARNING:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.6/site-packages/tensorflow/python/data/ops/multi_device_iterator_ops.py:601: get_next_as_optional (from tensorflow.python.data.ops.iterator_ops) is deprecated and will be removed in a future version.
Instructions for updating:
Use `tf.data.Iterator.get_next_as_optional()` instead.
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',).
10/10 [==============================] - 0s 2ms/step - loss: 1.0035
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 1ms/step - loss: 0.4436
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',).
10/10 [==============================] - 0s 1ms/step - loss: 0.2755

0.27546340227127075

در اینجا از 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
10/10 [==============================] - 0s 1ms/step - loss: 0.1961
Epoch 2/2
10/10 [==============================] - 0s 1ms/step - loss: 0.0867

<tensorflow.python.keras.callbacks.History at 0x7fa17808e240>

در هر دو حالت (مجموعه داده یا شماره) ، هر دسته از ورودی داده شده به طور مساوی بین چندین تکرار تقسیم می شود. به عنوان مثال ، اگر از MirroredStrategy با 2 GPU استفاده می کنید ، هر دسته از اندازه 10 بین 2 GPU تقسیم می شود و در هر مرحله 5 نمونه ورودی دریافت می شود. سپس با اضافه کردن GPU های بیشتر ، هر دوره سریعتر آموزش خواهد دید. به طور معمول ، شما می خواهید به عنوان اضافه کننده شتاب دهنده های بیشتر ، اندازه دسته خود را افزایش دهید تا بتوانید از قدرت محاسبات اضافی استفاده مؤثر کنید. بسته به مدل ، باید میزان یادگیری خود را دوباره تنظیم کنید. برای دریافت تعداد ماکتها می توانید از strategy.num_replicas_in_sync استفاده کنید.

 # Compute global batch size using 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 CentralStorageStrategy ParameterServerStrategy
API های Keras پشتیبانی پشتیبانی پشتیبانی تجربی پشتیبانی تجربی پست برنامه ریزی شده پشتیبانی 2.3

نمونه ها و آموزش ها

در اینجا لیستی از آموزشها و مثالهایی که نشانگر انتهای ادغام فوق برای پایان دادن به Keras است:

  1. آموزش برای آموزش MNIST با MirroredStrategy .
  2. آموزش آموزش MNIST با استفاده از MultiWorkerMirroredStrategy .
  3. راهنمای آموزش MNIST با استفاده از TPUStrategy .
  4. مخزن باغ TensorFlow Model شامل مجموعه ای از مدلهای پیشرفته با استفاده از استراتژیهای مختلف است.

با استفاده از 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 تماس می 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)
 

سپس ، یک مرحله از آموزش را تعریف می کنیم. برای محاسبه شیب و بهینه ساز از tf.GradientTape استفاده tf.GradientTape کرد تا از آن شیب ها برای به روزرسانی متغیرهای مدل استفاده کنیم. برای توزیع این مرحله آموزش ، ما یک تابع train_step و آن را به tf.distrbute.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 . tf.nn.compute_average_loss مبلغ tf.nn.compute_average_loss را به عنوان مثال خلاصه می کند و مبلغ آن را توسط global_batch_size تقسیم می کند. این مهم است زیرا بعداً پس از محاسبه شیب ها در هر ماکت ، آنها با جمع بندی در همه ماکت ها جمع می شوند.
  2. ما از API tf.distribute.Strategy.reduce برای جمع آوری نتایج برگشت یافته توسط tf.distribute.Strategy.run . tf.distribute.Strategy.run نتایج حاصل از هر ماکت محلی را در استراتژی برمی گرداند ، و روش های مختلفی برای مصرف این نتیجه وجود دارد. برای بدست آوردن یک مقدار جمع می توانید آنها را reduce . همچنین می توانید tf.distribute.Strategy.experimental_local_results انجام دهید تا لیستی از مقادیر موجود در نتیجه ، یکی در هر ماکت محلی دریافت کنید.
  3. وقتی apply_gradients در یک محدوده استراتژی توزیع فراخوانی می شود ، رفتار آن اصلاح می شود. به طور خاص ، قبل از اعمال شیب در هر نمونه موازی در هنگام آموزش همزمان ، یک تکرار کلی از شیب ها را انجام می دهد.

سرانجام ، پس از تعیین مرحله آموزش ، می توانیم بیش از dist_dataset تکرار dist_dataset و آموزش را به صورت حلقه ای اجرا کنیم:

 for dist_inputs in dist_dataset:
  print(distributed_train_step(dist_inputs))
 
tf.Tensor(0.4155251, shape=(), dtype=float32)
tf.Tensor(0.41321823, shape=(), dtype=float32)
tf.Tensor(0.4109319, shape=(), dtype=float32)
tf.Tensor(0.40866604, shape=(), dtype=float32)
tf.Tensor(0.40642032, shape=(), dtype=float32)
tf.Tensor(0.40419456, shape=(), dtype=float32)
tf.Tensor(0.4019885, shape=(), dtype=float32)
tf.Tensor(0.399802, shape=(), dtype=float32)
tf.Tensor(0.39763477, shape=(), dtype=float32)
tf.Tensor(0.3954866, shape=(), dtype=float32)
tf.Tensor(0.39335734, shape=(), dtype=float32)
tf.Tensor(0.3912467, shape=(), dtype=float32)
tf.Tensor(0.38915452, shape=(), dtype=float32)
tf.Tensor(0.38708064, shape=(), dtype=float32)
tf.Tensor(0.38502476, shape=(), dtype=float32)
tf.Tensor(0.38298675, shape=(), dtype=float32)
tf.Tensor(0.38096642, shape=(), dtype=float32)
tf.Tensor(0.3789635, shape=(), dtype=float32)
tf.Tensor(0.3769779, shape=(), dtype=float32)
tf.Tensor(0.37500936, shape=(), dtype=float32)

در مثال بالا ، ما از dist_dataset تکرار کردیم تا dist_dataset به آموزش شما دسترسی پیدا کنیم. ما همچنین از tf.distribute.Strategy.make_experimental_numpy_dataset برای پشتیبانی از ورودی های مبهم تهیه می کنیم. شما می توانید قبل از تماس با tf.distribute.Strategy.experimental_distribute_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.37305772, shape=(), dtype=float32)
tf.Tensor(0.3711228, shape=(), dtype=float32)
tf.Tensor(0.3692044, shape=(), dtype=float32)
tf.Tensor(0.36730233, shape=(), dtype=float32)
tf.Tensor(0.3654165, shape=(), dtype=float32)
tf.Tensor(0.36354658, shape=(), dtype=float32)
tf.Tensor(0.36169255, shape=(), dtype=float32)
tf.Tensor(0.3598542, shape=(), dtype=float32)
tf.Tensor(0.35803124, shape=(), dtype=float32)
tf.Tensor(0.3562236, shape=(), dtype=float32)

این ساده ترین مورد استفاده از tf.distribute.Strategy API برای توزیع حلقه های آموزش سفارشی را پوشش می دهد. ما در حال بهبود این API ها هستیم. از آنجا که این مورد استفاده برای انطباق کد شما نیاز به کار بیشتری دارد ، ما در آینده یک راهنمای مفصل جداگانه منتشر خواهیم کرد.

اکنون چه پشتیبانی می شود؟

API آموزش MirroredStrategy TPUStrategy MultiWorkerMirroredStrategy CentralStorageStrategy ParameterServerStrategy
حلقه آموزش سفارشی پشتیبانی پشتیبانی پشتیبانی تجربی پشتیبانی تجربی پست برنامه ریزی شده پشتیبانی 2.3

نمونه ها و آموزش ها

در اینجا چند مثال برای استفاده از استراتژی توزیع با حلقه های آموزش سفارشی آورده شده است:

  1. آموزش برای آموزش MNIST با استفاده از MirroredStrategy .
  2. راهنمای آموزش MNIST با استفاده از TPUStrategy .
  3. مخزن باغ TensorFlow Model شامل مجموعه ای از مدلهای پیشرفته با استفاده از استراتژیهای مختلف است.

استفاده از tf.distribute.Strategy با برآوردگر (پشتیبانی محدود)

tf.estimator یک آموزش توزیع شده tf.estimator API است که در ابتدا از رویکرد سرور پارامتر async پشتیبانی می کند. مانند Keras ، ما tf.distribute.Strategy را در tf.distribute.Strategy ادغام tf.distribute.Strategy tf.Estimator . اگر برای آموزش خود از Estimator استفاده می کنید ، می توانید با تغییر بسیار کمی در کد خود ، به آموزش توزیع شده به راحتی تغییر دهید. با این کار ، کاربران Estimator اکنون می توانند آموزش توزیع شده همزمان را در چندین GPU و کارگرهای مختلف انجام دهند ، همچنین از TPU استفاده کنند. این پشتیبانی در Estimator محدود است. برای جزئیات بیشتر ، بخش پشتیبانی اکنون را در زیر مشاهده می کنید.

استفاده از tf.distribute.Strategy با Estimator با tf.distribute.Strategy کمی متفاوت است. به جای استفاده از strategy.scope ، اکنون هدف استراتژی را در RunConfig برای Estimator می RunConfig .

در اینجا یک قطعه از کد است که نشان می دهد این کار را با از پیش ساخته شده برآورد LinearRegressor و MirroredStrategy :

 mirrored_strategy = tf.distribute.MirroredStrategy()
config = tf.estimator.RunConfig(
    train_distribute=mirrored_strategy, eval_distribute=mirrored_strategy)
regressor = tf.estimator.LinearRegressor(
    feature_columns=[tf.feature_column.numeric_column('feats')],
    optimizer='SGD',
    config=config)
 
INFO:tensorflow:Using MirroredStrategy with devices ('/job:localhost/replica:0/task:0/device:GPU:0',)
INFO:tensorflow:Initializing RunConfig with distribution strategies.
INFO:tensorflow:Not using Distribute Coordinator.
WARNING:tensorflow:Using temporary folder as model directory: /tmp/tmp2ack9oru
INFO:tensorflow:Using config: {'_model_dir': '/tmp/tmp2ack9oru', '_tf_random_seed': None, '_save_summary_steps': 100, '_save_checkpoints_steps': None, '_save_checkpoints_secs': 600, '_session_config': allow_soft_placement: true
graph_options {
  rewrite_options {
    meta_optimizer_iterations: ONE
  }
}
, '_keep_checkpoint_max': 5, '_keep_checkpoint_every_n_hours': 10000, '_log_step_count_steps': 100, '_train_distribute': <tensorflow.python.distribute.mirrored_strategy.MirroredStrategy object at 0x7fa124522b38>, '_device_fn': None, '_protocol': None, '_eval_distribute': <tensorflow.python.distribute.mirrored_strategy.MirroredStrategy object at 0x7fa124522b38>, '_experimental_distribute': None, '_experimental_max_worker_delay_secs': None, '_session_creation_timeout_secs': 7200, '_service': None, '_cluster_spec': ClusterSpec({}), '_task_type': 'worker', '_task_id': 0, '_global_id_in_cluster': 0, '_master': '', '_evaluation_master': '', '_is_chief': True, '_num_ps_replicas': 0, '_num_worker_replicas': 1, '_distribute_coordinator_mode': None}

ما در اینجا از یک برآوردگر پیش ساخته استفاده می کنیم ، اما همان کد با یک برآوردگر سفارشی نیز کار می کند. train_distribute نحوه توزیع آموزش را تعیین می کند و eval_distribute نحوه توزیع ارزیابی را تعیین می کند. این یکی دیگر از تفاوت های کراس است که در آن از همان راهبرد برای تمرین و ارزیابی استفاده می کنیم.

اکنون می توانیم این برآوردگر را با یک تابع ورودی آموزش داده و ارزیابی کنیم:

 def input_fn():
  dataset = tf.data.Dataset.from_tensors(({"feats":[1.]}, [1.]))
  return dataset.repeat(1000).batch(10)
regressor.train(input_fn=input_fn, steps=10)
regressor.evaluate(input_fn=input_fn, steps=10)
 
INFO:tensorflow:Calling model_fn.
WARNING:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.6/site-packages/tensorflow_estimator/python/estimator/canned/linear.py:1481: Layer.add_variable (from tensorflow.python.keras.engine.base_layer_v1) is deprecated and will be removed in a future version.
Instructions for updating:
Please use `layer.add_weight` method instead.
INFO:tensorflow:Done calling model_fn.
WARNING:tensorflow:AutoGraph could not transform <function _combine_distributed_scaffold.<locals>.<lambda> at 0x7fa12452cb70> and will run it as-is.
Cause: could not parse the source code:

      lambda scaffold: scaffold.ready_op, args=(grouped_scaffold,))

This error may be avoided by creating the lambda in a standalone statement.

To silence this warning, decorate the function with @tf.autograph.experimental.do_not_convert
WARNING: AutoGraph could not transform <function _combine_distributed_scaffold.<locals>.<lambda> at 0x7fa12452cb70> and will run it as-is.
Cause: could not parse the source code:

      lambda scaffold: scaffold.ready_op, args=(grouped_scaffold,))

This error may be avoided by creating the lambda in a standalone statement.

To silence this warning, decorate the function with @tf.autograph.experimental.do_not_convert
INFO:tensorflow:Create CheckpointSaverHook.
WARNING:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.6/site-packages/tensorflow_estimator/python/estimator/util.py:96: DistributedIteratorV1.initialize (from tensorflow.python.distribute.input_lib) is deprecated and will be removed in a future version.
Instructions for updating:
Use the iterator's `initializer` property instead.
INFO:tensorflow:Graph was finalized.
INFO:tensorflow:Running local_init_op.
INFO:tensorflow:Done running local_init_op.
INFO:tensorflow:Calling checkpoint listeners before saving checkpoint 0...
INFO:tensorflow:Saving checkpoints for 0 into /tmp/tmp2ack9oru/model.ckpt.
INFO:tensorflow:Calling checkpoint listeners after saving checkpoint 0...
INFO:tensorflow:loss = 1.0, step = 0
INFO:tensorflow:Calling checkpoint listeners before saving checkpoint 10...
INFO:tensorflow:Saving checkpoints for 10 into /tmp/tmp2ack9oru/model.ckpt.
INFO:tensorflow:Calling checkpoint listeners after saving checkpoint 10...
INFO:tensorflow:Loss for final step: 2.877698e-13.
INFO:tensorflow:Calling model_fn.
INFO:tensorflow:Done calling model_fn.
WARNING:tensorflow:AutoGraph could not transform <function _combine_distributed_scaffold.<locals>.<lambda> at 0x7fa1e9768d08> and will run it as-is.
Cause: could not parse the source code:

      lambda scaffold: scaffold.ready_op, args=(grouped_scaffold,))

This error may be avoided by creating the lambda in a standalone statement.

To silence this warning, decorate the function with @tf.autograph.experimental.do_not_convert
WARNING: AutoGraph could not transform <function _combine_distributed_scaffold.<locals>.<lambda> at 0x7fa1e9768d08> and will run it as-is.
Cause: could not parse the source code:

      lambda scaffold: scaffold.ready_op, args=(grouped_scaffold,))

This error may be avoided by creating the lambda in a standalone statement.

To silence this warning, decorate the function with @tf.autograph.experimental.do_not_convert
INFO:tensorflow:Starting evaluation at 2020-08-04T20:28:12Z
INFO:tensorflow:Graph was finalized.
INFO:tensorflow:Restoring parameters from /tmp/tmp2ack9oru/model.ckpt-10
INFO:tensorflow:Running local_init_op.
INFO:tensorflow:Done running local_init_op.
INFO:tensorflow:Evaluation [1/10]
INFO:tensorflow:Evaluation [2/10]
INFO:tensorflow:Evaluation [3/10]
INFO:tensorflow:Evaluation [4/10]
INFO:tensorflow:Evaluation [5/10]
INFO:tensorflow:Evaluation [6/10]
INFO:tensorflow:Evaluation [7/10]
INFO:tensorflow:Evaluation [8/10]
INFO:tensorflow:Evaluation [9/10]
INFO:tensorflow:Evaluation [10/10]
INFO:tensorflow:Inference Time : 0.20350s
INFO:tensorflow:Finished evaluation at 2020-08-04-20:28:12
INFO:tensorflow:Saving dict for global step 10: average_loss = 1.4210855e-14, global_step = 10, label/mean = 1.0, loss = 1.4210855e-14, prediction/mean = 0.99999994
INFO:tensorflow:Saving 'checkpoint_path' summary for global step 10: /tmp/tmp2ack9oru/model.ckpt-10

{'average_loss': 1.4210855e-14,
 'label/mean': 1.0,
 'loss': 1.4210855e-14,
 'prediction/mean': 0.99999994,
 'global_step': 10}

یکی دیگر از تفاوتهای برجسته در اینجا بین برآوردگر و کراس ، کاربری ورودی است. در Keras ذکر کردیم که هر دسته از مجموعه داده به طور خودکار در چند تکرار تقسیم می شود. در Estimator ، ما تقسیم خودکار دسته ای را انجام نمی دهیم ، و به طور خودکار داده ها را در بین کارگران مختلف خرد نمی کنیم. شما کنترل کاملی در نحوه توزیع داده های خود در کارگران و دستگاه ها دارید و باید یک input_fn برای مشخص کردن نحوه توزیع داده های خود ارائه دهید.

input_fn شما یک بار به ازای هر کارگر فراخوانی می شود ، بنابراین به یک کار داده داده می شود. سپس یک دسته از آن مجموعه داده به یک ماکت در آن کارگر تغذیه می شود و بدین ترتیب دسته ای از N برای ماکت های N را برای 1 کارگر مصرف می کند. به عبارت دیگر ، مجموعه داده بازگشت داده شده توسط input_fn باید دسته هایی از اندازه PER_REPLICA_BATCH_SIZE . و اندازه گروه جهانی برای یک مرحله می تواند به عنوان PER_REPLICA_BATCH_SIZE * strategy.num_replicas_in_sync بدست آید. PER_REPLICA_BATCH_SIZE * strategy.num_replicas_in_sync .

هنگام انجام آموزش چند کارگر ، باید داده های خود را در بین کارگران تقسیم کنید ، یا با یک دانه تصادفی روی هر یک از آنها مخلوط کنید. می توانید نمونه ای از نحوه انجام این کار را در آموزش چند کاره با Estimator مشاهده کنید .

و به همین ترتیب ، می توانید از استراتژی های سرور چند کارگر و پارامتر نیز استفاده کنید. کد همچنان یکسان است ، اما باید از tf.estimator.train_and_evaluate استفاده کنید و متغیرهای محیط TF_CONFIG برای هر باینری که در خوشه شما اجرا می شود تنظیم کنید.

اکنون چه پشتیبانی می شود؟

پشتیبانی محدود برای آموزش با Estimator با استفاده از تمام استراتژی ها به جز TPUStrategy . آموزش و ارزیابی اولیه باید کار کند ، اما تعدادی از ویژگی های پیشرفته مانند داربست هنوز کار نمی کنند. همچنین ممکن است در این ادغام چندین اشکال وجود داشته باشد. در حال حاضر ، ما قصد نداریم این پشتیبانی را به طور فعال بهبود بخشیم ، و درعوض بر روی Keras و پشتیبانی حلقه آموزش سفارشی متمرکز هستیم. در صورت امکان ، بهتر است به جای آن از tf.distribute با آن API استفاده کنید.

API آموزش MirroredStrategy TPUStrategy MultiWorkerMirroredStrategy CentralStorageStrategy ParameterServerStrategy
برآوردگر API پشتیبانی محدود پشتیبانی نشده پشتیبانی محدود پشتیبانی محدود پشتیبانی محدود

نمونه ها و آموزش ها

در اینجا چند مثال آورده شده است که استفاده از استراتژیهای مختلف با Estimator را به پایان می رسانند:

  1. آموزش چند کارگر با Estimator برای آموزش MNIST با چند کارگر با استفاده از MultiWorkerMirroredStrategy .
  2. به عنوان مثال پایان برای پایان دادن به آموزش چند کارگر در تنسور جریان / اکوسیستم با استفاده از قالب های Kubernetes. این مثال با یک مدل Keras آغاز می شود و با استفاده از API tf.keras.estimator.model_to_estimator آن را به یک Estimator تبدیل می کند.
  3. رسمی ResNet50 مدل، که می تواند با استفاده از آموزش دیده MirroredStrategy یا MultiWorkerMirroredStrategy .

مباحث دیگر

در این بخش ، موضوعاتی را که مربوط به موارد استفاده چندگانه است ، ارائه خواهیم داد.

متغیر محیط TF_CONFIG را تنظیم کنید

برای آموزش چند کارگر ، همانطور که قبلاً ذکر شد ، برای هر باینری که در خوشه شما اجرا می شود باید متغیر محیط TF_CONFIG تنظیم کنید. متغیر محیط TF_CONFIG یک رشته JSON است که مشخص می کند چه وظایفی یک خوشه ، آدرس آنها و نقش هر وظیفه را در خوشه تشکیل می دهد. ما یک قالب Kubernetes در repo tensorflow / ecosystem ارائه می دهیم که 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 در خوشه به همراه میزبان و درگاه آنها وجود دارد. قسمت "وظیفه" مشخص می کند که نقش وظیفه فعلی در خوشه ، کارگر 1 (کارگر دوم) است. نقش های معتبر در یک خوشه "رئیس" ، "کارگر" ، "ps" و "ارزیاب" است. هیچ کار "ps" وجود ندارد به جز هنگام استفاده از tf.distribute.experimental.ParameterServerStrategy .

بعد چی؟

tf.distribute.Strategy فعالانه در حال توسعه است. ما از شما استقبال می کنیم تا با استفاده از مسائل GitHub آن را امتحان کرده و ارائه دهید و نظرات خود را ارائه دهید.