scikit-CPU उपयोग और मेमोरी पर n_jobs पैरामीटर सीखें


12

स्किकिट-लर्न पर अधिकांश अनुमानकों में, समानांतर नौकरियों का उपयोग करने के लिए / विधियों n_jobsमें एक पैरामीटर है । मैंने देखा कि सिर्फ 1 पायथन प्रक्रिया बनाने के लिए इसे स्थापित करने और कोर को अधिकतम किया गया, जिससे सीपीयू का उपयोग शीर्ष पर 2500% तक पहुंच गया। यह इसे कुछ सकारात्मक पूर्णांक> 1 पर सेट करने से काफी अलग है, जो ~ 100% उपयोग पर कई पायथन प्रक्रियाएं बनाता है।fitpredictjoblib-1

यह बहु-सीपीयू लिनक्स सर्वर पर सीपीयू और कोर उपयोग को कैसे प्रभावित करता है? (जैसे अगर n_jobs=8तब 8 सीपीयू पूरी तरह से बंद हैं या सीपीयू अभी भी अन्य कार्यों / प्रक्रियाओं के लिए कुछ कोर आरक्षित करते हैं?)

इसके अतिरिक्त, मैं बड़े डेटासेट के लिए MemoryErrorकभी-कभी मिलता हूं n_jobs=-1। हालाँकि, स्मृति उपयोग आमतौर पर एकल पायथन प्रक्रिया के लिए लगभग 30-40% पर होता है। मान के आधार पर डेटा और मेमोरी को कैसे प्रबंधित / कॉपी किया जा रहा है n_jobs?


1
साथ ही याद रखें कि आप इसे -2 पर सेट कर सकते हैं, जो उपलब्ध मशीन के सभी लेकिन 1 का उपयोग करेगा, जिससे आपकी मशीन कम से कम कुछ हद तक काम कर रही है। काफी हद तक सही है कि मेमोरी के मुद्दे आमतौर पर कई कोर के लिए काटने लगते हैं, खासकर अगर डेटासेट बड़े
केन साइमे

जवाबों:


4

मैं -1सभी उपलब्ध संसाधनों की खपत के मूल्य की कल्पना कर सकता हूं जब वे उपलब्ध हो जाते हैं। जिस फ़ंक्शन के बारे में आप बात कर रहे हैं, उसके आधार पर, ऐसा लगता है कि डेटा को प्रत्येक कार्य के लिए कॉपी किया गया है, जिससे मेमोरी समस्याएँ हो सकती हैं यदि डेटासेट काफी बड़ा है। यहाँ GridSearchCV के डॉकस्ट्रिंग से जानकारी का एक टुकड़ा है :

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वास्तव में सभी भौतिक कोर का चयन करती है और उनके उपयोग को अधिकतम करती है। StackOverflow पर इस उत्तर में टिप्पणियों पर एक नज़र है ।

यदि आपने सेट नहीं किया है pre_dispatch, तो यह निश्चित रूप से बहुत प्रतिलिपि बनाने की कोशिश करेगा। यही कारण है कि आप स्मृति से बाहर भागते हैं। यदि आपके पास 4 कोर हैं, तो डिफ़ॉल्ट रूप से, डेटासेट की 8 प्रतियां बनाई जाएंगी (जैसा कि ऊपर उद्धरण में वर्णित है)।

यहां एक और धागा है , जो प्रदर्शन पक्ष पर अधिक दिखता है


1
इसलिए हम डेटा की प्रतियों को सीमित करने के लिए pre_dispatch का उपयोग करते हैं, लेकिन क्यों -1 में कोई स्मृति समस्या है?

1
@sweetyBaby - कृपया अतिरिक्त लिंक देखें। सेटिंग n_jobs = -1आपको स्मृति में नहीं ले जाएगी, केवल आपके सीपीयू पर कोर की संख्या, जो निश्चित रूप से मेमोरी मुद्दों को जन्म दे सकती है।
n1k31t4
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.