TPU-গতির ডেটা পাইপলাইন: tf.data.Dataset এবং TFRecords

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

TPU গুলি খুবই দ্রুত। প্রশিক্ষণের ডেটার প্রবাহ অবশ্যই তাদের প্রশিক্ষণের গতির সাথে সামঞ্জস্যপূর্ণ হতে হবে। এই ল্যাবে, আপনি শিখবেন কিভাবে tf.data.Dataset API ব্যবহার করে GCS থেকে ডেটা লোড করতে হয় যাতে আপনার TPU ফিড হয়।

এই ল্যাবটি "কেরা অন টিপিইউ" সিরিজের ১ম অংশ। আপনি নিম্নলিখিত ক্রমে অথবা স্বাধীনভাবে এগুলি করতে পারেন।

অনুসরণ

তুমি কি শিখবে

  • প্রশিক্ষণ ডেটা লোড করার জন্য tf.data.Dataset API ব্যবহার করতে
  • GCS থেকে দক্ষতার সাথে প্রশিক্ষণ ডেটা লোড করার জন্য TFRecord ফর্ম্যাট ব্যবহার করা

প্রতিক্রিয়া

এই কোড ল্যাবে যদি কিছু ভুল দেখতে পান, তাহলে অনুগ্রহ করে আমাদের জানান। GitHub সমস্যাগুলির [ প্রতিক্রিয়া লিঙ্ক ] মাধ্যমে প্রতিক্রিয়া প্রদান করা যেতে পারে।

২. গুগল কোলাবোরেটরি দ্রুত শুরু

এই ল্যাবটি গুগল কোলাবোরেটরি ব্যবহার করে এবং আপনার পক্ষ থেকে কোনও সেটআপের প্রয়োজন হয় না। কোলাবোরেটরি শিক্ষার উদ্দেশ্যে একটি অনলাইন নোটবুক প্ল্যাটফর্ম। এটি বিনামূল্যে CPU, GPU এবং TPU প্রশিক্ষণ প্রদান করে।

688858c21e3beff2.png সম্পর্কে

আপনি এই নমুনা নোটবুকটি খুলে কয়েকটি কক্ষ ঘুরে Colaboratory-এর সাথে পরিচিত হতে পারেন।

c3df49e90e5a654f.png সম্পর্কে Welcome to Colab.ipynb

একটি TPU ব্যাকএন্ড নির্বাচন করুন

8832c6208c99687d.png সম্পর্কে

Colab মেনুতে, Runtime > Change runtime type নির্বাচন করুন এবং তারপর TPU নির্বাচন করুন। এই কোড ল্যাবে আপনি হার্ডওয়্যার-অ্যাক্সিলারেটেড প্রশিক্ষণের জন্য সমর্থিত একটি শক্তিশালী TPU (টেন্সর প্রসেসিং ইউনিট) ব্যবহার করবেন। প্রথম এক্সিকিউশনে রানটাইমের সাথে সংযোগ স্বয়ংক্রিয়ভাবে হয়ে যাবে, অথবা আপনি উপরের ডানদিকের কোণায় "Connect" বোতামটি ব্যবহার করতে পারেন।

নোটবুক সম্পাদন

76d05caa8b4db6da.png সম্পর্কে

একটি কক্ষে ক্লিক করে এবং Shift-ENTER ব্যবহার করে একের পর এক কক্ষ সম্পাদন করুন। আপনি Runtime > Run all ব্যবহার করে সম্পূর্ণ নোটবুকটিও চালাতে পারেন।

সুচিপত্র

429f106990037ec4.png সম্পর্কে

সকল নোটবুকের একটি সূচিপত্র থাকে। আপনি বাম দিকের কালো তীর ব্যবহার করে এটি খুলতে পারেন।

লুকানো কোষ

edc3dba45d26f12a.png সম্পর্কে

কিছু কোষে কেবল তাদের শিরোনাম দেখাবে। এটি একটি Colab-নির্দিষ্ট নোটবুক বৈশিষ্ট্য। ভিতরের কোডটি দেখতে আপনি সেগুলিতে ডাবল ক্লিক করতে পারেন তবে এটি সাধারণত খুব আকর্ষণীয় হয় না। সাধারণত সমর্থন বা ভিজ্যুয়ালাইজেশন ফাংশন। ভিতরের ফাংশনগুলি সংজ্ঞায়িত করার জন্য আপনাকে এখনও এই কোষগুলি চালাতে হবে।

প্রমাণীকরণ

cdd4b41413100543.png সম্পর্কে

একটি অনুমোদিত অ্যাকাউন্টের মাধ্যমে প্রমাণীকরণ করলে, Colab আপনার ব্যক্তিগত Google Cloud Storage বাকেট অ্যাক্সেস করতে পারবে। উপরের কোড স্নিপেটটি একটি প্রমাণীকরণ প্রক্রিয়া শুরু করবে।

৩. [তথ্য] টেনসর প্রসেসিং ইউনিট (TPU) কী?

সংক্ষেপে

f88cf6facfc70166.png সম্পর্কে

কেরাসে TPU-তে মডেল প্রশিক্ষণের কোড (এবং TPU উপলব্ধ না থাকলে GPU বা CPU-তে ফিরে যান):

try: # detect TPUs
    tpu = tf.distribute.cluster_resolver.TPUClusterResolver.connect()
    strategy = tf.distribute.TPUStrategy(tpu)
except ValueError: # detect GPUs
    strategy = tf.distribute.MirroredStrategy() # for CPU/GPU or multi-GPU machines

# use TPUStrategy scope to define model
with strategy.scope():
  model = tf.keras.Sequential( ... )
  model.compile( ... )

# train model normally on a tf.data.Dataset
model.fit(training_dataset, epochs=EPOCHS, steps_per_epoch=...)

আমরা আজ TPU ব্যবহার করে ইন্টারেক্টিভ গতিতে (প্রতি প্রশিক্ষণ রানে মিনিট) একটি ফুলের শ্রেণিবিন্যাসকারী তৈরি এবং অপ্টিমাইজ করব।

688858c21e3beff2.png সম্পর্কে

টিপিইউ কেন?

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

8eb3e718b8e2ed08.png সম্পর্কে

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

হার্ডওয়্যার

MXU এবং VPU

একটি TPU v2 কোর একটি Matrix Multiply Unit (MXU) দিয়ে তৈরি যা ম্যাট্রিক্স গুণন এবং একটি Vector Processing Unit (VPU) পরিচালনা করে অন্যান্য সমস্ত কাজের জন্য যেমন অ্যাক্টিভেশন, সফটম্যাক্স ইত্যাদি। VPU float32 এবং int32 গণনা পরিচালনা করে। অন্যদিকে MXU একটি মিশ্র নির্ভুলতা 16-32 বিট ফ্লোটিং পয়েন্ট ফর্ম্যাটে কাজ করে।

7d68944718f76b18.png সম্পর্কে

মিশ্র স্পষ্টতা ভাসমান বিন্দু এবং bfloat16

MXU bfloat16 ইনপুট এবং float32 আউটপুট ব্যবহার করে ম্যাট্রিক্স গুণ গণনা করে। মধ্যবর্তী সঞ্চয় float32 নির্ভুলতার সাথে সম্পাদিত হয়।

19c5fc432840c714.png সম্পর্কে

নিউরাল নেটওয়ার্ক প্রশিক্ষণ সাধারণত হ্রাসপ্রাপ্ত ফ্লোটিং পয়েন্ট নির্ভুলতার কারণে সৃষ্ট শব্দের বিরুদ্ধে প্রতিরোধী হয়। এমন কিছু ক্ষেত্রে আছে যেখানে শব্দ অপ্টিমাইজারকে একত্রিত করতেও সাহায্য করে। ১৬-বিট ফ্লোটিং পয়েন্ট নির্ভুলতা ঐতিহ্যগতভাবে গণনা ত্বরান্বিত করার জন্য ব্যবহৃত হয়ে আসছে কিন্তু float16 এবং float32 ফর্ম্যাটের রেঞ্জ খুব আলাদা। float32 থেকে float16 এ নির্ভুলতা কমানোর ফলে সাধারণত ওভার এবং আন্ডারফ্লো হয়। সমাধান বিদ্যমান কিন্তু float16 কাজ করার জন্য সাধারণত অতিরিক্ত কাজ প্রয়োজন।

এই কারণেই গুগল TPU গুলিতে bfloat16 ফর্ম্যাট চালু করেছে। bfloat16 হল একটি ছেঁটে ফেলা float32 যার এক্সপোনেন্ট বিট এবং রেঞ্জ float32 এর মতোই। এটি, TPU গুলি bfloat16 ইনপুট কিন্তু float32 আউটপুট সহ মিশ্র নির্ভুলতায় ম্যাট্রিক্স গুণ গণনা করে, এর অর্থ হল, সাধারণত, হ্রাসকৃত নির্ভুলতার কর্মক্ষমতা লাভ থেকে উপকৃত হওয়ার জন্য কোনও কোড পরিবর্তনের প্রয়োজন হয় না।

সিস্টোলিক অ্যারে

MXU হার্ডওয়্যারে ম্যাট্রিক্স গুণন প্রয়োগ করে একটি তথাকথিত "সিস্টোলিক অ্যারে" আর্কিটেকচার ব্যবহার করে যেখানে ডেটা উপাদানগুলি হার্ডওয়্যার গণনা ইউনিটের একটি অ্যারের মধ্য দিয়ে প্রবাহিত হয়। (চিকিৎসাবিদ্যায়, "সিস্টোলিক" বলতে হৃদপিণ্ডের সংকোচন এবং রক্ত ​​প্রবাহকে বোঝায়, এখানে ডেটা প্রবাহকে বোঝায়।)

একটি ম্যাট্রিক্স গুণনের মৌলিক উপাদান হল একটি ম্যাট্রিক্সের একটি রেখা এবং অন্য ম্যাট্রিক্সের একটি কলামের মধ্যে একটি বিন্দু গুণফল (এই বিভাগের শীর্ষে চিত্রটি দেখুন)। একটি ম্যাট্রিক্স গুণের জন্য Y=X*W, ফলাফলের একটি উপাদান হবে:

Y[2,0] = X[2,0]*W[0,0] + X[2,1]*W[1,0] + X[2,2]*W[2,0] + ... + X[2,n]*W[n,0]

একটি GPU-তে, এই ডট প্রোডাক্টটিকে একটি GPU "কোর"-এ প্রোগ্রাম করা হবে এবং তারপর সমান্তরালভাবে যতগুলি "কোর" পাওয়া যাবে তার উপর এটি চালানো হবে যাতে ফলাফলের ম্যাট্রিক্সের প্রতিটি মান একবারে গণনা করার চেষ্টা করা যায়। যদি ফলাফলের ম্যাট্রিক্স 128x128 বড় হয়, তাহলে 128x128=16K "কোর" উপলব্ধ থাকতে হবে যা সাধারণত সম্ভব নয়। বৃহত্তম GPU-তে প্রায় 4000 কোর থাকে। অন্যদিকে, একটি TPU MXU-তে কম্পিউট ইউনিটগুলির জন্য ন্যূনতম হার্ডওয়্যার ব্যবহার করে: কেবল bfloat16 x bfloat16 => float32 গুণ-সঞ্চয়কারী, অন্য কিছু নয়। এগুলি এত ছোট যে একটি TPU একটি 128x128 MXU-তে 16K প্রয়োগ করতে পারে এবং একবারে এই ম্যাট্রিক্স গুণন প্রক্রিয়া করতে পারে।

অনুসরণ

উদাহরণ: MXU সিস্টোলিক অ্যারে। কম্পিউট উপাদানগুলি হল গুণ-সঞ্চয়কারী। একটি ম্যাট্রিক্সের মান অ্যারেতে লোড করা হয় (লাল বিন্দু)। অন্য ম্যাট্রিক্সের মান অ্যারের মধ্য দিয়ে প্রবাহিত হয় (ধূসর বিন্দু)। উল্লম্ব রেখাগুলি মানগুলিকে উপরে প্রচার করে। অনুভূমিক রেখাগুলি আংশিক যোগফল প্রচার করে। এটি ব্যবহারকারীর জন্য একটি অনুশীলন হিসাবে রেখে দেওয়া হয় যাতে নিশ্চিত করা যায় যে অ্যারের মধ্য দিয়ে ডেটা প্রবাহিত হওয়ার সাথে সাথে আপনি ডান দিক থেকে ম্যাট্রিক্স গুণনের ফলাফল পাবেন।

এছাড়াও, যখন একটি MXU-তে ডট পণ্য গণনা করা হচ্ছে, তখন মধ্যবর্তী পরিমাণগুলি কেবল সংলগ্ন কম্পিউট ইউনিটগুলির মধ্যে প্রবাহিত হয়। এগুলি মেমরিতে/থেকে/এমনকি একটি রেজিস্টার ফাইলে সংরক্ষণ এবং পুনরুদ্ধার করার প্রয়োজন হয় না। শেষ ফলাফল হল যে TPU সিস্টোলিক অ্যারে আর্কিটেকচারের একটি উল্লেখযোগ্য ঘনত্ব এবং শক্তি সুবিধা রয়েছে, পাশাপাশি ম্যাট্রিক্স গুণ গণনা করার সময় একটি GPU-এর তুলনায় একটি অ-নগণ্য গতি সুবিধা রয়েছে।

ক্লাউড টিপিইউ

যখন আপনি গুগল ক্লাউড প্ল্যাটফর্মে একটি " ক্লাউড TPU v2" অনুরোধ করেন, তখন আপনি একটি ভার্চুয়াল মেশিন (VM) পাবেন যার একটি PCI-সংযুক্ত TPU বোর্ড রয়েছে। TPU বোর্ডে চারটি ডুয়াল-কোর TPU চিপ রয়েছে। প্রতিটি TPU কোরে একটি VPU (ভেক্টর প্রসেসিং ইউনিট) এবং একটি 128x128 MXU (MatriX মাল্টিপ্লাই ইউনিট) রয়েছে। এই "ক্লাউড TPU" সাধারণত নেটওয়ার্কের মাধ্যমে অনুরোধ করা VM-এর সাথে সংযুক্ত থাকে। তাই সম্পূর্ণ ছবিটি এইরকম দেখাচ্ছে:

dfce5522ed644ece.png

উদাহরণ: আপনার VM একটি নেটওয়ার্ক-সংযুক্ত "ক্লাউড TPU" অ্যাক্সিলারেটর সহ। "ক্লাউড TPU" নিজেই একটি VM দিয়ে তৈরি যার একটি PCI-সংযুক্ত TPU বোর্ড রয়েছে যার উপর চারটি ডুয়াল-কোর TPU চিপ রয়েছে।

টিপিইউ পড

গুগলের ডেটা সেন্টারগুলিতে, টিপিইউগুলি একটি উচ্চ-কর্মক্ষমতা সম্পন্ন কম্পিউটিং (এইচপিসি) ইন্টারকানেক্টের সাথে সংযুক্ত থাকে যা এগুলিকে একটি খুব বড় অ্যাক্সিলারেটর হিসাবে দেখাতে পারে। গুগল এগুলিকে পড বলে এবং এগুলি 512 টিপিইউ ভি2 কোর বা 2048 টিপিইউ ভি3 কোর পর্যন্ত ধারণ করতে পারে।

2ec1e0d341e7fc34.jpeg সম্পর্কে

চিত্র: একটি TPU v3 পড। HPC ইন্টারকানেক্টের মাধ্যমে সংযুক্ত TPU বোর্ড এবং র্যাক।

প্রশিক্ষণের সময়, অল-রিডুস অ্যালগরিদম ব্যবহার করে TPU কোরের মধ্যে গ্রেডিয়েন্ট বিনিময় করা হয় ( এখানে অল-রিডুসের ভাল ব্যাখ্যা )। প্রশিক্ষণপ্রাপ্ত মডেলটি বড় ব্যাচ আকারের প্রশিক্ষণের মাধ্যমে হার্ডওয়্যারের সুবিধা নিতে পারে।

অনুসরণ

উদাহরণ: Google TPU-এর 2-D টরয়েডাল মেশ HPC নেটওয়ার্কে অল-রিডুস অ্যালগরিদম ব্যবহার করে প্রশিক্ষণের সময় গ্রেডিয়েন্টের সিঙ্ক্রোনাইজেশন।

সফটওয়্যারটি

বড় ব্যাচ সাইজের প্রশিক্ষণ

TPU-এর জন্য আদর্শ ব্যাচ সাইজ হল প্রতি TPU কোরে ১২৮টি ডেটা আইটেম, কিন্তু হার্ডওয়্যারটি ইতিমধ্যেই প্রতি TPU কোরে ৮টি ডেটা আইটেম থেকে ভালো ব্যবহার দেখাতে পারে। মনে রাখবেন যে একটি ক্লাউড TPU-তে ৮টি কোর থাকে।

এই কোড ল্যাবে, আমরা Keras API ব্যবহার করব। Keras-এ, আপনি যে ব্যাচটি নির্দিষ্ট করবেন তা হল সমগ্র TPU-এর জন্য বিশ্বব্যাপী ব্যাচের আকার। আপনার ব্যাচগুলি স্বয়ংক্রিয়ভাবে 8টিতে বিভক্ত হবে এবং TPU-এর 8টি কোরে চলবে।

da534407825f01e3.png সম্পর্কে

অতিরিক্ত পারফরম্যান্স টিপসের জন্য TPU পারফরম্যান্স গাইড দেখুন। খুব বড় ব্যাচ সাইজের জন্য, কিছু মডেলে বিশেষ যত্নের প্রয়োজন হতে পারে, আরও বিস্তারিত জানার জন্য LARSOptimizer দেখুন।

হুডের নিচে: XLA

টেনসরফ্লো প্রোগ্রামগুলি গণনা গ্রাফ সংজ্ঞায়িত করে। TPU সরাসরি পাইথন কোড চালায় না, এটি আপনার টেনসরফ্লো প্রোগ্রাম দ্বারা সংজ্ঞায়িত গণনা গ্রাফ চালায়। হুডের নীচে, XLA (অ্যাক্সিলারেটেড লিনিয়ার অ্যালজেব্রা কম্পাইলার) নামক একটি কম্পাইলার কম্পিউটেশন নোডের টেনসরফ্লো গ্রাফকে TPU মেশিন কোডে রূপান্তরিত করে। এই কম্পাইলারটি আপনার কোড এবং আপনার মেমোরি লেআউটে অনেক উন্নত অপ্টিমাইজেশনও করে। TPU-তে কাজ পাঠানোর সাথে সাথে কম্পাইলেশনটি স্বয়ংক্রিয়ভাবে ঘটে। আপনার বিল্ড চেইনে আপনাকে স্পষ্টভাবে XLA অন্তর্ভুক্ত করতে হবে না।

edce61112cd57972.png সম্পর্কে

উদাহরণ: TPU তে চালানোর জন্য, আপনার Tensorflow প্রোগ্রাম দ্বারা সংজ্ঞায়িত গণনা গ্রাফটি প্রথমে একটি XLA (accelerated Linear Algebra compiler) উপস্থাপনায় অনুবাদ করা হয়, তারপর XLA দ্বারা TPU মেশিন কোডে কম্পাইল করা হয়।

কেরাসে টিপিইউ ব্যবহার

Tensorflow 2.1 থেকে Keras API এর মাধ্যমে TPU গুলি সমর্থিত। Keras সাপোর্ট TPU এবং TPU পডগুলিতে কাজ করে। এখানে একটি উদাহরণ দেওয়া হল যা TPU, GPU(গুলি) এবং CPU-তে কাজ করে:

try: # detect TPUs
    tpu = tf.distribute.cluster_resolver.TPUClusterResolver.connect()
    strategy = tf.distribute.TPUStrategy(tpu)
except ValueError: # detect GPUs
    strategy = tf.distribute.MirroredStrategy() # for CPU/GPU or multi-GPU machines

# use TPUStrategy scope to define model
with strategy.scope():
  model = tf.keras.Sequential( ... )
  model.compile( ... )

# train model normally on a tf.data.Dataset
model.fit(training_dataset, epochs=EPOCHS, steps_per_epoch=...)

এই কোড স্নিপেটে:

  • TPUClusterResolver().connect() নেটওয়ার্কে TPU খুঁজে বের করে। এটি বেশিরভাগ Google ক্লাউড সিস্টেমে (AI Platform jobs, Colaboratory, Kubeflow, 'ctpu up' ইউটিলিটির মাধ্যমে তৈরি Deep Learning VM) প্যারামিটার ছাড়াই কাজ করে। এই সিস্টেমগুলি TPU_NAME এনভায়রনমেন্ট ভেরিয়েবলের জন্য তাদের TPU কোথায় তা জানে। আপনি যদি হাতে একটি TPU তৈরি করেন, তাহলে হয় আপনি যে VM থেকে এটি ব্যবহার করছেন তাতে TPU_NAME env. var. সেট করুন, অথবা স্পষ্ট প্যারামিটার সহ TPUClusterResolver কল করুন: TPUClusterResolver(tp_uname, zone, project)
  • TPUStrategy হল সেই অংশ যা বিতরণ এবং "অল-রিডুস" গ্রেডিয়েন্ট সিঙ্ক্রোনাইজেশন অ্যালগরিদম বাস্তবায়ন করে।
  • কৌশলটি একটি স্কোপের মাধ্যমে প্রয়োগ করা হয়। মডেলটি অবশ্যই স্ট্র্যাটেজি স্কোপের মধ্যে সংজ্ঞায়িত করা উচিত()।
  • tpu_model.fit ফাংশনটি TPU প্রশিক্ষণের জন্য ইনপুটের জন্য একটি tf.data.Dataset অবজেক্ট আশা করে।

সাধারণ TPU পোর্টিং কাজগুলি

  • টেনসরফ্লো মডেলে ডেটা লোড করার অনেক উপায় থাকলেও, TPU-এর জন্য tf.data.Dataset API ব্যবহার করা প্রয়োজন।
  • TPU গুলি খুব দ্রুত কাজ করে এবং এগুলি চালানোর সময় ডেটা গ্রহণ করা প্রায়শই বাধা হয়ে দাঁড়ায়। TPU পারফরম্যান্স গাইডে ডেটা বাধা এবং অন্যান্য পারফরম্যান্স টিপস সনাক্ত করার জন্য আপনি কিছু সরঞ্জাম ব্যবহার করতে পারেন।
  • int8 বা int16 সংখ্যাগুলিকে int32 হিসাবে বিবেচনা করা হয়। TPU তে 32 বিটের কম সংখ্যক পূর্ণসংখ্যার হার্ডওয়্যার নেই।
  • কিছু টেনসরফ্লো অপারেশন সমর্থিত নয়। তালিকাটি এখানে । সুখবর হল যে এই সীমাবদ্ধতা শুধুমাত্র প্রশিক্ষণ কোডের ক্ষেত্রে প্রযোজ্য, অর্থাৎ আপনার মডেলের মধ্য দিয়ে ফরোয়ার্ড এবং ব্যাকওয়ার্ড পাস। আপনি এখনও আপনার ডেটা ইনপুট পাইপলাইনে সমস্ত টেনসরফ্লো অপারেশন ব্যবহার করতে পারেন কারণ এটি CPU-তে কার্যকর করা হবে।
  • tf.py_func TPU তে সমর্থিত নয়।

৪. ডেটা লোড হচ্ছে

c0ecb860e4cad0a9.jpeg সম্পর্কেcc4781a7739c49ae.jpeg সম্পর্কে81236b00f8bbf39e.jpeg সম্পর্কে961e2228974076bb.jpeg সম্পর্কে7517dc163bdffcd5.jpeg সম্পর্কে96392df4767f566d.png সম্পর্কে

আমরা ফুলের ছবির একটি ডেটাসেট নিয়ে কাজ করব। লক্ষ্য হল ফুলগুলিকে ৫ ধরণের ফুলে ভাগ করা শেখা। tf.data.Dataset API ব্যবহার করে ডেটা লোড করা হয়। প্রথমে, আসুন API সম্পর্কে জেনে নেওয়া যাক।

হাতে-কলমে

অনুগ্রহ করে নিচের নোটবুকটি খুলুন, কোষগুলি (Shift-ENTER) চালান এবং যেখানেই "কাজের প্রয়োজন" লেবেল দেখতে পাবেন সেখানে নির্দেশাবলী অনুসরণ করুন।

c3df49e90e5a654f.png সম্পর্কে Fun with tf.data.Dataset (playground).ipynb

অতিরিক্ত তথ্য

"ফুল" ডেটাসেট সম্পর্কে

ডেটাসেটটি ৫টি ফোল্ডারে সাজানো। প্রতিটি ফোল্ডারে এক ধরণের ফুল রয়েছে। ফোল্ডারগুলির নাম সূর্যমুখী, ডেইজি, ড্যান্ডেলিয়ন, টিউলিপ এবং গোলাপ। ডেটা গুগল ক্লাউড স্টোরেজে একটি পাবলিক বাকেটে হোস্ট করা আছে। উদ্ধৃতি:

gs://flowers-public/sunflowers/5139971615_434ff8ed8b_n.jpg
gs://flowers-public/daisy/8094774544_35465c1c64.jpg
gs://flowers-public/sunflowers/9309473873_9d62b9082e.jpg
gs://flowers-public/dandelion/19551343954_83bb52f310_m.jpg
gs://flowers-public/dandelion/14199664556_188b37e51e.jpg
gs://flowers-public/tulips/4290566894_c7f061583d_m.jpg
gs://flowers-public/roses/3065719996_c16ecd5551.jpg
gs://flowers-public/dandelion/8168031302_6e36f39d87.jpg
gs://flowers-public/sunflowers/9564240106_0577e919da_n.jpg
gs://flowers-public/daisy/14167543177_cd36b54ac6_n.jpg

কেন tf.data.Dataset?

Keras এবং Tensorflow তাদের সকল প্রশিক্ষণ এবং মূল্যায়ন ফাংশনে ডেটাসেট গ্রহণ করে। একবার আপনি একটি ডেটাসেটে ডেটা লোড করলে, API নিউরাল নেটওয়ার্ক প্রশিক্ষণ ডেটার জন্য কার্যকর সমস্ত সাধারণ কার্যকারিতা প্রদান করে:

dataset = ... # load something (see below)
dataset = dataset.shuffle(1000) # shuffle the dataset with a buffer of 1000
dataset = dataset.cache() # cache the dataset in RAM or on disk
dataset = dataset.repeat() # repeat the dataset indefinitely
dataset = dataset.batch(128) # batch data elements together in batches of 128
AUTOTUNE = tf.data.AUTOTUNE
dataset = dataset.prefetch(AUTOTUNE) # prefetch next batch(es) while training

এই প্রবন্ধে আপনি পারফর্ম্যান্স টিপস এবং ডেটাসেটের সেরা অনুশীলনগুলি পেতে পারেন। রেফারেন্স ডকুমেন্টেশনটি এখানে

tf.data.Dataset এর মূল বিষয়গুলি

ডেটা সাধারণত একাধিক ফাইলে আসে, এখানে ছবি। আপনি নিম্নলিখিত নম্বরে কল করে ফাইলের নামের একটি ডেটাসেট তৈরি করতে পারেন:

filenames_dataset = tf.data.Dataset.list_files('gs://flowers-public/*/*.jpg')
# The parameter is a "glob" pattern that supports the * and ? wildcards.

তারপর আপনি প্রতিটি ফাইলের নামের সাথে একটি ফাংশন "ম্যাপ" করবেন যা সাধারণত ফাইলটিকে মেমরিতে প্রকৃত ডেটাতে লোড এবং ডিকোড করবে:

def decode_jpeg(filename):
  bits = tf.io.read_file(filename)
  image = tf.io.decode_jpeg(bits)
  return image

image_dataset = filenames_dataset.map(decode_jpeg)
# this is now a dataset of decoded images (uint8 RGB format)

একটি ডেটাসেটে পুনরাবৃত্তি করতে:

for data in my_dataset:
  print(data)

টিপলের ডেটাসেট

তত্ত্বাবধানে থাকা শিক্ষায়, একটি প্রশিক্ষণ ডেটাসেট সাধারণত প্রশিক্ষণ ডেটা এবং সঠিক উত্তরের জোড়া দিয়ে তৈরি হয়। এটি করার জন্য, ডিকোডিং ফাংশনটি টিপলগুলি ফেরত দিতে পারে। এরপর আপনার কাছে টিপলগুলির একটি ডেটাসেট থাকবে এবং আপনি যখন এটিতে পুনরাবৃত্তি করবেন তখন টিপলগুলি ফেরত দেওয়া হবে। ফেরত দেওয়া মানগুলি হল Tensorflow tensors যা আপনার মডেল দ্বারা ব্যবহারের জন্য প্রস্তুত। আপনি raw মানগুলি দেখতে .numpy() কল করতে পারেন:

def decode_jpeg_and_label(filename):
  bits = tf.read_file(filename)
  image = tf.io.decode_jpeg(bits)
  label = ... # extract flower name from folder name
  return image, label

image_dataset = filenames_dataset.map(decode_jpeg_and_label)
# this is now a dataset of (image, label) pairs 

for image, label in dataset:
  print(image.numpy().shape, label.numpy())

উপসংহার: একের পর এক ছবি লোড করা ধীর গতির!

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

সমাধান

এখানে সমাধান নোটবুক। যদি আপনি আটকে যান তবে আপনি এটি ব্যবহার করতে পারেন।

c3df49e90e5a654f.png সম্পর্কে Fun with tf.data.Dataset (solution).ipynb

আমরা যা কভার করেছি

  • 🤔 tf.data.Dataset.list_files
  • 🤔 tf.data.Dataset.map
  • 🤔 টিপলের ডেটাসেট
  • 😀 ডেটাসেটের মাধ্যমে পুনরাবৃত্তি করা হচ্ছে

অনুগ্রহ করে একটু সময় নিয়ে এই চেকলিস্টটি আপনার মাথায় ঢোকান।

৫. দ্রুত ডেটা লোড হচ্ছে

এই ল্যাবে আমরা যে টেনসর প্রসেসিং ইউনিট (TPU) হার্ডওয়্যার অ্যাক্সিলারেটর ব্যবহার করব তা খুবই দ্রুত। প্রায়শই চ্যালেঞ্জ হল তাদের ব্যস্ত রাখার জন্য যথেষ্ট দ্রুত ডেটা সরবরাহ করা। গুগল ক্লাউড স্টোরেজ (GCS) খুব উচ্চ থ্রুপুট বজায় রাখতে সক্ষম কিন্তু সমস্ত ক্লাউড স্টোরেজ সিস্টেমের মতো, একটি সংযোগ শুরু করতে কিছু নেটওয়ার্ককে এদিক-ওদিক খরচ করতে হয়। অতএব, হাজার হাজার পৃথক ফাইল হিসাবে আমাদের ডেটা সংরক্ষণ করা আদর্শ নয়। আমরা সেগুলিকে কম সংখ্যক ফাইলে ব্যাচ করব এবং tf.data.Dataset এর শক্তি ব্যবহার করে একাধিক ফাইল থেকে সমান্তরালভাবে পড়তে পারব।

পঠনযোগ্য

যে কোডটি ইমেজ ফাইল লোড করে, সেগুলিকে একটি সাধারণ আকারে পরিবর্তন করে এবং তারপর ১৬টি TFRecord ফাইলে সংরক্ষণ করে তা নিম্নলিখিত নোটবুকে রয়েছে। দয়া করে দ্রুত এটি পড়ুন। এটি কার্যকর করার প্রয়োজন নেই কারণ কোডল্যাবের বাকি অংশের জন্য সঠিকভাবে TFRecord-ফর্ম্যাট করা ডেটা সরবরাহ করা হবে।

c3df49e90e5a654f.png সম্পর্কে Flower pictures to TFRecords.ipynb

সর্বোত্তম GCS থ্রুপুটের জন্য আদর্শ ডেটা লেআউট

TFRecord ফাইল ফর্ম্যাট

ডেটা সংরক্ষণের জন্য Tensorflow-এর পছন্দের ফাইল ফর্ম্যাট হল protobuf- ভিত্তিক TFRecord ফর্ম্যাট। অন্যান্য সিরিয়ালাইজেশন ফর্ম্যাটগুলিও কাজ করবে তবে আপনি TFRecord ফাইলগুলি থেকে সরাসরি একটি ডেটাসেট লোড করতে পারেন:

filenames = tf.io.gfile.glob(FILENAME_PATTERN)
dataset = tf.data.TFRecordDataset(filenames)
dataset = dataset.map(...) # do the TFRecord decoding here - see below

সর্বোত্তম কর্মক্ষমতার জন্য, একাধিক TFRecord ফাইল থেকে একসাথে পড়ার জন্য নিম্নলিখিত আরও জটিল কোড ব্যবহার করার পরামর্শ দেওয়া হচ্ছে। এই কোডটি N ফাইলগুলি থেকে সমান্তরালভাবে পড়বে এবং পড়ার গতির পক্ষে ডেটা ক্রম উপেক্ষা করবে।

AUTOTUNE = tf.data.AUTOTUNE
ignore_order = tf.data.Options()
ignore_order.experimental_deterministic = False

filenames = tf.io.gfile.glob(FILENAME_PATTERN)
dataset = tf.data.TFRecordDataset(filenames, num_parallel_reads=AUTOTUNE)
dataset = dataset.with_options(ignore_order)
dataset = dataset.map(...) # do the TFRecord decoding here - see below

TFRecord চিট শিট

TFRecords-এ তিন ধরণের ডেটা সংরক্ষণ করা যেতে পারে: বাইট স্ট্রিং (বাইটের তালিকা), 64 বিট পূর্ণসংখ্যা এবং 32 বিট ফ্লোট । এগুলি সর্বদা তালিকা হিসাবে সংরক্ষণ করা হয়, একটি একক ডেটা উপাদান আকার 1 এর একটি তালিকা হবে। TFRecords-এ ডেটা সংরক্ষণ করতে আপনি নিম্নলিখিত সহায়ক ফাংশনগুলি ব্যবহার করতে পারেন।

বাইট স্ট্রিং লেখা

# warning, the input is a list of byte strings, which are themselves lists of bytes
def _bytestring_feature(list_of_bytestrings):
  return tf.train.Feature(bytes_list=tf.train.BytesList(value=list_of_bytestrings))

পূর্ণসংখ্যা লেখা

def _int_feature(list_of_ints): # int64
  return tf.train.Feature(int64_list=tf.train.Int64List(value=list_of_ints))

লেখা ভাসমান

def _float_feature(list_of_floats): # float32
  return tf.train.Feature(float_list=tf.train.FloatList(value=list_of_floats))

উপরের সাহায্যকারীদের ব্যবহার করে একটি TFRecord লেখা

# input data in my_img_bytes, my_class, my_height, my_width, my_floats
with tf.python_io.TFRecordWriter(filename) as out_file:
  feature = {
    "image": _bytestring_feature([my_img_bytes]), # one image in the list
    "class": _int_feature([my_class]),            # one class in the list
    "size": _int_feature([my_height, my_width]),  # fixed length (2) list of ints
    "float_data": _float_feature(my_floats)       # variable length  list of floats
  }
  tf_record = tf.train.Example(features=tf.train.Features(feature=feature))
  out_file.write(tf_record.SerializeToString())

TFRecords থেকে ডেটা পড়ার জন্য, আপনাকে প্রথমে আপনার সংরক্ষিত রেকর্ডের লেআউট ঘোষণা করতে হবে। ঘোষণায়, আপনি যেকোনো নামযুক্ত ক্ষেত্রকে একটি নির্দিষ্ট দৈর্ঘ্যের তালিকা বা একটি পরিবর্তনশীল দৈর্ঘ্যের তালিকা হিসাবে অ্যাক্সেস করতে পারেন:

TFRecords থেকে পড়া

def read_tfrecord(data):
  features = {
    # tf.string = byte string (not text string)
    "image": tf.io.FixedLenFeature([], tf.string), # shape [] means scalar, here, a single byte string
    "class": tf.io.FixedLenFeature([], tf.int64),  # shape [] means scalar, i.e. a single item
    "size": tf.io.FixedLenFeature([2], tf.int64),  # two integers
    "float_data": tf.io.VarLenFeature(tf.float32)  # a variable number of floats
  }

  # decode the TFRecord
  tf_record = tf.io.parse_single_example(data, features)

  # FixedLenFeature fields are now ready to use
  sz = tf_record['size']

  # Typical code for decoding compressed images
  image = tf.io.decode_jpeg(tf_record['image'], channels=3)

  # VarLenFeature fields require additional sparse.to_dense decoding
  float_data = tf.sparse.to_dense(tf_record['float_data'])

  return image, sz, float_data

# decoding a tf.data.TFRecordDataset
dataset = dataset.map(read_tfrecord)
# now a dataset of triplets (image, sz, float_data)

দরকারী কোড স্নিপেট:

একক ডেটা উপাদান পড়া

tf.io.FixedLenFeature([], tf.string)   # for one byte string
tf.io.FixedLenFeature([], tf.int64)    # for one int
tf.io.FixedLenFeature([], tf.float32)  # for one float

নির্দিষ্ট আকারের উপাদানের তালিকা পড়া

tf.io.FixedLenFeature([N], tf.string)   # list of N byte strings
tf.io.FixedLenFeature([N], tf.int64)    # list of N ints
tf.io.FixedLenFeature([N], tf.float32)  # list of N floats

পরিবর্তনশীল সংখ্যক ডেটা আইটেম পড়া

tf.io.VarLenFeature(tf.string)   # list of byte strings
tf.io.VarLenFeature(tf.int64)    # list of ints
tf.io.VarLenFeature(tf.float32)  # list of floats

একটি VarLenFeature একটি স্পার্স ভেক্টর প্রদান করে এবং TFRecord ডিকোড করার পরে একটি অতিরিক্ত পদক্ষেপ প্রয়োজন:

dense_data = tf.sparse.to_dense(tf_record['my_var_len_feature'])

TFRecords-এ ঐচ্ছিক ক্ষেত্র থাকাও সম্ভব। যদি আপনি একটি ক্ষেত্র পড়ার সময় একটি ডিফল্ট মান নির্দিষ্ট করেন, তাহলে ক্ষেত্রটি অনুপস্থিত থাকলে ত্রুটির পরিবর্তে ডিফল্ট মানটি ফেরত পাঠানো হয়।

tf.io.FixedLenFeature([], tf.int64, default_value=0) # this field is optional

আমরা যা কভার করেছি

  • 🤔 GCS থেকে দ্রুত অ্যাক্সেসের জন্য ডেটা ফাইল ভাগ করা
  • 😓 TFRecords কিভাবে লিখবেন। (আপনি কি ইতিমধ্যেই বাক্য গঠন ভুলে গেছেন? ঠিক আছে, এই পৃষ্ঠাটিকে একটি চিট শিট হিসেবে বুকমার্ক করুন)
  • 🤔 TFRecordDataset ব্যবহার করে TFRecords থেকে একটি ডেটাসেট লোড করা হচ্ছে

অনুগ্রহ করে একটু সময় নিয়ে এই চেকলিস্টটি আপনার মাথায় ঢোকান।

৬. অভিনন্দন!

এখন আপনি একটি TPU-তে ডেটা দিতে পারেন। অনুগ্রহ করে পরবর্তী ল্যাবে যান।

বাস্তবে টিপিইউ

ক্লাউড এআই প্ল্যাটফর্মে টিপিইউ এবং জিপিইউ পাওয়া যায়:

পরিশেষে, আমরা প্রতিক্রিয়া পেতে ভালোবাসি। এই ল্যাবে যদি কিছু ভুল দেখেন অথবা এটি উন্নত করা উচিত বলে মনে করেন, তাহলে দয়া করে আমাদের জানান। GitHub সমস্যাগুলির [ প্রতিক্রিয়া লিঙ্ক ] মাধ্যমে প্রতিক্রিয়া প্রদান করা যেতে পারে।

এইচআর.পিএনজি

মার্টিন গোর্নার আইডি small.jpg
লেখক: মার্টিন গোর্নার
টুইটার: @martin_gorner