سخنرانی ها ، جلسات محصول ، کارگاه ها و موارد دیگر را از لیست پخش Google I / O مشاهده کنید

آموزش توزیع شده با 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.distribute.Strategy قصد دارد از هر دو حالت اجرا پشتیبانی کند اما با tf.function بهتر کار می کند. حالت Eager فقط برای رفع اشکال توصیه می شود و برای TPUStrategy پشتیبانی نمی شود. اگرچه آموزش مورد توجه این راهنما است ، این API همچنین می تواند برای توزیع ارزیابی و پیش بینی در سیستم عامل های مختلف مورد استفاده قرار گیرد.

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

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

# Import TensorFlow
import tensorflow as tf

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

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

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

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

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

MirroredStrategy

tf.distribute.MirroredStrategy از آموزش توزیع همزمان در چندین GPU در یک دستگاه پشتیبانی می کند. این یک نسخه در هر دستگاه GPU ایجاد می کند. هر متغیر در مدل در تمام نسخه ها منعکس می شود. این متغیرها با هم یک متغیر مفهومی واحد به نام MirroredVariable . این متغیرها با استفاده از به روزرسانی های یکسان با یکدیگر همگام سازی می شوند.

برای برقراری ارتباط با بروزرسانی های متغیر در دستگاه ها ، از الگوریتم های کارآمد کاهش دهنده استفاده می شود. با جمع کردن سنسورهای جمع کننده در همه دستگاه ها ، آنها را در هر دستگاه در دسترس قرار می دهد. این یک الگوریتم ذوب شده است که بسیار کارآمد است و می تواند سربار هماهنگی را به میزان قابل توجهی کاهش دهد. بسته به نوع ارتباط موجود بین دستگاه ها ، الگوریتم ها و پیاده سازی های تمام کاهش بسیاری وجود دارد. به طور پیش فرض ، از کتابخانه ارتباطات جمعی NVIDIA ( NCCL ) به عنوان اجرای کاملاً کاهش دهنده استفاده می کند. می توانید از بین چند گزینه دیگر یکی را انتخاب کنید یا گزینه خود را بنویسید.

در اینجا ساده ترین راه ایجاد MirroredStrategy :

mirrored_strategy = tf.distribute.MirroredStrategy()
WARNING:tensorflow:Collective ops is not configured at program startup. Some performance features may not be enabled.
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:1,/job:localhost/replica:0/task:0/device:GPU:0
WARNING:tensorflow:Collective ops is not configured at program startup. Some performance features may not be enabled.
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())
WARNING:tensorflow:Collective ops is not configured at program startup. Some performance features may not be enabled.
INFO:tensorflow:Using MirroredStrategy with devices ('/job:localhost/replica:0/task:0/device:GPU:0',)

TPUStrategy

tf.distribute.TPUStrategy شما امکان می دهد آموزش tf.distribute.TPUStrategy خود را در مورد واحدهای پردازش تنسور (TPU) اجرا کنید. 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.MultiWorkerMirroredStrategy بسیار شبیه به MirroredStrategy . این برنامه آموزش توزیع همزمان را در بین چندین کارگر ، که هر کدام دارای GPU های بالقوه متعددی هستند ، اجرا می کند. مشابه 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 Implementation.RING مبتنی بر RPC است و از CPU و GPU پشتیبانی می کند. CommunicationImplementation.NCCL Implementation.NCCL از NCCL استفاده می کند و عملکرد پیشرفته ای را در GPU ارائه می دهد اما از پردازنده پشتیبانی نمی کند. 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

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

ParameterServerStrategy

پارامتر آموزش سرور یک روش متداول داده موازی برای مقیاس گذاری آموزش مدل روی چندین ماشین است. یک خوشه آموزش سرور پارامتر از کارگران و سرورهای پارامتر تشکیل شده است. متغیرها در سرورهای پارامتر ایجاد می شوند و در هر مرحله توسط کارگران خوانده و به روز می شوند. برای جزئیات بیشتر به آموزش آموزش پارامتر سرور مراجعه کنید.

در TensorFlow 2 ، آموزش سرور پارامتر از یک معماری مبتنی بر هماهنگ کننده مرکزی از طریق کلاس tf.distribute.experimental.coordinator.ClusterCoordinator .

در این پیاده سازی ، tf.distribute.Server worker و parameter server tf.distribute.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)

در TensorFlow 1 ، ParameterServerStrategy فقط با برآوردگر از طریق نماد tf.compat.v1.distribute.experimental.ParameterServerStrategy است.

استراتژی CentralStorage

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 های قابل مشاهده استفاده می کند. به روزرسانی متغیرها در کپی ها قبل از اعمال بر روی متغیرها جمع می شود.

استراتژی های دیگر

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

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

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

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

default_strategy = tf.distribute.get_strategy()

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

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

with strategy.scope():
  # Do something interesting
  print(tf.Variable(1.))
WARNING:tensorflow:Collective ops is not configured at program startup. Some performance features may not be enabled.
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 با tf.keras.Model.fit

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

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

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

استراتژی های توزیع TensorFlow از انواع مدل های 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')
WARNING:tensorflow:Collective ops is not configured at program startup. Some performance features may not be enabled.
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',).
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: 0.3648
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.1613
10/10 [==============================] - 1s 2ms/step - loss: 0.1001
0.1001412644982338

در اینجا یک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 [==============================] - 1s 2ms/step - loss: 0.0713
Epoch 2/2
10/10 [==============================] - 0s 2ms/step - loss: 0.0315
<tensorflow.python.keras.callbacks.History at 0x7f18ac0bdcd0>

در هر دو حالت - با Dataset یا Numpy - هر دسته از ورودی داده شده به طور مساوی بین نسخه های چندگانه تقسیم می شود. به عنوان مثال ، اگر از MirroredStrategy با 2 GPU استفاده می کنید ، هر دسته از اندازه 10 بین 2 GPU تقسیم می شود که در هر مرحله 5 نمونه ورودی دریافت می شود. پس از اضافه کردن GPU های بیشتر ، هر دوره سریعتر آموزش می یابد. معمولاً ، با افزودن شتاب دهنده های بیشتر ، می خواهید اندازه دسته خود را افزایش دهید تا از قدرت محاسبات اضافی استفاده م effectiveثر داشته باشید. همچنین بسته به مدل ، باید میزان یادگیری خود را از نو تنظیم کنید. برای بدست آوردن تعداد ماکت ها می توانید از 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 ParameterServerStrategy استراتژی CentralStorage
API های Keras پشتیبانی پشتیبانی پشتیبانی تجربی پشتیبانی تجربی پشتیبانی تجربی

مثالها و آموزشها

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

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

استفاده از tf.distribute.Strategy با حلقه های آموزش سفارشی

همانطور که مشاهده کردید ، استفاده از tf.distribute.Strategy با 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 به عنوان مثال ضرر را جمع می کند و مبلغ را به 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 تکرار کنید و آموزش را به صورت حلقه ای اجرا کنید:

for dist_inputs in dist_dataset:
  print(distributed_train_step(dist_inputs))
tf.Tensor(0.5716536, shape=(), dtype=float32)
tf.Tensor(0.56787133, shape=(), dtype=float32)
tf.Tensor(0.564126, shape=(), dtype=float32)
tf.Tensor(0.5604175, shape=(), dtype=float32)
tf.Tensor(0.5567452, shape=(), dtype=float32)
tf.Tensor(0.5531087, shape=(), dtype=float32)
tf.Tensor(0.54950774, shape=(), dtype=float32)
tf.Tensor(0.5459418, shape=(), dtype=float32)
tf.Tensor(0.5424106, shape=(), dtype=float32)
tf.Tensor(0.5389137, shape=(), dtype=float32)
tf.Tensor(0.53545076, shape=(), dtype=float32)
tf.Tensor(0.5320213, shape=(), dtype=float32)
tf.Tensor(0.528625, shape=(), dtype=float32)
tf.Tensor(0.5252616, shape=(), dtype=float32)
tf.Tensor(0.52193063, shape=(), dtype=float32)
tf.Tensor(0.5186317, shape=(), dtype=float32)
tf.Tensor(0.5153646, shape=(), dtype=float32)
tf.Tensor(0.51212865, shape=(), dtype=float32)
tf.Tensor(0.5089238, shape=(), dtype=float32)
tf.Tensor(0.5057497, shape=(), dtype=float32)

در مثال بالا ، برای ارائه ورودی به آموزش خود ، بر روی dist_dataset تکرار کردید. همچنین برای پشتیبانی از ورودی های NumPy tf.distribute.Strategy.make_experimental_numpy_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.5026059, shape=(), dtype=float32)
tf.Tensor(0.49949214, shape=(), dtype=float32)
tf.Tensor(0.496408, shape=(), dtype=float32)
tf.Tensor(0.4933532, shape=(), dtype=float32)
tf.Tensor(0.49032742, shape=(), dtype=float32)
tf.Tensor(0.48733026, shape=(), dtype=float32)
tf.Tensor(0.48436147, shape=(), dtype=float32)
tf.Tensor(0.4814206, shape=(), dtype=float32)
tf.Tensor(0.4785076, shape=(), dtype=float32)
tf.Tensor(0.475622, shape=(), dtype=float32)

این ساده ترین حالت استفاده از tf.distribute.Strategy API برای توزیع حلقه های آموزش سفارشی را پوشش می دهد.

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

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

مثالها و آموزشها

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

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

مباحث دیگر

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

تنظیم متغیر محیط TF_CONFIG

برای آموزش چند کارگر ، همانطور که قبلا ذکر شد ، شما باید متغیر محیط TF_CONFIG برای هر باینری که در خوشه شما اجرا می شود تنظیم کنید. متغیر محیطی TF_CONFIG یک رشته JSON است که مشخص می کند چه وظایفی یک خوشه را تشکیل می دهد ، آدرس آنها و نقش هر کار در خوشه چیست. repo tensorflow/ecosystem الگوی Kubernetes را فراهم می کند ، که TF_CONFIG برای کارهای آموزشی شما تنظیم می کند.

TF_CONFIG دو TF_CONFIG : یک خوشه و یک کار.

  • یک خوشه اطلاعات مربوط به خوشه آموزش را ارائه می دهد ، که یک دستورالعمل متشکل از انواع مختلف مشاغل مانند کارگر است. در آموزش چند کارگری ، معمولاً یک کارگر وجود دارد که علاوه بر کاری که یک کارگر عادی انجام می دهد ، مسئولیت کمی بیشتر مانند ذخیره ایست بازرسی و نوشتن پرونده خلاصه برای TensorBoard را بر عهده می گیرد. از این کارگر به عنوان "کارگر ارشد" یاد می شود و معمول است که کارگر با شاخص 0 به عنوان کارگر اصلی منصوب می شود (در واقع نحوه اجرای tf.distribute.Strategy این صورت است).
  • از طرف دیگر یک کار اطلاعات مربوط به وظیفه فعلی را فراهم می کند. خوشه م componentلفه اول برای همه کارگران یکسان است و وظیفه م componentلفه دوم بر روی هر کارگر متفاوت است و نوع و شاخص آن کارگر را مشخص می کند.

یک مثال از 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" کارگر 1 (کارگر دوم) است. نقش های معتبر در یک خوشه "chief" ، "worker" ، "ps" و "evaluator" . به جز هنگام استفاده از tf.distribute.experimental.ParameterServerStrategy کار "ps" وجود داشته باشد.

بعدی چیست؟

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