ওভারভিউ
এই গাইডটি tf.data
প্রোফাইলার এবং tf.data
সাথে পরিচিতি অনুমান করে। ইনপুট পাইপলাইন কার্যকারিতা সংক্রান্ত সমস্যাগুলি নির্ণয় এবং ঠিক করতে ব্যবহারকারীদের উদাহরণ সহ ধাপে ধাপে নির্দেশাবলী সরবরাহ করা এর লক্ষ্য।
শুরু করার জন্য, আপনার টেনসরফ্লো কাজের একটি প্রোফাইল সংগ্রহ করুন। এটি কীভাবে করবেন সে সম্পর্কে নির্দেশাবলী সিপিইউ / জিপিইউ এবং ক্লাউড টিপিইউগুলির জন্য উপলব্ধ।
নীচে বিশদে বিশদ বিশ্লেষণ কর্মপ্রবাহটি প্রোফাইলারটিতে ট্রেস ভিউয়ার সরঞ্জামকে কেন্দ্র করে। এই সরঞ্জামটি এমন একটি টাইমলাইন প্রদর্শন করে যা আপনার টেনসরফ্লো প্রোগ্রাম দ্বারা সম্পাদিত অপের সময়কাল দেখায় এবং কোন অপটিকে কার্যকর করতে সবচেয়ে বেশি সময় নেয় তা আপনাকে সনাক্ত করতে সহায়তা করে। ট্রেস ভিউয়ার সম্পর্কে আরও তথ্যের জন্য টিএফ প্রোফাইলার গাইডের এই বিভাগটি দেখুন । সাধারণভাবে, tf.data
ইভেন্টগুলি হোস্ট সিপিইউ টাইমলাইনে উপস্থিত হবে।
বিশ্লেষণ কর্মপ্রবাহ
নীচের কর্মপ্রবাহ অনুসরণ করুন। আমাদের এটির উন্নতিতে সহায়তা করতে যদি আপনার প্রতিক্রিয়া থাকে তবে দয়া করে "কমপ: ডেটা" লেবেল সহ গিথব সমস্যা তৈরি করুন ।
1. আপনার tf.data
পাইপলাইন ডেটা উত্পাদন যথেষ্ট দ্রুত?
ইনপুট পাইপলাইনটি আপনার টেনসরফ্লো প্রোগ্রামের জন্য বাধা কিনা তা নির্ধারণ করেই শুরু করুন।
এটি করার জন্য, ট্রেস ভিউয়ারে IteratorGetNext::DoCompute
অপস অনুসন্ধান করুন। সাধারণভাবে, আপনি কোনও পদক্ষেপের শুরুতে এগুলি দেখার আশা করছেন। এই স্লাইসগুলি আপনার ইনপুট পাইপলাইনটিকে যখন অনুরোধ করা হয় তখন উপাদানগুলির একটি ব্যাচ উত্পাদন করতে সময় লাগে তা উপস্থাপন করে। আপনি যদি tf.function
ব্যবহার করছেন বা যদি আপনার ডেটাসেটের উপর tf.function
পুনরাবৃত্তি করেন তবে এগুলি tf_data_iterator_get_next
থ্রেডে পাওয়া উচিত।
মনে রাখবেন আপনি একটি ব্যবহার করছেন যদি বন্টন কৌশল , আপনি দেখতে পারেন IteratorGetNextAsOptional::DoCompute
পরিবর্তে ঘটনা IteratorGetNext::DoCompute
(মেমরি 2.3 এর হিসাবে)।
যদি কলগুলি দ্রুত ফিরে আসে (<= 50 আমাদের), এর অর্থ হল আপনার ডেটা যখন অনুরোধ করা হয় তখন এটি উপলব্ধ। ইনপুট পাইপলাইন আপনার বাধা নয়; আরও জেনেরিক পারফরম্যান্স বিশ্লেষণ টিপসের জন্য প্রোফাইলার গাইডটি দেখুন।
যদি কলগুলি ধীরে ধীরে ফিরে আসে, tf.data
গ্রাহকের অনুরোধগুলি সাথে রাখতে অক্ষম। পরবর্তী বিভাগে চালিয়ে যান।
২. আপনি কি ডেটা উপস্থাপন করছেন?
ইনপুট পাইপলাইন পারফরম্যান্সের জন্য সেরা অনুশীলনটি হল আপনার tf.data
পাইপলাইনটির শেষে একটি tf.data.Dataset.prefetch
রূপান্তর tf.data
। এই রূপান্তরটি মডেল গণনার পরবর্তী ধাপের সাথে ইনপুট পাইপলাইনের প্রিপ্রোসেসিং গণনাটিকে ওভারল্যাপ করে এবং আপনার মডেলটিকে প্রশিক্ষণ দেওয়ার সময় অনুকূল ইনপুট পাইপলাইন সম্পাদনের জন্য প্রয়োজনীয়। আপনি ডাটা পূর্বে আনা করছি, তাহলে আপনি একটি দেখতে পাবেন Iterator::Prefetch
হিসাবে একই থ্রেডে ফালি IteratorGetNext::DoCompute
অপ।
আপনার পাইপলাইন শেষে যদি prefetch
না থাকে তবে আপনার একটি যুক্ত করা উচিত। tf.data
কর্মক্ষমতা সুপারিশ সম্পর্কে আরও তথ্যের জন্য, tf.data কর্মক্ষমতা গাইড দেখুন ।
যদি আপনি ইতিমধ্যে ডেটা উপস্থাপন করছেন এবং ইনপুট পাইপলাইনটি এখনও আপনার বাধা হয়ে থাকে তবে আরও কার্যকারিতা বিশ্লেষণ করতে পরবর্তী বিভাগে চালিয়ে যান।
৩. আপনি কি উচ্চ সিপিইউ ব্যবহারে পৌঁছে যাচ্ছেন?
tf.data
উপলব্ধ সংস্থানগুলির সর্বোত্তম ব্যবহারের চেষ্টা করার মাধ্যমে উচ্চ থ্রুপুট অর্জন করে। সাধারণভাবে, এমনকি জিপিইউ বা tf.data
মতো অ্যাকসিলরেটে আপনার মডেলটি চালানোর tf.data
, tf.data
পাইপলাইনগুলি tf.data
চালিত হয়। আপনি মত সরঞ্জাম সঙ্গে আপনার ব্যবহারের পরীক্ষা করতে পারবেন এসএআর এবং htop , অথবা কনসোলে পর্যবেক্ষণ মেঘ যদি আপনি GCP উপর চালাচ্ছেন।
যদি আপনার ব্যবহার কম হয় তবে এটি প্রস্তাব দেয় যে আপনার ইনপুট পাইপলাইনটি হোস্ট সিপিইউর পুরো সুবিধা নিচ্ছে না। সেরা অনুশীলনের জন্য আপনার tf.data পারফরম্যান্স গাইডের পরামর্শ নেওয়া উচিত। আপনি যদি সর্বোত্তম অনুশীলন এবং ব্যবহার এবং থ্রুপুট কম প্রয়োগ করেন তবে নীচে বোতলনেক বিশ্লেষণ চালিয়ে যান।
যদি আপনার ব্যবহারটি উত্সের সীমাতে পৌঁছেছে , পারফরম্যান্সকে আরও উন্নত করতে আপনার নিজের ইনপুট পাইপলাইনের দক্ষতা উন্নত করতে হবে (উদাহরণস্বরূপ, অপ্রয়োজনীয় গণনা এড়ানো) বা অফলোড গণনা।
tf.data
অপ্রয়োজনীয় গণনা এড়িয়ে আপনি আপনার ইনপুট পাইপলাইনটির দক্ষতা উন্নত করতে পারেন। এটি করার একটি উপায় tf.data.Dataset.cache
গণনা-নিবিড় কাজের পরে tf.data.Dataset.cache
রূপান্তর সন্নিবেশ করা যদি আপনার ডেটা মেমরির সাথে ফিট করে; এটি বর্ধিত মেমরির ব্যবহারের ব্যয়ে গণনা হ্রাস করে। tf.data
, tf.data
ইনট্রা-অপ প্যারালালিজম অক্ষম করার ক্ষেত্রে> 10% দ্বারা দক্ষতা বাড়ানোর সম্ভাবনা রয়েছে এবং আপনার ইনপুট পাইপলাইনে নিম্নলিখিত বিকল্পটি সেট করে করা যেতে পারে:
dataset = ...
options = tf.data.Options()
options.experimental_threading.max_intra_op_parallelism = 1
dataset = dataset.with_options(options)
৪. বোতলজাতীয় বিশ্লেষণ
নিম্নলিখিত বিভাগটি কীভাবে বাধা tf.data
এবং সম্ভাব্য প্রশমন কৌশলগুলি বুঝতে ট্রেস ভিউয়ারে tf.data
ইভেন্টগুলি পড়তে হবে।
প্রোফাইলারটিতে tf.data
ইভেন্টগুলি বোঝা
প্রোফাইলারের প্রতিটি tf.data
ইভেন্টের নাম Iterator::<Dataset>
tf.data
Iterator::<Dataset>
, যেখানে <Dataset>
सेट <Dataset>
ডেটাসেট উত্স বা রূপান্তরের নাম। প্রতিটি ইভেন্টের লম্বা নাম Iterator::<Dataset_1>::...::<Dataset_n>
, যা আপনি tf.data
ইভেন্টে ক্লিক করে দেখতে পারেন। দীর্ঘ নামে <Dataset_n>
ম্যাচ <Dataset>
(ছোট) থেকে নাম, এবং দীর্ঘ নামে অন্যান্য ডেটাসেট স্রোতবরাবর রূপান্তরের প্রতিনিধিত্ব করে।
উদাহরণস্বরূপ, উপরের স্ক্রিনশটটি নিম্নলিখিত কোড থেকে উত্পন্ন হয়েছিল:
dataset = tf.data.Dataset.range(10)
dataset = dataset.map(lambda x: x)
dataset = dataset.repeat(2)
dataset = dataset.batch(5)
এখানে, Iterator::Map
ইভেন্টটির দীর্ঘ নাম Iterator::BatchV2::FiniteRepeat::Map
। দ্রষ্টব্য যে ডেটাসেটের নামটি পাইথন API থেকে কিছুটা আলাদা হতে পারে (উদাহরণস্বরূপ, পুনরাবৃত্তির পরিবর্তে FiniteRepeat) তবে পার্স করার পক্ষে যথেষ্ট স্বজ্ঞাত হওয়া উচিত।
সিঙ্ক্রোনাস এবং অ্যাসিনক্রোনাস রূপান্তর
সিঙ্ক্রোনাস tf.data
রূপান্তর (যেমন Batch
এবং Map
) এর জন্য, আপনি একই থ্রেডে প্রবাহের রূপান্তরগুলি থেকে ইভেন্টগুলি দেখতে পাবেন। উপরের উদাহরণে, যেহেতু ব্যবহৃত সমস্ত রূপান্তরগুলি সমকালীন, তাই সমস্ত ঘটনা একই থ্রেডে উপস্থিত হয়।
(যেমন অ্যাসিঙ্ক্রোনাস রূপান্তরের জন্য Prefetch
, ParallelMap
, ParallelInterleave
এবং MapAndBatch
) মূল প্রজেক্টের রূপান্তরের থেকে ইভেন্টগুলি একটি ভিন্ন থ্রেডে হবে। এই ধরনের ক্ষেত্রে, "দীর্ঘ নাম" আপনাকে কোনও পাইপলাইনে কোনও রূপান্তরটি কোনও ইভেন্টের সাথে সম্পর্কিত বলে চিহ্নিত করতে সহায়তা করতে পারে।
উদাহরণস্বরূপ, উপরের স্ক্রিনশটটি নিম্নলিখিত কোড থেকে উত্পন্ন হয়েছিল:
dataset = tf.data.Dataset.range(10)
dataset = dataset.map(lambda x: x)
dataset = dataset.repeat(2)
dataset = dataset.batch(5)
dataset = dataset.prefetch(1)
এখানে, tf_data_iterator_get_next
Iterator::Prefetch
tf_data_iterator_get_next
ইভেন্টগুলি tf_data_iterator_get_next
থ্রেডে রয়েছে। যেহেতু Prefetch
অ্যাসিঙ্ক্রোনাস, তার ইনপুট ইভেন্টগুলি ( BatchV2
) একটি ভিন্ন থ্রেডে হবে, এবং দীর্ঘ নামের জন্য অনুসন্ধান দ্বারা নির্নয় করা যাবে না Iterator::Prefetch::BatchV2
। এই ক্ষেত্রে, তারা tf_data_iterator_resource
থ্রেডে রয়েছে। দীর্ঘ নাম থেকে, আপনি অনুমান করতে পারেন যে BatchV2
উজান হয় Prefetch
। তদ্ব্যতীত, parent_id
এর BatchV2
ঘটনার আইডি ম্যাচ হবে Prefetch
ইভেন্ট।
বাধা সনাক্তকরণ
সাধারণভাবে, আপনার ইনপুট পাইপলাইনে বাধা চিহ্নিত করতে, উত্সের বাইরেরতম রূপান্তর থেকে ইনপুট পাইপলাইনটি হাঁটুন। আপনার পাইপলাইনে চূড়ান্ত রূপান্তর থেকে শুরু করে আপনি ধীরে ধীরে রূপান্তর না পাওয়া বা TFRecord
মতো উত্স ডেটাসেটে না পৌঁছা পর্যন্ত আপস্ট্রিম রূপান্তরগুলিতে TFRecord
। উপরের উদাহরণে, আপনার কাছ থেকে শুরু করবেন Prefetch
, তারপর মূল প্রজেক্টের পদব্রজে ভ্রমণ BatchV2
, FiniteRepeat
, Map
, এবং পরিশেষে Range
।
সাধারণভাবে, একটি ধীর রূপান্তর যার সাথে ঘটনাগুলি দীর্ঘ, তবে যার ইনপুট ইভেন্টগুলি ছোট to কিছু উদাহরণ নীচে অনুসরণ করুন।
নোট করুন যে বেশিরভাগ হোস্ট ইনপুট পাইপলাইনে চূড়ান্ত (বাহ্যতম) রূপান্তরটি হ'ল Iterator::Model
ইভেন্ট। tf.data
রানটাইম দ্বারা মডেল রূপান্তরটি স্বয়ংক্রিয়ভাবে প্রবর্তিত হয় এবং ইনপুট পাইপলাইন কার্যকারিতা ইনস্ট্রুমেন্টিং এবং tf.data
জন্য ব্যবহৃত হয়।
যদি আপনার কাজটি কোনও বিতরণ কৌশল ব্যবহার করে থাকে তবে ট্রেস ভিউয়ারে অতিরিক্ত ইভেন্টগুলি থাকতে পারে যা ডিভাইস ইনপুট পাইপলাইনের সাথে সম্পর্কিত। ডিভাইস পাইপলাইন (অধীনে নেস্টেড দূরতম রূপান্তর IteratorGetNextOp::DoCompute
বা IteratorGetNextAsOptionalOp::DoCompute
) একজন হতে হবে Iterator::Prefetch
একটি আপস্ট্রিম সঙ্গে ঘটনা Iterator::Generator
ইভেন্ট। আপনি সম্পর্কিত হোস্ট পাইপলাইনটি Iterator::Model
ইভেন্টগুলি অনুসন্ধান করে খুঁজে পেতে পারেন।
উদাহরণ 1
উপরের স্ক্রিনশটটি নিম্নলিখিত ইনপুট পাইপলাইন থেকে উত্পন্ন হয়েছে:
dataset = tf.data.TFRecordDataset(filename)
dataset = dataset.map(parse_record)
dataset = dataset.batch(32)
dataset = dataset.repeat()
স্ক্রিনশটে, লক্ষ্য করুন যে (1) Iterator::Map
ইভেন্টগুলি দীর্ঘ, তবে (2) এর ইনপুট ইভেন্টগুলি ( Iterator::FlatMap
) দ্রুত ফিরে আসে। এটি পরামর্শ দেয় যে ক্রমবর্ধমান মানচিত্রের রূপান্তরটি হ'ল বাধা।
নোট করুন যে স্ক্রিনশটে InstantiatedCapturedFunction::Run
ফাংশন InstantiatedCapturedFunction::Run
ইভেন্টটি মানচিত্রের কার্য সম্পাদন করতে যে সময় লাগে তার সাথে মিলে যায়।
উদাহরণ 2
উপরের স্ক্রিনশটটি নিম্নলিখিত ইনপুট পাইপলাইন থেকে উত্পন্ন হয়েছে:
0 বি 7c448ab0 এই উদাহরণটি উপরের মতো, তবে মানচিত্রের পরিবর্তে সমান্তরাল মানচিত্র ব্যবহার করে। আমরা এখানে লক্ষ্য করেছি যে (1) Iterator::ParallelMap
Iterator::FlatMap
ইভেন্টগুলি দীর্ঘ, তবে (2) এর ইনপুট ইভেন্টগুলি Iterator::FlatMap
(যেটি ভিন্ন ধরণের রয়েছে, যেহেতু সমান্তরাল Iterator::FlatMap
) সংক্ষিপ্ত। এটি সূচিত করে যে প্যারালালম্যাপ রূপান্তরটি হ'ল বাধা।
বাধা দেওয়া
উত্স ডেটাসেটস
আপনি যদি টিএফআরকর্ড ফাইলগুলি পড়ার মতো কোনও বাধাবি হিসাবে কোনও ডেটাসেট উত্স সনাক্ত করেন তবে আপনি ডেটা এক্সট্রাকশনকে সমান্তরাল করে কর্মক্ষমতা উন্নত করতে পারেন। এটি করার জন্য, আপনার ডেটা একাধিক ফাইলের মধ্যে ছড়িয়ে পড়েছে এবং tf.data.Dataset.interleave
এ num_parallel_calls
প্যারামিটার সহ tf.data.Dataset.interleave
ব্যবহার করুন তা tf.data.AUTOTUNE
। যদি নির্ধারণবাদটি আপনার প্রোগ্রামের পক্ষে গুরুত্বপূর্ণ না হয়, আপনি tf.data.Dataset.interleave
টিএফ ২.২ হিসাবে tf.data.Dataset.interleave
deterministic=False
পতাকা সেট করে কর্মক্ষমতা আরও উন্নত করতে পারেন। উদাহরণস্বরূপ, আপনি যদি টিএফআরকর্ডস থেকে পড়ছেন তবে আপনি নিম্নলিখিতটি করতে পারেন:
dataset = tf.data.Dataset.from_tensor_slices(filenames)
dataset = dataset.interleave(tf.data.TFRecordDataset,
num_parallel_calls=tf.data.AUTOTUNE,
deterministic=False)
নোট করুন যে ফাইল খোলার ওভারহেডটি অ্যামোর্টাইজ করার জন্য শার্ল্ড ফাইলগুলি যুক্তিসঙ্গতভাবে বড় হওয়া উচিত। সমান্তরাল ডেটা নিষ্কাশন সম্পর্কিত আরও তথ্যের জন্য tf.data
কর্মক্ষমতা tf.data
এই বিভাগটি দেখুন।
রূপান্তর ডেটাসেট
যদি আপনি একটি মধ্যবর্তী tf.data
রূপান্তরকে বাধা হিসাবে চিহ্নিত করে থাকেন, তবে আপনার ডেটা মেমরির সাথে মানানসই হয় এবং এটি উপযুক্ত হলে আপনি রূপান্তরকে সমান্তরাল করে বা tf.data
ক্যাশে করে এটিকে মোকাবেলা করতে পারেন। কিছু রূপান্তর যেমন Map
সমান্তরাল প্রতিরূপ রয়েছে; tf.data
কর্মক্ষমতা গাইড কীভাবে tf.data
সমান্তরাল করতে হয় তা প্রদর্শন করে। Filter
, Unbatch
এবং Batch
মতো অন্যান্য রূপান্তরগুলি অন্তর্নিহিত Unbatch
; আপনি "বাহ্যিক সমান্তরালতা" প্রবর্তন করে তাদের সমান্তরাল করতে পারেন। উদাহরণস্বরূপ, ধরুন আপনার ইনপুট পাইপলাইনটি প্রাথমিকভাবে নীচের মত দেখাচ্ছে, Batch
সাথে বাধা হিসাবে:
filenames = tf.data.Dataset.list_files(file_path, shuffle=is_training)
dataset = filenames_to_dataset(filenames)
dataset = dataset.batch(batch_size)
শার্পড ইনপুটগুলির উপর ইনপুট পাইপলাইনের একাধিক অনুলিপি চালিয়ে এবং ফলাফলগুলিকে একত্রিত করে আপনি "বাহ্যিক সমান্তরালতা" প্রবর্তন করতে পারেন:
filenames = tf.data.Dataset.list_files(file_path, shuffle=is_training)
def make_dataset(shard_index):
filenames = filenames.shard(NUM_SHARDS, shard_index)
dataset = filenames_to_dataset(filenames)
Return dataset.batch(batch_size)
indices = tf.data.Dataset.range(NUM_SHARDS)
dataset = indices.interleave(make_dataset,
num_parallel_calls=tf.data.AUTOTUNE)
dataset = dataset.prefetch(tf.data.AUTOTUNE)
অতিরিক্ত সম্পদ
- tf.data পারফরম্যান্স কীভাবে লিখতে হয় তার
tf.data
ইনপুট পাইপলাইন -
tf.data
ভিডিওর ভিতরে:tf.data
সেরা অনুশীলন - প্রোফাইলার গাইড
- কোলাব সহ প্রোফাইলার টিউটোরিয়াল