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

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

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

# Import TensorFlow
import tensorflow as tf

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

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

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

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

آموزش API MirroredStrategy TPUStrategy MultiWorkerMirroredStrategy استراتژی CentralStorage 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')

اگر می خواهید ارتباط متقابل دستگاه را نادیده بگیرید ، می توانید این کار را با استفاده از استدلال 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',)

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.experimental.MultiWorkerMirroredStrategy بسیار شبیه به MirroredStrategy . این برنامه آموزش توزیع همزمان را در بین چندین کارگر ، هر کدام با GPU های بالقوه متعدد ، پیاده سازی می کند. مشابه MirroredStrategy ، کپی همه متغیرهای مدل را در هر دستگاه در همه کارگران ایجاد می کند.

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

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

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

ParameterServerStrategy

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

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

در این پیاده سازی ، 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)

توجه داشته باشید که اگر از TFConfigClusterResolver استفاده می کنید ، باید متغیر محیط TF_CONFIG را پیکربندی کنید. این در MultiWorkerMirroredStrategy مشابه MultiWorkerMirroredStrategy اما دارای هشدارهای اضافی است.

در TF 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 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.keras از مشخصات Keras API است . tf.keras یک API سطح بالا برای ساخت و آموزش مدل ها است. با ادغام در tf.keras ، توزیع آموزش خود را که در چارچوب آموزش Keras با استفاده از model.fit توزیع می شود ، برای شما یکپارچه کرده 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',)

این مثال usees MirroredStrategy بنابراین شما می توانید این بر روی یک ماشین با GPU های متعدد اجرا کنید. 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
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: 0.2137
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.0945
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.0587

0.0586698018014431

در اینجا یک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 2ms/step - loss: 0.0418
Epoch 2/2
10/10 [==============================] - 0s 2ms/step - loss: 0.0185

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

در هر دو حالت (مجموعه داده یا 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 و بهینه ساز برای اعمال شیب ها برای به روزرسانی متغیرهای مدل ما استفاده کنید. برای توزیع این مرحله آموزش، آن را در یک تابع 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 تقسیم می کند. این مهم است زیرا بعداً پس از محاسبه شیب ها بر روی هر ماکت ، آنها با جمع کردن آنها در کل ماکت ها جمع می شوند.
  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.18279998, shape=(), dtype=float32)
tf.Tensor(0.18224256, shape=(), dtype=float32)
tf.Tensor(0.18168819, shape=(), dtype=float32)
tf.Tensor(0.1811369, shape=(), dtype=float32)
tf.Tensor(0.18058868, shape=(), dtype=float32)
tf.Tensor(0.18004347, shape=(), dtype=float32)
tf.Tensor(0.17950125, shape=(), dtype=float32)
tf.Tensor(0.178962, shape=(), dtype=float32)
tf.Tensor(0.17842571, shape=(), dtype=float32)
tf.Tensor(0.17789237, shape=(), dtype=float32)
tf.Tensor(0.17736195, shape=(), dtype=float32)
tf.Tensor(0.17683437, shape=(), dtype=float32)
tf.Tensor(0.17630969, shape=(), dtype=float32)
tf.Tensor(0.17578785, shape=(), dtype=float32)
tf.Tensor(0.17526883, shape=(), dtype=float32)
tf.Tensor(0.17475258, shape=(), dtype=float32)
tf.Tensor(0.17423911, shape=(), dtype=float32)
tf.Tensor(0.17372845, shape=(), dtype=float32)
tf.Tensor(0.17322046, shape=(), dtype=float32)
tf.Tensor(0.1727152, shape=(), dtype=float32)

در مثال بالا ، برای ارائه ورودی به آموزش خود ، بر روی dist_dataset تکرار کردید. ما همچنین tf.distribute.Strategy.make_experimental_numpy_dataset برای پشتیبانی از ورودی های numpy ارائه می 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.17221266, shape=(), dtype=float32)
tf.Tensor(0.17171277, shape=(), dtype=float32)
tf.Tensor(0.17121558, shape=(), dtype=float32)
tf.Tensor(0.17072096, shape=(), dtype=float32)
tf.Tensor(0.17022902, shape=(), dtype=float32)
tf.Tensor(0.16973962, shape=(), dtype=float32)
tf.Tensor(0.16925281, shape=(), dtype=float32)
tf.Tensor(0.1687686, shape=(), dtype=float32)
tf.Tensor(0.1682869, shape=(), dtype=float32)
tf.Tensor(0.16780771, 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 دو جزIG دارد: خوشه و کار. خوشه اطلاعات مربوط به خوشه آموزش را ارائه می دهد ، که یک دستورالعمل متشکل از انواع مختلف شغل مانند کارگر است. در آموزش چند کارگر ، معمولاً یک کارگر وجود دارد که علاوه بر کاری که یک کارگر عادی انجام می دهد ، مسئولیت کمی بیشتر مانند ذخیره ایست بازرسی و نوشتن پرونده خلاصه برای 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 در خوشه به همراه میزبان ها و پورت های آنها وجود دارد. بخش "وظیفه" مشخص می کند که نقش وظیفه فعلی در خوشه ، کارگر 1 (کارگر دوم) است. نقش های معتبر در یک خوشه "رئیس" ، "کارگر" ، "PS" و "ارزیابی کننده" است. به جز هنگام استفاده از tf.distribute.experimental.ParameterServerStrategy کار "ps" وجود داشته باشد.

دیگه چیه؟

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