2013-08-07 8 views
15

के साथ असंगत है मैं मल्टीप्रोसेसिंग का उपयोग करके एक साधारण परीक्षण चलाने की कोशिश कर रहा हूं। जब तक मैं numpy आयात नहीं करता तब तक परीक्षण अच्छी तरह से काम करता है (भले ही यह प्रोग्राम में उपयोग नहीं किया जाता है)।मल्टीप्रोसेसिंग NumPy

from multiprocessing import Pool 
import time 
import numpy as np #this is the problematic line 


def CostlyFunc(N): 
    """""" 
    tstart = time.time() 
    x = 0 
    for i in xrange(N): 
     for j in xrange(N): 
      if i % 2: x += 2 
      else: x -= 2  
    print "CostlyFunc : elapsed time %f s" % (time.time() - tstart) 
    return x 

#serial application 
ResultList0 = [] 
StartTime = time.time() 
for i in xrange(3): 
    ResultList0.append(CostlyFunc(5000)) 
print "Elapsed time (serial) : ", time.time() - StartTime 


#multiprocessing application 
StartTime = time.time() 
pool = Pool() 
asyncResult = pool.map_async(CostlyFunc, [5000, 5000, 5000]) 
ResultList1 = asyncResult.get() 
print "Elapsed time (multiporcessing) : ", time.time() - StartTime 

अगर मैं परिणाम numpy आयात नहीं करते है:

CostlyFunc : elapsed time 2.866265 s 
CostlyFunc : elapsed time 2.793213 s 
CostlyFunc : elapsed time 2.794936 s 
Elapsed time (serial) : 8.45455098152 
CostlyFunc : elapsed time 2.889815 s 
CostlyFunc : elapsed time 2.891556 s 
CostlyFunc : elapsed time 2.898898 s 
Elapsed time (multiporcessing) : 2.91595196724 

कुल बीता हुआ समय, समय 1 प्रक्रिया के लिए आवश्यक के समान है जिसका अर्थ है कि गणना की गई है यहाँ कोड है parallelized। अगर मैं numpy आयात परिणाम कर हो जाता है:

CostlyFunc : elapsed time 2.877116 s 
CostlyFunc : elapsed time 2.866778 s 
CostlyFunc : elapsed time 2.860894 s 
Elapsed time (serial) : 8.60492110252 
CostlyFunc : elapsed time 8.450145 s 
CostlyFunc : elapsed time 8.473006 s 
CostlyFunc : elapsed time 8.506402 s 
Elapsed time (multiporcessing) : 8.55398178101 

कुल समय बीत दोनों धारावाहिक और बहु ​​तरीकों के लिए एक ही है, क्योंकि केवल एक कोर प्रयोग किया जाता है। यह स्पष्ट है कि समस्या numpy से आता है। क्या यह संभव है कि मेरे पास मल्टीप्रोसेसिंग और न्यूमपी के मेरे संस्करणों के बीच असंगतता हो?

मैं वर्तमान में Python2.7, NumPy 1.6.2 का उपयोग कर रहा है और लिनक्स पर 0.70a1 बहु

+1

यह बहुत अजीब है- यह ओएसएक्स पर पाइथन 2.7 और न्यूपी 1.7 के साथ ठीक काम करता प्रतीत होता है। समय से यह तीन कोरों की तरह दिखता है, लेकिन प्रसंस्करण का समय धीमा हो जाता है- क्या आप इसकी पुष्टि कर सकते हैं? – Daniel

+0

आपके उत्तर के लिए धन्यवाद। मुझे पूरा यकीन है कि गणना केवल 1 कोर पर की जाती है जब मैं NumPy आयात करता हूं (मैंने mpstat (http://linuxcommand.org/man_pages/mpstat1.html) के साथ चेक किया है)। ऐसा प्रतीत होता है कि एक ही कोर एक ही समय में 3 नौकरियों की गणना करता है: इसलिए प्रत्येक नौकरियां ~ 8.5 सेकंड लेती हैं लेकिन कुल समय भी ~ 8.5 सेकंड होता है। – user2660966

+0

मैंने numpy 1.6.1, numpy 1.6.2 और numpy 1.7.1 के साथ प्रयास किया ... एक ही समस्या – user2660966

उत्तर

2

(फर्स्ट पोस्ट खेद अगर यह अच्छी तरह से तैयार नहीं है या alligned)

आप बहु सूत्रण का उपयोग करने के Numpy बंद कर सकते हैं 1

को MKL_NUM_THREADS seting डेबियन के तहत द्वारा मैं प्रयोग किया है:

export MKL_NUM_THREADS=1 

स्रोत संबंधित stackoverflow पद से: Python: How do you stop numpy from multithreading?

परिणाम:

[email protected]:~/tmp$ python multi.py 
CostlyFunc : elapsed time 3.847009 s 
CostlyFunc : elapsed time 3.253226 s 
CostlyFunc : elapsed time 3.415734 s 
Elapsed time (serial) : 10.5163660049 
CostlyFunc : elapsed time 4.218424 s 
CostlyFunc : elapsed time 5.252429 s 
CostlyFunc : elapsed time 4.862513 s 
Elapsed time (multiporcessing) : 9.11713695526 

[email protected]:~/tmp$ export MKL_NUM_THREADS=1 

[email protected]:~/tmp$ python multi.py 
CostlyFunc : elapsed time 3.014677 s 
CostlyFunc : elapsed time 3.102548 s 
CostlyFunc : elapsed time 3.060915 s 
Elapsed time (serial) : 9.17840886116 
CostlyFunc : elapsed time 3.720322 s 
CostlyFunc : elapsed time 3.950583 s 
CostlyFunc : elapsed time 3.656165 s 
Elapsed time (multiporcessing) : 7.399310112 

मुझे लगता है कि अगर मदद करता है, क्योंकि मैं अंत में लगता है कि आप समानांतर में चलाने के लिए हो सकता है अपनी मशीन के लिए numpy के लिए धागे की संख्या को समायोजित करने की कोशिश numpy चाहते यकीन नहीं है।

+0

जो व्यक्ति डाउनवॉटेड है: यदि आप डाउनवोट करते हैं - कृपया टिप्पणी अनुभाग में प्रश्न पूछें और क्यों पूछें। – Jon

1

अपने प्रश्न पर टिप्पणी से, उस लिंक @Ophion नहीं पर एक नजर है, लेकिन मैं के Why does multiprocessing use only a single core after I import numpy? डुप्लीकेट के रूप में यह फ्लैग किया है - 9:06

पर ali_m अगस्त 22 मैं यह देखने के लिए जाँच करेगा आप बीएलएएस के एक अनुकूलित संस्करण का उपयोग कर रहे हैं। मैंने पाया है कि numpy के कुछ सामान्य इंस्टॉल इस lib के संस्करण को वितरित और अनुकूलित नहीं करते हैं। मेरे इंस्टॉल से आप नोट कर सकते हैं कि libf77blas.so, libcblas.so, libatlas.so के लिए अंक हैं। अजगर के साथ से http://docs.scipy.org/doc/numpy/user/install.html

:

यहां निर्देश दिए BLAS की एक अनुकूलित संस्करण के निर्माण के लिए कर रहे हैं

आयात numpy.core._dotblas

>>> numpy.core._dotblas.__file__ 

## output: 

'PYTHONHOME/lib/python2.7/site-packages/numpy/core/_dotblas.so' 

अपने टर्मिनल से:

$ ldd 'PYTHONHOME/lib/python2.7/site-packages/numpy/core/_dotblas.so' 
linux-vdso.so.1 => (0x00007fff241ff000) 
libf77blas.so => /opt/arch/intel/lib/libf77blas.so (0x00007f6050647000) 
libcblas.so => /opt/arch/intel/lib/libcblas.so (0x00007f6050429000) 
libatlas.so => /opt/arch/intel/lib/libatlas.so (0x00007f604fbf1000) 
libpython2.7.so.1.0 => 'PYTHONHOME/lib/libpython2.7.so.1.0 (0x00007f604f817000) 
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f604f5f9000) 
libc.so.6 => /lib64/libc.so.6 (0x00007f604f266000) 
libgfortran.so.3 => /usr/lib64/libgfortran.so.3 (0x00007f604ef74000) 
libm.so.6 => /lib64/libm.so.6 (0x00007f604ecef000) 
libdl.so.2 => /lib64/libdl.so.2 (0x00007f604eaeb000) 
libutil.so.1 => /lib64/libutil.so.1 (0x00007f604e8e8000) 

/lib64/ld-linux-x86-64.so।2 (0x0000003c75e00000)

संबंधित मुद्दे