গুগল I / O মে 18-20 মে! স্থান সংরক্ষণ করুন এবং আপনার সময়সূচীটি এখনই নিবন্ধ করুন

টেনসরফ্লো প্রোফাইলার দিয়ে টেনসরফ্লো জিপিইউ পারফরম্যান্স অনুকূল করুন

ওভারভিউ

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

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

পারফরম্যান্স অপটিমাইজেশন ওয়ার্কফ্লো

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

  1. 1 জিপিইউতে পারফরম্যান্স অনুকূলিত করুন এবং ডিবাগ করুন
    1. ইনপুট পাইপলাইনটি কোনও বাধা কিনা তা পরীক্ষা করুন
    2. 1 জিপিইউর ডিবাগ পারফরম্যান্স
    3. Fp16 সক্ষম করুন এবং LAচ্ছিকভাবে XLA সক্ষম করুন
  2. মাল্টি-জিপিইউ একক হোস্টে পারফরম্যান্স অনুকূলিত করুন এবং ডিবাগ করুন

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

পরবর্তী বিভাগগুলি পারফরম্যান্সের বাধাগুলি সনাক্ত করতে এবং সমাধান করতে সহায়তা করার জন্য উপরের প্রতিটি দৃশ্যের প্রস্তাবিত পদ্ধতির বিষয়ে আলোচনা করে।

1 জিপিইউতে পারফরম্যান্স অনুকূল করুন

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

টেনসরফ্লো প্রোফাইলারের ওভারভিউ পৃষ্ঠাটি আপনার প্রোগ্রামটি আদর্শ দৃশ্যের থেকে কতটা দূরে রয়েছে তার একটি ধারণা সরবরাহ করে।

TensorFlow Profiler Overview Page

ওভারভিউ পৃষ্ঠায় সন্ধানের মূল সংখ্যাগুলি হ'ল:

  1. আসল ডিভাইস বাস্তবায়ন থেকে পদক্ষেপের সময়টি কত
  2. ডিভাইস বনাম হোস্টে রাখা অপ্সের শতাংশ
  3. কতগুলি কার্নেল এফপি 16 ব্যবহার করে

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

নীচে 1 জিপিইউতে চলছে এমন একটি মডেল ট্রেস ভিউয়ের চিত্র রয়েছে। টেনসরফ্লো নেম স্কোপ এবং টেনসরফ্লো অপস বিভাগগুলি থেকে, আপনি মডেলটির বিভিন্ন অংশগুলি যেমন ফরোয়ার্ড পাস, লস ফাংশন, পশ্চাদপদ পাস / গ্রেডিয়েন্ট গণনা এবং অপ্টিমাইজার ওজন আপডেট আপডেট করতে পারেন। আপনি প্রতিটি স্ট্রিমের পাশে জিপিইউতে চলছে এমন অপারেশনগুলিও দেখতে পাবেন, যা CUDA স্ট্রিমগুলি উল্লেখ করে। প্রতিটি স্ট্রিম নির্দিষ্ট কাজের জন্য ব্যবহৃত হয়। এই ট্রেসটিতে, স্ট্রীম # 118 ডিভাইস অনুলিপিগুলিতে কম্পিউট কার্নেল এবং ডিভাইস লঞ্চ করতে ব্যবহৃত হয়। স্ট্রীম # 119 হোস্ট টু ডিভাইসের অনুলিপি এবং ডিভাইস অনুলিপি করার জন্য স্ট্রিম # 120 ব্যবহার করা হয়।

image

এই ট্রেস পারফরম্যান্ট মডেলের সাধারণ বৈশিষ্ট্যগুলি দেখায়। উদাহরণস্বরূপ, জিপিইউ কম্পিউট টাইমলাইন ( স্ট্রিম # 118 ) খুব কম ফাঁক দিয়ে ব্যস্ত দেখায়। হোস্ট থেকে ডিভাইসে সর্বনিম্ন অনুলিপি রয়েছে ( স্ট্রিম # 119 ) এবং ডিভাইস থেকে হোস্টে ( স্ট্রিম # 120 ) পাশাপাশি পদক্ষেপের মধ্যে ন্যূনতম ফাঁক রয়েছে। আপনি যখন আপনার প্রোগ্রামের জন্য টেনসরফ্লো প্রোফাইলারটি চালান, আপনি হয়ত এই আদর্শ বৈশিষ্ট্যগুলি আপনার ট্রেস ভিউতে দেখতে পাবেন না। এই গাইডের বাকি অংশগুলিতে সাধারণ পরিস্থিতি এবং সেগুলি কীভাবে ঠিক করা যায় তা অন্তর্ভুক্ত।

ডিবাগ ইনপুট পাইপলাইন

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

image

আপনার ইনপুট-পাইপলাইনটি ধাপ সময়টিতে উল্লেখযোগ্যভাবে অবদান রাখে নিম্নলিখিতগুলি আপনি গ্রহণ করতে পারেন:

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

1 জিপিইউর ডিবাগ পারফরম্যান্স

এমন কয়েকটি কারণ রয়েছে যা কম জিপিইউ ব্যবহারে অবদান রাখতে পারে। ট্রেস ভিউয়ার এবং সম্ভাব্য সমাধানগুলি দেখার সময় নীচে কিছু পরিস্থিতি সাধারণত দেখা যায় observed

ধাপগুলির মধ্যে গ্যাপগুলি বিশ্লেষণ করুন

আপনার প্রোগ্রামটি যখন অনুকূলভাবে চলমান না থাকে তখন একটি সাধারণ পর্যবেক্ষণ হ'ল প্রশিক্ষণের পদক্ষেপের মধ্যে ফাঁক। নীচের চিত্রটিতে, 8 এবং 9 ধাপের মধ্যে একটি বৃহত্তর ব্যবধান রয়েছে, যার অর্থ এই সময়কালে GPU অলস থাকে।

image

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

আপনি যদি হোস্টের পাশের বড় ফাঁকগুলি দেখেন, যা জিপিইউতে এই TF_GPU_THREAD_MODE=gpu_private নির্ধারণ করে, আপনি পরিবেশ পরিবর্তনশীল TF_GPU_THREAD_MODE=gpu_private সেট করতে পারেন। এটি নিশ্চিত করে যে জিপিইউ কার্নেলগুলি তাদের নিজস্ব উত্সর্গীকৃত থ্রেডগুলি থেকে শুরু করা হয়েছে এবং tf.data কাজের পিছনে tf.data পেতে না হয়।

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

যদি আপনার ইনপুট পাইপলাইনটি অপ্টিমাইজ করার পরে আপনি এখনও ট্রেস ভিউয়ারের ধাপগুলির মধ্যে ফাঁক লক্ষ্য করেন, তবে আপনাকে পদক্ষেপগুলির মধ্যে মডেল কোডটি দেখতে হবে এবং কলব্যাকগুলি / ম্যাট্রিকগুলি অক্ষম করা হলে কর্মক্ষমতা উন্নত হবে কিনা তা দেখতে হবে। এই অপ্সগুলির কিছু বিবরণ ট্রেস ভিউয়ারেও রয়েছে (উভয় ডিভাইস এবং হোস্ট সাইড) scenario এই দৃশ্যে সুপারিশটি হ'ল প্রতিটি ধাপের পরিবর্তে একটি নির্দিষ্ট সংখ্যক পদক্ষেপের পরে এগুলি অপসারণ করে ওপেনের ওভারহেডকে সামঞ্জস্য করা। tf.keras compile পদ্ধতিটি ব্যবহার করার সময়, experimental_steps_per_execution পতাকা নির্ধারণটি স্বয়ংক্রিয়ভাবে এটি করে। কাস্টম প্রশিক্ষণের লুপগুলির জন্য, tf.while_loop . tf.while_loop ব্যবহার tf.while_loop

উচ্চতর ডিভাইস ব্যবহার অর্জন করুন

ক্ষুদ্র জিপিইউ কার্নেল এবং হোস্ট কার্নেল বিলম্বিত করে

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

টেনসরফ্লো প্রোফাইলারের সংক্ষিপ্ত বিবরণ পৃষ্ঠাটি দেখায় যে কার্নেলগুলি প্রবর্তন করতে হোস্টের জন্য অপেক্ষা করার কারণে GPU কতটা অলস ছিল। নীচের চিত্রটিতে, জিপিইউ কার্নেলগুলি আরম্ভ হওয়ার জন্য অপেক্ষা করার জন্য প্রায় 10% পদক্ষেপের জন্য অলস।

image

এই একই প্রোগ্রামটির জন্য ট্রেস ভিউয়ারটি কার্নেলের মধ্যে ছোট ফাঁকগুলি দেখায় যেখানে হোস্টটি জিপিইউতে কার্নেল প্রবর্তন করতে ব্যস্ত।

image

জিপিইউতে প্রচুর ছোট ছোট অপস চালু করে (উদাহরণস্বরূপ একটি স্কেলার অ্যাডের মতো), হোস্টটি সম্ভবত জিপিইউতে থাকবে না। একই টেনসরফ্লো প্রোফাইলের টেনসরফ্লো স্ট্যাটাস পৃষ্ঠাটি 126,224 মুল অপারেশনগুলি ২. 2. 2. সেকেন্ডের মধ্যে দেখায়। সুতরাং, প্রতিটি কার্নেল প্রায় 21.9 is সে, যা খুব ছোট (প্রায় একই সময়ে লঞ্চের বিলম্বের মতো) এবং হোস্ট কার্নেলের প্রবর্তন বিলম্বের ফলস্বরূপ হতে পারে।

image

যদি আপনার ট্রেস ভিউয়ার উপরের চিত্রটির মতো জিপিইউতে অপ্সের মধ্যে অনেক ছোট ফাঁক দেখায় তবে আপনি এটি করতে পারেন:

  • ছোট টেনারগুলি সংঘবদ্ধ করুন এবং ভেক্টরাইজড ক্রিয়াকলাপগুলি ব্যবহার করুন বা প্রতিটি কার্নেল চালু করার জন্য আরও বড় ব্যাচের আকার ব্যবহার করুন, যা জিপিইউকে আরও বেশি সময়ের জন্য ব্যস্ত রাখবে।
  • আপনি টিএফ গ্রাফ তৈরি করতে tf.function ব্যবহার করছেন এবং খাঁটি আগ্রহী মোডে অপারেশনগুলি চালাচ্ছেন না তা নিশ্চিত করুন ( tf.keras.Model.compile স্বয়ংক্রিয়ভাবে এটি করে)।
  • এক্সএলএল ব্যবহার করে ফিউজ কার্নেলগুলি। আরও তথ্যের জন্য, কীভাবে এক্সএলএলকে উচ্চতর পারফরম্যান্স পেতে সক্ষম করতে তার নীচের বিভাগটি দেখুন। এটি একটি পরীক্ষামূলক বৈশিষ্ট্য, তবে উচ্চ ডিভাইস ব্যবহারের দিকে নিয়ে যায়।
টেনসরফ্লো ওপ প্লেসমেন্ট

টেনসরফ্লো প্রোফাইলার ওভারভিউ পৃষ্ঠা আপনাকে হোস্ট বনাম ডিভাইসে স্থাপন করা অপের শতাংশের কথা বলবে (আপনি ট্রেস ভিউয়ারটি দেখে নির্দিষ্ট অপের স্থান নির্ধারণও করতে পারবেন)। নীচের চিত্রের মতো, আপনি চাইছেন যে ডিভাইসের তুলনায় হোস্টের ওপ্সের শতাংশ খুব কম হবে।

image

আদর্শভাবে বেশিরভাগ কম্পিউট ইনটেনসিভ অপস জিপিইউতে রাখা উচিত। আপনার মডেলের ক্রিয়াকলাপ এবং tf.debugging.set_log_device_placement(True) কোন ডিভাইসগুলিতে নির্ধারিত হয়েছে তা নির্ধারণের জন্য, আপনার প্রোগ্রামের প্রথম বিবৃতি হিসাবে tf.debugging.set_log_device_placement(True) সেট করুন। মনে রাখবেন যে কিছু ক্ষেত্রে, আপনি যদি কোনও নির্দিষ্ট ডিভাইসে tf.unique জন্য একটি অপ্ট নির্দিষ্ট করে থাকেন তবে এর বাস্তবায়ন এই tf.unique ওভাররাইড করতে পারে (উদাহরণ: tf.unique ) tf.unique এমনকি একক জিপিইউ প্রশিক্ষণের জন্য, tf.distribute.OneDeviceStrategy মতো বিতরণ কৌশল নির্দিষ্ট করে tf.distribute.OneDeviceStrategy ফলে আপনার ডিভাইসে tf.distribute.OneDeviceStrategy আরও tf.distribute.OneDeviceStrategy বসানো হতে পারে।

জিপিইউতে অধিকাংশ অপস রাখার একটি কারণ হোস্ট এবং ডিভাইসের মধ্যে অতিরিক্ত মেমরি কপি প্রতিরোধ করা (হোস্ট এবং ডিভাইসের মধ্যে মডেল ইনপুট / আউটপুট ডেটার জন্য মেমরির অনুলিপিগুলি প্রত্যাশিত)। অতিরিক্ত কপি করার একটি উদাহরণ নীচে জিপিইউ স্ট্রিম # 167 , # 168 এবং # 169 এর ট্রেস ভিউতে দেখা যাবে।

image

জিপিইউ কার্নেলগুলি কার্যকর করতে বাধা দিলে এই অনুলিপিগুলি মাঝে মাঝে কর্মক্ষমতাতে ক্ষতি করে। ট্রেস দর্শকের মেমরি অনুলিপি অপারেশনগুলিতে এই অনুলিপি করা টেনারগুলির উত্স হ'ল অপস সম্পর্কে আরও তথ্য থাকে তবে কোনও অপের সাথে কোনও মেমকপি সংযুক্ত করা সর্বদা সহজ হতে পারে না। এই ক্ষেত্রে, প্রতিটি পদক্ষেপে একই স্থানে মেমরির অনুলিপিটি ঘটে কিনা তা নিকটস্থ অপসগুলিতে দেখতে সহায়ক।

জিপিইউতে আরও দক্ষ কার্নেল

আপনার প্রোগ্রামের জিপিইউ ব্যবহারটি গ্রহণযোগ্য হয়ে গেলে, পরবর্তী পদক্ষেপটি টেনসর কোরগুলি ব্যবহার করে বা অপস ফিউজ করে জিপিইউ কার্নেলগুলির কার্যকারিতা বৃদ্ধি করা উচিত।

টেনসর কোর ব্যবহার

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

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

ফিউজিং অপস

tf.xla.experimental_compile বৈশিষ্ট্যের সাহায্যে tf.xla.experimental_compile ছোট tf.xla.experimental_compile বড় আকারের কার্নেল গঠনের জন্য গুরুত্বপূর্ণ পারফরম্যান্স লাভের দিকে নিয়ে যেতে পারে। নীচে এক্সএলএ সক্ষম করুন বিভাগে আরও বিশদ আলোচনা করা হয়েছে।

Fp16 এবং XLA সক্ষম করুন

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

মিশ্র নির্ভুলতা সক্ষম করা

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

অনুকূল fp16 কার্নেল ব্যবহার করে

Fp16 সক্ষম করার সাথে, আপনার প্রোগ্রামের ম্যাট্রিক্স গুণ (GEMM) কার্নেলগুলি, সম্পর্কিত টেনসর কোরগুলি ব্যবহার করে এমন এফপি 16 সংস্করণ ব্যবহার করা উচিত। যাইহোক, কিছু ক্ষেত্রে, এটি ঘটে না এবং আপনি fp16 সক্ষম করার থেকে প্রত্যাশিত গতিপথ দেখতে পাবেন না, কারণ আপনার প্রোগ্রামটি পরিবর্তে অকার্যকর প্রয়োগের দিকে ফিরে যায়।

image

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

ডায়নামিক বনাম স্ট্যাটিক লস স্কেলিং

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

এক্সএলএ সক্ষম করা হচ্ছে

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

মাল্টি-জিপিইউ একক হোস্টে পারফরম্যান্স অনুকূলিত করুন

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

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

image

নিম্নলিখিত চেকলিস্টটি আপনাকে মাল্টি-জিপিইউ দৃশ্যে পারফরম্যান্স অনুকূল করার সময় আরও ভাল পারফরম্যান্স অর্জনে সহায়তা করবে:

  1. ব্যাচের আকার সর্বাধিক করার চেষ্টা করুন, যা উচ্চতর ডিভাইসটির ব্যবহারের দিকে পরিচালিত করবে এবং একাধিক জিপিইউ জুড়ে যোগাযোগের ব্যয়কে সংযোজন করবে। মেমোরি প্রোফাইলার ব্যবহার করে আপনার প্রোগ্রামটি মেমরির ব্যবহারের শীর্ষে কতটা কাছাকাছি তা উপলব্ধি করতে সহায়তা করে। মনে রাখবেন যে একটি উচ্চতর ব্যাচের আকার একীভূতকরণকে প্রভাবিত করতে পারে তবে পারফরম্যান্স সুবিধাগুলি দ্বারা এটি সাধারণত ছাপিয়ে যায়।
  2. একক জিপিইউ থেকে একাধিক জিপিইউতে যাওয়ার সময়, একই হোস্টকে এখন আরও অনেক ইনপুট ডেটা প্রক্রিয়া করতে হবে। সুতরাং (1) এর পরে ইনপুট পাইপলাইন কার্য সম্পাদন পুনরায় পরীক্ষা করে দেখার এবং এটি কোনও বাধা নয় তা নিশ্চিত করার পরামর্শ দেওয়া হয়।
  3. অনিয়মিত অলরেডিউস কল রয়েছে কিনা তা দেখতে আপনার প্রোগ্রামের ট্রেস ভিউতে জিপিইউ টাইমলাইনটি পরীক্ষা করুন, এর ফলে সমস্ত ডিভাইস জুড়ে একটি সিঙ্ক্রোনাইজেশনের ফলস্বরূপ। উপরে প্রদর্শিত ট্রেস ভিউতে, অলরেডিউস এনসিসিএল কার্নেলের মাধ্যমে করা হয় এবং প্রতিটি ধাপে গ্রেডিয়েন্টের জন্য প্রতিটি জিপিইউতে কেবল একটি এনসিসিএল কল রয়েছে।
  4. অপ্রয়োজনীয় ডি 2 এইচ, এইচ 2 ডি এবং ডি 2 ডি অনুলিপি ক্রিয়াকলাপগুলি পরীক্ষা করে দেখুন এবং সেগুলি হ্রাস করা যায় কিনা।
  5. প্রতিটি প্রতিলিপি একই কাজ করছে তা নিশ্চিত করার জন্য পদক্ষেপের সময়টি পরীক্ষা করুন। এটি ঘটতে পারে যে একটি জিপিইউ (সাধারণত জিপিইউ 0) অতিরিক্ত সাবস্ক্রাইব করা হয় কারণ হোস্ট ভুল করে আরও কাজ চালিয়ে যায়।
  6. অবশেষে, আপনার ট্রেস ভিউতে সমস্ত জিপিইউগুলি জুড়ে প্রশিক্ষণের ধাপটি যে কোনও অপস, যা বিভাগীয়ভাবে সম্পাদন করছে তার জন্য পরীক্ষা করুন। এটি সাধারণত ঘটে যখন আপনার প্রোগ্রামে একটি GPU থেকে অন্য GPU এর নিয়ন্ত্রণ নির্ভরতা অন্তর্ভুক্ত থাকে। এই পরিস্থিতিতে ডিবাগিং পারফরম্যান্স অতীতে কেস বাই কেস ভিত্তিতে সমাধান করা হয়েছে। আপনি যদি আপনার প্রোগ্রামে এই আচরণটি পর্যবেক্ষণ করেন তবে আপনার ট্রেস ভিউয়ের চিত্রগুলি সহ একটি গিথুব ইস্যু ফাইল করুন

গ্রেডিয়েন্ট অলরেডুস অনুকূলিত করুন

সিঙ্ক্রোনাস কৌশল নিয়ে প্রশিক্ষণ দেওয়ার সময় প্রতিটি ডিভাইস ইনপুট ডেটার একটি অংশ পায়। ফরোয়ার্ড এবং পিছনের দিকগুলি মডেলটির মধ্য দিয়ে চলে যাওয়ার গণনার পরে, প্রতিটি ডিভাইসে গণনা করা গ্রেডিয়েন্টগুলি একত্রিত করতে হবে এবং হ্রাস করা দরকার। এই গ্রেডিয়েন্ট অলরেডিউস প্রতিটি ডিভাইসে গ্রেডিয়েন্ট গণনার পরে এবং অপ্টিমাইজারটি মডেলের ওজনগুলি আপডেট করার আগে ঘটে। প্রতিটি জিপিইউ প্রথমে মডেল স্তরগুলি জুড়ে গ্রেডিয়েন্টগুলিকে tf.distribute.CrossDeviceOps করে, tf.distribute.CrossDeviceOps ( tf.distribute.NcclAllReduce ডিফল্ট) ব্যবহার করে GPUs জুড়ে তাদের যোগাযোগ করে এবং তারপরে স্তর প্রতি হ্রাসের পরে গ্রেডিয়েন্টগুলি প্রদান করে। অপ্টিমাইজার আপনার মডেলটির ওজন আপডেট করতে এই হ্রাস গ্রেডিয়েন্টগুলি ব্যবহার করবে। আদর্শভাবে, কোনও ওভারহেড প্রতিরোধের জন্য সমস্ত জিপিইউতে একই সময়ে এই প্রক্রিয়াটি হওয়া উচিত। অলরেডিউসের সময় প্রায় একই রকম হওয়া উচিত:

(number of parameters * 4bytes)/ (communication bandwidth)

বিতরণকৃত প্রশিক্ষণ কাজ চালানোর সময় আপনি যে পারফরম্যান্স দেখছেন তা প্রত্যাশা মতো বা আপনার আরও পারফরম্যান্স ডিবাগিংয়ের দরকার আছে কিনা তা বোঝার জন্য এই গণনাটি দ্রুত চেক হিসাবে দরকারী। আপনি tf.keras.Model.summary থেকে আপনার মডেলটিতে পরামিতিগুলির সংখ্যা পেতে পারেন।

নোট করুন যে প্রতিটি মডেল প্যারামিটার 4 বাইট, যেহেতু টেনসরফ্লো গ্রেডিয়েন্টগুলি যোগাযোগ করতে fp32 ব্যবহার করে। আপনি যখন fp16 সক্ষম করেছেন তখনও, এনসিসিএল অলরেডিউজ fp22 পরামিতি ব্যবহার করে। ভবিষ্যতে, টেনসরফ্লো fp16 ব্যবহার করে অলরেডিউজ অপারেশনগুলিকে সমর্থন করবে, পাশাপাশি গ্রেডিয়েন্ট অলরেডিউসকে পাইপলাইনিং করার ফলে এটি গ্রেডিয়েন্ট গণনার সাথে ওভারল্যাপ হবে।

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

জিপিইউ হোস্ট থ্রেড কনটেন্টেশন

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

GPU1 নিষ্ক্রিয় হয়ে GPU2 শুরু হওয়ার পরে GPU2 শুরু হওয়ার পরে অপস চালানো শুরু করলে নীচের ট্রেস ভিউয়ারটি ওভারহেডটি দেখায় CP

image

হোস্টের জন্য ট্রেস ভিউটি দেখায় যে হোস্ট GPU1 এ GPU1 এ প্রবর্তন করার আগে কার্নেলগুলি প্রবর্তন করছে (নোট করুন যে নীচে tf_Compute * অপসগুলি সিপিইউ থ্রেডের সূচক নয়)।

image

আপনি যদি আপনার প্রোগ্রামের ট্রেস ভিউতে জিপিইউ কার্নেলগুলির এই স্তম্ভিত দেখতে পান তবে প্রস্তাবিত ক্রিয়াটি হ'ল:

  • TF_GPU_THREAD_MODE এনভায়রনমেন্ট ভেরিয়েবল TF_GPU_THREAD_MODE কে gpu_private সেট করুন। এই পরিবেশের পরিবর্তনশীলটি হোস্টকে একটি জিপিইউ প্রাইভেটের জন্য রাখার জন্য বলবে।
  • ডিফল্টরূপে, TF_GPU_THREAD_MODE=gpu_private থ্রেডের সংখ্যা 2 TF_GPU_THREAD_MODE=gpu_private সেট করে, যা বেশিরভাগ ক্ষেত্রেই যথেষ্ট। তবে, TF_GPU_THREAD_COUNT এনভায়রনমেন্ট ভেরিয়েবল TF_GPU_THREAD_COUNT পছন্দসই সংখ্যায় থ্রেডে সেট করে সেই নম্বরটি পরিবর্তন করা যেতে পারে।