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

1. ওভারভিউ

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

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

ca8cc21f6838eccc.png

আপনি কি শিখবেন

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

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

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

2. Google Colaboratory দ্রুত শুরু

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

688858c21e3beff2.png

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

c3df49e90e5a654f.png Welcome to Colab.ipynb

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

8832c6208c99687d.png

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

নোটবুক এক্সিকিউশন

76d05caa8b4db6da.png

একটি কক্ষে ক্লিক করে এবং Shift-ENTER ব্যবহার করে এক সময়ে সেলগুলি চালান৷ আপনি রানটাইম > সমস্ত চালান দিয়ে পুরো নোটবুক চালাতে পারেন

বিষয়বস্তুর সারণী

429f106990037ec4.png

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

লুকানো কোষ

edc3dba45d26f12a.png

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

প্রমাণীকরণ

cdd4b41413100543.png

Colab-এর পক্ষে আপনার ব্যক্তিগত Google ক্লাউড স্টোরেজ বালতি অ্যাক্সেস করা সম্ভব যদি আপনি একটি অনুমোদিত অ্যাকাউন্টের মাধ্যমে প্রমাণীকরণ করেন। উপরের কোড স্নিপেট একটি প্রমাণীকরণ প্রক্রিয়া ট্রিগার করবে।

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

সংক্ষেপে

f88cf6facfc70166.png

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

8eb3e718b8e2ed08.png

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

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

MXU এবং VPU

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

7d68944718f76b18.png

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

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

19c5fc432840c714.png

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

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

f1b283fc45966717.gif

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

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

মেঘ TPU

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

dfce5522ed644ece.png

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

TPU শুঁটি

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

2ec1e0d341e7fc34.jpeg

উদাহরণ: একটি TPU v3 পড। TPU বোর্ড এবং র্যাকগুলি HPC আন্তঃসংযোগের মাধ্যমে সংযুক্ত।

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

d97b9cc5d40fdb1d.gif

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

সফটওয়্যার

বড় ব্যাচ আকারের প্রশিক্ষণ

TPU-গুলির জন্য আদর্শ ব্যাচের আকার হল প্রতি TPU কোরে 128টি ডেটা আইটেম কিন্তু হার্ডওয়্যারটি ইতিমধ্যেই প্রতি TPU কোরে 8টি ডেটা আইটেম থেকে ভাল ব্যবহার দেখাতে পারে। মনে রাখবেন যে একটি ক্লাউড টিপিইউতে 8টি কোর রয়েছে।

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

da534407825f01e3.png

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

হুড অধীনে: XLA

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

edce61112cd57972.png

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

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

TPUs কেরাস API এর মাধ্যমে Tensorflow 2.1 এর মাধ্যমে সমর্থিত। কেরাস সমর্থন টিপিইউ এবং টিপিইউ পডগুলিতে কাজ করে। এখানে একটি উদাহরণ রয়েছে যা 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' ইউটিলিটির মাধ্যমে তৈরি ডিপ লার্নিং ভিএম) প্যারামিটার ছাড়াই কাজ করে। TPU_NAME এনভায়রনমেন্ট ভেরিয়েবলের জন্য এই সিস্টেমগুলি জানে যে তাদের TPU কোথায় আছে৷ আপনি যদি হাতে একটি TPU তৈরি করেন, হয় TPU_NAME env সেট করুন৷ var আপনি যে VM থেকে এটি ব্যবহার করছেন তাতে, অথবা স্পষ্ট প্যারামিটার সহ TPUClusterResolver কল করুন: TPUClusterResolver(tp_uname, zone, project)
  • TPUStrategy হল সেই অংশ যা ডিস্ট্রিবিউশন এবং "অল-রিডুস" গ্রেডিয়েন্ট সিঙ্ক্রোনাইজেশন অ্যালগরিদম প্রয়োগ করে।
  • কৌশল একটি সুযোগ মাধ্যমে প্রয়োগ করা হয়. মডেলটিকে অবশ্যই কৌশলের সুযোগ() এর মধ্যে সংজ্ঞায়িত করতে হবে।
  • tpu_model.fit ফাংশন টিপিইউ প্রশিক্ষণের জন্য ইনপুটের জন্য একটি tf.data.Dataset অবজেক্ট আশা করে।

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

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

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

c0ecb860e4cad0a9.jpegcc4781a7739c49ae.jpeg81236b00f8bbf39e.jpeg961e2228974076bb.jpeg7517dc163bdffcd5.jpeg96392df4767f566d.png

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

হাতে-কলমে

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

c3df49e90e5a654f.png Fun with tf.data.Dataset (playground).ipynb

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

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

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

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?

কেরাস এবং টেনসরফ্লো তাদের সমস্ত প্রশিক্ষণ এবং মূল্যায়ন ফাংশনে ডেটাসেট গ্রহণ করে। একবার আপনি ডেটাসেটে ডেটা লোড করলে, 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)

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

তত্ত্বাবধানে শেখার ক্ষেত্রে, একটি প্রশিক্ষণ ডেটাসেট সাধারণত জোড়া প্রশিক্ষণ ডেটা এবং সঠিক উত্তর দিয়ে তৈরি হয়। এটির অনুমতি দেওয়ার জন্য, ডিকোডিং ফাংশন টিপল ফেরত দিতে পারে। তারপরে আপনার কাছে টিপলের একটি ডেটাসেট থাকবে এবং আপনি এটিতে পুনরাবৃত্তি করলে টিপলগুলি ফেরত দেওয়া হবে। প্রত্যাবর্তিত মানগুলি হল টেনসরফ্লো টেনসরগুলি আপনার মডেলের দ্বারা খাওয়ার জন্য প্রস্তুত৷ কাঁচা মান দেখতে আপনি .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())

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

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

সমাধান

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

c3df49e90e5a654f.png Fun with tf.data.Dataset (solution).ipynb

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

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

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

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

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

রিড-থ্রু

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

c3df49e90e5a654f.png Flower pictures to TFRecords.ipynb

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

TFRecord ফাইল বিন্যাস

ডেটা সংরক্ষণের জন্য Tensorflow-এর পছন্দের ফাইল ফরম্যাট হল প্রোটোবাফ -ভিত্তিক 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

TFRrecord চিট শীট

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

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

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

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

6. অভিনন্দন!

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

অনুশীলনে TPUs

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

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

HR.png

Martin Görner ID small.jpg
লেখক: মার্টিন গোর্নার
টুইটার: @martin_gorner