जब मैं सुन्न आयात करता हूं तो मल्टीप्रोसेसिंग केवल एक कोर का उपयोग क्यों करता है?


127

मुझे यकीन नहीं है कि क्या यह ओएस के मुद्दे के रूप में अधिक मायने रखता है, लेकिन मुझे लगा कि मैं यहां पूछूंगा कि किसी को चीजों के पायथन अंत से कुछ अंतर्दृष्टि है।

मैं एक सीपीयू-भारी forलूप का उपयोग करके समानांतर करने की कोशिश कर रहा joblibहूं, लेकिन मुझे लगता है कि प्रत्येक कार्यकर्ता प्रक्रिया को एक अलग कोर को सौंपा जाने के बजाय, मैं उन सभी को एक ही कोर को सौंपा जा रहा हूं और कोई प्रदर्शन लाभ नहीं है।

यहाँ एक बहुत ही तुच्छ उदाहरण है ...

from joblib import Parallel,delayed
import numpy as np

def testfunc(data):
    # some very boneheaded CPU work
    for nn in xrange(1000):
        for ii in data[0,:]:
            for jj in data[1,:]:
                ii*jj

def run(niter=10):
    data = (np.random.randn(2,100) for ii in xrange(niter))
    pool = Parallel(n_jobs=-1,verbose=1,pre_dispatch='all')
    results = pool(delayed(testfunc)(dd) for dd in data)

if __name__ == '__main__':
    run()

... और यहाँ है जो मैं देख रहा हूँ, htopजबकि यह स्क्रिप्ट चल रही है:

htop

मैं 4 कोर वाले लैपटॉप पर Ubuntu 12.10 (3.5.0-26) चला रहा हूं। स्पष्ट रूप joblib.Parallelसे विभिन्न श्रमिकों के लिए अलग-अलग प्रक्रियाएं पैदा कर रहा है, लेकिन क्या कोई तरीका है कि मैं इन प्रक्रियाओं को अलग-अलग कोर पर निष्पादित कर सकता हूं?


stackoverflow.com/questions/15168014/… - वहाँ कोई जवाब नहीं मुझे डर है, लेकिन यह एक ही मुद्दे की तरह लगता है।
NPE

इसके अलावा stackoverflow.com/questions/6905264/…
NPE


क्या यह अभी भी एक मुद्दा है? मैं इसे Python 3.7 के साथ फिर से बनाने और मल्टीप्रोसेसिंग.Pool () के साथ numpy आयात करने का प्रयास कर रहा हूं, और यह सभी थ्रेड्स का उपयोग कर रहा है (जैसा कि इसे करना चाहिए)। बस यह सुनिश्चित करना चाहते हैं कि यह तय हो गया है।
जेरेड नीलसन

जवाबों:


148

कुछ और गुगली करने के बाद मुझे यहाँ जवाब मिला ।

ऐसा लगता है कि कुछ पायथन मॉड्यूल ( numpy, scipy, tables, pandas, skimage...) आयात पर कोर आत्मीयता के साथ गड़बड़। जहां तक ​​मैं बता सकता हूं, यह समस्या विशेष रूप से उन्हें मल्टीथ्रेडेड ओपनबीएलएएस पुस्तकालयों के खिलाफ जोड़ने के कारण होती है।

एक वर्कअराउंड का उपयोग करके कार्य आत्मीयता को रीसेट करना है

os.system("taskset -p 0xff %d" % os.getpid())

मॉड्यूल आयात के बाद चिपकाई गई इस रेखा के साथ, मेरा उदाहरण अब सभी कोर पर चलता है:

htop_workaround

मेरा अब तक का अनुभव यह रहा है कि इससे numpyप्रदर्शन पर कोई नकारात्मक प्रभाव नहीं पड़ता है , हालाँकि यह शायद मशीन-और कार्य-विशिष्ट है।

अपडेट करें:

ओपनब्लस के सीपीयू आत्मीयता-रीसेट व्यवहार को अक्षम करने के भी दो तरीके हैं। उदाहरण के लिए, रन-टाइम पर आप पर्यावरण चर OPENBLAS_MAIN_FREE(या GOTOBLAS_MAIN_FREE) का उपयोग कर सकते हैं

OPENBLAS_MAIN_FREE=1 python myscript.py

या वैकल्पिक रूप से, यदि आप OpenBLAS को स्रोत से संकलित कर रहे हैं, तो आप Makefile.ruleलाइन को समाहित करने के लिए इसे संपादित करके स्थायी रूप से इसे बिल्ड-टाइम में अक्षम कर सकते हैं

NO_AFFINITY=1

धन्यवाद, आपके समाधान से समस्या हल हो गई। एक प्रश्न, मेरे पास एक ही कोड है, लेकिन टो अलग मशीन पर अलग तरीके से चलता है। दोनों मशीनें उबुन्टु 12.04 एलटीएस, अजगर 2.7 हैं, लेकिन केवल एक ही यह समस्या है। क्या आपके पास कोई विचार है क्यों?
इम्पाट

दोनों मशीनों में OpenBLAS (OpenMPI के साथ निर्माण) है।
०४

2
पुराना धागा, लेकिन अगर कोई और इस मुद्दे को पाता है, तो मुझे सटीक समस्या थी और यह वास्तव में ओपनबीएलएएस पुस्तकालयों से संबंधित था। यहां देखें दो संभावित वर्कअराउंड और कुछ संबंधित चर्चा।
गेब्रियल

2
सीपीयू आत्मीयता का उपयोगpsutil करने का एक और तरीका है ।
Ioannis Filippidis

2
@ जेएचजी यह पायथन के बजाय ओपनबीएलएएस के साथ एक मुद्दा है, इसलिए मैं किसी भी कारण से नहीं देख पा रहा हूं कि पायथन संस्करण में फर्क क्यों पड़ेगा
एलिअम

27

पायथन 3 अब सीधे आत्मीयता स्थापित करने के तरीकों को उजागर करता है

>>> import os
>>> os.sched_getaffinity(0)
{0, 1, 2, 3}
>>> os.sched_setaffinity(0, {1, 3})
>>> os.sched_getaffinity(0)
{1, 3}
>>> x = {i for i in range(10)}
>>> x
{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
>>> os.sched_setaffinity(0, x)
>>> os.sched_getaffinity(0)
{0, 1, 2, 3}

1
त्रुटि> विशेषता: मॉड्यूल 'ओएस' में कोई विशेषता नहीं है 'शेड्यूल_गेटफिनिटी', पायथन 3.6
धान

4
@ डुप्लीकेटेड डॉक्यूमेंटेशन से: वे केवल कुछ यूनिक्स प्लेटफार्मों पर उपलब्ध हैं।
ब्लैकजैक

2
मेरे पास एक ही समस्या है, लेकिन मैंने शीर्ष os.system ("कार्यपत्र -p 0xff% d"% os.getpid ()) पर इसी पंक्ति को एकीकृत किया है, लेकिन इसके सभी सीपीयू का उपयोग नहीं करता है
rajeshcis

12

Python on Ubuntuइसका मतलब यह है कि यह विंडोज और अन्य ओएस पर परेशानी के बिना काम कर रहा है। क्या यह?
मस्तूल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.