के भीतर पाइथन मल्टीप्रोसेसिंग मेरे पास एक पाइथन स्क्रिप्ट है जिसे मैंने मल्टीप्रोसेसिंग मॉड्यूल का उपयोग करके तेजी से निष्पादन के लिए लिखा है। गणना शर्मनाक समानांतर है, इसलिए प्रोसेसर की संख्या के साथ दक्षता स्केल। अब, मैं इसे एमपीआई प्रोग्राम के भीतर उपयोग करना चाहता हूं, जो कई कंप्यूटरों में एमसीएमसी गणना का प्रबंधन करता है। इस कोड में सिस्टम() है जो पाइथन स्क्रिप्ट को आमंत्रित करता है। हालांकि, मुझे लगता है कि जब इसे इस तरह कहा जाता है, तो पाइथन मल्टीप्रोसेसिंग का उपयोग करने से दक्षता लाभ गायब हो जाता है।एमपीई
एमपीआई से बुलाए जाने पर मल्टीप्रोसेसिंग से गति लाभ को बनाए रखने के लिए मैं अपनी पायथन स्क्रिप्ट कैसे प्राप्त कर सकता हूं?
यहां एक साधारण उदाहरण है, जो कि अधिक जटिल कोडों के समान है जो मैं उपयोग करना चाहता हूं लेकिन समान सामान्य व्यवहार प्रदर्शित करता है। मैं junk.py नामक एक निष्पादन योग्य पायथन लिपि लिखता हूं।
#!/usr/bin/python
import multiprocessing
import numpy as np
nproc = 3
nlen = 100000
def f(x):
print x
v = np.arange(nlen)
result = 0.
for i, y in enumerate(v):
result += (x+v[i:]).sum()
return result
def foo():
pool = multiprocessing.Pool(processes=nproc)
xlist = range(2,2+nproc)
print xlist
result = pool.map(f, xlist)
print result
if __name__ == '__main__':
foo()
जब मैं अपने आप में खोल से चलाने के लिए, का उपयोग करते हुए "टॉप" मैं तीन अजगर प्रक्रियाओं को एक मेरी 16 कोर मशीन पर CPU की 100% ले जा रहा देख सकते हैं।
node094:mpi[ 206 ] /usr/bin/time junk.py
[2, 3, 4]
2
3
4
[333343333400000.0, 333348333450000.0, 333353333500000.0]
62.68user 0.04system 0:21.11elapsed 297%CPU (0avgtext+0avgdata 16516maxresident)k
0inputs+0outputs (0major+11092minor)pagefaults 0swaps
हालांकि, अगर मैं mpirun के साथ इस आह्वान, प्रत्येक अजगर प्रक्रिया cpu का 33% लेता है, और कुल मिलाकर इसके बारे में तीन बार के रूप में समय लगता है चलाने के लिए। अधिक प्रक्रियाओं में -np 2 या अधिक परिणामों के साथ कॉल करना, लेकिन किसी भी गणना को तेज नहीं करता है।
node094:mpi[ 208 ] /usr/bin/time mpirun -np 1 junk.py
[2, 3, 4]
2
3
4
[333343333400000.0, 333348333450000.0, 333353333500000.0]
61.63user 0.07system 1:01.91elapsed 99%CPU (0avgtext+0avgdata 16520maxresident)k
0inputs+8outputs (0major+13715minor)pagefaults 0swaps
(अतिरिक्त नोट्स:। यह लिनक्स डेबियन संस्करण पर mpirun 1.8.1, अजगर 2.7.3 खरखरा मैंने सुना है प्रणाली() हमेशा एमपीआई कार्यक्रमों के भीतर की अनुमति नहीं है, लेकिन यह मेरे लिए काम कर रहा है इस कंप्यूटर पर पिछले पांच साल। उदाहरण के लिए मैंने एक एमपीआई प्रोग्राम के भीतर सिस्टम() से एक पाथ्रेड-आधारित समानांतर कोड कहा है, और यह वांछित के रूप में प्रत्येक थ्रेड के लिए 100% सीपीयू का उपयोग किया जाता है। इसके अलावा, अगर आप सुझाव देने जा रहे थे धारावाहिक में पायथन लिपि चला रहा है और इसे और अधिक नोड्स पर कॉल कर रहा है ... एमसीएमसी गणना में एक निश्चित संख्या में श्रृंखला शामिल होती है जिसे सिंक्रनाइज़ तरीके से स्थानांतरित करने की आवश्यकता होती है, इसलिए दुर्भाग्य से गणना को इस तरह से पुनर्गठित नहीं किया जा सकता है।)
तो उत्तर स्क्रिप्ट में मल्टीप्रोसेसिंग को बंद करना है? – Cmag
क्षमा करें, किस भाग का उत्तर? किसी के साथ लॉन्च करना सीपीयू समस्या से बच जाएगा।कांटा के साथ मुद्दे के रूप में, ओपनएमपीआई के mpirun/mpiexec आपको बताएगा कि क्या आप परिस्थितियों में चल रहे हैं जहां फोर्क-आईएनजी सुरक्षित नहीं है, और जब आप उत्पन्न होते हैं तो आप उस समस्या से निपट सकते हैं। –
मैंने सरल समाधान और मेरे असली कोड दोनों के साथ इस समाधान कार्यों की पुष्टि की है। बहुत बहुत धन्यवाद! मैं अनुमान लगा रहा हूं कि ओपंपी संस्करण 1.7 में बाध्यकारी विकल्पों के साथ mpirun के इस व्यवहार को बदल दिया गया है, अन्यथा मैं नहीं देख सकता कि मैंने पहले से चलाए गए कुछ कोड क्यों काम करेंगे। –