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

টিএফ প্রোফাইলার দিয়ে tf.data পারফরম্যান্স বিশ্লেষণ করুন

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

এই গাইডটি tf.data প্রোফাইলার এবং tf.data সাথে পরিচিতি অনুমান করে। ইনপুট পাইপলাইন কার্যকারিতা সংক্রান্ত সমস্যাগুলি নির্ণয় এবং ঠিক করতে ব্যবহারকারীদের উদাহরণ সহ ধাপে ধাপে নির্দেশাবলী সরবরাহ করা এর লক্ষ্য।

শুরু করতে, আপনার টেনসরফ্লো কাজের একটি প্রোফাইল সংগ্রহ করুন। এটি কীভাবে করবেন সে সম্পর্কে নির্দেশাবলী সিপিইউ / জিপিইউ এবং ক্লাউড টিপিইউগুলির জন্য উপলব্ধ।

TensorFlow Trace Viewer

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

বিশ্লেষণ কর্মপ্রবাহ

নীচের কর্মপ্রবাহ অনুসরণ করুন। আমাদের এটির উন্নতিতে সহায়তা করতে যদি আপনার প্রতিক্রিয়া থাকে তবে দয়া করে "কমপ্যাস: ডেটা" লেবেল সহ একটি গিথব সমস্যা তৈরি করুন

1. আপনার tf.data পাইপলাইন ডেটা উত্পাদন যথেষ্ট দ্রুত?

ইনপুট পাইপলাইনটি আপনার টেনসরফ্লো প্রোগ্রামের জন্য বাধা কিনা তা নির্ধারণ করেই শুরু করুন।

এটি করার জন্য, ট্রেস ভিউয়ারে IteratorGetNext::DoCompute অপস অনুসন্ধান করুন। সাধারণভাবে, আপনি কোনও পদক্ষেপের শুরুতে এগুলি দেখার আশা করছেন। এই স্লাইসগুলি আপনার ইনপুট পাইপলাইনটিকে যখন অনুরোধ করা হয় তখন উপাদানগুলির একটি ব্যাচ উত্পাদন করতে সময় লাগে তা উপস্থাপন করে। আপনি যদি tf.function ব্যবহার করছেন বা আপনার ডেটাসেটের উপর tf.function , সেগুলি tf_data_iterator_get_next থ্রেডে পাওয়া উচিত।

মনে রাখবেন আপনি একটি ব্যবহার করছেন যদি বন্টন কৌশল , আপনি দেখতে পারেন IteratorGetNextAsOptional::DoCompute পরিবর্তে ঘটনা IteratorGetNext::DoCompute (মেমরি 2.3 এর হিসাবে)।

image

যদি কলগুলি দ্রুত ফিরে আসে (<= 50 আমাদের), এর অর্থ হল আপনার ডেটা যখন অনুরোধ করা হয় তখন এটি উপলব্ধ। ইনপুট পাইপলাইন আপনার বাধা নয়; আরও জেনেরিক পারফরম্যান্স বিশ্লেষণ টিপসের জন্য প্রোফাইলার গাইডটি দেখুন।

image

যদি কলগুলি ধীরে ধীরে ফিরে আসে, tf.data গ্রাহকের অনুরোধগুলি সাথে রাখতে অক্ষম। পরবর্তী বিভাগে চালিয়ে যান।

২. আপনি কি ডেটা উপস্থাপন করছেন?

ইনপুট পাইপলাইন পারফরম্যান্সের জন্য সর্বোত্তম অনুশীলন tf.data.Dataset.prefetch আপনার tf.data পাইপলাইনের শেষে একটি tf.data.Dataset.prefetch রূপান্তর tf.data । এই রূপান্তরটি মডেল গণনার পরবর্তী ধাপের সাথে ইনপুট পাইপলাইনের প্রিপ্রোসেসিং গণনাটিকে ওভারল্যাপ করে এবং আপনার মডেলটিকে প্রশিক্ষণ দেওয়ার সময় অনুকূল ইনপুট পাইপলাইন সম্পাদনের জন্য প্রয়োজনীয়। আপনি ডাটা পূর্বে আনা করছি, তাহলে আপনি একটি দেখতে পাবেন Iterator::Prefetch হিসাবে একই থ্রেডে ফালি IteratorGetNext::DoCompute অপ।

image

আপনার পাইপলাইন শেষে যদি 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 ইভেন্টগুলি বোঝা

প্রোফাইলারের প্রতিটি tf.data ইভেন্টের নাম Iterator::<Dataset> tf.data Iterator::<Dataset> , যেখানে <Dataset> सेट <Dataset> ডেটাসেট উত্স বা রূপান্তরের নাম। প্রতিটি ইভেন্টের লম্বা নাম Iterator::<Dataset_1>::...::<Dataset_n> , যা আপনি tf.data ইভেন্টে ক্লিক করে দেখতে পারেন। দীর্ঘ নামে <Dataset_n> ম্যাচ <Dataset> (ছোট) থেকে নাম, এবং দীর্ঘ নামে অন্যান্য ডেটাসেট স্রোতবরাবর রূপান্তরের প্রতিনিধিত্ব করে।

image

উদাহরণস্বরূপ, উপরের স্ক্রিনশটটি নিম্নলিখিত কোড থেকে উত্পন্ন হয়েছিল:

 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 ) মূল প্রজেক্টের রূপান্তরের থেকে ইভেন্টগুলি একটি ভিন্ন থ্রেডে হবে। এই জাতীয় ক্ষেত্রে, "দীর্ঘ নাম" আপনাকে কোনও পাইপলাইনে কোনও রূপান্তরটি কোনও ইভেন্টের সাথে সম্পর্কিত বলে চিহ্নিত করতে সহায়তা করতে পারে।

image

উদাহরণস্বরূপ, উপরের স্ক্রিনশটটি নিম্নলিখিত কোড থেকে উত্পন্ন হয়েছিল:

 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 IteratorGetNextAsOptionalOp::DoCompute ইভেন্টটি একটি IteratorGetNextAsOptionalOp::DoCompute Iterator::Generator ইভেন্ট সহ হবে। আপনি সম্পর্কিত হোস্ট পাইপলাইনটি Iterator::Model ইভেন্টগুলি অনুসন্ধান করে খুঁজে পেতে পারেন।

উদাহরণ 1

image

উপরের স্ক্রিনশটটি নিম্নলিখিত ইনপুট পাইপলাইন থেকে উত্পন্ন হয়েছে:

 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

image

উপরের স্ক্রিনশটটি নিম্নলিখিত ইনপুট পাইপলাইন থেকে উত্পন্ন হয়েছে:

 dataset = tf.data.TFRecordDataset(filename)
dataset = dataset.map(parse_record, num_parallel_calls=2)
dataset = dataset.batch(32)
dataset = dataset.repeat()
 

এই উদাহরণটি উপরের মতো, তবে মানচিত্রের পরিবর্তে সমান্তরাল মানচিত্র ব্যবহার করে। আমরা এখানে লক্ষ্য করেছি যে (1) Iterator::ParallelMap ইভেন্টগুলি দীর্ঘ, তবে (2) এর ইনপুট ইভেন্টগুলি Iterator::FlatMap (যেটি ভিন্ন ধরণের রয়েছে, যেহেতু সমান্তরাল Iterator::FlatMap ) সংক্ষিপ্ত। এটি সূচিত করে যে প্যারালালম্যাপ রূপান্তরটি হ'ল বাধা।

বাধা দেওয়া

উত্স ডেটাসেটস

আপনি যদি টিএফআরকার্ড ফাইলগুলি পড়ার মতো কোনও বাধাবি হিসাবে কোনও ডেটাসেট উত্স সনাক্ত করেন তবে আপনি ডেটা এক্সট্রাকশনকে সমান্তরাল করে কর্মক্ষমতা উন্নত করতে পারেন। এটি করার জন্য, আপনার ডেটা একাধিক ফাইলের ওপরে প্রসারিত হয়েছে এবং tf.data.Dataset.interleave তে num_parallel_calls পরামিতি সেট করে num_parallel_calls ব্যবহার করুন তা tf.data.experimental.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.experimental.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.experimental.AUTOTUNE)
dataset = dataset.prefetch(tf.data.experimental.AUTOTUNE)
 

অতিরিক্ত সম্পদ