সিপিইউ ব্যবহার এবং মেমরির উপর বিজ্ঞান-শিখুন n_jobs পরামিতি


12

সাইকিট-লার্ন সম্পর্কে বেশিরভাগ অনুমানকারীতে, সমান্তরাল কাজ ব্যবহার করে তৈরি করার জন্য / পদ্ধতিগুলির একটি n_jobsপরামিতি রয়েছে । আমি লক্ষ্য করেছি যে এটি সেট করা মাত্র 1 পাইথন প্রক্রিয়া তৈরি করে এবং কোরগুলি সর্বাধিক করে তোলে, ফলে সিপিইউ ব্যবহার 2500% শীর্ষে পৌঁছে যায়। এটি কিছু ধনাত্মক পূর্ণসংখ্য> 1 এ সেট করা থেকে একেবারে পৃথক, যা 100 ডলার ব্যবহারে একাধিক পাইথন প্রক্রিয়া তৈরি করে।fitpredictjoblib-1

এটি কীভাবে সেট করার ফলে মাল্টি-সিপিইউ লিনাক্স সার্ভারে সিপিইউ এবং মূল ব্যবহারকে প্রভাবিত করে? (উদাহরণস্বরূপ যদি n_jobs=88 টি সিপিইউ পুরোপুরি লকড থাকে বা সিপিইউগুলি এখনও অন্য কাজ / প্রক্রিয়াগুলির জন্য কিছু কোর সংরক্ষণ করে?)

অতিরিক্ত হিসাবে, বড় ডেটাসেটের জন্য MemoryErrorসেট n_jobs=-1করার সময় আমি মাঝে মাঝে পাই । তবে একক পাইথন প্রক্রিয়াটির জন্য মেমরির ব্যবহারটি প্রায় 30-40% অবধি থাকে। কীভাবে ডেটা ও মেমরির মান / মূল্যায়ন করা হয় তার উপর নির্ভর করে n_jobs?


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

উত্তর:


4

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

If `n_jobs` was set to a value higher than one, the data is copied for each
point in the grid (and not `n_jobs` times). This is done for efficiency
reasons if individual jobs take very little time, but may raise errors if
the dataset is large and not enough memory is available.  A workaround in
this case is to set `pre_dispatch`. Then, the memory is copied only
`pre_dispatch` many times. A reasonable value for `pre_dispatch` is `2 *
n_jobs`.

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

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

সম্পাদনা করুন:

দেখে মনে হচ্ছে যে সেটিংটি n_jobs=-1প্রকৃতপক্ষে সমস্ত শারীরিক কোর নির্বাচন করে এবং তাদের ব্যবহার সর্বাধিকতর করে। স্ট্যাকওভারফ্লোতে এই উত্তরে মন্তব্যগুলি দেখুন ।

আপনি যদি সেট না করে থাকেন তবে pre_dispatchএটি অবশ্যই অনেকগুলি অনুলিপি করার চেষ্টা করবে। এ কারণেই আপনার স্মৃতিশক্তি চলে গেছে। আপনার যদি 4 টি কোর থাকে তবে ডিফল্টরূপে 8 টি অনুলিপি তৈরি করা হবে ডেটাসেট (উদ্ধৃতিতে উপরে বর্ণিত হিসাবে)।

এখানে আরও একটি থ্রেড রয়েছে , যা পারফরম্যান্সের দিক থেকে আরও বেশি দেখায়


1
সুতরাং আমরা ডেটা অনুলিপি সীমাবদ্ধ করতে pre_dispatch ব্যবহার করি, কিন্তু কেন একটি মেমরি সমস্যা আছে -1 এ সেট?

1
@ সুইটিবাবি - দয়া করে যুক্ত লিঙ্কগুলি দেখুন। সেটিং n_jobs = -1আপনাকে স্মৃতিশক্তিটিকে বিবেচনায় নেবে না, কেবলমাত্র আপনার সিপিইউতে কেবলমাত্র সংখ্যার কোরের সংখ্যা রয়েছে যা অবশ্যই মেমরির সমস্যার কারণ হতে পারে।
n1k31t4
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.