2013-05-01 11 views
11

मैं IPython.parallel के साथ प्रयोग कर रहा हूं और बस विभिन्न इंजनों पर कई शेल कमांड लॉन्च करना चाहता हूं।IPython.parallel मल्टीकोर का उपयोग नहीं कर रहा है?

सेल 0:

मैं निम्नलिखित नोटबुक है

from IPython.parallel import Client 
client = Client() 
print len(client) 
5 

और आदेशों का शुभारंभ:

सेल 1:

%%px --targets 0 --noblock 
!python server.py 

सेल 2:

%%px --targets 1 --noblock 
!python mincemeat.py 127.0.0.1 

सेल 3:

%%px --targets 2 --noblock 
!python mincemeat.py 127.0.0.1 

यह MapReduce की mincemeat कार्यान्वयन का उपयोग करता है क्या करता है। जब मैं पहली !python mincemeat.py 127.0.0.1 लॉन्च करता हूं तो यह लगभग 100% कोर का उपयोग करता है, फिर जब मैं दूसरा लॉन्च करता हूं तो यह प्रत्येक 50% तक गिर जाता है। मेरे पास मशीन पर 4 कोर (+ आभासी कोर) हैं और टर्मिनल से सीधे लॉन्च करते समय उनका उपयोग कर सकते हैं लेकिन नोटबुक में नहीं।

क्या मुझे कुछ याद आ रही है? मैं एक कोर प्रति !python mincemeat.py 127.0.0.1 कमांड का उपयोग करना चाहता हूं।

संपादित करें:

सेल 1:

%%px --targets 0 --noblock 

a = 0 
for i in xrange(100000): 
    for j in xrange(10000): 
     a += 1 

सेल 2:

%%px --targets 0 --noblock 

a = 0 
for i in xrange(100000): 
    for j in xrange(10000): 
     a += 1 


स्पष्टता के लिए, यहाँ एक और बात यह है कि कई कोर का उपयोग नहीं कर रहा हैमुझे लगता है कि मुझे कुछ याद आ रही है। मेरा मानना ​​है कि उपलब्ध होने पर उन दो कोशिकाओं को एक अलग कोर चलाया जाना चाहिए। हालांकि, यह मामला प्रतीत नहीं होता है। फिर सीपीयू उपयोग से पता चलता है कि वे एक ही कोर साझा करते हैं और इसका 50% उपयोग करते हैं। मैंने गलत क्या किया?

+0

मुझे यकीन नहीं है कि आईपीथॉन का उपयोग करने का बिंदु क्या है।समानांतर, जब आप एक समय में एक मशीन पर सिंगल-लाइन शेल कमांड चला रहे हैं, लेकिन यह असंभव है कि IPython.parallel में आपके उपप्रोसेसेस का कितना कोर उपयोग करने में हस्तक्षेप करने की कोई क्षमता है। ऐसा लगता है कि यदि आप IPython.parallel के बिना यह वही उदाहरण करते हैं (क्योंकि यह केवल तीन एक-पंक्ति शेल कॉल है)? – minrk

+0

हाय @mnirk। Ipython.parallel के बिना कोशिकाएं अवरुद्ध हो रही हैं, यह बहुत कम दिलचस्प है। चीजों को स्पष्ट करने के लिए, मैं अलग-अलग कोरों पर एक प्रक्रिया नहीं चलाना चाहता, बल्कि मैं चाहता हूं कि प्रत्येक प्रक्रिया को एक कोर प्राप्त हो। यही कारण है कि मैं प्रत्येक आदेश को एक अलग लक्ष्य पर आवंटित करता हूं। हालांकि, ऐसा लगता है कि सभी इंजन (लक्ष्य 0 से 4) एक ही कोर पर चल रहे हैं। – zermelozf

+0

मेरा मतलब है कि यह तीन सादे टर्मिनल सत्रों में करता है - यह अभी आप अभी कर रहे हैं, तीन अलग-अलग सत्रों में एकल शेल कमांड चला रहे हैं। आईपीथन वास्तव में बिल्कुल शामिल नहीं है। – minrk

उत्तर

15
चैट चर्चा का

सारांश:

CPU affinity एक विशेष सीपीयू कोर, और यहां मुद्दा यह है करने के लिए एक प्रक्रिया को पिन करने के लिए एक तंत्र है कि कभी कभी आयात करने numpy के रूप में सीपीयू 0, को अजगर प्रक्रियाओं pinning खत्म कर सकते हैं विशेष बीएलएएस पुस्तकालयों के खिलाफ जोड़ने का नतीजा। आप इस सेल चलाकर अपने इंजन के सभी अनपिन कर सकते हैं:

%%px 
import os 
import psutil 
from multiprocessing import cpu_count 

p = psutil.Process(os.getpid()) 
p.set_cpu_affinity(range(cpu_count())) 
print p.get_cpu_affinity() 

कौन सा multiprocessing.cpu_count का उपयोग करता है CPU की संख्या प्राप्त करने, और तब सभी सीपीयू के साथ हर इंजन एकत्रित करती है।

एक आईपीथन नोटबुक exploring the issue

+0

यह बग रिपोर्ट भी देखें https://github.com/ipython/IPython/मुद्दों/840 –

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