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

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

بررسی اجمالی

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

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

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

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

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

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

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

TensorFlow را راه اندازی کنید

import tensorflow as tf

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

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

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

به منظور حمایت از این موارد استفاده، TensorFlow است MirroredStrategy ، TPUStrategy ، MultiWorkerMirroredStrategy ، ParameterServerStrategy ، CentralStorageStrategy ، و همچنین استراتژی های دیگر در دسترس است. بخش بعدی توضیح می دهد که کدام یک از این موارد در کدام سناریو در TensorFlow پشتیبانی می شود. در اینجا یک مرور سریع وجود دارد:

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

استراتژی آینه ای

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 عنوان مثال، که تمام پردازنده های گرافیکی که به 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
INFO:tensorflow:Using MirroredStrategy with devices ('/job:localhost/replica:0/task:0/device:GPU:0', '/job:localhost/replica:0/task:0/device:GPU:1')

اگر شما مایل به نادیده گرفتن دستگاه ارتباط متقابل، شما می توانید با استفاده از انجام cross_device_ops استدلال با تهیه یک نمونه از tf.distribute.CrossDeviceOps . در حال حاضر، tf.distribute.HierarchicalCopyAllReduce و tf.distribute.ReductionToOneDevice دو گزینه دیگر نسبت به tf.distribute.NcclAllReduce است، که به طور پیش فرض.

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

TPUS استراتژی

tf.distribute.TPUStrategy اجازه می دهد تا به شما آموزش TensorFlow خود را در اجرا تانسور واحد پردازش (TPU ها) . TPU ها ASIC های تخصصی گوگل هستند که برای تسریع چشمگیر حجم کار یادگیری ماشین طراحی شده اند. آنها در دسترس هستند گوگل COLAB از تحقیقات ابر TPU ، و ابر TPU .

از نظر معماری آموزش توزیع شده، TPUStrategy همان است MirroredStrategy آن را پیاده سازی همزمان آموزش توزیع شده است. TPU ها ارائه اجرای خود را از کارآمد همه را کاهش دهد و دیگر عملیات جمعی در سراسر هسته TPU متعدد، که در استفاده TPUStrategy .

در اینجا این است که چگونه شما می نمونه TPUStrategy :

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

TPUClusterResolver عنوان مثال کمک می کند تا در مکانی که TPU ها. در Colab ، نیازی به ذکر هیچ گونه آرگومان برای آن ندارید.

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

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

استراتژی MultiWorkerMirrored

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 است RPC مبتنی بر و پشتیبانی از هر دو CPU و GPU. CommunicationImplementation.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 این سند است.

برای جزئیات بیشتر در مورد MultiWorkerMirroredStrategy ، در نظر گرفتن آموزش های زیر است:

ParameterServerStrategy

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

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

در این اجرا، worker و parameter server اجرای وظایف tf.distribute.Server بازدید کنندگان که برای انجام وظایف از هماهنگ کننده گوش می دهند. هماهنگ کننده منابع ایجاد می کند ، وظایف آموزشی را اعزام می کند ، نقاط بازرسی می نویسد و با شکست کارها برخورد می کند.

در برنامه نویسی در حال اجرا در هماهنگ کننده، شما یک استفاده ParameterServerStrategy شی تعریف یک گام آموزش و استفاده از یک ClusterCoordinator به گام آموزش اعزام به کارگران از راه دور. در اینجا ساده ترین راه ایجاد آنها وجود دارد:

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

برای کسب اطلاعات بیشتر در مورد ParameterServerStrategy ، چک کردن آموزش سرور پارامتر با Keras Model.fit و یک آموزش سفارشی حلقه آموزش.

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

استراتژی مرکزی ذخیره سازی

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

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

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

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

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

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

default_strategy = tf.distribute.get_strategy()

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

  • این اجازه می دهد بدون قید و شرط کد کتابخانه آگاه از توزیع را بنویسید. برای مثال، در tf.optimizer ها شما می توانید استفاده tf.distribute.get_strategy و استفاده از آن استراتژی برای کاهش شیب آن همیشه یک شی استراتژی که در آن شما می توانید پاسخ بازگشت Strategy.reduce API.
# In optimizer or other library code
# Get currently active strategy
strategy = tf.distribute.get_strategy()
strategy.reduce("SUM", 1., axis=None)  # reduce some values
1.0
  • مشابه کد کتابخانه ، می توان از آن برای نوشتن برنامه های کاربران نهایی برای کار با و بدون استراتژی توزیع ، بدون نیاز به منطق مشروط استفاده کرد. در اینجا یک قطعه کد نمونه است که این را نشان می دهد:
if tf.config.list_physical_devices('GPU'):
  strategy = tf.distribute.MirroredStrategy()
else:  # Use the Default Strategy
  strategy = tf.distribute.get_strategy()

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

استراتژی OneDevice

tf.distribute.OneDeviceStrategy یک استراتژی به جای تمام متغیرها و محاسبه در یک دستگاه واحد مشخص شده باشد.

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

این استراتژی از جهات مختلف از استراتژی پیش فرض متمایز است. در استراتژی پیش فرض ، منطق جایگذاری متغیر در مقایسه با اجرای TensorFlow بدون هیچ گونه استراتژی توزیع ، بدون تغییر باقی می ماند. اما هنگامی که با استفاده از OneDeviceStrategy ، تمام متغیرها در دامنه آن را ایجاد می کند به صراحت در دستگاه مشخص قرار داده است. علاوه بر این، هر گونه توابع به نام از طریق OneDeviceStrategy.run نیز در دستگاه مشخص قرار داده می شود.

ورودی توزیع شده از طریق این استراتژی به دستگاه مشخص شده پیش واکشی می شود. در استراتژی پیش فرض ، توزیع ورودی وجود ندارد.

مشابه استراتژی پیش فرض ، این استراتژی همچنین می تواند برای آزمایش کد شما قبل از تغییر به استراتژی های دیگر که در واقع در چندین دستگاه/ماشین توزیع می شوند ، مورد استفاده قرار گیرد. با این کار ماشین آلات استراتژی توزیع تا حدودی بیش از استراتژی پیش فرض ورزش کنند، اما به طور کامل استفاده از، برای مثال، نمی MirroredStrategy یا TPUStrategy . اگر می خواهید کدی رفتار کند که گویی هیچ استراتژی ای وجود ندارد ، سپس از Default Strategy استفاده کنید.

تا اینجا با استراتژی های مختلف و چگونگی ایجاد آنها آشنا شده اید. چند بخش بعدی روشهای مختلفی را که می توانید از آنها برای توزیع آموزش خود استفاده کنید نشان می دهد.

از tf.distribute.Strategy با Keras Model.fit استفاده کنید

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

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

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

استراتژی توزیع TensorFlow پشتیبانی از تمامی انواع Keras models- متوالی ، کاربردی ، و subclassed .

در اینجا یک قطعه از کد را برای انجام این کار برای یک مدل Keras بسیار ساده با یک Dense لایه:

mirrored_strategy = tf.distribute.MirroredStrategy()

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

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

این مثال با استفاده MirroredStrategy ، بنابراین شما می توانید آن را روی یک ماشین با 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)
2021-09-22 20:33:41.551842: W tensorflow/core/grappler/optimizers/data/auto_shard.cc:695] AUTO sharding policy will apply DATA sharding policy as it failed to apply FILE sharding policy because of the following reason: Found an unshardable source dataset: name: "TensorDataset/_2"
op: "TensorDataset"
input: "Placeholder/_0"
input: "Placeholder/_1"
attr {
  key: "Toutput_types"
  value {
    list {
      type: DT_FLOAT
      type: DT_FLOAT
    }
  }
}
attr {
  key: "output_shapes"
  value {
    list {
      shape {
        dim {
          size: 1
        }
      }
      shape {
        dim {
          size: 1
        }
      }
    }
  }
}
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: 2.4687
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: 1.0912
2021-09-22 20:33:44.537154: W tensorflow/core/grappler/optimizers/data/auto_shard.cc:695] AUTO sharding policy will apply DATA sharding policy as it failed to apply FILE sharding policy because of the following reason: Found an unshardable source dataset: name: "TensorDataset/_2"
op: "TensorDataset"
input: "Placeholder/_0"
input: "Placeholder/_1"
attr {
  key: "Toutput_types"
  value {
    list {
      type: DT_FLOAT
      type: DT_FLOAT
    }
  }
}
attr {
  key: "output_shapes"
  value {
    list {
      shape {
        dim {
          size: 1
        }
      }
      shape {
        dim {
          size: 1
        }
      }
    }
  }
}
10/10 [==============================] - 1s 2ms/step - loss: 0.6776
0.6776412129402161

در اینجا یک tf.data.Dataset آموزش و ورودی تابع eval فراهم می کند. همچنین می توانید از آرایه های NumPy استفاده کنید:

import numpy as np

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

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

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

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

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

API آموزش MirroredStrategy TPUStrategy MultiWorkerMirroredStrategy ParameterServerStrategy CentralStorageStrategy
Keras Model.fit پشتیبانی پشتیبانی پشتیبانی پشتیبانی تجربی پشتیبانی تجربی

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

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

  1. آموزش : آموزش با Model.fit و MirroredStrategy .
  2. آموزش : آموزش با Model.fit و MultiWorkerMirroredStrategy .
  3. راهنمای : شامل نمونه ای از استفاده Model.fit و TPUStrategy .
  4. آموزش : آموزش سرور پارامتر با Model.fit و ParameterServerStrategy .
  5. آموزش : برت ریز تنظیم برای انجام وظایف بسیاری از معیار چسب با Model.fit و TPUStrategy .
  6. TensorFlow مدل باغ مخزن حاوی مجموعه ای از دولت از هنر، مدل اجرا با استفاده از استراتژی های مختلف.

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

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

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

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

در زیر یک قطعه کوتاه است که این مورد استفاده را برای یک مثال آموزشی ساده با استفاده از همان مدل Keras مانند قبل نشان می دهد.

ابتدا ، مدل و بهینه ساز را در محدوده استراتژی ایجاد کنید. این اطمینان می دهد که هر متغیری که با مدل و بهینه ساز ایجاد شود ، متغیرهای آینه ای هستند.

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

بعد، ایجاد مجموعه داده ورودی و پاسخ tf.distribute.Strategy.experimental_distribute_dataset برای توزیع مجموعه داده را بر اساس استراتژی.

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

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

در نهایت، هنگامی که شما گام آموزش تعریف کرده اند، شما می توانید بیش از تکرار dist_dataset و اجرای آموزش در یک حلقه:

for dist_inputs in dist_dataset:
  print(distributed_train_step(dist_inputs))
tf.Tensor(0.29786447, shape=(), dtype=float32)
tf.Tensor(0.29653987, shape=(), dtype=float32)
tf.Tensor(0.29522538, shape=(), dtype=float32)
tf.Tensor(0.29392087, shape=(), dtype=float32)
tf.Tensor(0.29262626, shape=(), dtype=float32)
tf.Tensor(0.29134142, shape=(), dtype=float32)
tf.Tensor(0.29006627, shape=(), dtype=float32)
tf.Tensor(0.28880078, shape=(), dtype=float32)
tf.Tensor(0.2875447, shape=(), dtype=float32)
tf.Tensor(0.28629807, shape=(), dtype=float32)
tf.Tensor(0.28506076, shape=(), dtype=float32)
tf.Tensor(0.2838327, shape=(), dtype=float32)
tf.Tensor(0.28261372, shape=(), dtype=float32)
tf.Tensor(0.28140378, shape=(), dtype=float32)
tf.Tensor(0.28020284, shape=(), dtype=float32)
tf.Tensor(0.27901068, shape=(), dtype=float32)
tf.Tensor(0.27782732, shape=(), dtype=float32)
tf.Tensor(0.27665266, shape=(), dtype=float32)
tf.Tensor(0.2754866, shape=(), dtype=float32)
tf.Tensor(0.274329, shape=(), dtype=float32)

در مثال بالا، شما در تکرار بیش از dist_dataset به ارائه ورودی به آموزش خود را. شما نیز با ارائه tf.distribute.Strategy.make_experimental_numpy_dataset برای پشتیبانی از ورودی نامپای. شما می توانید این API برای ایجاد یک مجموعه داده قبل از تماس استفاده tf.distribute.Strategy.experimental_distribute_dataset .

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

iterator = iter(dist_dataset)
for _ in range(10):
  print(distributed_train_step(next(iterator)))
tf.Tensor(0.2731799, shape=(), dtype=float32)
tf.Tensor(0.27203918, shape=(), dtype=float32)
tf.Tensor(0.27090666, shape=(), dtype=float32)
tf.Tensor(0.26978233, shape=(), dtype=float32)
tf.Tensor(0.26866615, shape=(), dtype=float32)
tf.Tensor(0.26755798, shape=(), dtype=float32)
tf.Tensor(0.2664578, shape=(), dtype=float32)
tf.Tensor(0.26536545, shape=(), dtype=float32)
tf.Tensor(0.2642809, shape=(), dtype=float32)
tf.Tensor(0.26320407, shape=(), dtype=float32)

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

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

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

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

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

  1. آموزش : آموزش با یک حلقه آموزش سفارشی و MirroredStrategy .
  2. آموزش : آموزش با یک حلقه آموزش سفارشی و MultiWorkerMirroredStrategy .
  3. راهنمای : شامل نمونه ای از یک حلقه آموزش سفارشی با TPUStrategy .
  4. آموزش : آموزش سرور پارامتر با یک حلقه آموزش سفارشی و ParameterServerStrategy .
  5. TensorFlow مدل باغ مخزن حاوی مجموعه ای از دولت از هنر، مدل اجرا با استفاده از استراتژی های مختلف.

موضوعات دیگر

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

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

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

دو جزء از وجود دارد 'TF_CONFIG' : یک خوشه و یک کار.

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

یک نمونه از 'TF_CONFIG' است:

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

این 'TF_CONFIG' مشخص می کند که سه کارگران و دو وجود دارد "ps" وظایف در "cluster" همراه با میزبان و پورت های آنها. "task" بخشی نقش وظیفه فعلی در مشخص "cluster" -worker 1 (کارگر دوم). نقش معتبر در یک خوشه هستند "chief" ، "worker" ، "ps" و "evaluator" . باید وجود داشته باشد "ps" کار به جز زمانی که با استفاده از tf.distribute.experimental.ParameterServerStrategy .

بعدش چی؟

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