গভীর শেখার মডেলগুলিকে প্রশিক্ষণ দেওয়ার সময় মিনি-ব্যাচের মেমরির প্রভাব কীভাবে গণনা করা যায়?


17

আমি আন্ড্রেজ কারফাতীর কাছ থেকে এই নোটগুলির উপর ভিত্তি করে আমার মডেলকে প্রশিক্ষণের জন্য কোনও জিপিইউর প্রয়োজনীয় মেমোরি গণনা করার চেষ্টা করছি: http://cs231n.github.io/convolutional- নেট ওয়ার্কস / # কমপিটেশনাল- কনসাইডারেশন

আমার নেটওয়ার্কে 532,752 টি অ্যাক্টিভেশন এবং 19,072,984 পরামিতি (ওজন এবং বায়াস ) রয়েছে। এগুলি সমস্ত 32 বিট ভাসমান মান, সুতরাং প্রতিটি মেমরিতে 4 বাইট নেয়।

আমার ইনপুট চিত্রটি 180x50x1 (প্রস্থ x উচ্চতা x গভীরতা) = 9,000 ফ্ল্যাট 32 মান। আমি চিত্রের বর্ধন ব্যবহার করি না, তাই আমি মনে করি বিবিধ স্মৃতিটি কেবল মিনি-ব্যাচের আকারের সাথে সম্পর্কিত। আমি 128 টি চিত্রের একটি মিনি ব্যাচ ব্যবহার করছি।

আন্দ্রেজের সুপারিশের ভিত্তিতে আমি নিম্নলিখিত মেমরির আকারগুলি পেয়েছি:

ক্রিয়াকলাপ : 532,752 * 4 / (1024 ^ 2) = 2.03 এমবি

পরামিতি: 19,072,984 * 4 / (1024 ^ 2) * 3 = 218.27 এমবি

বিবিধ: 128 * 9,000 * 4 / (1024 ^ 2) = 4.39 এমবি

সুতরাং এই নেটওয়ার্কটি প্রশিক্ষণের জন্য মোট মেমরিটি 224,69 মেগাবাইট হবে

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

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

আমার গভীর শেখার মডেলটি প্রশিক্ষণের জন্য আপনি কী আমাকে স্মৃতিচারণ বিবেচনা করতে সহায়তা করতে পারেন? উপরোক্ত বিবেচনাগুলি কি সঠিক?


দয়া করে এখানে আপনার প্রশ্নের উত্তর (প্রস্তাবিত) দেখুন ।
অ্যাডাম হেন্ডরি

উত্তর:


5

আমি মনে করি আপনি সঠিক পথে আছেন

হ্যাঁ, আপনাকে ব্যাকপ্রসারণের জন্য অ্যাক্টিভেশনগুলির এবং প্যারামিটারগুলির ডেরিভেটিভগুলি সংরক্ষণ করতে হবে।

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

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


5

টুইটারে

আমি এই ক্রিয়াকলাপটি দিয়ে যাচ্ছি যে আমি নিজের প্রয়োজনীয় স্মৃতিটি গণনা করতে পারি কিনা তা দেখতে:

ক্রিয়াকলাপ : 532,752 * 2 * 4 / (1024 ^ 2) = 4.06 এমবি

পরামিতি: 19,072,984 * 4 / (1024 ^ 2) * 3 = 218.27 এমবি

বিবিধ: 128 * 9,000 * 4 / (1024 ^ 2) = 4.39 এমবি

মোট স্মৃতি: (4.06 * 128 ) + 218.27 + 4.39 = 742.34 এমবি

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


আমি আপনাকে এই নিবন্ধ এবং সংশ্লিষ্ট ভিডিওতে নির্দেশ করব । তারা আমাকে আরও অনেক ভাল যা চলছে তা বুঝতে সাহায্য করেছিল।

দ্রষ্টব্য: ভবিষ্যদ্বাণীগুলির জন্য একটি নেটওয়ার্ক ব্যবহার করার জন্য প্রয়োজনীয় মেমরিটি দুটি কারণে প্রশিক্ষণের জন্য প্রয়োজনীয় চেয়ে অনেক কম:

  • ভবিষ্যদ্বাণী করার সময়, আমরা কেবল নেটওয়ার্কের মাধ্যমে একটি চিত্র প্রেরণ করি এবং পিছনে নয় (সুতরাং আমরা মেমরি এক্স 3 গুণ করি না; নীচে দেখুন)
  • প্রতি চিত্রের জন্য একটি পূর্বাভাস রয়েছে (সুতরাং আমাদের কোনও ব্যাচের আকারের দ্বারা একটি চিত্রের জন্য প্রয়োজনীয় মেমরিটি গুণানোর প্রয়োজন নেই কারণ আমরা পূর্বাভাসে ব্যাচগুলি ব্যবহার করি না)।

প্রক্রিয়া (ট্রেন থেকে স্মৃতি)

  1. একটি ছবিতে প্রশিক্ষণের জন্য প্রয়োজনীয় মেমরি গণনা করুন
  2. আপনার ব্যাচের চিত্র সংখ্যা দ্বারা এই সংখ্যাটি গুণ করুন

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

পদক্ষেপ 1: 1 চিত্রের জন্য মেমরি

একটি চিত্র প্রশিক্ষণের জন্য, আপনাকে অবশ্যই এর জন্য মেমরি সংরক্ষণ করতে হবে:

  • মডেল পরামিতি:

    ওজন এবং গোঁড়ামির প্রতিটি স্তর, তাদের এ গ্রেডিয়েন্ট , এবং তাদের ভরবেগ ভেরিয়েবল (আদম, Adagrad, RMSProp ইত্যাদি optimizers ব্যবহার করা হয় যদি থাকে)

    এর জন্য মেমোরিটিকে আনুমানিকভাবে নির্ধারণ করতে, ওজন এবং বায়াসগুলি সংরক্ষণ করার জন্য প্রয়োজনীয় মেমরিটি গণনা করুন এবং এটি 3 দ্বারা (অর্থাৎ "3" দ্বারা গুণিত করুন কারণ আমরা বলছি যে ওজন এবং বায়াসগুলি সংরক্ষণ করার জন্য প্রয়োজনীয় মেমরির পরিমাণ (মোটামুটি) সমান) যে গ্রেডিয়েন্ট এবং গতিশীল পরিবর্তনশীল জন্য প্রয়োজন)

    সমীকরণ:

    Convolutions:

    ওজন (এন) = গভীরতা (এন) * (কর্নেল_উইথ * কর্নেল_ উচ্চতা) * গভীরতা (এন -1)

    পক্ষপাত (n) = গভীরতা (n)

    সম্পূর্ণ সংযুক্ত (ঘন) স্তর:

    ওজন (এন) = আউটপুট (এন) * ইনপুট (এন)

    বায়াসেস (এন) = আউটপুট (এন)

কোথায় এন বর্তমান স্তর এবং এন -1 পূর্ববর্তী স্তর এবং আউটপুটগুলি এফসি স্তর থেকে আউটপুট সংখ্যা এবং ইনপুটগুলি এফসি স্তরটির ইনপুটগুলির সংখ্যা (যদি পূর্ববর্তী স্তরটি সম্পূর্ণভাবে সংযুক্ত স্তর না থাকে, ইনপুটগুলির সংখ্যা সমানভাবে সেই স্তরটির আকারের সমান)।

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

  • ক্রিয়াকলাপ (এগুলি ক্যাফেতে "ব্লবস"):

(আমি এখানে স্বল্পভাবে পদ ব্যবহার করছি, আমার সাথে সহ্য করুন)

কনভলিউশন লেয়ারের প্রতিটি কনভলিউশন " চিত্রটিতে বহু পিক্সেল " অ্যাক্টিভেশন তৈরি করে (যেমন আপনি একটি একক কনভলিউশনের মাধ্যমে চিত্রটি পাস করেন, আপনি " এম " অ্যাক্টিভেশন সমন্বিত একটি বৈশিষ্ট্য মানচিত্র পাবেন , যেখানে " মি " আপনার পিক্সেলগুলির সংখ্যা ইমেজ / ইনপুট)।

পুরোপুরি সংযুক্ত স্তরগুলির জন্য, আপনার উত্পন্ন অ্যাক্টিভেশনগুলির সংখ্যা আপনার আউটপুট আকারের সমান।

Convolutions:

ক্রিয়াকলাপ (এন) = চিত্র_ প্রস্থ * চিত্র_ উচ্চতা * চিত্র_নাম_চ্যানেলগুলি

সম্পূর্ণ সংযুক্ত (ঘন) স্তর:

ক্রিয়াকলাপ (এন) = আউটপুট (এন)

নোট করুন যে আপনার ইনপুটটি নেটওয়ার্কের শুরুতে কেবলমাত্র একটি চিত্র। কনভোলিউশনের পরে, এটি অন্য কোনও কিছুতে পরিণত হয় (বৈশিষ্ট্যযুক্ত মানচিত্র)। সুতরাং আরও সঠিকভাবে "চিত্র_উইথ", "চিত্র_ উচ্চতা", এবং "চিত্র_নাম_চ্যানেলগুলি" "ইনপুট_উইথ", "ইনপুট_উত্তর", এবং "স্তর_পথ" এর সাথে প্রতিস্থাপন করুন। (চিত্রগুলির ক্ষেত্রে এই ধারণাটি সম্পর্কে চিন্তা করা আমার পক্ষে সহজ।

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

পদক্ষেপ 2: ট্রেনের ব্যাচ মেমরি

ওজন এবং পক্ষপাতের সংখ্যা (3 বার) এবং ক্রিয়াকলাপের সংখ্যার (বারের আকারের 2 গুণ বেশি) যোগ করুন। এটিকে 4 দিয়ে গুণ করুন এবং আপনি ব্যাচকে প্রশিক্ষণের জন্য প্রয়োজনীয় বাইটের সংখ্যা পাবেন। জিবিতে উত্তর পেতে আপনি 1024 ^ 2 দিয়ে ভাগ করতে পারেন।


আপনি কেন বলেন "আমরা ভবিষ্যদ্বাণীতে ব্যাচ ব্যবহার করি না"? যদি কোনও ব্যবহারকারীর প্রচুর সংখ্যক চিত্র নিয়ে ভবিষ্যদ্বাণী করা প্রয়োজন হয় তবে ভবিষ্যদ্বাণীগুলিতে ব্যাচগুলি ব্যবহার করা বোধগম্য হতে পারে।
user3731622

1

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

আপনি নিজের প্রোগ্রামের অংশটি চালাতে পারেন যা আপনি পপেন ব্যবহার করে একটি আলাদা সাব-প্রসেসে পর্যবেক্ষণ করতে চান এবং এটির পিআইডি ব্যবহার করে এটির মেমরি এবং সিপিইউ ব্যবহার পর্যবেক্ষণ করে।

এই জাতীয় কাজের জন্য আমি ভাল মনে করি। যদিও আরও অনেকে আছেন।

আমি আশা করি এটি সাহায্য করবে


3
উত্তরের জন্য ধন্যবাদ, আনোয়ার আমি একটি অভিজ্ঞতামূলক পর্যবেক্ষণের চেয়ে বিশ্লেষণী গণনার সন্ধান করছি।
বার্বোলো
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.