Keras PlatoBlockchain ডেটা ইন্টেলিজেন্স সহ মাল্টি-GPU প্রশিক্ষণের জন্য 5 টি টিপস। উল্লম্ব অনুসন্ধান. আই.

কেরাসের সাথে মাল্টি-জিপিইউ প্রশিক্ষণের জন্য 5 টিপস

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

কেন TensorFlow এবং Keras?

TensorFlow Google দ্বারা তৈরি একটি অত্যন্ত জনপ্রিয় ডিপ লার্নিং লাইব্রেরি যা আপনাকে দ্রুত জটিল নেটওয়ার্কগুলির প্রোটোটাইপ করতে দেয়৷ এটি অটো-ডিফারেনশিয়েশন (যা আপনাকে খরচ ফাংশনের গ্রেডিয়েন্টের অনুমান/কোডিং থেকে বাঁচায়) এবং GPU সমর্থন (যা আপনাকে শালীন হার্ডওয়্যার ব্যবহার করে সহজেই 200x গতির উন্নতি করতে দেয়) এর মতো অনেক আকর্ষণীয় বৈশিষ্ট্য সহ আসে। তাছাড়া এটি একটি পাইথন ইন্টারফেস অফার করে যার অর্থ হল আপনি C বা CUDA কোড লেখার প্রয়োজন ছাড়াই দ্রুত প্রোটোটাইপ করতে পারবেন। টেনসরফ্লো-এর পরিবর্তে অন্য অনেক ফ্রেমওয়ার্ক ব্যবহার করা যেতে পারে, যেমন টর্চ, এমএক্সনেট, থিয়ানো, ক্যাফে, ডিপলার্নিং4জে, সিএনটিকে, ইত্যাদি কিন্তু এটি সবই আপনার ব্যবহারের ক্ষেত্রে এবং আপনার ব্যক্তিগত পছন্দের উপর নির্ভর করে।

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

মাল্টি-জিপিইউ প্রশিক্ষণের জন্য টিপস এবং গোটচা

আর কিছু না করে, আসুন কেরাসে জিপিইউ প্রশিক্ষণের সবচেয়ে বেশি সুবিধা নেওয়ার কয়েকটি টিপস এবং কয়েকটি গোটচা যা আপনার মনে রাখা উচিত সে সম্পর্কে ঝাঁপ দাও:

1. মাল্টি-জিপিইউ প্রশিক্ষণ স্বয়ংক্রিয় নয়

কেরাস এবং টেনসরফ্লো ব্যবহার করে GPU-তে প্রশিক্ষণের মডেলগুলি বিরামহীন। আপনার যদি একটি NVIDIA কার্ড থাকে এবং আপনি CUDA ইনস্টল করে থাকেন, তাহলে গ্রন্থাগারগুলি স্বয়ংক্রিয়ভাবে এটি সনাক্ত করবে এবং প্রশিক্ষণের জন্য এটি ব্যবহার করবে। খুবই ভাল! কিন্তু আপনি যদি একজন নষ্ট ব্র্যাট হন এবং আপনার একাধিক জিপিইউ থাকে তবে কী করবেন? ভাল দুর্ভাগ্যবশত মাল্টি-জিপিইউ প্রশিক্ষণ অর্জন করতে আপনাকে কিছুটা কাজ করতে হবে।
Keras PlatoBlockchain ডেটা ইন্টেলিজেন্স সহ মাল্টি-GPU প্রশিক্ষণের জন্য 5 টি টিপস। উল্লম্ব অনুসন্ধান. আই.
আপনি কী অর্জন করতে চান তার উপর নির্ভর করে একটি নেটওয়ার্ককে সমান্তরাল করার একাধিক উপায় রয়েছে তবে প্রধান দুটি পন্থা হল মডেল এবং ডেটা সমান্তরালকরণ। প্রথমটি আপনাকে সাহায্য করতে পারে যদি আপনার মডেলটি একটি একক GPU-তে ফিট করার জন্য খুব জটিল হয় এবং পরবর্তীটি সাহায্য করে যখন আপনি সম্পাদনের গতি বাড়াতে চান৷ সাধারণত যখন লোকেরা মাল্টি-জিপিইউ প্রশিক্ষণের কথা বলে তখন তাদের অর্থ পরবর্তীটি। এটি অর্জন করা আরও কঠিন ছিল তবে সৌভাগ্যক্রমে কেরাস সম্প্রতি নামক একটি ইউটিলিটি পদ্ধতি অন্তর্ভুক্ত করেছে mutli_gpu_model যা সমান্তরাল প্রশিক্ষণ/পূর্বাভাসকে সহজ করে তোলে (বর্তমানে শুধুমাত্র TF ব্যাকএন্ডের সাথে উপলব্ধ)। মূল ধারণা হল যে আপনি পদ্ধতির মাধ্যমে আপনার মডেলটি পাস করেন এবং এটি বিভিন্ন GPU তে অনুলিপি করা হয়। আসল ইনপুটটি খণ্ডে বিভক্ত করা হয় যা বিভিন্ন GPU-তে খাওয়ানো হয় এবং তারপরে সেগুলিকে একক আউটপুট হিসাবে একত্রিত করা হয়। এই পদ্ধতিটি সমান্তরাল প্রশিক্ষণ এবং পূর্বাভাস অর্জনের জন্য ব্যবহার করা যেতে পারে, তবুও মনে রাখবেন যে প্রশিক্ষণের জন্য এটি প্রয়োজনীয় সিঙ্ক্রোনাইজেশনের কারণে GPU-এর পরিমাণের সাথে রৈখিকভাবে স্কেল করে না।

2. ব্যাচের আকারের দিকে মনোযোগ দিন

আপনি যখন মাল্টি-জিপিইউ ট্রেনিং করেন তখন ব্যাচের আকারের দিকে মনোযোগ দিন কারণ এটি আপনার মডেলের গতি/মেমরি, কনভারজেন্সের উপর একাধিক প্রভাব ফেলে এবং আপনি যদি সতর্ক না হন তবে আপনি আপনার মডেলের ওজন নষ্ট করতে পারেন!

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

অভিন্নতা: আপনি যদি আপনার মডেলকে প্রশিক্ষিত করতে স্টকাস্টিক গ্রেডিয়েন্ট ডিসেন্ট (SGD) বা এর কিছু ভেরিয়েন্ট ব্যবহার করেন, তাহলে আপনার মনে রাখা উচিত যে ব্যাচের আকার আপনার নেটওয়ার্কের একত্রিত এবং সাধারণীকরণের ক্ষমতাকে প্রভাবিত করতে পারে। অনেক কম্পিউটার দৃষ্টি সমস্যায় সাধারণ ব্যাচের আকার 32-512 উদাহরণের মধ্যে। হিসাবে কেসকার প্রমুখ এটি রাখুন, "এটি অনুশীলনে দেখা গেছে যে একটি বৃহত্তর ব্যাচ (512-এর চেয়ে) ব্যবহার করার সময় মডেলটির গুণমানে একটি অবনতি হয়, যা সাধারণীকরণের ক্ষমতা দ্বারা পরিমাপ করা হয়।" নোট করুন যে অন্যান্য বিভিন্ন অপ্টিমাইজারের বিভিন্ন বৈশিষ্ট্য রয়েছে এবং বিশেষ বিতরণকৃত অপ্টিমাইজেশান কৌশল সমস্যাটির সাথে সাহায্য করতে পারে। আপনি যদি গাণিতিক বিবরণে আগ্রহী হন, আমি জোরি হারম্যানের থিসিস পড়ার পরামর্শ দিই।স্কেলেবল ডিপ লার্নিং এবং সমান্তরাল গ্রেডিয়েন্ট ডিসেন্টের উপর".
Keras PlatoBlockchain ডেটা ইন্টেলিজেন্স সহ মাল্টি-GPU প্রশিক্ষণের জন্য 5 টি টিপস। উল্লম্ব অনুসন্ধান. আই.
ওজন নষ্ট করা: এটি একটি বাজে প্রযুক্তিগত বিবরণ যা বিধ্বংসী ফলাফল হতে পারে। আপনি যখন মাল্টি-জিপিইউ ট্রেনিং করেন, তখন সমস্ত জিপিইউকে ডেটা দিয়ে খাওয়ানো গুরুত্বপূর্ণ। এটি ঘটতে পারে যে আপনার যুগের একেবারে শেষ ব্যাচে সংজ্ঞায়িত থেকে কম ডেটা রয়েছে (কারণ আপনার ডেটাসেটের আকারটি আপনার ব্যাচের আকার দ্বারা সঠিকভাবে ভাগ করা যাবে না)। এর ফলে শেষ ধাপে কিছু জিপিইউ কোনো ডেটা গ্রহণ করতে পারে না। দুর্ভাগ্যবশত কিছু কেরাস লেয়ার, বিশেষ করে ব্যাচ নরমালাইজেশন লেয়ার, এর সাথে মোকাবিলা করতে পারে না যার ফলে ন্যান মানগুলি ওজনে প্রদর্শিত হয় (বিএন স্তরে চলমান গড় এবং বৈচিত্র্য)। জিনিসগুলিকে আরও খারাপ করার জন্য, কেউ প্রশিক্ষণের সময় সমস্যাটি পর্যবেক্ষণ করবে না (যখন শেখার পর্যায় 1 হয়) কারণ নির্দিষ্ট স্তরটি অনুমানে ব্যাচের গড়/প্রকরণ ব্যবহার করে। তা সত্ত্বেও ভবিষ্যদ্বাণীর সময় (শেখার পর্যায় 0 এ সেট করা হয়েছে), চলমান গড়/ভেরিয়েন্স ব্যবহার করা হয় যা আমাদের ক্ষেত্রে খারাপ ফলাফলের দিকে নিয়ে যেতে পারে। তাই নিজের উপকার করুন এবং আপনি যখন মাল্টি-জিপিইউ ট্রেনিং করবেন তখন আপনার ব্যাচের আকার ঠিক আছে কিনা তা নিশ্চিত করুন। এটি অর্জনের দুটি সহজ উপায় হল পূর্বনির্ধারিত আকারের সাথে মেলে না এমন ব্যাচগুলিকে প্রত্যাখ্যান করা বা আপনি পূর্বনির্ধারিত আকারে না পৌঁছানো পর্যন্ত ব্যাচের মধ্যে রেকর্ডগুলি পুনরাবৃত্তি করে৷ শেষ কিন্তু অন্তত মনে রাখবেন যে মাল্টি-জিপিইউ সেটআপে, ব্যাচের আকার আপনার সিস্টেমে উপলব্ধ জিপিইউ-এর সংখ্যার একাধিক হওয়া উচিত।

3. জিপিইউ ডেটা স্টারভেশন ওরফে সিপিইউগুলি জিপিইউগুলির সাথে তাল মিলিয়ে চলতে পারে না

সাধারণত ডিপ নেটওয়ার্কের প্রশিক্ষণ/ভবিষ্যদ্বাণী করার সময় সবচেয়ে ব্যয়বহুল অংশটি হল GPU-তে অনুমান করা। ডেটা পটভূমিতে CPU-তে প্রি-প্রসেস করা হয় এবং সেগুলিকে পর্যায়ক্রমে GPU-তে খাওয়ানো হয়। তা সত্ত্বেও GPU গুলি কত দ্রুত তা অবমূল্যায়ন করা উচিত নয়; এটি ঘটতে পারে যে যদি আপনার নেটওয়ার্ক খুব অগভীর হয় বা প্রিপ্রসেসিং ধাপটি খুব জটিল হয় যে আপনার CPUগুলি আপনার GPU গুলি রাখতে পারে না বা অন্য কথায় তারা তাদের যথেষ্ট দ্রুত ডেটা সরবরাহ করে না। এটি কম GPU ব্যবহারের দিকে পরিচালিত করতে পারে যা অর্থ/সম্পদ অপচয়ে অনুবাদ করে।
Keras PlatoBlockchain ডেটা ইন্টেলিজেন্স সহ মাল্টি-GPU প্রশিক্ষণের জন্য 5 টি টিপস। উল্লম্ব অনুসন্ধান. আই.
কেরাস সাধারণত সমান্তরালভাবে ব্যাচের অনুমান সম্পাদন করে তবুও পাইথনের জিআইএল (গ্লোবাল ইন্টারপ্রেটার লক) এর কারণে আপনি পাইথনে সত্যিকারের মাল্টি-থ্রেডিং অর্জন করতে পারবেন না। এর জন্য দুটি সমাধান রয়েছে: হয় একাধিক প্রসেস ব্যবহার করুন (মনে রাখবেন যে এটিতে প্রচুর গোটচা রয়েছে যা আমি এখানে কভার করতে যাচ্ছি না) অথবা আপনার প্রিপ্রসেসিং ধাপটি সহজ রাখুন। অতীতে আমি ইমেজ প্রিপ্রসেসিংয়ের সময় সিপিইউতে যে অপ্রয়োজনীয় স্ট্রেন রেখেছিলাম তার কিছু উপশম করার জন্য কেরাসে একটি পুল-রিকোয়েস্ট পাঠিয়েছি, তাই বেশিরভাগ ব্যবহারকারীরা স্ট্যান্ডার্ড জেনারেটর ব্যবহার করলে তাদের প্রভাবিত করা উচিত নয়। আপনার যদি কাস্টম জেনারেটর থাকে তবে সি লাইব্রেরি যেমন Numpy-এ যতটা সম্ভব লজিক চাপানোর চেষ্টা করুন কারণ এই পদ্ধতিগুলির মধ্যে কিছু আসলে GIL মুক্ত করুন যার মানে আপনি সমান্তরালকরণের ডিগ্রি বাড়াতে পারেন। আপনি GPU ডেটা অনাহারের সম্মুখীন হচ্ছেন কিনা তা সনাক্ত করার একটি ভাল উপায় হল GPU ব্যবহার নিরীক্ষণ করা, তবুও সতর্ক করা উচিত যে এটি পর্যবেক্ষণ করার একমাত্র কারণ নয় (একাধিক GPU তে প্রশিক্ষণের সময় যে সিঙ্ক্রোনাইজেশন ঘটে তাও কম ব্যবহারের জন্য দায়ী। ) সাধারণত GPU ডেটা অনাহার শনাক্ত করা যেতে পারে GPU বিস্ফোরণ পর্যবেক্ষণ করে এবং কোন ব্যবহার ছাড়াই দীর্ঘ বিরতি দিয়ে। অতীতে আমি Dstat-এর জন্য একটি এক্সটেনশন ওপেন-সোর্স করেছি যা আপনাকে আপনার GPU ব্যবহার পরিমাপ করতে সাহায্য করতে পারে, তাই দেখুন মূল ব্লগ পোস্ট.

4. আপনার সমান্তরাল মডেল সংরক্ষণ

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

5. উপলব্ধ GPU গণনা একটি খারাপ পার্শ্ব-প্রতিক্রিয়া আছে

দুর্ভাগ্যবশত এই মুহুর্তে, tensorflow.python.client.device_lib.list_local_devices() পদ্ধতিতে একটি খারাপ পার্শ্ব-প্রতিক্রিয়া রয়েছে যা একটি নতুন TensorFlow সেশন তৈরি করতে এবং সিস্টেমে উপলব্ধ সমস্ত GPU-এর আরম্ভ করে। এটি অপ্রত্যাশিত ফলাফলের দিকে নিয়ে যেতে পারে যেমন নির্দিষ্ট করা থেকে বেশি জিপিইউ দেখা বা অকালে নতুন সেশন শুরু করা (আপনি এতে সমস্ত বিবরণ পড়তে পারেন টান-অনুরোধ) অনুরূপ বিস্ময় এড়াতে আপনাকে পরিবর্তে কেরাসের K.get_session().list_devices() পদ্ধতি ব্যবহার করার পরামর্শ দেওয়া হচ্ছে, যা আপনাকে সেশনে বর্তমানে নিবন্ধিত সমস্ত GPU ফিরিয়ে দেবে। শেষ কিন্তু অন্তত নয়, মনে রাখবেন যে list_devices() পদ্ধতিতে কল করা একরকম ব্যয়বহুল, তাই আপনি যদি উপলভ্য GPU গুলির সংখ্যার বিষয়ে আগ্রহী হন তবে পদ্ধতিটিকে একবার কল করুন এবং একটি স্থানীয় ভেরিয়েবলে তাদের নম্বর সংরক্ষণ করুন।

এটাই! আশা করি আপনি এই তালিকাটি দরকারী খুঁজে পেয়েছেন। আপনি যদি কেরাসে জিপিইউ প্রশিক্ষণের জন্য অন্যান্য গোটচাস/টিপস খুঁজে পান তবে সেগুলি নীচে মন্তব্যে ভাগ করুন। 🙂

সময় স্ট্যাম্প:

থেকে আরো ডেটাবক্স