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

টেনসরফ্লো দিয়ে প্রশিক্ষণ বিতরণ করা হয়েছে

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

সংক্ষিপ্ত বিবরণ

tf.distribute.Strategy একাধিক GPUs, একাধিক মেশিন বা TPUs জুড়ে প্রশিক্ষণ বিতরণ করার জন্য একটি tf.distribute.Strategy এপিআই। এই এপিআই ব্যবহার করে, আপনি আপনার বিদ্যমান মডেলগুলি এবং ন্যূনতম কোড পরিবর্তনগুলি সহ প্রশিক্ষণ কোড বিতরণ করতে পারেন।

tf.distribute.Strategy এই মূল লক্ষ্যগুলি tf.distribute.Strategy করা হয়েছে:

  • গবেষকগণ, এমএল ইঞ্জিনিয়ারগণ সহ একাধিক ব্যবহারকারীর বিভাগগুলি ব্যবহার এবং সমর্থন করা সহজ
  • বক্সের বাইরে ভাল পারফরম্যান্স সরবরাহ করুন।
  • কৌশলগুলির মধ্যে সহজ স্যুইচিং।

tf.distribute.Strategy মত একটি উচ্চ পর্যায়ের API- এর সাথে ব্যবহার করা যাবে Keras (, এবং, সাধারণভাবে TensorFlow ব্যবহার করে যে কোনও গণনার), এবং কাস্টম প্রশিক্ষণ লুপ বিতরণ করতে ব্যবহার করা যাবে।

টেনসরফ্লো ২.x এ, আপনি আপনার প্রোগ্রামগুলি tf.function বা tf.function ব্যবহার করে tf.function গ্রাফে tf.functiontf.distribute.Strategy এই উভয় কার্যকর করার tf.distribute.Strategy সমর্থন করতে চায় তবে tf.function সাথে সবচেয়ে ভাল কাজ করে। আগ্রহী মোডটি কেবলমাত্র ডিবাগিং উদ্দেশ্যেই সুপারিশ করা হয় এবং TPUStrategy জন্য সমর্থিত নয়। যদিও আমরা এই গাইডটিতে বেশিরভাগ সময় প্রশিক্ষণ নিয়ে আলোচনা করি, তবে এই এপিআই বিভিন্ন প্ল্যাটফর্মগুলিতে মূল্যায়ন এবং পূর্বাভাস বিতরণের জন্যও ব্যবহার করা যেতে পারে।

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

এই গাইডে, আমরা বিভিন্ন ধরণের কৌশল এবং আপনি কীভাবে বিভিন্ন পরিস্থিতিতে ব্যবহার করতে পারেন তা ব্যাখ্যা করি।

 # Import TensorFlow
import tensorflow as tf
 

কৌশল কৌশল

tf.distribute.Strategy বিভিন্ন অক্ষ বরাবর ব্যবহারের একটি সংখ্যা কভার করতে চান। এর মধ্যে কয়েকটি সমন্বিত বর্তমানে সমর্থিত এবং অন্যগুলি ভবিষ্যতে যুক্ত করা হবে। এই অক্ষগুলির মধ্যে কয়েকটি:

  • সিঙ্ক্রোনাস বনাম অ্যাসিনক্রোনাস প্রশিক্ষণ: এটি ডেটা প্যারালালিজম সহ প্রশিক্ষণ বিতরণের দুটি সাধারণ উপায়। সিঙ্ক প্রশিক্ষণে, সমস্ত কর্মীরা সিঙ্কে ইনপুট ডেটার বিভিন্ন স্লাইস এবং প্রতিটি পদক্ষেপে গ্রেডিয়েন্টকে প্রশিক্ষণ দিয়ে প্রশিক্ষণ দেয়। অ্যাসিঙ্ক প্রশিক্ষণে, সমস্ত কর্মীরা স্বতন্ত্রভাবে ইনপুট ডেটার উপর প্রশিক্ষণ নিচ্ছেন এবং অ্যাসিঙ্ক্রোনালি ভেরিয়েবল আপডেট করে। সাধারণত সিঙ্ক প্রশিক্ষণ প্যারামিটার সার্ভার আর্কিটেকচারের মাধ্যমে অল-হ্রাস এবং অ্যাসিঙ্কের মাধ্যমে সমর্থিত।
  • হার্ডওয়্যার প্ল্যাটফর্ম: আপনি আপনার প্রশিক্ষণটি একটি মেশিনে একাধিক জিপিইউ বা একটি নেটওয়ার্কে একাধিক মেশিনে (প্রতিটি 0 বা তার বেশি জিপিইউ সহ) বা ক্লাউড টিপিইউতে স্কেল করতে চাইতে পারেন।

এই ব্যবহারের ক্ষেত্রে সমর্থন করার জন্য, এখানে ছয়টি কৌশল উপলব্ধ রয়েছে। পরবর্তী বিভাগে আমরা ব্যাখ্যা করব যে এগুলির মধ্যে কোনটি সমর্থিত যেখানে টিএফ ২.২-এ এই পরিস্থিতিতে কোন পরিস্থিতিতে রয়েছে। এখানে একটি দ্রুত ওভারভিউ রয়েছে:

প্রশিক্ষণ এপিআই MirroredStrategy TPUStrategy MultiWorkerMirroredStrategy CentralStorageStrategy ParameterServerStrategy
কেরাস এপিআই সমর্থিত সমর্থিত পরীক্ষামূলক সহায়তা পরীক্ষামূলক সহায়তা সমর্থিত পরিকল্পিত পোস্ট ২.৩
কাস্টম প্রশিক্ষণ লুপ সমর্থিত সমর্থিত পরীক্ষামূলক সহায়তা পরীক্ষামূলক সহায়তা সমর্থিত পরিকল্পিত পোস্ট ২.৩
অনুমানকারী API সীমিত সমর্থন সমর্থিত নয় সীমিত সমর্থন সীমিত সমর্থন সীমিত সমর্থন

MirroredStrategy

tf.distribute.MirroredStrategy এক মেশিনে একাধিক GPU- তে সিঙ্ক্রোনাস বিতরণ প্রশিক্ষণ সমর্থন করে। এটি প্রতি জিপিইউ ডিভাইসে একটি প্রতিলিপি তৈরি করে। মডেলের প্রতিটি পরিবর্তনশীল সমস্ত প্রতিলিপি জুড়ে মিরর করা হয়। একসঙ্গে, এই ভেরিয়েবল একটি একক ধারণাগত পরিবর্তনশীল নামক গঠন MirroredVariable । এই পরিবর্তনগুলি অভিন্ন আপডেটগুলি প্রয়োগ করে একে অপরের সাথে সিঙ্কে রাখা হয়।

দক্ষ সমস্ত-হ্রাস অ্যালগরিদমগুলি ডিভাইসগুলিতে পরিবর্তনশীল আপডেটগুলি যোগাযোগ করতে ব্যবহৃত হয়। সমস্ত ডিভাইস জুড়ে অ্যালগ্রেট সমষ্টি টেনারগুলি এগুলি যোগ করে এবং প্রতিটি ডিভাইসে এগুলিকে উপলব্ধ করে। এটি একটি ফিউজড অ্যালগরিদম যা অত্যন্ত দক্ষ এবং সিঙ্ক্রোনাইজেশনের ওভারহেডকে উল্লেখযোগ্যভাবে হ্রাস করতে পারে। ডিভাইসগুলির মধ্যে উপলব্ধ যোগাযোগের ধরণের উপর নির্ভর করে অনেকগুলি অল-হ্রাস অ্যালগরিদম এবং বাস্তবায়ন উপলব্ধ। ডিফল্টরূপে, এটি সর্বনিম্ন বাস্তবায়ন হিসাবে এনভিআইডিএ এনসিসিএল ব্যবহার করে। আমরা সরবরাহ করি এমন কয়েকটি অপশন থেকে আপনি চয়ন করতে পারেন বা নিজের লেখা write

MirroredStrategy তৈরির সহজ উপায় এখানে:

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

এটি MirroredStrategy উদাহরণ তৈরি করবে যা টেনসরফ্লোতে দৃশ্যমান সমস্ত জিপিইউ ব্যবহার করবে এবং এনসিসিএলকে ক্রস ডিভাইস যোগাযোগ হিসাবে ব্যবহার করবে।

আপনি যদি নিজের মেশিনে কিছু জিপিইউ ব্যবহার করতে চান তবে আপনি এটি এর মতো করতে পারেন:

 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 আপনাকে টেনসর প্রসেসিং ইউনিট (টিপিইউ) এ আপনার টেনসরফ্লো প্রশিক্ষণ চালাতে দেয়। টিপিইউ হ'ল গুগলের বিশেষায়িত এএসআইসি, যা নাটকীয়ভাবে মেশিন লার্নিংয়ের কাজের চাপ বাড়িয়ে তুলতে ডিজাইন করা হয়েছে। এগুলি টেনসরফ্লো রিসার্চ ক্লাউড এবং ক্লাউড টিপিইউ গুগল কোলাবে পাওয়া যায়।

বিতরণ প্রশিক্ষণ স্থাপত্য নিরিখে TPUStrategy একই MirroredStrategy - এটা সমলয় বিতরণ প্রশিক্ষণ বাস্তবায়ন করছে। টিপিইউগুলি একাধিক TPUStrategy কোর জুড়ে দক্ষ অল-কমাতে এবং অন্যান্য সম্মিলিত ক্রিয়াকলাপগুলির নিজস্ব বাস্তবায়ন সরবরাহ করে, যা 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 দৃষ্টান্তটি TPUClusterResolver সনাক্ত করতে সহায়তা করে। কুলাবে, আপনাকে এটিতে কোনও যুক্তি নির্দিষ্ট করার দরকার নেই।

আপনি যদি ক্লাউড টিপিইউগুলির জন্য এটি ব্যবহার করতে চান:

  • tpu আর্গুমেন্টে আপনাকে অবশ্যই আপনার tpu নাম উল্লেখ করতে হবে।
  • আপনাকে অবশ্যই প্রোগ্রামটির শুরুতে টিপিইউ সিস্টেমটি স্পষ্টভাবে শুরু করতে হবে। টিপিইউগুলি গণনার জন্য ব্যবহার করার আগে এটি প্রয়োজন। টিপিইউ সিস্টেমটি আরম্ভ করার সাথে সাথে টিপিইউ মেমরিটিও মুছে যায়, তাই রাষ্ট্রের ক্ষতি এড়াতে প্রথমে এই পদক্ষেপটি সম্পন্ন করা গুরুত্বপূর্ণ।

MultiWorkerMirroredStrategy

tf.distribute.experimental.MultiWorkerMirroredStrategy খুব অনুরূপ MirroredStrategy । এটি একাধিক কর্মী, প্রতিটি সম্ভাব্য একাধিক জিপিইউ সহ সিঙ্ক্রোনাস বিতরণ প্রশিক্ষণ প্রয়োগ করে। MirroredStrategy অনুরূপ, এটি প্রতিটি ডিভাইসে সমস্ত কর্মী জুড়ে মডেলের সমস্ত ভেরিয়েবলের অনুলিপি তৈরি করে।

এটি কালেক্টিওপসকে বহু-কর্মী অল-হ্রাস যোগাযোগের পদ্ধতি হিসাবে চলকগুলিকে সিঙ্কে রাখার জন্য ব্যবহৃত হয়। টেনসরফ্লো গ্রাফের একটি যৌথ বিকল্পটি একটি একক অপশন যা হার্ডওয়্যার, নেটওয়ার্ক টপোলজি এবং টেনসর মাপ অনুযায়ী স্বয়ংক্রিয়ভাবে টেনসরফ্লো রানটাইমে একটি সর্ব-হ্রাস অ্যালগরিদম চয়ন করতে পারে।

এটি অতিরিক্ত কর্মক্ষমতা অপ্টিমাইজেশন প্রয়োগ করে। উদাহরণস্বরূপ, এটিতে একটি স্ট্যাটিক অপ্টিমাইজেশন রয়েছে যা ছোট টেনারগুলির একাধিক অল্প-হ্রাসকে বৃহত্তর টেনসরগুলিতে কম অল-হ্রাসে রূপান্তর করে। এছাড়াও, আমরা এটির জন্য একটি প্লাগইন আর্কিটেকচার ডিজাইন করছি - যাতে ভবিষ্যতে আপনি আপনার হার্ডওয়্যারের জন্য আরও ভাল সুর করা আলগোরিদিমগুলি প্লাগইন করতে সক্ষম হবেন। নোট করুন যে সম্মিলিত অপ্স সম্প্রচার এবং সমস্ত জমায়েতের মতো অন্যান্য সম্মিলিত ক্রিয়াকলাপও বাস্তবায়ন করে।

এখানে 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 বর্তমানে আপনাকে MultiWorkerMirroredStrategy দুটি পৃথক বাস্তবায়নের মধ্য থেকে চয়ন করতে দেয়। CollectiveCommunication.RING জিআরপিসি যোগাযোগ স্তর হিসাবে ব্যবহার করে রিং-ভিত্তিক CollectiveCommunication.RING প্রয়োগ করে। CollectiveCommunication.NCCL ব্যবহার এনভিডিয়া এর NCCL যৌথ বাস্তবায়ন। CollectiveCommunication.AUTO রানটাইমের পছন্দকে পিছনে দেয়। সম্মিলিত প্রয়োগের সেরা পছন্দটি জিপিইউর সংখ্যা এবং ধরণের উপর নির্ভর করে এবং ক্লাস্টারে নেটওয়ার্ক আন্তঃসংযোগ করে। আপনি নিম্নলিখিত পদ্ধতিতে সেগুলি নির্দিষ্ট করতে পারেন:

 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

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

CentralStorageStrategy

tf.distribute.experimental.CentralStorageStrategy পাশাপাশি সিঙ্ক্রোনাস ট্রেনিং করে। ভেরিয়েবলগুলি মিরর করা হয় না, পরিবর্তে সেগুলি সিপিইউতে রাখা হয় এবং সমস্ত স্থানীয় জিপিইউতে অপারেশনগুলি প্রতিলিপি করা হয়। যদি কেবল একটি জিপিইউ থাকে তবে সমস্ত ভেরিয়েবল এবং ক্রিয়াকলাপ সেই জিপিইউতে স্থাপন করা হবে।

এর দ্বারা 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 ইনস্ট্যান্স তৈরি করবে যা সমস্ত দৃশ্যমান জিপিইউ এবং সিপিইউ ব্যবহার করবে। ভেরিয়েবলগুলিতে প্রয়োগ করার আগে প্রতিরূপগুলিতে পরিবর্তনগুলিতে আপডেট একত্রিত করা হবে।

ParameterServerStrategy

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

কোডের ক্ষেত্রে, এটি অন্যান্য কৌশলগুলির মতো দেখায়:

 ps_strategy = tf.distribute.experimental.ParameterServerStrategy()
 

বহু কর্মী প্রশিক্ষণের জন্য, TF_CONFIG আপনার ক্লাস্টারে প্যারামিটার সার্ভার এবং কর্মীদের কনফিগারেশন নির্দিষ্ট করতে হবে যা আপনি নীচে TF_CONFIG এ আরও পড়তে পারেন।

অন্যান্য কৌশল

উপরোক্ত কৌশলগুলি ছাড়াও, আরও দুটি কৌশল রয়েছে যা tf.distribute API ব্যবহার করার সময় প্রোটোটাইপিং এবং ডিবাগিংয়ের জন্য কার্যকর হতে পারে।

ডিফল্ট কৌশল

ডিফল্ট কৌশল হ'ল একটি বিতরণ কৌশল যা উপস্থিত থাকে যখন কোনও স্পষ্টত বিতরণ কৌশল সুযোগ না থাকে। এটি tf.distribute.Strategy ইন্টারফেস প্রয়োগ করে তবে এটি একটি পাস- tf.distribute.Strategy এবং প্রকৃত বিতরণ সরবরাহ করে না। উদাহরণস্বরূপ, strategy.run(fn) কেবলমাত্র fn কল করবে। এই কৌশলটি ব্যবহার করে লিখিত কোডগুলি কোনও কৌশল ছাড়াই লিখিত কোডের মতো আচরণ করা উচিত। আপনি এটিকে "নো-অপশন" কৌশল হিসাবে ভাবতে পারেন।

ডিফল্ট কৌশলটি একটি সিঙ্গলটন - এবং এটির এর বেশি উদাহরণ তৈরি করা যায় না। এটি কোনও সুস্পষ্ট কৌশলগত স্কোপের বাইরে (একই এপিআই যা একটি সুনির্দিষ্ট কৌশলটির স্কোপের অভ্যন্তরে বর্তমান কৌশলটি পেতে ব্যবহার করা যেতে পারে tf.distribute.get_strategy() ব্যবহার করে প্রাপ্ত হতে পারে।

 default_strategy = tf.distribute.get_strategy()
 

এই কৌশলটি দুটি প্রধান উদ্দেশ্যে কাজ করে:

  • এটি নিঃশর্তভাবে বিতরণ সচেতন লাইব্রেরি কোড লেখার অনুমতি দেয়। উদাহরণস্বরূপ, অপ্টিমাইজারে, আমরা tf.distribute.get_strategy() করতে পারি এবং গ্রেডিয়েন্টগুলি হ্রাস করার জন্য সেই কৌশলটি ব্যবহার করতে পারি - এটি সর্বদা একটি কৌশল অবজেক্টকে ফিরিয়ে আনবে যার উপর ভিত্তি করে আমরা হ্রাস এপিআই বলতে পারি।
 # 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")
 

এই কৌশলটি বিভিন্ন উপায়ে ডিফল্ট কৌশল থেকে পৃথক। ডিফল্ট কৌশলে, কোনও বিতরণ কৌশল ছাড়াই টেনসরফ্লো চালনার সাথে তুলনামূলকভাবে চলক স্থান নির্ধারণের যুক্তি অপরিবর্তিত থাকে। OneDeviceStrategy ব্যবহার করার OneDeviceStrategy , এর OneDeviceStrategy তৈরি সমস্ত ভেরিয়েবলগুলি স্পষ্টভাবে নির্দিষ্ট ডিভাইসে স্থাপন করা হয়। তদুপরি, OneDeviceStrategy.run মাধ্যমে ডাকা যে কোনও ফাংশনও নির্দিষ্ট ডিভাইসে স্থাপন করা হবে।

এই কৌশলটির মাধ্যমে বিতরণ করা ইনপুট নির্দিষ্ট ডিভাইসে প্রিফেট করা হবে। ডিফল্ট কৌশলটিতে কোনও ইনপুট বিতরণ নেই is

ডিফল্ট কৌশল হিসাবে একই, এই কৌশলটি অন্য কৌশলগুলিতে স্যুইচ করার আগে আপনার কোডটি পরীক্ষা করতেও ব্যবহৃত হতে পারে যা আসলে একাধিক ডিভাইস / মেশিনে বিতরণ করে। এই বন্টন কৌশল যন্ত্রপাতি কিছুটা ডিফল্ট কৌশল চেয়ে ব্যায়াম হবে, কিন্তু ব্যবহার হিসাবে পূর্ণ ব্যাপ্তি না MirroredStrategy বা TPUStrategy ইত্যাদি আপনি কোড চান যে আচরণ করবে কোন কৌশল, তাহলে ডিফল্ট কৌশল ব্যবহার।

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

tf.distribute.Strategy সহ tf.keras.Model.fit ব্যবহার করা

আমরা tf.distribute.Strategy কে tf.keras একীভূত করেছি যা tf.keras এর কেরাস এপিআই স্পেসিফিকেশন বাস্তবায়ন করেছে। tf.keras মডেলগুলি তৈরি এবং প্রশিক্ষণের জন্য একটি উচ্চ-স্তরের API। tf.keras ব্যাকএন্ডে সংহত করে আমরা model.fit ব্যবহার করে কেরাস প্রশিক্ষণ কাঠামোয় আপনার লেখা প্রশিক্ষণ বিতরণ করা model.fit করে model.fit

আপনার কোডে আপনাকে যা পরিবর্তন করতে হবে তা এখানে:

  1. উপযুক্ত tf.distribute.Strategy এর একটি উদাহরণ তৈরি করুন।
  2. Keras মডেল, অপটিমাইজার এবং ভিতরে মেট্রিক্স সৃষ্টির সরান strategy.scope

আমরা সব ধরণের কেরাস মডেলকে সমর্থন করি - ক্রমযুক্ত, কার্যকরী এবং উপশ্রেণীযুক্ত।

একটি ঘন স্তর সহ খুব সাধারণ কেরাস মডেলটির জন্য এটি করার জন্য এখানে কোডের স্নিপেট রয়েছে:

 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',)

এই উদাহরণে আমরা MirroredStrategy ব্যবহার করেছি যাতে আমরা এটি একাধিক জিপিইউ সহ একটি মেশিনে চালাতে পারি। কৌশল.স্কোপ strategy.scope() প্রশিক্ষণ বিতরণ করতে কোন কৌশলটি ব্যবহার করবে তা কেরাসকে নির্দেশ করে। এই ক্ষেত্রের মধ্যে মডেল / অপ্টিমাইজার / মেট্রিক তৈরি করা আমাদের নিয়মিত ভেরিয়েবলের পরিবর্তে বিতরণ ভেরিয়েবলগুলি তৈরি করতে দেয়। একবার এটি সেট আপ হয়ে গেলে আপনি নিজের মডেলটি ঠিক নিজের মতো ফিট করতে পারেন। 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: 1.0035
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 1ms/step - loss: 0.4436
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.2755

0.27546340227127075

প্রশিক্ষণ সরবরাহ এবং ইনপুট ইনপুট tf.data.Dataset জন্য আমরা এখানে একটি tf.data.Dataset ব্যবহার করেছি। আপনি নাম্পার অ্যারেও ব্যবহার করতে পারেন:

 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 1ms/step - loss: 0.1961
Epoch 2/2
10/10 [==============================] - 0s 1ms/step - loss: 0.0867

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

উভয় ক্ষেত্রে (ডাটাসেট বা নম্পী), প্রদত্ত ইনপুটটির প্রতিটি ব্যাচকে একাধিক প্রতিরূপের মধ্যে সমানভাবে বিভক্ত করা হয়েছে। উদাহরণস্বরূপ, যদি 2 জিপিইউ সহ MirroredStrategy ব্যবহার করা হয় তবে 10 মাপের প্রতিটি ব্যাচ 2 টি জিপিইউর মধ্যে বিভক্ত হবে এবং প্রতিটি পদক্ষেপে 5 টি ইনপুট উদাহরণ পাবেন। আপনি আরও জিপিইউ যুক্ত করার সাথে সাথে প্রতিটি যুগের দ্রুত প্রশিক্ষণ হবে। সাধারণত, আপনি আরও ত্বক যুক্ত করার সাথে সাথে আপনার ব্যাচের আকার বাড়াতে চান যাতে অতিরিক্ত কম্পিউটিং পাওয়ারকে কার্যকরভাবে কার্যকর করা যায়। মডেলটির উপর নির্ভর করে আপনার শেখার হারকেও আবার টিউন করতে হবে। প্রতিরূপের সংখ্যা পেতে আপনি strategy.num_replicas_in_sync .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]
 

এখন কি সমর্থিত?

প্রশিক্ষণ এপিআই MirroredStrategy TPUStrategy MultiWorkerMirroredStrategy CentralStorageStrategy ParameterServerStrategy
কেরাস এপিআই সমর্থিত সমর্থিত পরীক্ষামূলক সহায়তা পরীক্ষামূলক সহায়তা 2.3 পোস্ট পরিকল্পিত সমর্থন

উদাহরণ এবং টিউটোরিয়াল

এখানে টিউটোরিয়াল এবং উদাহরণগুলির একটি তালিকা রয়েছে যা উপরের একীকরণের শেষটি কেরাসের সাথে শেষ করে:

  1. টিউটোরিয়াল সঙ্গে MNIST প্রশিক্ষণের MirroredStrategy
  2. MultiWorkerMirroredStrategy ওয়ার্কারমিরর্ডার্ডস্ট্রেজি ব্যবহার করে MultiWorkerMirroredStrategy প্রশিক্ষণের জন্য টিউটোরিয়াল
  3. টিপিসট্রেটিজি ব্যবহার করে TPUStrategy প্রশিক্ষণের বিষয়ে গাইড
  4. বিভিন্ন কৌশল ব্যবহার করে বাস্তবায়িত অত্যাধুনিক মডেলগুলির সংকলন সহ টেনসরফ্লো মডেল গার্ডেনের সংগ্রহস্থল

কাস্টম প্রশিক্ষণ লুপের সাথে tf.distribute.Strategy ব্যবহার করা

যেমনটি আপনি দেখেছেন, কেরাস model.fit সাথে tf.distribute.Strategy ব্যবহার করে আপনার কোডের কয়েকটি লাইন পরিবর্তন করা দরকার। আরও কিছু প্রচেষ্টা সহ, আপনি কাস্টম প্রশিক্ষণ লুপগুলির সাথে tf.distribute.Strategy ব্যবহার করতে পারেন।

আপনার যদি অনুমানের বা কেরাসের চেয়ে আপনার প্রশিক্ষণের লুপগুলির উপর আরও নমনীয়তা এবং নিয়ন্ত্রণের প্রয়োজন হয় তবে আপনি কাস্টম প্রশিক্ষণ লুপগুলি লিখতে পারেন। উদাহরণস্বরূপ, একটি জিএন ব্যবহার করার সময়, আপনি প্রতিটি রাউন্ডে বিভিন্ন সংখ্যক জেনারেটর বা বৈষম্যমূলক পদক্ষেপ নিতে চাইতে পারেন। একইভাবে, উচ্চ স্তরের ফ্রেমওয়ার্কগুলি শক্তিবৃদ্ধি শেখার প্রশিক্ষণের জন্য খুব উপযুক্ত নয়।

কাস্টম প্রশিক্ষণের tf.distribute.Strategy সমর্থন করার জন্য, আমরা tf.distribute.Strategy ক্লাসের মাধ্যমে পদ্ধতির একটি মূল সেট সরবরাহ tf.distribute.Strategy । এগুলি ব্যবহারের জন্য প্রাথমিকভাবে কোডটির ছোট্ট পুনর্গঠনের প্রয়োজন হতে পারে, তবে এটি শেষ হয়ে গেলে, আপনি জিপিইউ, টিপিইউ এবং একাধিক মেশিনের মধ্যে কৌশলগত উদাহরণ পরিবর্তন করে কেবল পরিবর্তন করতে পারবেন।

এখানে আমরা আগের মতো একই কেরাস মডেলটি ব্যবহার করে একটি সাধারণ প্রশিক্ষণের উদাহরণের জন্য এই ব্যবহারের ক্ষেত্রে চিত্রিত একটি সংক্ষিপ্ত স্নিপেট দেখাব।

প্রথমত, আমরা কৌশলটির ক্ষেত্রের মধ্যে মডেল এবং অপ্টিমাইজার তৈরি করি। এটি নিশ্চিত করে যে মডেল এবং অপ্টিমাইজার দিয়ে তৈরি যে কোনও ভেরিয়েবলগুলি মিরর ভেরিয়েবল।

 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 কল tf.distribute.Strategy.experimental_distribute_dataset

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

তারপরে, আমরা প্রশিক্ষণের এক ধাপ সংজ্ঞায়িত করি। আমরা আমাদের মডেলের ভেরিয়েবলগুলি আপডেট করার জন্য গ্রেডিয়েন্টগুলি এবং অপ্টিমাইজারকে গণনা করার জন্য tf.GradientTape গ্রেডিয়েন্ট tf.GradientTape ব্যবহার করব tf.GradientTape এই প্রশিক্ষণ পদক্ষেপটি বিতরণ করার জন্য, আমরা একটি ফাংশন train_step তা tf.distrbute.Strategy.run প্রেরণ করি যা আমরা আগে dist_dataset থেকে 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_losstf.nn.compute_average_loss উদাহরণ হিসাবে প্রতিটি ক্ষতির পরিমাণ এবং তার যোগফলকে গ্লোবাল_বাচ_সাইজ দ্বারা বিভক্ত করে। এটি গুরুত্বপূর্ণ কারণ পরে পরে গ্রেডিয়েন্ট প্রতিটি প্রতিরূপ হিসেব করা হয়েছে, তবে তারা তাদেরকে summing দ্বারা প্রতিলিপি জুড়ে সমষ্টিগত হয়।
  2. tf.distribute.Strategy.reduce দ্বারা tf.distribute.Strategy.run ফলাফলগুলিকে একত্রিত করার জন্য আমরা tf.distribute.Strategy.reduce এপিআই ব্যবহার tf.distribute.Strategy.runtf.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.4155251, shape=(), dtype=float32)
tf.Tensor(0.41321823, shape=(), dtype=float32)
tf.Tensor(0.4109319, shape=(), dtype=float32)
tf.Tensor(0.40866604, shape=(), dtype=float32)
tf.Tensor(0.40642032, shape=(), dtype=float32)
tf.Tensor(0.40419456, shape=(), dtype=float32)
tf.Tensor(0.4019885, shape=(), dtype=float32)
tf.Tensor(0.399802, shape=(), dtype=float32)
tf.Tensor(0.39763477, shape=(), dtype=float32)
tf.Tensor(0.3954866, shape=(), dtype=float32)
tf.Tensor(0.39335734, shape=(), dtype=float32)
tf.Tensor(0.3912467, shape=(), dtype=float32)
tf.Tensor(0.38915452, shape=(), dtype=float32)
tf.Tensor(0.38708064, shape=(), dtype=float32)
tf.Tensor(0.38502476, shape=(), dtype=float32)
tf.Tensor(0.38298675, shape=(), dtype=float32)
tf.Tensor(0.38096642, shape=(), dtype=float32)
tf.Tensor(0.3789635, shape=(), dtype=float32)
tf.Tensor(0.3769779, shape=(), dtype=float32)
tf.Tensor(0.37500936, shape=(), dtype=float32)

উপরের উদাহরণে, আমরা আপনার প্রশিক্ষণে ইনপুট সরবরাহ করতে dist_dataset দিয়ে পুনরাবৃত্তি করেছি। আমরা প্রদান tf.distribute.Strategy.make_experimental_numpy_dataset numpy ইনপুট সমর্থন। tf.distribute.Strategy.experimental_distribute_dataset কল করার আগে আপনি এই API টি ডেটাसेट তৈরি করতে ব্যবহার করতে পারেন।

আপনার ডেটা দ্বারা পুনরাবৃত্তি করার আরেকটি উপায় হ'ল স্পষ্টভাবে পুনরাবৃত্তকারী ব্যবহার করা। আপনি পুরো ডেটাসেটের পুনরাবৃত্তির বিপরীতে প্রদত্ত কয়েকটি পদক্ষেপের জন্য দৌড়াতে চাইলে আপনি এটি করতে চাইতে পারেন। পুনরাবৃত্তির উপরে এখন প্রথম কোনো ইটারেটরে তৈরি করতে পরিবর্তন করা হবে এবং তারপর স্পষ্টভাবে কল next ইনপুট ডেটা পেতে এটিতে।

 iterator = iter(dist_dataset)
for _ in range(10):
  print(distributed_train_step(next(iterator)))
 
tf.Tensor(0.37305772, shape=(), dtype=float32)
tf.Tensor(0.3711228, shape=(), dtype=float32)
tf.Tensor(0.3692044, shape=(), dtype=float32)
tf.Tensor(0.36730233, shape=(), dtype=float32)
tf.Tensor(0.3654165, shape=(), dtype=float32)
tf.Tensor(0.36354658, shape=(), dtype=float32)
tf.Tensor(0.36169255, shape=(), dtype=float32)
tf.Tensor(0.3598542, shape=(), dtype=float32)
tf.Tensor(0.35803124, shape=(), dtype=float32)
tf.Tensor(0.3562236, shape=(), dtype=float32)

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

এখন কি সমর্থিত?

প্রশিক্ষণ এপিআই MirroredStrategy TPUStrategy MultiWorkerMirroredStrategy CentralStorageStrategy ParameterServerStrategy
কাস্টম প্রশিক্ষণ লুপ সমর্থিত সমর্থিত পরীক্ষামূলক সহায়তা পরীক্ষামূলক সহায়তা 2.3 পোস্ট পরিকল্পিত সমর্থন

উদাহরণ এবং টিউটোরিয়াল

কাস্টম প্রশিক্ষণের লুপগুলির সাথে বিতরণ কৌশল ব্যবহারের জন্য এখানে কয়েকটি উদাহরণ রয়েছে:

  1. টিউটোরিয়াল প্রশিক্ষণের ব্যবহার MNIST MirroredStrategy
  2. টিপিসট্রেটিজি ব্যবহার করে TPUStrategy প্রশিক্ষণের বিষয়ে গাইড
  3. বিভিন্ন কৌশল ব্যবহার করে বাস্তবায়িত অত্যাধুনিক মডেলগুলির সংকলন সহ টেনসরফ্লো মডেল গার্ডেনের সংগ্রহস্থল

tf.distribute.Strategy সাথে tf.distribute.Strategy ব্যবহার (সীমিত সমর্থন)

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

tf.distribute.Strategy সাথে tf.distribute.Strategy এর ব্যবহার কেরাস কেসের চেয়ে কিছুটা আলাদা। ব্যবহার করার পরিবর্তে strategy.scope , এখন আমরা মধ্যে কৌশল বস্তুর পাস RunConfig মূল্নির্ধারক জন্য।

এখানে কোডের একটি টুকরো যার এমন কোন premade মূল্নির্ধারক সঙ্গে শো এই LinearRegressor এবং MirroredStrategy :

 mirrored_strategy = tf.distribute.MirroredStrategy()
config = tf.estimator.RunConfig(
    train_distribute=mirrored_strategy, eval_distribute=mirrored_strategy)
regressor = tf.estimator.LinearRegressor(
    feature_columns=[tf.feature_column.numeric_column('feats')],
    optimizer='SGD',
    config=config)
 
INFO:tensorflow:Using MirroredStrategy with devices ('/job:localhost/replica:0/task:0/device:GPU:0',)
INFO:tensorflow:Initializing RunConfig with distribution strategies.
INFO:tensorflow:Not using Distribute Coordinator.
WARNING:tensorflow:Using temporary folder as model directory: /tmp/tmp2ack9oru
INFO:tensorflow:Using config: {'_model_dir': '/tmp/tmp2ack9oru', '_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.mirrored_strategy.MirroredStrategy object at 0x7fa124522b38>, '_device_fn': None, '_protocol': None, '_eval_distribute': <tensorflow.python.distribute.mirrored_strategy.MirroredStrategy object at 0x7fa124522b38>, '_experimental_distribute': None, '_experimental_max_worker_delay_secs': None, '_session_creation_timeout_secs': 7200, '_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}

আমরা এখানে একটি প্রাক তৈরির এসিমেটর ব্যবহার করি তবে একই কোডটি কাস্টম অনুমানের সাথেও কাজ করে। train_distribute কীভাবে প্রশিক্ষণ বিতরণ করা হবে তা নির্ধারণ করে এবং মূল্যায়ন কীভাবে বিতরণ করা হবে তা নির্ধারণ করে eval_distribute এটি কেরাসের থেকে অন্য একটি পার্থক্য যেখানে আমরা প্রশিক্ষণ এবং ইভাল উভয়ের জন্য একই কৌশল ব্যবহার করি।

এখন আমরা এই অনুমানটিকে একটি ইনপুট ফাংশন দিয়ে প্রশিক্ষণ এবং মূল্যায়ন করতে পারি:

 def input_fn():
  dataset = tf.data.Dataset.from_tensors(({"feats":[1.]}, [1.]))
  return dataset.repeat(1000).batch(10)
regressor.train(input_fn=input_fn, steps=10)
regressor.evaluate(input_fn=input_fn, steps=10)
 
INFO:tensorflow:Calling model_fn.
WARNING:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.6/site-packages/tensorflow_estimator/python/estimator/canned/linear.py:1481: Layer.add_variable (from tensorflow.python.keras.engine.base_layer_v1) is deprecated and will be removed in a future version.
Instructions for updating:
Please use `layer.add_weight` method instead.
INFO:tensorflow:Done calling model_fn.
WARNING:tensorflow:AutoGraph could not transform <function _combine_distributed_scaffold.<locals>.<lambda> at 0x7fa12452cb70> and will run it as-is.
Cause: could not parse the source code:

      lambda scaffold: scaffold.ready_op, args=(grouped_scaffold,))

This error may be avoided by creating the lambda in a standalone statement.

To silence this warning, decorate the function with @tf.autograph.experimental.do_not_convert
WARNING: AutoGraph could not transform <function _combine_distributed_scaffold.<locals>.<lambda> at 0x7fa12452cb70> and will run it as-is.
Cause: could not parse the source code:

      lambda scaffold: scaffold.ready_op, args=(grouped_scaffold,))

This error may be avoided by creating the lambda in a standalone statement.

To silence this warning, decorate the function with @tf.autograph.experimental.do_not_convert
INFO:tensorflow:Create CheckpointSaverHook.
WARNING:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.6/site-packages/tensorflow_estimator/python/estimator/util.py:96: DistributedIteratorV1.initialize (from tensorflow.python.distribute.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:Running local_init_op.
INFO:tensorflow:Done running local_init_op.
INFO:tensorflow:Calling checkpoint listeners before saving checkpoint 0...
INFO:tensorflow:Saving checkpoints for 0 into /tmp/tmp2ack9oru/model.ckpt.
INFO:tensorflow:Calling checkpoint listeners after saving checkpoint 0...
INFO:tensorflow:loss = 1.0, step = 0
INFO:tensorflow:Calling checkpoint listeners before saving checkpoint 10...
INFO:tensorflow:Saving checkpoints for 10 into /tmp/tmp2ack9oru/model.ckpt.
INFO:tensorflow:Calling checkpoint listeners after saving checkpoint 10...
INFO:tensorflow:Loss for final step: 2.877698e-13.
INFO:tensorflow:Calling model_fn.
INFO:tensorflow:Done calling model_fn.
WARNING:tensorflow:AutoGraph could not transform <function _combine_distributed_scaffold.<locals>.<lambda> at 0x7fa1e9768d08> and will run it as-is.
Cause: could not parse the source code:

      lambda scaffold: scaffold.ready_op, args=(grouped_scaffold,))

This error may be avoided by creating the lambda in a standalone statement.

To silence this warning, decorate the function with @tf.autograph.experimental.do_not_convert
WARNING: AutoGraph could not transform <function _combine_distributed_scaffold.<locals>.<lambda> at 0x7fa1e9768d08> and will run it as-is.
Cause: could not parse the source code:

      lambda scaffold: scaffold.ready_op, args=(grouped_scaffold,))

This error may be avoided by creating the lambda in a standalone statement.

To silence this warning, decorate the function with @tf.autograph.experimental.do_not_convert
INFO:tensorflow:Starting evaluation at 2020-08-04T20:28:12Z
INFO:tensorflow:Graph was finalized.
INFO:tensorflow:Restoring parameters from /tmp/tmp2ack9oru/model.ckpt-10
INFO:tensorflow:Running local_init_op.
INFO:tensorflow:Done running local_init_op.
INFO:tensorflow:Evaluation [1/10]
INFO:tensorflow:Evaluation [2/10]
INFO:tensorflow:Evaluation [3/10]
INFO:tensorflow:Evaluation [4/10]
INFO:tensorflow:Evaluation [5/10]
INFO:tensorflow:Evaluation [6/10]
INFO:tensorflow:Evaluation [7/10]
INFO:tensorflow:Evaluation [8/10]
INFO:tensorflow:Evaluation [9/10]
INFO:tensorflow:Evaluation [10/10]
INFO:tensorflow:Inference Time : 0.20350s
INFO:tensorflow:Finished evaluation at 2020-08-04-20:28:12
INFO:tensorflow:Saving dict for global step 10: average_loss = 1.4210855e-14, global_step = 10, label/mean = 1.0, loss = 1.4210855e-14, prediction/mean = 0.99999994
INFO:tensorflow:Saving 'checkpoint_path' summary for global step 10: /tmp/tmp2ack9oru/model.ckpt-10

{'average_loss': 1.4210855e-14,
 'label/mean': 1.0,
 'loss': 1.4210855e-14,
 'prediction/mean': 0.99999994,
 'global_step': 10}

এখানে অনুমানকারী এবং কেরাসের মধ্যে হাইলাইট করার আরেকটি পার্থক্য হ'ল ইনপুট হ্যান্ডলিং। কেরাসে, আমরা উল্লেখ করেছি যে ডেটাসেটের প্রতিটি ব্যাচ একাধিক প্রতিরূপে স্বয়ংক্রিয়ভাবে বিভক্ত হয়। অনুমানকগুলিতে, তবে আমরা ব্যাচের স্বয়ংক্রিয়ভাবে বিভাজন করি না, বা স্বয়ংক্রিয়ভাবে বিভিন্ন কর্মীদের মধ্যে ডেটাটি তীক্ষ্ণতর করি না। আপনি কীভাবে আপনার ডেটা কর্মী এবং ডিভাইসগুলিতে বিতরণ করতে চান তার সম্পূর্ণ নিয়ন্ত্রণ রয়েছে এবং কীভাবে আপনার ডেটা বিতরণ করতে হবে তা নির্দিষ্ট করতে আপনাকে অবশ্যই একটি input_fn করতে হবে।

আপনার input_fn প্রতি শ্রমিক প্রতি একবার ডাকা হয়, এইভাবে প্রতি শ্রমিকের জন্য একটি ডেটাসেট দেয়। তারপরে সেই ডেটাসেটের একটি ব্যাচ সেই শ্রমিকের একটি প্রতিলিপিতে খাওয়ানো হয়, যার ফলে 1 জন কর্মীর উপর এন প্রতিরূপের জন্য এন ব্যাচগুলি গ্রাস করে। অন্য কথায়, ডেটা সেটটি দ্বারা ফিরে input_fn আকারের ব্যাচ প্রদান করা উচিত PER_REPLICA_BATCH_SIZE । এবং একটি পদক্ষেপের জন্য বিশ্বব্যাপী ব্যাচের আকারটি PER_REPLICA_BATCH_SIZE * strategy.num_replicas_in_sync . PER_REPLICA_BATCH_SIZE * strategy.num_replicas_in_sync হিসাবে প্রাপ্ত হতে পারে।

একাধিক কর্মী প্রশিক্ষণ নেওয়ার সময়, আপনাকে হয় কর্মীদের মধ্যে আপনার ডেটা বিভক্ত করা উচিত, বা প্রতিটি একটি এলোমেলো বীজ দিয়ে বদলানো উচিত। আপনি কীভাবে এটি করতে পারবেন তার একটি উদাহরণ এস্টিমেটরের সাথে মাল্টি-ওয়ার্কার ট্রেনিংয়ে দেখতে পারেন।

এবং একইভাবে, আপনি মাল্টি ওয়ার্কার এবং পরামিতি সার্ভার কৌশলগুলিও ব্যবহার করতে পারেন। কোড অবশেষ একই, কিন্তু আপনি ব্যবহার করতে হবে tf.estimator.train_and_evaluate , এবং সেট TF_CONFIG আপনার ক্লাস্টার প্রতিটি বাইনারি চলমান জন্য বিভিন্ন পরিবেশের।

এখন কি সমর্থিত?

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

প্রশিক্ষণ এপিআই MirroredStrategy TPUStrategy MultiWorkerMirroredStrategy CentralStorageStrategy ParameterServerStrategy
অনুমানকারী API সীমিত সমর্থন সমর্থিত নয় সীমিত সমর্থন সীমিত সমর্থন সীমিত সমর্থন

উদাহরণ এবং টিউটোরিয়াল

এখানে এমন কয়েকটি উদাহরণ দেওয়া হয়েছে যা অনুমানের সাথে বিভিন্ন কৌশলগুলির ব্যবহারের শেষ দেখায়:

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

অন্যান্য বিষয়

এই বিভাগে, আমরা কয়েকটি বিষয় কভার করব যা একাধিক ব্যবহারের ক্ষেত্রে প্রাসঙ্গিক।

TF_CONFIG পরিবেশ পরিবর্তনশীল সেট আপ করা হচ্ছে

বহু-কর্মী প্রশিক্ষণের জন্য, যেমনটি আগে উল্লেখ করা হয়েছে, আপনার ক্লাস্টারে প্রতিটি বাইনারি চলার জন্য আপনাকে TF_CONFIG এনভায়রনমেন্ট ভেরিয়েবল সেট করতে হবে। TF_CONFIG এনভায়রনমেন্ট ভেরিয়েবল একটি JSON স্ট্রিং যা কোন ক্লাস্টার গঠন করে তা নির্দিষ্ট করে, তাদের ঠিকানা এবং ক্লাস্টারে প্রতিটি টাস্কের ভূমিকা। আমরা টেনসরফ্লো / ইকোসিস্টেম রেপোতে একটি কুবেরনেটস টেম্পলেট সরবরাহ করি যা আপনার প্রশিক্ষণের জন্য TF_CONFIG সেট করে।

TF_CONFIG এর দুটি উপাদান রয়েছে: ক্লাস্টার এবং কার্য। ক্লাস্টার প্রশিক্ষণ ক্লাস্টার সম্পর্কে তথ্য সরবরাহ করে, যা একটি ডিক যা বিভিন্ন ধরণের কাজের যেমন শ্রমিকের সমন্বয়ে গঠিত dict বহু-শ্রমিক প্রশিক্ষণে সাধারণত একজন কর্মী থাকেন যা নিয়মিত কর্মীর কাজ ছাড়াও টেনসরবার্ডের জন্য চেকপয়েন্ট সংরক্ষণ করা এবং সারসংক্ষেপ ফাইল লেখার মতো আরও কিছুটা দায়িত্ব গ্রহণ করে। এই জাতীয় কর্মীকে 'প্রধান' কর্মী হিসাবে উল্লেখ করা হয়, এবং এটি প্রথাগত যে সূচক 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 উল্লেখ করে যে তাদের হোস্ট এবং পোর্টগুলির সাথে ক্লাস্টারে তিনটি কর্মী এবং দুটি পিএস কাজ রয়েছে। "টাস্ক" অংশটি নির্দিষ্ট করে যে ক্লাস্টারে বর্তমান কর্মের ভূমিকা, কর্মী 1 (দ্বিতীয় কর্মী)। একটি ক্লাস্টারে বৈধ ভূমিকা "চিফ", "কর্মী", "পিএস" এবং "মূল্যায়নকারী"। tf.distribute.experimental.ParameterServerStrategy ব্যবহার করা ব্যতীত আর কোনও "পিএস" কাজ থাকা উচিত tf.distribute.experimental.ParameterServerStrategy

এরপর কি?

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