2014-09-10 4 views
11

के भीतर पाइथन मल्टीप्रोसेसिंग मेरे पास एक पाइथन स्क्रिप्ट है जिसे मैंने मल्टीप्रोसेसिंग मॉड्यूल का उपयोग करके तेजी से निष्पादन के लिए लिखा है। गणना शर्मनाक समानांतर है, इसलिए प्रोसेसर की संख्या के साथ दक्षता स्केल। अब, मैं इसे एमपीआई प्रोग्राम के भीतर उपयोग करना चाहता हूं, जो कई कंप्यूटरों में एमसीएमसी गणना का प्रबंधन करता है। इस कोड में सिस्टम() है जो पाइथन स्क्रिप्ट को आमंत्रित करता है। हालांकि, मुझे लगता है कि जब इसे इस तरह कहा जाता है, तो पाइथन मल्टीप्रोसेसिंग का उपयोग करने से दक्षता लाभ गायब हो जाता है।एमपीई

एमपीआई से बुलाए जाने पर मल्टीप्रोसेसिंग से गति लाभ को बनाए रखने के लिए मैं अपनी पायथन स्क्रिप्ट कैसे प्राप्त कर सकता हूं?

यहां एक साधारण उदाहरण है, जो कि अधिक जटिल कोडों के समान है जो मैं उपयोग करना चाहता हूं लेकिन समान सामान्य व्यवहार प्रदर्शित करता है। मैं 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% सीपीयू का उपयोग किया जाता है। इसके अलावा, अगर आप सुझाव देने जा रहे थे धारावाहिक में पायथन लिपि चला रहा है और इसे और अधिक नोड्स पर कॉल कर रहा है ... एमसीएमसी गणना में एक निश्चित संख्या में श्रृंखला शामिल होती है जिसे सिंक्रनाइज़ तरीके से स्थानांतरित करने की आवश्यकता होती है, इसलिए दुर्भाग्य से गणना को इस तरह से पुनर्गठित नहीं किया जा सकता है।)

उत्तर

8

OpenMPI's mpirun, v1.7 and later, कोर को प्रक्रियाओं को बाध्य करने के लिए डिफ़ॉल्ट - यानी, जब यह पाइथन junk.py प्रक्रिया को लॉन्च करता है, तो यह इसे कोर पर बांधता है कि यह चालू होगा। यह ठीक है, और अधिकांश एमपीआई उपयोग मामलों के लिए सही डिफ़ॉल्ट व्यवहार। लेकिन यहां प्रत्येक एमपीआई कार्य तब अधिक प्रक्रियाओं (मल्टीप्रोसेसिंग पैकेज के माध्यम से) को फोर्क कर रहा है, और उन फोर्कड प्रक्रियाओं को उनके माता-पिता की बाध्यकारी स्थिति प्राप्त होती है - इसलिए वे सभी एक ही कोर से बंधे होते हैं, जो स्वयं के बीच लड़ते हैं। (शीर्ष पर "पी" कॉलम आपको दिखाएगा कि वे सभी एक ही प्रोसेसर पर हैं)

यदि आप mpirun -np 2 हैं, तो आपको तीन प्रक्रियाओं के दो सेट मिलेंगे, प्रत्येक एक अलग कोर पर, प्रत्येक के बीच प्रत्येक खुद को।

openmpi साथ

, आप, बंधन को बंद करके इस से बच सकते हैं

mpirun -np 1 --bind-to none junk.py 

या कुछ अन्य बाध्यकारी जो दिया अपनी दौड़ के अंतिम ज्यामिति समझ में आता है चुनने। एमपीआईसी similar options with hydra है।

ध्यान दें कि एमपीआई isn't always safe or supported के साथ उपप्रोसेसेस का फोर्क() आईएनजी, विशेष रूप से इन्फिनिबैंड इंटरकनेक्ट्स के साथ चलने वाले क्लस्टर के साथ, लेकिन ओपनएमपीआई के मिप्रून/एमपीपीएक्स आपको चेतावनी देगा कि यह सुरक्षित नहीं है।

+0

तो उत्तर स्क्रिप्ट में मल्टीप्रोसेसिंग को बंद करना है? – Cmag

+1

क्षमा करें, किस भाग का उत्तर? किसी के साथ लॉन्च करना सीपीयू समस्या से बच जाएगा।कांटा के साथ मुद्दे के रूप में, ओपनएमपीआई के mpirun/mpiexec आपको बताएगा कि क्या आप परिस्थितियों में चल रहे हैं जहां फोर्क-आईएनजी सुरक्षित नहीं है, और जब आप उत्पन्न होते हैं तो आप उस समस्या से निपट सकते हैं। –

+0

मैंने सरल समाधान और मेरे असली कोड दोनों के साथ इस समाधान कार्यों की पुष्टि की है। बहुत बहुत धन्यवाद! मैं अनुमान लगा रहा हूं कि ओपंपी संस्करण 1.7 में बाध्यकारी विकल्पों के साथ mpirun के इस व्यवहार को बदल दिया गया है, अन्यथा मैं नहीं देख सकता कि मैंने पहले से चलाए गए कुछ कोड क्यों काम करेंगे। –