This page was translated by the Cloud Translation API.
Switch to English

বিতরণ ইনপুট

টেনসরফ্লো.আর.জে দেখুন গুগল কোলাবে চালান গিটহাবের উত্স দেখুন নোটবুক ডাউনলোড করুন

Tf.distribute API গুলি ব্যবহারকারীদের একক মেশিন থেকে একাধিক মেশিনে তাদের প্রশিক্ষণের মাপসই করার সহজ উপায় সরবরাহ করে। তাদের মডেলটি স্কেল করার সময়, ব্যবহারকারীদের একাধিক ডিভাইসগুলিতে তাদের ইনপুট বিতরণ করতে হবে। tf.distribute এমন APIs সরবরাহ করে যা আপনি স্বয়ংক্রিয়ভাবে ডিভাইসগুলিতে আপনার ইনপুট বিতরণ করতে পারেন।

এই গাইডটি আপনাকে বিভিন্ন উপায়ে দেখাবে যাতে আপনি tf.distribute API ব্যবহার করে বিতরণ করা ডেটাসেট এবং পুনরুক্তি তৈরি করতে পারেন। অতিরিক্তভাবে, নিম্নলিখিত বিষয়গুলি কভার করা হবে:

এই গাইডটি কেরাস এপিআই দিয়ে বিতরণ করা ইনপুটটির ব্যবহার কভার করে না।

বিতরণ করা ডেটাসেটস

স্কেল করতে tf.distribute API গুলি ব্যবহার করার জন্য, ব্যবহারকারীরা তাদের ইনপুট উপস্থাপনের জন্য tf.data.Dataset ব্যবহার করার পরামর্শ দেয়। tf.distribute tf.data.Dataset (উদাহরণস্বরূপ, প্রতিটি tf.data.Dataset ডিভাইসে ডেটার স্বয়ংক্রিয় tf.data.Dataset ) কার্যকারিতা অপ্টিমাইজেশানকে নিয়মিতভাবে প্রয়োগের সাথে অন্তর্ভুক্ত করার সাথে দক্ষতার সাথে কাজ করার জন্য তৈরি করা হয়েছে। আপনার যদি tf.data.Dataset ব্যতীত অন্য কিছু ব্যবহারের ক্ষেত্রে ব্যবহারের কেস থাকে তবে দয়া করে এই গাইডের পরবর্তী অংশটি দেখুন । অ-বিতরণকৃত প্রশিক্ষণ লুপে ব্যবহারকারীরা প্রথমে একটি tf.data.Dataset উদাহরণ তৈরি করে এবং তারপরে উপাদানগুলির পুনরাবৃত্তি করে। উদাহরণ স্বরূপ:

 import tensorflow as tf

# Helper libraries
import numpy as np
import os

print(tf.__version__)
 
2.3.0

 global_batch_size = 16
# Create a tf.data.Dataset object.
dataset = tf.data.Dataset.from_tensors(([1.], [1.])).repeat(100).batch(global_batch_size)

@tf.function
def train_step(inputs):
  features, labels = inputs
  return labels - 0.3 * features

# Iterate over the dataset using the for..in construct.
for inputs in dataset:
  print(train_step(inputs))

 
tf.Tensor(
[[0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]], shape=(16, 1), dtype=float32)
tf.Tensor(
[[0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]], shape=(16, 1), dtype=float32)
tf.Tensor(
[[0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]], shape=(16, 1), dtype=float32)
tf.Tensor(
[[0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]], shape=(16, 1), dtype=float32)
tf.Tensor(
[[0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]], shape=(16, 1), dtype=float32)
tf.Tensor(
[[0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]], shape=(16, 1), dtype=float32)
tf.Tensor(
[[0.7]
 [0.7]
 [0.7]
 [0.7]], shape=(4, 1), dtype=float32)

ব্যবহারকারীদের ব্যবহারকারীর বিদ্যমান কোডের ন্যূনতম পরিবর্তন সহ tf.distribute কৌশল ব্যবহার করার অনুমতি দেওয়ার জন্য, দুটি এপিআই চালু করা হয়েছিল যা একটি tf.data.Dataset উদাহরণ বিতরণ করবে এবং একটি বিতরণকৃত ডেটাসেট অবজেক্টটি ফিরিয়ে দেবে। তারপরে কোনও ব্যবহারকারী এই বিতরণকৃত ডেটাসেট উদাহরণটি পুনরুক্ত করতে এবং তাদের মডেলটিকে আগের মতো প্রশিক্ষণ দিতে পারে। আসুন এখন দুটি tf.distribute.Strategy.experimental_distribute_dataset এবং tf.distribute.Strategy.experimental_distribute_datasets_from_function এ আরও বিশদ tf.distribute.Strategy.experimental_distribute_datasets_from_function :

tf.distribute.Strategy.experimental_distribute_dataset

ব্যবহার

এই এপিআই একটি tf.data.Dataset ইনপুট হিসাবে ইনপুট হিসাবে নেয় এবং একটি tf.distribute.DistributedDataset উদাহরণ দেয়। গ্লোবাল ব্যাচ আকারের সমান একটি মান সহ আপনার ইনপুট ডেটাসেটের ব্যাচ করা উচিত। এই গ্লোবাল ব্যাচের আকারটি এমন সমস্ত নমুনার সংখ্যা যা আপনি 1 টি পদক্ষেপে সমস্ত ডিভাইস জুড়ে প্রক্রিয়া করতে চান। আপনি একটি Pythonic ফ্যাশন এই বিতরণ ডেটা সেটটি পুনরুক্তি বা ব্যবহার করে একটি পুনরুক্তিকারীর তৈরি করতে পারেন iter । প্রত্যাবর্তিত বস্তুটি কোনও tf.data.Dataset উদাহরণ নয় এবং কোনও অন্যান্য APIs সমর্থন করে না যা tf.data.Dataset রূপান্তর বা পরিদর্শন করে। এটি নির্দিষ্ট প্রস্তাবিত এপিআই যদি আপনার নির্দিষ্ট উপায় না পান যাতে আপনি বিভিন্ন প্রতিরূপের মাধ্যমে নিজের ইনপুটটি তীক্ষ্ণ করতে চান।

 global_batch_size = 16
mirrored_strategy = tf.distribute.MirroredStrategy()

dataset = tf.data.Dataset.from_tensors(([1.], [1.])).repeat(100).batch(global_batch_size)
# Distribute input using the `experimental_distribute_dataset`.
dist_dataset = mirrored_strategy.experimental_distribute_dataset(dataset)
# 1 global batch of data fed to the model in 1 step.
print(next(iter(dist_dataset)))
 
INFO:tensorflow:Using MirroredStrategy with devices ('/job:localhost/replica:0/task:0/device:GPU:0',)
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.
(<tf.Tensor: shape=(16, 1), dtype=float32, numpy=
array([[1.],
       [1.],
       [1.],
       [1.],
       [1.],
       [1.],
       [1.],
       [1.],
       [1.],
       [1.],
       [1.],
       [1.],
       [1.],
       [1.],
       [1.],
       [1.]], dtype=float32)>, <tf.Tensor: shape=(16, 1), dtype=float32, numpy=
array([[1.],
       [1.],
       [1.],
       [1.],
       [1.],
       [1.],
       [1.],
       [1.],
       [1.],
       [1.],
       [1.],
       [1.],
       [1.],
       [1.],
       [1.],
       [1.]], dtype=float32)>)

প্রোপার্টি

ছোট্ট

tf.distribute একটি নতুন ব্যাচের আকারের সাথে ইনপুটটি tf.data.Dataset দৃষ্টান্তটি tf.distribute পাঠায় যা সিঙ্কের প্রতিরূপের সংখ্যা দ্বারা বিভক্ত বিশ্বব্যাপী আকারের সমান। সিঙ্কে প্রতিলিপিগুলির সংখ্যা প্রশিক্ষণের সময় গ্রেডিয়েন্ট অলরেডুসে অংশ নিচ্ছে এমন ডিভাইসের সংখ্যার সমান। একটি ব্যবহারকারী কল করা হলে next পুনরুক্তিকারীর, ডেটার একটি প্রতি প্রতিরূপ ব্যাচ আকার প্রতিটি প্রতিরূপ উপর ফিরিয়ে দেওয়া হয় বিতরণ করেন। রিবাচড ডেটাসেট কার্ডিনালিটি সর্বদা প্রতিরূপের সংখ্যার একাধিক হবে। এখানে উদাহরণ তুলে ধরা হলো:

  • tf.data.Dataset.range(6).batch(4, drop_remainder=False)

    বিতরণ ছাড়াই:

    ব্যাচ 1: [0, 1, 2, 3]

    ব্যাচ 2: [4, 5]

    2 টিরও বেশি প্রতিলিপি বিতরণ সহ:

    ব্যাচ 1: প্রতিলিপি 1: [0, 1] প্রতিলিপি 2: [2, 3]

    ব্যাচ 2: প্রতিলিপি 2: [4] প্রতিলিপি 2: [5]

    শেষ ব্যাচটি ([৪, ৫]) ২ টি প্রতিরূপের মধ্যে বিভক্ত।

  • tf.data.Dataset.range(4).batch(4)

    বিতরণ ছাড়াই:

    ব্যাচ 1: [[0], [1], [2], [3]]

    5 টিরও বেশি প্রতিলিপি বিতরণ সহ:

    ব্যাচ 1: প্রতিলিপি 1: [0] প্রতিলিপি 2: [1] প্রতিলিপি 3: [2] প্রতিলিপি 4: [3] প্রতিলিপি 5: []

  • tf.data.Dataset.range(8).batch(4)

    বিতরণ ছাড়াই:

    ব্যাচ 1: [0, 1, 2, 3]

    ব্যাচ 2: [4, 5, 6, 7]

    3 টিরও বেশি প্রতিলিপি বিতরণ সহ:

    ব্যাচ 1: প্রতিলিপি 1: [0, 1] প্রতিলিপি 2: [2, 3] প্রতিলিপি 3: []

    ব্যাচ 2: প্রতিলিপি 1: [4, 5] প্রতিলিপি 2: [6, 7] প্রতিলিপি 3: []

ডেটাসেটটি পুনরায় পাঠানোর ক্ষেত্রে একটি স্পেস জটিলতা রয়েছে যা প্রতিরূপের সংখ্যার সাথে রৈখিকভাবে বৃদ্ধি পায়। এর অর্থ হল যে বহু শ্রমিক প্রশিক্ষণ ব্যবহারের ক্ষেত্রে ইনপুট পাইপলাইন OOM ত্রুটিতে চলে যেতে পারে।

Sharding

tf.distribute মাল্টি ওয়ার্কার প্রশিক্ষণে ইনপুট ডেটাসেটও অটোচার্ড করে। প্রতিটি ডাটাসেট কর্মীর সিপিইউ ডিভাইসে তৈরি করা হয়। কর্মীদের একটি সেটের উপর একটি ডেটাসেট tf.data.experimental.AutoShardPolicy অর্থ প্রতিটি কর্মীকে পুরো ডেটাসেটের একটি উপসেট বরাদ্দ করা হয় (যদি সঠিক tf.data.experimental.AutoShardPolicy সেট করা থাকে)। এটি নিশ্চিত করার জন্য যে প্রতিটি পদক্ষেপে, প্রতিটি কর্মী দ্বারা অ ওভারল্যাপিং ডেটাসেট উপাদানগুলির একটি বিশ্বব্যাপী ব্যাচ আকারে প্রক্রিয়া করা হবে। tf.data.experimental.DistributeOptions বিভিন্ন বিকল্প রয়েছে যা tf.data.experimental.DistributeOptions ব্যবহার করে নির্দিষ্ট করা যেতে পারে।

 dataset = tf.data.Dataset.from_tensors(([1.],[1.])).repeat(64).batch(16)
options = tf.data.Options()
options.experimental_distribute.auto_shard_policy = tf.data.experimental.AutoShardPolicy.DATA
dataset = dataset.with_options(options)
 

তিনটি আলাদা বিকল্প রয়েছে যা আপনি tf.data.experimental.AutoShardPolicy জন্য সেট করতে পারেন:

  • স্বয়ং: এটি ডিফল্ট বিকল্প যার অর্থ একটি ফাইল দ্বারা প্রণীত করার চেষ্টা করা হবে। কোনও ফাইল-ভিত্তিক ডেটাসেট সনাক্ত না করা হলে FILE দ্বারা তীক্ষ্ণ প্রচেষ্টা ব্যর্থ হয়। tf.distribute এরপরে আবার ডেটা দ্বারা ভাগ করে tf.distribute । দ্রষ্টব্য যে ইনপুট ডেটাसेटটি যদি ফাইল-ভিত্তিক হয় তবে ফাইলের সংখ্যা শ্রমিকের সংখ্যার চেয়ে কম হয় তবে একটি ত্রুটি উত্থাপিত হবে।
  • ফাইল: আপনি যদি সমস্ত কর্মীদের উপর ইনপুট ফাইলগুলি তীক্ষ্ণ করতে চান তবে এটি বিকল্প। ফাইলের সংখ্যা শ্রমিকের সংখ্যার চেয়ে কম হলে একটি ত্রুটি উত্থাপিত হবে। আপনার এই বিকল্পটি ব্যবহার করা উচিত যদি কর্মীদের সংখ্যার চেয়ে ইনপুট ফাইলের সংখ্যা অনেক বড় হয় এবং ফাইলগুলির ডেটা সমানভাবে বিতরণ করা হয়। ফাইলগুলির ডেটা সমানভাবে বিতরণ না করা হলে এই বিকল্পটির খারাপ দিকটি অলস শ্রমিক রয়েছে workers উদাহরণস্বরূপ, আসুন আমরা 2 টি কর্মীর উপর 2 টির প্রতি 1 টি প্রতিলিপি বিতরণ করি। ফাইল 1 এ [0, 1, 2, 3, 4, 5] এবং ফাইল 2 টিতে [6, 7, 8, 9, 10, 11] রয়েছে। সিঙ্কে প্রতিরূপের মোট সংখ্যা 2 এবং গ্লোবাল ব্যাচের আকার 4 হতে দিন।

    • কর্মী 0:

    ব্যাচ 1 = প্রতিলিপি 1: [0, 1]

    ব্যাচ 2 = প্রতিলিপি 1: [2, 3]

    ব্যাচ 3 = প্রতিলিপি 1: [4]

    ব্যাচ 4 = প্রতিলিপি 1: [5]

    • কর্মী 1:

    ব্যাচ 1 = প্রতিলিপি 2: [6, 7]

    ব্যাচ 2 = প্রতিলিপি 2: [8, 9]

    ব্যাচ 3 = প্রতিলিপি 2: [10]

    ব্যাচ 4 = প্রতিলিপি 2: [11]

  • ডেটা: এটি সমস্ত কর্মী জুড়ে উপাদানগুলিকে অটোচার্ড করবে। প্রতিটি কর্মী পুরো ডেটাসেটটি পড়বে এবং কেবল তার জন্য নির্ধারিত শারডটি প্রক্রিয়া করবে। অন্যান্য সমস্ত শারড ত্যাগ করা হবে। এটি সাধারণত ব্যবহৃত হয় যদি ইনপুট ফাইলের সংখ্যা শ্রমিকের সংখ্যার চেয়ে কম হয় এবং আপনি সমস্ত শ্রমিকের মধ্যে ডেটা আরও ভালভাবে ছড়িয়ে দিতে চান। নেতিবাচক দিকটি হ'ল প্রতিটি ডেটাसेट প্রতিটি কর্মীর উপর পড়ে। উদাহরণস্বরূপ, আসুন আমরা 2 কর্মীর উপরে 1 ফাইল বিতরণ করি। ফাইল 1 এ [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11] রয়েছে। সিঙ্কে প্রতিরূপের মোট সংখ্যা 2 হতে দিন।

    • কর্মী 0:

    ব্যাচ 1 = প্রতিলিপি 1: [0, 1]

    ব্যাচ 2 = প্রতিলিপি 1: [4, 5]

    ব্যাচ 3 = প্রতিলিপি 1: [8, 9]

    • কর্মী 1:

    ব্যাচ 1 = প্রতিলিপি 2: [2, 3]

    ব্যাচ 2 = প্রতিলিপি 2: [6, 7]

    ব্যাচ 3 = প্রতিলিপি 2: [10, 11]

  • বন্ধ: আপনি যদি অটোশেডিং বন্ধ করেন তবে প্রতিটি কর্মী সমস্ত ডেটা প্রক্রিয়া করবে। উদাহরণস্বরূপ, আসুন আমরা 2 কর্মীর উপরে 1 ফাইল বিতরণ করি। ফাইল 1 এ [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11] রয়েছে। সিঙ্কে প্রতিলিপিগুলির মোট সংখ্যা ২ হতে দিন Then তারপরে প্রতিটি কর্মী নীচের বিতরণটি দেখতে পাবেন:

    • কর্মী 0:

    ব্যাচ 1 = প্রতিলিপি 1: [0, 1]

    ব্যাচ 2 = প্রতিলিপি 1: [2, 3]

    ব্যাচ 3 = প্রতিলিপি 1: [4, 5]

    ব্যাচ 4 = প্রতিলিপি 1: [6, 7]

    ব্যাচ 5 = প্রতিলিপি 1: [8, 9]

    ব্যাচ 6 = প্রতিলিপি 1: [10, 11]

    • কর্মী 1:

    ব্যাচ 1 = প্রতিলিপি 2: [0, 1]

    ব্যাচ 2 = প্রতিলিপি 2: [2, 3]

    ব্যাচ 3 = প্রতিলিপি 2: [4, 5]

    ব্যাচ 4 = প্রতিলিপি 2: [6, 7]

    ব্যাচ 5 = প্রতিলিপি 2: [8, 9]

    ব্যাচ 6 = প্রতিলিপি 2: [10, 11]

প্রিফেচিং

ডিফল্টরূপে, tf.distribute ব্যবহারকারী প্রদত্ত tf.data.Dataset উদাহরণের শেষে একটি tf.distribute রূপান্তর যুক্ত করে। buffer_size ট্রান্সফর্মেশনের আর্গুমেন্ট যা buffer_size সিঙ্কে প্রতিলিপি সংখ্যার সমান।

tf.distribute.Strategy.experimental_distribute_datasets_from_function

ব্যবহার

এই API টি একটি ইনপুট ফাংশন নেয় এবং একটি tf.distribute.DistributedDataset দৃষ্টান্ত দেয় returns ব্যবহারকারীরা যে ইনপুট ফাংশনটি পাস করে তার একটি tf.distribute.InputContext আর্গুমেন্ট থাকে এবং একটি tf.data.Dataset দৃষ্টান্তটি ফেরত দেওয়া উচিত। এই এপিআই দিয়ে, tf.distribute ব্যবহারকারীর tf.data.Dataset আর কোনও পরিবর্তন করে না tf.data.Dataset ইনপুটটি ইনপুট ফাংশন থেকে ফিরে আসে। ব্যাচ করা এবং ডেটাसेटকে তীক্ষ্ণ করা তার ব্যবহারকারীর দায়িত্ব। tf.distribute শ্রমিকদের প্রতিটি সিপিইউ ডিভাইসে ইনপুট tf.distribute কল করে। ব্যবহারকারীদের তাদের নিজস্ব ব্যাচিং এবং শারডিং যুক্তি নির্দিষ্ট করার অনুমতি দেওয়ার পাশাপাশি, এই মাল্টি ওয়ার্কার প্রশিক্ষণের জন্য ব্যবহার করার সময় tf.distribute.Strategy.experimental_distribute_dataset তুলনায় এই এপিআই আরও ভাল স্কেলাবিলিটি এবং পারফরম্যান্স প্রদর্শন করে।

 mirrored_strategy = tf.distribute.MirroredStrategy()

def dataset_fn(input_context):
  batch_size = input_context.get_per_replica_batch_size(global_batch_size)
  dataset = tf.data.Dataset.from_tensors(([1.],[1.])).repeat(64).batch(16)
  dataset = dataset.shard(
    input_context.num_input_pipelines, input_context.input_pipeline_id)
  dataset = dataset.batch(batch_size)
  dataset = dataset.prefetch(2) # This prefetches 2 batches per device.
  return dataset

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

প্রোপার্টি

ছোট্ট

tf.data.Dataset দৃষ্টান্তটি ইনপুট ফাংশনের রিটার্ন মান প্রতি প্রতিলিপি ব্যাচের আকার ব্যবহার করে ব্যাচ করা উচিত। প্রতি প্রতিলিপি ব্যাচের আকার প্রতিযোগিতামূলক সংখ্যার দ্বারা ভাগ করা বৈশ্বিক ব্যাচের আকার যা সিঙ্ক প্রশিক্ষণে অংশ নিচ্ছে। এটি কারণ tf.distribute শ্রমিকের প্রতিটি সিপিইউ ডিভাইসে ইনপুট ফাংশনটি কল করে। প্রদত্ত শ্রমিকের উপর তৈরি ডেটাসেটটি ওই কর্মীর সমস্ত প্রতিলিপি ব্যবহারের জন্য প্রস্তুত থাকতে হবে।

Sharding

tf.distribute.InputContext অবজেক্টটি যা tf.distribute.InputContext ব্যবহারকারীর ইনপুট tf.distribute আর্গুমেন্ট হিসাবে প্রেরণ করা হয়েছে tf.distribute নীচে tf.distribute দ্বারা তৈরি করা হয়েছে। এতে শ্রমিকের সংখ্যা, বর্তমান কর্মী আইডি ইত্যাদি সম্পর্কিত তথ্য রয়েছে এই ইনপুট ফাংশনটি tf.distribute.InputContext অবজেক্টের অংশ হিসাবে এই বৈশিষ্ট্যগুলি ব্যবহার করে ব্যবহারকারীদের দ্বারা নির্ধারিত নীতি অনুসারে tf.distribute.InputContext পরিচালনা করতে tf.distribute.InputContext

প্রিফেচিং

tf.distribute এর শেষে tf.data.Dataset রূপান্তর যুক্ত করে না। ব্যবহারকারী দ্বারা সরবরাহিত ইনপুট ফাংশন দ্বারা tf.data.Dataset ফেরত দেয়।

বিতরণকারী আইট্রেটার্স

tf.data.Dataset দৃষ্টান্তের অনুরূপ, আপনাকে tf.distribute.DistributedDataset পুনরুক্তি করতে এবং tf.distribute.DistributedDataset এ উপাদানগুলিতে অ্যাক্সেস করতে tf.distribute.DistributedDataset দৃষ্টান্তে একটি পুনরুক্তি তৈরি করতে হবে। নিম্নলিখিতটি আপনি tf.distribute.DistributedIterator একটি tf.distribute.DistributedIterator তৈরি করতে পারেন এবং এটি আপনার মডেলটি প্রশিক্ষণের জন্য ব্যবহার করতে পারেন তা নীচে:

রীতিনীতি

লুপ কনস্ট্রাক্টের জন্য পাইথোনিক ব্যবহার করুন

আপনি পুনরুক্তি উপর একটি ব্যবহারকারী বন্ধুত্বপূর্ণ Pythonic লুপ ব্যবহার করতে পারেন tf.distribute.DistributedDataset । উপাদানগুলি tf.distribute.DistributedIterator থেকে ফিরে এসেছে একটি একক tf.Tensor বা tf.distribute.DistributedValues যার প্রতি প্রতিরূপে একটি মান থাকে। একটি tf.function ভিতরে লুপ স্থাপন একটি কর্মক্ষমতা বৃদ্ধি দেবে। তবে break এবং return বর্তমানে সমর্থিত নয় যদি লুপটি tf.function ভিতরে tf.function । মাল্টি ওয়ার্কার স্ট্রাটেজি যেমন tf.distribute.experimental.MultiWorkerMirroredStrategy এবং tf.distribute.TPUStrategy মতো মাল্টি ওয়ার্কার স্ট্র্যাটেজি ব্যবহার করার সময় আমরা লুপটি tf.function ভিতরে রাখার সমর্থন করি না। tf.function ভিতরে লুপ স্থাপন একক কর্মী tf.distribute.TPUStrategy জন্য কাজ করে তবে TPU tf.distribute.TPUStrategy ব্যবহার করার সময় নয়।

 global_batch_size = 16
mirrored_strategy = tf.distribute.MirroredStrategy()

dataset = tf.data.Dataset.from_tensors(([1.],[1.])).repeat(100).batch(global_batch_size)
dist_dataset = mirrored_strategy.experimental_distribute_dataset(dataset)

@tf.function
def train_step(inputs):
  features, labels = inputs
  return labels - 0.3 * features

for x in dist_dataset:
  # train_step trains the model using the dataset elements
  loss = mirrored_strategy.run(train_step, args=(x,))
  print("Loss is ", loss)
 
INFO:tensorflow:Using MirroredStrategy with devices ('/job:localhost/replica:0/task:0/device:GPU:0',)
Loss is  tf.Tensor(
[[0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]], shape=(16, 1), dtype=float32)
Loss is  tf.Tensor(
[[0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]], shape=(16, 1), dtype=float32)
Loss is  tf.Tensor(
[[0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]], shape=(16, 1), dtype=float32)
Loss is  tf.Tensor(
[[0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]], shape=(16, 1), dtype=float32)
Loss is  tf.Tensor(
[[0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]], shape=(16, 1), dtype=float32)
Loss is  tf.Tensor(
[[0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]], shape=(16, 1), dtype=float32)
Loss is  tf.Tensor(
[[0.7]
 [0.7]
 [0.7]
 [0.7]], shape=(4, 1), dtype=float32)

সুস্পষ্ট পুনরাবৃত্তি তৈরি করতে iter ব্যবহার করুন

পুনরুক্তি করতে একটি উপাদানের উপরে tf.distribute.DistributedDataset উদাহরণস্বরূপ, আপনি একটি তৈরি করতে পারেন tf.distribute.DistributedIterator ব্যবহার iter এটিতে API- টি। একটি সুস্পষ্ট পুনরাবৃত্তি সহ, আপনি একটি নির্দিষ্ট সংখ্যক পদক্ষেপের জন্য পুনরাবৃত্তি করতে পারেন। tf.distribute.DistributedIterator উদাহরণ dist_iterator থেকে পরবর্তী উপাদানটি পেতে, আপনি next(dist_iterator) , dist_iterator.get_next() , বা dist_iterator.get_next_as_optional() কল করতে পারেন। পূর্ববর্তী দুটি মূলত একই:

 num_epochs = 10
steps_per_epoch = 5
for epoch in range(num_epochs):
  dist_iterator = iter(dist_dataset)
  for step in range(steps_per_epoch):
    # train_step trains the model using the dataset elements
    loss = mirrored_strategy.run(train_step, args=(next(dist_iterator),))
    # which is the same as
    # loss = mirrored_strategy.run(train_step, args=(dist_iterator.get_next(),))
    print("Loss is ", loss)
 
Loss is  tf.Tensor(
[[0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]], shape=(16, 1), dtype=float32)
Loss is  tf.Tensor(
[[0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]], shape=(16, 1), dtype=float32)
Loss is  tf.Tensor(
[[0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]], shape=(16, 1), dtype=float32)
Loss is  tf.Tensor(
[[0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]], shape=(16, 1), dtype=float32)
Loss is  tf.Tensor(
[[0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]], shape=(16, 1), dtype=float32)
Loss is  tf.Tensor(
[[0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]], shape=(16, 1), dtype=float32)
Loss is  tf.Tensor(
[[0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]], shape=(16, 1), dtype=float32)
Loss is  tf.Tensor(
[[0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]], shape=(16, 1), dtype=float32)
Loss is  tf.Tensor(
[[0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]], shape=(16, 1), dtype=float32)
Loss is  tf.Tensor(
[[0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]], shape=(16, 1), dtype=float32)
Loss is  tf.Tensor(
[[0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]], shape=(16, 1), dtype=float32)
Loss is  tf.Tensor(
[[0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]], shape=(16, 1), dtype=float32)
Loss is  tf.Tensor(
[[0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]], shape=(16, 1), dtype=float32)
Loss is  tf.Tensor(
[[0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]], shape=(16, 1), dtype=float32)
Loss is  tf.Tensor(
[[0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]], shape=(16, 1), dtype=float32)
Loss is  tf.Tensor(
[[0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]], shape=(16, 1), dtype=float32)
Loss is  tf.Tensor(
[[0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]], shape=(16, 1), dtype=float32)
Loss is  tf.Tensor(
[[0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]], shape=(16, 1), dtype=float32)
Loss is  tf.Tensor(
[[0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]], shape=(16, 1), dtype=float32)
Loss is  tf.Tensor(
[[0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]], shape=(16, 1), dtype=float32)
Loss is  tf.Tensor(
[[0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]], shape=(16, 1), dtype=float32)
Loss is  tf.Tensor(
[[0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]], shape=(16, 1), dtype=float32)
Loss is  tf.Tensor(
[[0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]], shape=(16, 1), dtype=float32)
Loss is  tf.Tensor(
[[0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]], shape=(16, 1), dtype=float32)
Loss is  tf.Tensor(
[[0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]], shape=(16, 1), dtype=float32)
Loss is  tf.Tensor(
[[0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]], shape=(16, 1), dtype=float32)
Loss is  tf.Tensor(
[[0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]], shape=(16, 1), dtype=float32)
Loss is  tf.Tensor(
[[0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]], shape=(16, 1), dtype=float32)
Loss is  tf.Tensor(
[[0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]], shape=(16, 1), dtype=float32)
Loss is  tf.Tensor(
[[0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]], shape=(16, 1), dtype=float32)
Loss is  tf.Tensor(
[[0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]], shape=(16, 1), dtype=float32)
Loss is  tf.Tensor(
[[0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]], shape=(16, 1), dtype=float32)
Loss is  tf.Tensor(
[[0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]], shape=(16, 1), dtype=float32)
Loss is  tf.Tensor(
[[0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]], shape=(16, 1), dtype=float32)
Loss is  tf.Tensor(
[[0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]], shape=(16, 1), dtype=float32)
Loss is  tf.Tensor(
[[0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]], shape=(16, 1), dtype=float32)
Loss is  tf.Tensor(
[[0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]], shape=(16, 1), dtype=float32)
Loss is  tf.Tensor(
[[0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]], shape=(16, 1), dtype=float32)
Loss is  tf.Tensor(
[[0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]], shape=(16, 1), dtype=float32)
Loss is  tf.Tensor(
[[0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]], shape=(16, 1), dtype=float32)
Loss is  tf.Tensor(
[[0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]], shape=(16, 1), dtype=float32)
Loss is  tf.Tensor(
[[0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]], shape=(16, 1), dtype=float32)
Loss is  tf.Tensor(
[[0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]], shape=(16, 1), dtype=float32)
Loss is  tf.Tensor(
[[0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]], shape=(16, 1), dtype=float32)
Loss is  tf.Tensor(
[[0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]], shape=(16, 1), dtype=float32)
Loss is  tf.Tensor(
[[0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]], shape=(16, 1), dtype=float32)
Loss is  tf.Tensor(
[[0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]], shape=(16, 1), dtype=float32)
Loss is  tf.Tensor(
[[0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]], shape=(16, 1), dtype=float32)
Loss is  tf.Tensor(
[[0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]], shape=(16, 1), dtype=float32)
Loss is  tf.Tensor(
[[0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]
 [0.7]], shape=(16, 1), dtype=float32)

next() বা tf.distribute.DistributedIterator.get_next() , যদি tf.distribute.DistributedIterator এর শেষে পৌঁছেছে, তবে একটি আউটআফরেঞ্জ ত্রুটি নিক্ষেপ করা হবে। ক্লায়েন্ট পাইথন দিকের ত্রুটিটি ধরতে পারে এবং চেকপয়েন্টিং এবং মূল্যায়নের মতো অন্যান্য কাজ চালিয়ে যেতে পারে। তবে, আপনি যদি হোস্ট প্রশিক্ষণ লুপ ব্যবহার করেন (যেমন, tf.function প্রতি একাধিক পদক্ষেপ tf.function ), যা দেখে মনে হচ্ছে এটি কার্যকর হবে না:

 @tf.function
def train_fn(iterator):
  for _ in tf.range(steps_per_loop):
    strategy.run(step_fn, args=(next(iterator),))
 

train_fn স্টেপ বডি tf.range অভ্যন্তরে মোড়ানো দ্বারা একাধিক পদক্ষেপ রয়েছে। এই ক্ষেত্রে, নির্ভরতাবিহীন লুপের বিভিন্ন পুনরাবৃত্তিগুলি সমান্তরালভাবে শুরু হতে পারে, সুতরাং পূর্ববর্তী পুনরাবৃত্তির গণনা শেষ হওয়ার আগে একটি আউটঅফ্রেঞ্জ ত্রুটি পরবর্তী পুনরাবৃত্তিতে ট্রিগার করা যেতে পারে। একবার আউটঅফ্রেঞ্জ ত্রুটি নিক্ষেপ করা হলে ফাংশনটির সমস্ত অপসগুলি এখনই বন্ধ হয়ে যাবে। যদি আপনি এমন কিছু ঘটনা এড়াতে চান তবে একটি বিকল্প যা আউটআফরঞ্জ ত্রুটি না ফেলে তা হ'ল tf.distribute.DistributedIterator.get_next_as_optional()get_next_as_optional একটি tf.experimental.Optional যা পরবর্তী উপাদান থাকে বা tf.distribute.DistributedIterator এর শেষ পর্যন্ত পৌঁছে গেলে কোনও মান থাকে না।

 # You can break the loop with get_next_as_optional by checking if the Optional contains value
global_batch_size = 4
steps_per_loop = 5
strategy = tf.distribute.MirroredStrategy(devices=["GPU:0", "CPU:0"])

dataset = tf.data.Dataset.range(9).batch(global_batch_size)
distributed_iterator = iter(strategy.experimental_distribute_dataset(dataset))

@tf.function
def train_fn(distributed_iterator):
  for _ in tf.range(steps_per_loop):
    optional_data = distributed_iterator.get_next_as_optional()
    if not optional_data.has_value():
      break
    per_replica_results = strategy.run(lambda x:x, args=(optional_data.get_value(),))
    tf.print(strategy.experimental_local_results(per_replica_results))
train_fn(distributed_iterator)
 
WARNING:tensorflow:There are non-GPU devices in `tf.distribute.Strategy`, not using nccl allreduce.
INFO:tensorflow:Using MirroredStrategy with devices ('/job:localhost/replica:0/task:0/device:GPU:0', '/job:localhost/replica:0/task:0/device:CPU:0')
([0 1], [2 3])
([4 5], [6 7])
([8], [])

element_spec সম্পত্তি ব্যবহার করে

আপনি যদি একটি একটি বিতরণ ডেটাসেটের উপাদান পাস যদি tf.function এবং চান tf.TypeSpec গ্যারান্টি, আপনি নির্দিষ্ট করতে পারেন input_signature আর্গুমেন্ট tf.function । বিতরণ করা ডেটাসেটের আউটপুট হল tf.distribute.DistributedValues যা একক ডিভাইস বা একাধিক ডিভাইসে ইনপুট উপস্থাপন করতে পারে। এই বিতরণকৃত মানের সাথে সম্পর্কিত tf.TypeSpec পেতে আপনি বিতরণকৃত ডেটাसेट বা বিতরণকৃত element_spec সম্পত্তি ব্যবহার করতে পারেন।

 global_batch_size = 16
epochs = 5
steps_per_epoch = 5
mirrored_strategy = tf.distribute.MirroredStrategy()

dataset = tf.data.Dataset.from_tensors(([1.],[1.])).repeat(100).batch(global_batch_size)
dist_dataset = mirrored_strategy.experimental_distribute_dataset(dataset)

@tf.function(input_signature=[dist_dataset.element_spec])
def train_step(per_replica_inputs):
  def step_fn(inputs):
    return 2 * inputs
  
  return mirrored_strategy.run(step_fn, args=(per_replica_inputs,))

for _ in range(epochs):
  iterator = iter(dist_dataset)
  for _ in range(steps_per_epoch):
    output = train_step(next(iterator))
    tf.print(output)
 
INFO:tensorflow:Using MirroredStrategy with devices ('/job:localhost/replica:0/task:0/device:GPU:0',)
([[1]
 [1]
 [1]
 ...
 [1]
 [1]
 [1]], [[1]
 [1]
 [1]
 ...
 [1]
 [1]
 [1]], [[1]
 [1]
 [1]
 ...
 [1]
 [1]
 [1]], [[1]
 [1]
 [1]
 ...
 [1]
 [1]
 [1]])
([[1]
 [1]
 [1]
 ...
 [1]
 [1]
 [1]], [[1]
 [1]
 [1]
 ...
 [1]
 [1]
 [1]], [[1]
 [1]
 [1]
 ...
 [1]
 [1]
 [1]], [[1]
 [1]
 [1]
 ...
 [1]
 [1]
 [1]])
([[1]
 [1]
 [1]
 ...
 [1]
 [1]
 [1]], [[1]
 [1]
 [1]
 ...
 [1]
 [1]
 [1]], [[1]
 [1]
 [1]
 ...
 [1]
 [1]
 [1]], [[1]
 [1]
 [1]
 ...
 [1]
 [1]
 [1]])
([[1]
 [1]
 [1]
 ...
 [1]
 [1]
 [1]], [[1]
 [1]
 [1]
 ...
 [1]
 [1]
 [1]], [[1]
 [1]
 [1]
 ...
 [1]
 [1]
 [1]], [[1]
 [1]
 [1]
 ...
 [1]
 [1]
 [1]])
([[1]
 [1]
 [1]
 ...
 [1]
 [1]
 [1]], [[1]
 [1]
 [1]
 ...
 [1]
 [1]
 [1]], [[1]
 [1]
 [1]
 ...
 [1]
 [1]
 [1]], [[1]
 [1]
 [1]
 ...
 [1]
 [1]
 [1]])
([[1]
 [1]
 [1]
 ...
 [1]
 [1]
 [1]], [[1]
 [1]
 [1]
 ...
 [1]
 [1]
 [1]], [[1]
 [1]
 [1]
 ...
 [1]
 [1]
 [1]], [[1]
 [1]
 [1]
 ...
 [1]
 [1]
 [1]])
([[1]
 [1]
 [1]
 ...
 [1]
 [1]
 [1]], [[1]
 [1]
 [1]
 ...
 [1]
 [1]
 [1]], [[1]
 [1]
 [1]
 ...
 [1]
 [1]
 [1]], [[1]
 [1]
 [1]
 ...
 [1]
 [1]
 [1]])
([[1]
 [1]
 [1]
 ...
 [1]
 [1]
 [1]], [[1]
 [1]
 [1]
 ...
 [1]
 [1]
 [1]], [[1]
 [1]
 [1]
 ...
 [1]
 [1]
 [1]], [[1]
 [1]
 [1]
 ...
 [1]
 [1]
 [1]])
([[1]
 [1]
 [1]
 ...
 [1]
 [1]
 [1]], [[1]
 [1]
 [1]
 ...
 [1]
 [1]
 [1]], [[1]
 [1]
 [1]
 ...
 [1]
 [1]
 [1]], [[1]
 [1]
 [1]
 ...
 [1]
 [1]
 [1]])
([[1]
 [1]
 [1]
 ...
 [1]
 [1]
 [1]], [[1]
 [1]
 [1]
 ...
 [1]
 [1]
 [1]], [[1]
 [1]
 [1]
 ...
 [1]
 [1]
 [1]], [[1]
 [1]
 [1]
 ...
 [1]
 [1]
 [1]])
([[1]
 [1]
 [1]
 ...
 [1]
 [1]
 [1]], [[1]
 [1]
 [1]
 ...
 [1]
 [1]
 [1]], [[1]
 [1]
 [1]
 ...
 [1]
 [1]
 [1]], [[1]
 [1]
 [1]
 ...
 [1]
 [1]
 [1]])
([[1]
 [1]
 [1]
 ...
 [1]
 [1]
 [1]], [[1]
 [1]
 [1]
 ...
 [1]
 [1]
 [1]], [[1]
 [1]
 [1]
 ...
 [1]
 [1]
 [1]], [[1]
 [1]
 [1]
 ...
 [1]
 [1]
 [1]])
([[1]
 [1]
 [1]
 ...
 [1]
 [1]
 [1]], [[1]
 [1]
 [1]
 ...
 [1]
 [1]
 [1]], [[1]
 [1]
 [1]
 ...
 [1]
 [1]
 [1]], [[1]
 [1]
 [1]
 ...
 [1]
 [1]
 [1]])
([[1]
 [1]
 [1]
 ...
 [1]
 [1]
 [1]], [[1]
 [1]
 [1]
 ...
 [1]
 [1]
 [1]], [[1]
 [1]
 [1]
 ...
 [1]
 [1]
 [1]], [[1]
 [1]
 [1]
 ...
 [1]
 [1]
 [1]])
([[1]
 [1]
 [1]
 ...
 [1]
 [1]
 [1]], [[1]
 [1]
 [1]
 ...
 [1]
 [1]
 [1]], [[1]
 [1]
 [1]
 ...
 [1]
 [1]
 [1]], [[1]
 [1]
 [1]
 ...
 [1]
 [1]
 [1]])
([[1]
 [1]
 [1]
 ...
 [1]
 [1]
 [1]], [[1]
 [1]
 [1]
 ...
 [1]
 [1]
 [1]], [[1]
 [1]
 [1]
 ...
 [1]
 [1]
 [1]], [[1]
 [1]
 [1]
 ...
 [1]
 [1]
 [1]])
([[1]
 [1]
 [1]
 ...
 [1]
 [1]
 [1]], [[1]
 [1]
 [1]
 ...
 [1]
 [1]
 [1]], [[1]
 [1]
 [1]
 ...
 [1]
 [1]
 [1]], [[1]
 [1]
 [1]
 ...
 [1]
 [1]
 [1]])
([[1]
 [1]
 [1]
 ...
 [1]
 [1]
 [1]], [[1]
 [1]
 [1]
 ...
 [1]
 [1]
 [1]], [[1]
 [1]
 [1]
 ...
 [1]
 [1]
 [1]], [[1]
 [1]
 [1]
 ...
 [1]
 [1]
 [1]])
([[1]
 [1]
 [1]
 ...
 [1]
 [1]
 [1]], [[1]
 [1]
 [1]
 ...
 [1]
 [1]
 [1]], [[1]
 [1]
 [1]
 ...
 [1]
 [1]
 [1]], [[1]
 [1]
 [1]
 ...
 [1]
 [1]
 [1]])
([[1]
 [1]
 [1]
 ...
 [1]
 [1]
 [1]], [[1]
 [1]
 [1]
 ...
 [1]
 [1]
 [1]], [[1]
 [1]
 [1]
 ...
 [1]
 [1]
 [1]], [[1]
 [1]
 [1]
 ...
 [1]
 [1]
 [1]])
([[1]
 [1]
 [1]
 ...
 [1]
 [1]
 [1]], [[1]
 [1]
 [1]
 ...
 [1]
 [1]
 [1]], [[1]
 [1]
 [1]
 ...
 [1]
 [1]
 [1]], [[1]
 [1]
 [1]
 ...
 [1]
 [1]
 [1]])
([[1]
 [1]
 [1]
 ...
 [1]
 [1]
 [1]], [[1]
 [1]
 [1]
 ...
 [1]
 [1]
 [1]], [[1]
 [1]
 [1]
 ...
 [1]
 [1]
 [1]], [[1]
 [1]
 [1]
 ...
 [1]
 [1]
 [1]])
([[1]
 [1]
 [1]
 ...
 [1]
 [1]
 [1]], [[1]
 [1]
 [1]
 ...
 [1]
 [1]
 [1]], [[1]
 [1]
 [1]
 ...
 [1]
 [1]
 [1]], [[1]
 [1]
 [1]
 ...
 [1]
 [1]
 [1]])
([[1]
 [1]
 [1]
 ...
 [1]
 [1]
 [1]], [[1]
 [1]
 [1]
 ...
 [1]
 [1]
 [1]], [[1]
 [1]
 [1]
 ...
 [1]
 [1]
 [1]], [[1]
 [1]
 [1]
 ...
 [1]
 [1]
 [1]])
([[1]
 [1]
 [1]
 ...
 [1]
 [1]
 [1]], [[1]
 [1]
 [1]
 ...
 [1]
 [1]
 [1]], [[1]
 [1]
 [1]
 ...
 [1]
 [1]
 [1]], [[1]
 [1]
 [1]
 ...
 [1]
 [1]
 [1]])

আংশিক ব্যাচ

tf.data.Dataset ব্যাচগুলির মুখোমুখি হয় যখন tf.data.Dataset উদাহরণস্বরূপ ব্যবহারকারীরা তৈরি করেন এমন ব্যাচের আকার থাকতে পারে যা প্রতিরূপের সংখ্যা দ্বারা সমানভাবে বিভাজ্য নয় বা যখন ডেটাসেটের উদাহরণের কার্ডিনালিটি ব্যাচের আকার দ্বারা বিভাজ্য নয়। এর অর্থ হ'ল যখন ডেটাসেটটি একাধিক প্রতিরূপে বিতরণ করা হবে, তখন কিছু পুনরাবৃত্তিকারীদের next কলটির ফলাফল আউটআফর্যাঞ্জেরিয়র হবে। এই ব্যবহারের tf.distribute পরিচালনা করতে, tf.distribute ব্যাচের আকার 0 এর ডামি ব্যাচগুলি প্রতিরূপে প্রক্রিয়াকরণের জন্য আর কোনও ডেটা নেই বলে প্রত্যাবর্তন করে।

একক কর্মী ক্ষেত্রে, যদি তথ্য দ্বারা ফিরিয়ে দেওয়া না হয় next পুনরুক্তিকারীর এই কল, 0 ব্যাচ আকারের ডামি ব্যাচ তৈরি করেছেন এবং ডেটাসেটে বাস্তব তথ্য দিয়ে ব্যবহার করা হয়। আংশিক ব্যাচের ক্ষেত্রে, সর্বশেষ বিশ্বব্যাপী ব্যাচের তথ্যের ডামি ব্যাচের পাশাপাশি বাস্তব তথ্য থাকবে। ডেটা প্রসেসিংয়ের স্টপিং শর্তটি এখন প্রতিরূপের কোনওটির কাছে ডেটা আছে কিনা তা পরীক্ষা করে দেখায়। যদি কোনও প্রতিরূপে কোনও ডেটা না থাকে তবে একটি আউটঅফ্রেঞ্জ ত্রুটি নিক্ষেপ করা হয়।

মাল্টি ওয়ার্কার কেসের ক্ষেত্রে, প্রতিটি শ্রমিকের ডেটা উপস্থিতির প্রতিনিধিত্ব করে এমন বুলিয়ান মান ক্রস প্রতিলিপি যোগাযোগ ব্যবহার করে একত্রিত হয় এবং এটি সনাক্ত করতে ব্যবহৃত হয় যদি সমস্ত শ্রমিক বিতরণকৃত ডেটাসেট প্রক্রিয়াজাতকরণ শেষ করে। যেহেতু এতে ক্রস শ্রমিক যোগাযোগ জড়িত রয়েছে সেখানে কিছু কার্যকারিতা জড়িত রয়েছে।

আদেশ সহকারে

  • একাধিক কর্মী সেটআপ সহ tf.distribute.Strategy.experimental_distribute_dataset API ব্যবহার করার সময়, ব্যবহারকারীরা একটি tf.data.Dataset পাস করে যা ফাইলগুলি থেকে পড়ে। তাহলে tf.data.experimental.AutoShardPolicy সেট করা হয় AUTO বা FILE প্রতি পদক্ষেপ ব্যাচ আকার সত্যিকারের ব্যবহারকারী সংজ্ঞায়িত বিশ্বব্যাপী ব্যাচ আকার চেয়ে ছোট হতে পারে। ফাইলের অবশিষ্ট উপাদানগুলি বিশ্ব ব্যাচের আকারের চেয়ে কম হলে এটি ঘটতে পারে। ব্যবহারকারীরা হয় চালাতে বা সেট করার জন্য পদক্ষেপ সংখ্যার উপর নির্ভর করে ছাড়া ডেটা সেটটি এক্সস্ট করতে tf.data.experimental.AutoShardPolicy করার DATA এটি প্রায় কাজ।

  • স্টেটফুল ডেটাসেট ট্রান্সফর্মেশনগুলি বর্তমানে tf.distribute এবং ডেটাসেটের কাছে উপেক্ষা করা কোনও স্টেটফুল tf.distribute সাহায্যে সমর্থিত নয়। উদাহরণস্বরূপ, যদি আপনার ডেটাসেটে কোনও map_fn যা কোনও চিত্র tf.random.uniform জন্য tf.random.uniform ব্যবহার করে, তবে আপনার কাছে একটি ডেটাসেট গ্রাফ রয়েছে যা স্থানীয় মেশিনে স্টেটের (অর্থাৎ এলোমেলো বীজ) উপর নির্ভর করে যেখানে পাইথন প্রক্রিয়া চালিত হচ্ছে।

  • পরীক্ষামূলক tf.data.experimental.OptimizationOptions যেগুলি ডিফল্টরূপে অক্ষম করা হয় কিছু নির্দিষ্ট প্রসঙ্গে - যেমন tf.distribute সাথে একসাথে ব্যবহৃত হলে - পারফরম্যান্স অবক্ষয়ের কারণ হতে পারে। বিতরণ সেটিংয়ে তারা আপনার কাজের চাপের পারফরম্যান্সে উপকৃত হবে তা যাচাই করার পরে আপনার কেবল তাদের সক্ষম করা উচিত।

  • tf.distribute.experimental_distribute_dataset বা tf.distribute.experimental_distribute_datasets_from_function ব্যবহার করার সময় শ্রমিকরা যে ক্রমে ডেটা প্রক্রিয়া করে তা গ্যারান্টিযুক্ত নয়। আপনি যদি ভবিষ্যদ্বাণী স্কেল করার জন্য tf.distribute ব্যবহার করছেন তবে এটি সাধারণত প্রয়োজন tf.distribute তবে আপনি ব্যাচের প্রতিটি উপাদানের জন্য একটি সূচক সন্নিবেশ করতে পারেন এবং সেই অনুযায়ী আউটপুট অর্ডার করতে পারেন। কীভাবে আউটপুটগুলি অর্ডার করতে হয় তার উদাহরণ নীচের স্নিপেট।

 mirrored_strategy = tf.distribute.MirroredStrategy()
dataset_size = 24
batch_size = 6
dataset = tf.data.Dataset.range(dataset_size).enumerate().batch(batch_size)
dist_dataset = mirrored_strategy.experimental_distribute_dataset(dataset)

def predict(index, inputs):
  outputs = 2 * inputs
  return index, outputs

result = {}
for index, inputs in dist_dataset:
  output_index, outputs = mirrored_strategy.run(predict, args=(index, inputs))
  indices = list(mirrored_strategy.experimental_local_results(output_index))
  rindices = []
  for a in indices:
    rindices.extend(a.numpy())
  outputs = list(mirrored_strategy.experimental_local_results(outputs))
  routputs = []
  for a in outputs:
    routputs.extend(a.numpy())
  for i, value in zip(rindices, routputs):
    result[i] = value

print(result)
 
INFO:tensorflow:Using MirroredStrategy with devices ('/job:localhost/replica:0/task:0/device:GPU:0',)
WARNING:tensorflow:Using MirroredStrategy eagerly has significant overhead currently. We will be working on improving this in the future, but for now please wrap `call_for_each_replica` or `experimental_run` or `experimental_run_v2` inside a tf.function to get the best performance.
WARNING:tensorflow:Using MirroredStrategy eagerly has significant overhead currently. We will be working on improving this in the future, but for now please wrap `call_for_each_replica` or `experimental_run` or `experimental_run_v2` inside a tf.function to get the best performance.
WARNING:tensorflow:Using MirroredStrategy eagerly has significant overhead currently. We will be working on improving this in the future, but for now please wrap `call_for_each_replica` or `experimental_run` or `experimental_run_v2` inside a tf.function to get the best performance.
WARNING:tensorflow:Using MirroredStrategy eagerly has significant overhead currently. We will be working on improving this in the future, but for now please wrap `call_for_each_replica` or `experimental_run` or `experimental_run_v2` inside a tf.function to get the best performance.
{0: 0, 1: 2, 2: 4, 3: 6, 4: 8, 5: 10, 6: 12, 7: 14, 8: 16, 9: 18, 10: 20, 11: 22, 12: 24, 13: 26, 14: 28, 15: 30, 16: 32, 17: 34, 18: 36, 19: 38, 20: 40, 21: 42, 22: 44, 23: 46}

আমি যদি কোনও ক্যানোনিকাল tf.data.Dataset উদাহরণ ব্যবহার না করি তবে আমি কীভাবে আমার ডেটা বিতরণ করব?

কখনও কখনও ব্যবহারকারীরা তাদের ইনপুট উপস্থাপন করতে tf.data.Dataset ব্যবহার করতে পারবেন না এবং পরবর্তী সময়ে উল্লিখিত API গুলি একাধিক ডিভাইসে ডেটাসেট বিতরণ করতে পারেন। এই জাতীয় ক্ষেত্রে আপনি কোনও জেনারেটরের কাছ থেকে কাঁচা টেনার বা ইনপুট ব্যবহার করতে পারেন।

স্বেচ্ছাসেবক টেনসর ইনপুটগুলির জন্য পরীক্ষামূলক_স্তর_মূল্য_ফর্ম_ফাংশনটি ব্যবহার করুন

strategy.run গ্রহণ tf.distribute.DistributedValues যার আউটপুট next(iterator) । টেনসর মানগুলি পাস করার জন্য, কাঁচা tf.distribute.DistributedValues থেকে tf.distribute.DistributedValues নির্মাণের জন্য experimental_distribute_values_from_function tf.distribute.DistributedValues ব্যবহার করুন।

 mirrored_strategy = tf.distribute.MirroredStrategy()
worker_devices = mirrored_strategy.extended.worker_devices

def value_fn(ctx):
  return tf.constant(1.0)

distributed_values = mirrored_strategy.experimental_distribute_values_from_function(value_fn)
for _ in range(4):
  result = mirrored_strategy.run(lambda x:x, args=(distributed_values,))
  print(result)
 
INFO:tensorflow:Using MirroredStrategy with devices ('/job:localhost/replica:0/task:0/device:GPU:0',)
WARNING:tensorflow:Using MirroredStrategy eagerly has significant overhead currently. We will be working on improving this in the future, but for now please wrap `call_for_each_replica` or `experimental_run` or `experimental_run_v2` inside a tf.function to get the best performance.
tf.Tensor(1.0, shape=(), dtype=float32)
tf.Tensor(1.0, shape=(), dtype=float32)
tf.Tensor(1.0, shape=(), dtype=float32)
tf.Tensor(1.0, shape=(), dtype=float32)

আপনার ইনপুট যদি কোনও জেনারেটরের থেকে থাকে তবে tf.data.Dataset.from_generator ব্যবহার করুন

আপনি যদি জেনারেটর ফাংশন ব্যবহার করতে চান তবে আপনি from_generator API ব্যবহার করে একটি tf.data.Dataset উদাহরণ তৈরি করতে পারেন।

 mirrored_strategy = tf.distribute.MirroredStrategy()
def input_gen():
  while True:
    yield np.random.rand(4)

# use Dataset.from_generator
dataset = tf.data.Dataset.from_generator(
    input_gen, output_types=(tf.float32), output_shapes=tf.TensorShape([4]))
dist_dataset = mirrored_strategy.experimental_distribute_dataset(dataset)
iterator = iter(dist_dataset)
for _ in range(4):
  mirrored_strategy.run(lambda x:x, args=(next(iterator),))
 
INFO:tensorflow:Using MirroredStrategy with devices ('/job:localhost/replica:0/task:0/device:GPU:0',)