এস্টিমেটর সহ বহু-কর্মী প্রশিক্ষণ

TensorFlow.org এ দেখুন Google Colab-এ চালান GitHub-এ উৎস দেখুন নোটবুক ডাউনলোড করুন

ওভারভিউ

এই টিউটোরিয়ালটি দেখায় কিভাবে tf.distribute.Strategy tf.estimator সাথে বিতরণ করা বহু-কর্মী প্রশিক্ষণের জন্য ব্যবহার করা যেতে পারে। আপনি যদি tf.estimator ব্যবহার করে আপনার কোড লেখেন, এবং আপনি উচ্চ কর্মক্ষমতা সহ একটি একক মেশিনের বাইরে স্কেলিং করতে আগ্রহী হন, এই টিউটোরিয়ালটি আপনার জন্য।

শুরু করার আগে, অনুগ্রহ করে বিতরণ কৌশল নির্দেশিকা পড়ুন। মাল্টি-জিপিইউ প্রশিক্ষণ টিউটোরিয়ালটিও প্রাসঙ্গিক, কারণ এই টিউটোরিয়ালটি একই মডেল ব্যবহার করে।

সেটআপ

প্রথমত, TensorFlow এবং প্রয়োজনীয় আমদানি সেটআপ করুন।

import tensorflow_datasets as tfds
import tensorflow as tf

import os, json
tf.compat.v1.disable_eager_execution()

ইনপুট ফাংশন

এই টিউটোরিয়ালটি TensorFlow ডেটাসেট থেকে MNIST ডেটাসেট ব্যবহার করে। এখানে কোডটি একটি মূল পার্থক্য সহ মাল্টি-জিপিইউ প্রশিক্ষণ টিউটোরিয়ালের অনুরূপ: মাল্টি-কর্মী প্রশিক্ষণের জন্য এস্টিমেটর ব্যবহার করার সময়, মডেল কনভারজেন্স নিশ্চিত করার জন্য কর্মীদের সংখ্যা দ্বারা ডেটাসেট ভাগ করা প্রয়োজন। ইনপুট ডেটা কর্মী সূচক দ্বারা শার্ড করা হয়, যাতে প্রতিটি কর্মী 1/num_workers ডেটাসেটের স্বতন্ত্র অংশ প্রক্রিয়া করে।

BUFFER_SIZE = 10000
BATCH_SIZE = 64

def input_fn(mode, input_context=None):
  datasets, info = tfds.load(name='mnist',
                                with_info=True,
                                as_supervised=True)
  mnist_dataset = (datasets['train'] if mode == tf.estimator.ModeKeys.TRAIN else
                   datasets['test'])

  def scale(image, label):
    image = tf.cast(image, tf.float32)
    image /= 255
    return image, label

  if input_context:
    mnist_dataset = mnist_dataset.shard(input_context.num_input_pipelines,
                                        input_context.input_pipeline_id)
  return mnist_dataset.map(scale).cache().shuffle(BUFFER_SIZE).batch(BATCH_SIZE)

অভিন্নতা অর্জনের জন্য আরেকটি যুক্তিসঙ্গত পন্থা হবে প্রতিটি কর্মীর কাছে স্বতন্ত্র বীজ সহ ডেটাসেট এলোমেলো করা।

মাল্টি-কর্মী কনফিগারেশন

এই টিউটোরিয়ালের মূল পার্থক্যগুলির মধ্যে একটি ( মাল্টি-জিপিইউ ট্রেনিং টিউটোরিয়ালের তুলনায়) হল মাল্টি-ওয়ার্কার সেটআপ। TF_CONFIG এনভায়রনমেন্ট ভেরিয়েবল হল ক্লাস্টারের অংশ প্রতিটি কর্মীকে ক্লাস্টার কনফিগারেশন নির্দিষ্ট করার আদর্শ উপায়।

TF_CONFIG এর দুটি উপাদান রয়েছে: cluster এবং taskcluster সমগ্র ক্লাস্টার সম্পর্কে তথ্য প্রদান করে, যেমন ক্লাস্টারের কর্মী এবং প্যারামিটার সার্ভারগুলি। task বর্তমান টাস্ক সম্পর্কে তথ্য প্রদান করে। প্রথম কম্পোনেন্ট cluster সমস্ত কর্মী এবং প্যারামিটার সার্ভারের জন্য একই, এবং দ্বিতীয় উপাদান task প্রতিটি কর্মী এবং প্যারামিটার সার্ভারে আলাদা এবং এর নিজস্ব type এবং index নির্দিষ্ট করে। এই উদাহরণে, টাস্ক type হল worker এবং টাস্ক index হল 0

উদাহরণের উদ্দেশ্যে, এই টিউটোরিয়ালটি দেখায় কিভাবে localhost 2 জন কর্মী সহ একটি TF_CONFIG সেট করতে হয়। অনুশীলনে, আপনি একটি বাহ্যিক IP ঠিকানা এবং পোর্টে একাধিক কর্মী তৈরি করবেন এবং প্রতিটি কর্মীকে যথাযথভাবে TF_CONFIG সেট করবেন, অর্থাৎ টাস্ক index পরিবর্তন করবেন।

os.environ['TF_CONFIG'] = json.dumps({
    'cluster': {
        'worker': ["localhost:12345", "localhost:23456"]
    },
    'task': {'type': 'worker', 'index': 0}
})

মডেল সংজ্ঞায়িত করুন

প্রশিক্ষণের জন্য স্তর, অপ্টিমাইজার এবং ক্ষতি ফাংশন লিখুন। এই টিউটোরিয়ালটি কেরাস লেয়ার সহ মডেলটিকে সংজ্ঞায়িত করে, মাল্টি-জিপিইউ ট্রেনিং টিউটোরিয়ালের মতো।

LEARNING_RATE = 1e-4
def model_fn(features, labels, mode):
  model = tf.keras.Sequential([
      tf.keras.layers.Conv2D(32, 3, activation='relu', input_shape=(28, 28, 1)),
      tf.keras.layers.MaxPooling2D(),
      tf.keras.layers.Flatten(),
      tf.keras.layers.Dense(64, activation='relu'),
      tf.keras.layers.Dense(10)
  ])
  logits = model(features, training=False)

  if mode == tf.estimator.ModeKeys.PREDICT:
    predictions = {'logits': logits}
    return tf.estimator.EstimatorSpec(labels=labels, predictions=predictions)

  optimizer = tf.compat.v1.train.GradientDescentOptimizer(
      learning_rate=LEARNING_RATE)
  loss = tf.keras.losses.SparseCategoricalCrossentropy(
      from_logits=True, reduction=tf.keras.losses.Reduction.NONE)(labels, logits)
  loss = tf.reduce_sum(loss) * (1. / BATCH_SIZE)
  if mode == tf.estimator.ModeKeys.EVAL:
    return tf.estimator.EstimatorSpec(mode, loss=loss)

  return tf.estimator.EstimatorSpec(
      mode=mode,
      loss=loss,
      train_op=optimizer.minimize(
          loss, tf.compat.v1.train.get_or_create_global_step()))

মাল্টিওয়ার্কার মিররড স্ট্র্যাটেজি

মডেলটি প্রশিক্ষণ দিতে, tf.distribute.experimental.MultiWorkerMirroredStrategy এর একটি উদাহরণ ব্যবহার করুন। MultiWorkerMirroredStrategy সমস্ত কর্মী জুড়ে প্রতিটি ডিভাইসে মডেলের স্তরগুলিতে সমস্ত ভেরিয়েবলের কপি তৈরি করে। এটি CollectiveOps ব্যবহার করে, সমষ্টিগত যোগাযোগের জন্য একটি TensorFlow অপ, গ্রেডিয়েন্টগুলিকে একত্রিত করতে এবং ভেরিয়েবলগুলিকে সিঙ্কে রাখতে। tf.distribute.Strategy এই কৌশল সম্পর্কে আরও বিশদ রয়েছে।

strategy = tf.distribute.experimental.MultiWorkerMirroredStrategy()
WARNING:tensorflow:From /tmp/ipykernel_7505/349189047.py:1: _CollectiveAllReduceStrategyExperimental.__init__ (from tensorflow.python.distribute.collective_all_reduce_strategy) is deprecated and will be removed in a future version.
Instructions for updating:
use distribute.MultiWorkerMirroredStrategy instead
INFO:tensorflow:Single-worker MultiWorkerMirroredStrategy with local_devices = ('/device:GPU:0',), communication = CommunicationImplementation.AUTO

ট্রেন এবং মডেল মূল্যায়ন

এর পরে, অনুমানকারীর জন্য RunConfig এ বিতরণ কৌশলটি নির্দিষ্ট করুন এবং tf.estimator.train_and_evaluate ব্যবহার করে প্রশিক্ষণ ও মূল্যায়ন করুন। এই টিউটোরিয়ালটি train_distribute মাধ্যমে কৌশলটি নির্দিষ্ট করে শুধুমাত্র প্রশিক্ষণ বিতরণ করে। eval_distribute এর মাধ্যমে মূল্যায়ন বিতরণ করাও সম্ভব।

config = tf.estimator.RunConfig(train_distribute=strategy)

classifier = tf.estimator.Estimator(
    model_fn=model_fn, model_dir='/tmp/multiworker', config=config)
tf.estimator.train_and_evaluate(
    classifier,
    train_spec=tf.estimator.TrainSpec(input_fn=input_fn),
    eval_spec=tf.estimator.EvalSpec(input_fn=input_fn)
)
INFO:tensorflow:Initializing RunConfig with distribution strategies.
INFO:tensorflow:Not using Distribute Coordinator.
INFO:tensorflow:Using config: {'_model_dir': '/tmp/multiworker', '_tf_random_seed': None, '_save_summary_steps': 100, '_save_checkpoints_steps': None, '_save_checkpoints_secs': 600, '_session_config': allow_soft_placement: true
graph_options {
  rewrite_options {
    meta_optimizer_iterations: ONE
  }
}
, '_keep_checkpoint_max': 5, '_keep_checkpoint_every_n_hours': 10000, '_log_step_count_steps': 100, '_train_distribute': <tensorflow.python.distribute.collective_all_reduce_strategy._CollectiveAllReduceStrategyExperimental object at 0x7f3404234490>, '_device_fn': None, '_protocol': None, '_eval_distribute': None, '_experimental_distribute': None, '_experimental_max_worker_delay_secs': None, '_session_creation_timeout_secs': 7200, '_checkpoint_save_graph_def': True, '_service': None, '_cluster_spec': ClusterSpec({}), '_task_type': 'worker', '_task_id': 0, '_global_id_in_cluster': 0, '_master': '', '_evaluation_master': '', '_is_chief': True, '_num_ps_replicas': 0, '_num_worker_replicas': 1, '_distribute_coordinator_mode': None}
INFO:tensorflow:Not using Distribute Coordinator.
INFO:tensorflow:Running training and evaluation locally (non-distributed).
INFO:tensorflow:Start train and evaluate loop. The evaluate will happen after every checkpoint. Checkpoint frequency is determined based on RunConfig arguments: save_checkpoints_steps None or save_checkpoints_secs 600.
WARNING:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.7/site-packages/tensorflow_estimator/python/estimator/estimator.py:1244: StrategyBase.configure (from tensorflow.python.distribute.distribute_lib) is deprecated and will be removed in a future version.
Instructions for updating:
use `update_config_proto` instead.
INFO:tensorflow:The `input_fn` accepts an `input_context` which will be given by DistributionStrategy
INFO:tensorflow:Calling model_fn.
/tmpfs/src/tf_docs_env/lib/python3.7/site-packages/tensorflow/python/data/ops/dataset_ops.py:449: UserWarning: To make it possible to preserve tf.data options across serialization boundaries, their implementation has moved to be part of the TensorFlow graph. As a consequence, the options value is in general no longer known at graph construction time. Invoking this method in graph mode retains the legacy behavior of the original implementation, but note that the returned value might not reflect the actual value of the options.
  warnings.warn("To make it possible to preserve tf.data options across "
INFO:tensorflow:Calling model_fn.
INFO:tensorflow:Done calling model_fn.
INFO:tensorflow:Done calling model_fn.
INFO:tensorflow:Create CheckpointSaverHook.
INFO:tensorflow:Create CheckpointSaverHook.
WARNING:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.7/site-packages/tensorflow_estimator/python/estimator/util.py:95: DistributedIteratorV1.initialize (from tensorflow.python.distribute.v1.input_lib) is deprecated and will be removed in a future version.
Instructions for updating:
Use the iterator's `initializer` property instead.
WARNING:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.7/site-packages/tensorflow_estimator/python/estimator/util.py:95: DistributedIteratorV1.initialize (from tensorflow.python.distribute.v1.input_lib) is deprecated and will be removed in a future version.
Instructions for updating:
Use the iterator's `initializer` property instead.
INFO:tensorflow:Graph was finalized.
INFO:tensorflow:Graph was finalized.
INFO:tensorflow:Running local_init_op.
INFO:tensorflow:Running local_init_op.
INFO:tensorflow:Done running local_init_op.
INFO:tensorflow:Done running local_init_op.
INFO:tensorflow:Calling checkpoint listeners before saving checkpoint 0...
INFO:tensorflow:Calling checkpoint listeners before saving checkpoint 0...
INFO:tensorflow:Saving checkpoints for 0 into /tmp/multiworker/model.ckpt.
INFO:tensorflow:Saving checkpoints for 0 into /tmp/multiworker/model.ckpt.
INFO:tensorflow:Calling checkpoint listeners after saving checkpoint 0...
INFO:tensorflow:Calling checkpoint listeners after saving checkpoint 0...
2022-01-26 05:29:43.503603: W tensorflow/core/grappler/utils/graph_view.cc:836] No registered 'MultiDeviceIteratorFromStringHandle' OpKernel for GPU devices compatible with node { {node MultiDeviceIteratorFromStringHandle} }
    .  Registered:  device='CPU'

2022-01-26 05:29:43.504873: W tensorflow/core/grappler/utils/graph_view.cc:836] No registered 'MultiDeviceIteratorGetNextFromShard' OpKernel for GPU devices compatible with node { {node MultiDeviceIteratorGetNextFromShard} }
    .  Registered:  device='CPU'
INFO:tensorflow:loss = 2.292878, step = 0
INFO:tensorflow:loss = 2.292878, step = 0
INFO:tensorflow:global_step/sec: 173.275
INFO:tensorflow:global_step/sec: 173.275
INFO:tensorflow:loss = 2.29561, step = 100 (0.579 sec)
INFO:tensorflow:loss = 2.29561, step = 100 (0.579 sec)
INFO:tensorflow:global_step/sec: 189.057
INFO:tensorflow:global_step/sec: 189.057
INFO:tensorflow:loss = 2.2644367, step = 200 (0.529 sec)
INFO:tensorflow:loss = 2.2644367, step = 200 (0.529 sec)
INFO:tensorflow:global_step/sec: 193.075
INFO:tensorflow:global_step/sec: 193.075
INFO:tensorflow:loss = 2.2662685, step = 300 (0.517 sec)
INFO:tensorflow:loss = 2.2662685, step = 300 (0.517 sec)
INFO:tensorflow:global_step/sec: 199.957
INFO:tensorflow:global_step/sec: 199.957
INFO:tensorflow:loss = 2.2667098, step = 400 (0.500 sec)
INFO:tensorflow:loss = 2.2667098, step = 400 (0.500 sec)
INFO:tensorflow:global_step/sec: 204.217
INFO:tensorflow:global_step/sec: 204.217
INFO:tensorflow:loss = 2.251912, step = 500 (0.490 sec)
INFO:tensorflow:loss = 2.251912, step = 500 (0.490 sec)
INFO:tensorflow:global_step/sec: 201.747
INFO:tensorflow:global_step/sec: 201.747
INFO:tensorflow:loss = 2.2633677, step = 600 (0.496 sec)
INFO:tensorflow:loss = 2.2633677, step = 600 (0.496 sec)
INFO:tensorflow:global_step/sec: 206.079
INFO:tensorflow:global_step/sec: 206.079
INFO:tensorflow:loss = 2.2531767, step = 700 (0.485 sec)
INFO:tensorflow:loss = 2.2531767, step = 700 (0.485 sec)
INFO:tensorflow:global_step/sec: 231.299
INFO:tensorflow:global_step/sec: 231.299
INFO:tensorflow:loss = 2.2578738, step = 800 (0.433 sec)
INFO:tensorflow:loss = 2.2578738, step = 800 (0.433 sec)
INFO:tensorflow:global_step/sec: 657.044
INFO:tensorflow:global_step/sec: 657.044
INFO:tensorflow:loss = 2.2344787, step = 900 (0.150 sec)
INFO:tensorflow:loss = 2.2344787, step = 900 (0.150 sec)
INFO:tensorflow:Calling checkpoint listeners before saving checkpoint 938...
INFO:tensorflow:Calling checkpoint listeners before saving checkpoint 938...
INFO:tensorflow:Saving checkpoints for 938 into /tmp/multiworker/model.ckpt.
INFO:tensorflow:Saving checkpoints for 938 into /tmp/multiworker/model.ckpt.
INFO:tensorflow:Calling checkpoint listeners after saving checkpoint 938...
INFO:tensorflow:Calling checkpoint listeners after saving checkpoint 938...
INFO:tensorflow:Calling model_fn.
INFO:tensorflow:Calling model_fn.
INFO:tensorflow:Done calling model_fn.
INFO:tensorflow:Done calling model_fn.
INFO:tensorflow:Starting evaluation at 2022-01-26T05:29:56
INFO:tensorflow:Starting evaluation at 2022-01-26T05:29:56
INFO:tensorflow:Graph was finalized.
INFO:tensorflow:Graph was finalized.
INFO:tensorflow:Restoring parameters from /tmp/multiworker/model.ckpt-938
INFO:tensorflow:Restoring parameters from /tmp/multiworker/model.ckpt-938
INFO:tensorflow:Running local_init_op.
INFO:tensorflow:Running local_init_op.
INFO:tensorflow:Done running local_init_op.
INFO:tensorflow:Done running local_init_op.
INFO:tensorflow:Evaluation [10/100]
INFO:tensorflow:Evaluation [10/100]
INFO:tensorflow:Evaluation [20/100]
INFO:tensorflow:Evaluation [20/100]
INFO:tensorflow:Evaluation [30/100]
INFO:tensorflow:Evaluation [30/100]
INFO:tensorflow:Evaluation [40/100]
INFO:tensorflow:Evaluation [40/100]
INFO:tensorflow:Evaluation [50/100]
INFO:tensorflow:Evaluation [50/100]
INFO:tensorflow:Evaluation [60/100]
INFO:tensorflow:Evaluation [60/100]
INFO:tensorflow:Evaluation [70/100]
INFO:tensorflow:Evaluation [70/100]
INFO:tensorflow:Evaluation [80/100]
INFO:tensorflow:Evaluation [80/100]
INFO:tensorflow:Evaluation [90/100]
INFO:tensorflow:Evaluation [90/100]
INFO:tensorflow:Evaluation [100/100]
INFO:tensorflow:Evaluation [100/100]
INFO:tensorflow:Inference Time : 2.04637s
INFO:tensorflow:Inference Time : 2.04637s
INFO:tensorflow:Finished evaluation at 2022-01-26-05:29:58
INFO:tensorflow:Finished evaluation at 2022-01-26-05:29:58
INFO:tensorflow:Saving dict for global step 938: global_step = 938, loss = 2.234131
INFO:tensorflow:Saving dict for global step 938: global_step = 938, loss = 2.234131
INFO:tensorflow:Saving 'checkpoint_path' summary for global step 938: /tmp/multiworker/model.ckpt-938
INFO:tensorflow:Saving 'checkpoint_path' summary for global step 938: /tmp/multiworker/model.ckpt-938
INFO:tensorflow:Loss for final step: 1.10881.
INFO:tensorflow:Loss for final step: 1.10881.
({'loss': 2.234131, 'global_step': 938}, [])

প্রশিক্ষণ কর্মক্ষমতা অপ্টিমাইজ করুন

আপনার কাছে এখন tf.distribute.Strategy দ্বারা চালিত একটি মডেল এবং একটি মাল্টি-ওয়ার্কার সক্ষম এস্টিমেটর আছে। বহু-কর্মী প্রশিক্ষণের কর্মক্ষমতা অপ্টিমাইজ করতে আপনি নিম্নলিখিত কৌশলগুলি চেষ্টা করতে পারেন:

  • ব্যাচের আকার বাড়ান: এখানে উল্লেখ করা ব্যাচের আকার প্রতি-GPU। সাধারণভাবে, GPU মেমরির সাথে মানানসই সবথেকে বড় ব্যাচের মাপ বাঞ্ছনীয়।
  • কাস্ট ভেরিয়েবল: সম্ভব হলে ভেরিয়েবলগুলিকে tf.float এ কাস্ট করুন। অফিসিয়াল ResNet মডেল এটি কিভাবে করা যেতে পারে তার একটি উদাহরণ অন্তর্ভুক্ত করে।
  • যৌথ যোগাযোগ ব্যবহার করুন: MultiWorkerMirroredStrategy একাধিক যৌথ যোগাযোগ বাস্তবায়ন প্রদান করে।

    • RING ক্রস-হোস্ট কমিউনিকেশন লেয়ার হিসেবে gRPC ব্যবহার করে রিং-ভিত্তিক সমষ্টি প্রয়োগ করে।
    • NCCL যৌথ বাস্তবায়নের জন্য Nvidia-এর NCCL ব্যবহার করে।
    • AUTO রানটাইমের পছন্দকে পিছিয়ে দেয়।

    যৌথ বাস্তবায়নের সর্বোত্তম পছন্দ নির্ভর করে GPU-এর সংখ্যা এবং প্রকারের উপর এবং ক্লাস্টারে নেটওয়ার্ক আন্তঃসংযোগ। স্বয়ংক্রিয় পছন্দকে ওভাররাইড করতে, MultiWorkerMirroredStrategy এর কনস্ট্রাক্টরের communication প্যারামিটারে একটি বৈধ মান নির্দিষ্ট করুন, যেমন communication=tf.distribute.experimental.CollectiveCommunication.NCCL

আপনার টেনসরফ্লো মডেলের পারফরম্যান্স অপ্টিমাইজ করতে আপনি ব্যবহার করতে পারেন এমন অন্যান্য কৌশল এবং সরঞ্জামগুলি সম্পর্কে আরও জানতে গাইডের পারফরম্যান্স বিভাগে যান৷

অন্যান্য কোড উদাহরণ

  1. কুবারনেটস টেমপ্লেট ব্যবহার করে টেনসরফ্লো/ইকোসিস্টেমে বহু কর্মী প্রশিক্ষণের জন্য শেষ থেকে শেষ উদাহরণ । এই উদাহরণটি কেরাস মডেল দিয়ে শুরু হয় এবং এটিকে tf.keras.estimator.model_to_estimator API ব্যবহার করে একটি এস্টিমেটরে রূপান্তরিত করে।
  2. অফিসিয়াল মডেল , যার মধ্যে অনেকগুলি একাধিক বিতরণ কৌশল চালানোর জন্য কনফিগার করা যেতে পারে।