2012-02-12 10 views
13

मुझे अपने आवेदन के लिए पाइथन मल्टीप्रोसेसिंग या सेलेरी या पीपी का उपयोग करने का निर्णय लेने में कुछ परेशानी हो रही है।क्या अजवाइन स्थानीय प्रणाली पर पाइथन मल्टीप्रोसेसिंग के रूप में कुशल है?

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

मेरा प्रश्न: क्या यह तर्क सही है? और क्या स्थानीय रूप से अजवाइन का उपयोग करने के साथ कोई नकारात्मक (प्रदर्शन) है (यदि यह एकाधिक कोर वाले एक सर्वर को मेरे कार्य को पूरा कर सकता है)? या क्या यह मल्टीप्रोसेसिंग का उपयोग करने और बाद में कुछ और में बढ़ने की सलाह दी जाती है?

धन्यवाद!

पेज। यह एक व्यक्तिगत शिक्षण परियोजना के लिए है, लेकिन शायद मैं एक दिन एक फर्म में डेवलपर के रूप में काम करना चाहता हूं और सीखना चाहता हूं कि पेशेवर कैसे करते हैं।

+0

आपको क्या लगता है कि एकाधिक CPUs आईओ-भारी प्रशंसा में मदद करेंगे? यदि आपका एप्लिकेशन आईओ-बाउंड है तो आपको एकाधिक आईओ चैनल चाहिए, सीपीयू नहीं। –

+0

क्षमा करें गलत शब्द ... यह बहुत सीपीयू गहन है। असल में यह बहुत सारे डेटा इनपुट के साथ एक बड़े रिकर्सन में गणित है। – Lostsoul

+0

वितरित करने के लिए एक अच्छी प्रक्रिया की तरह माना जाता है - उस मामले में, आगे बढ़ें :) क्या आपको गलती सहनशीलता की आवश्यकता है - उदाहरण के लिए, सभी जगहों पर बिखरे हुए स्वयंसेवक कंप्यूटिंग का उपयोग करने की कोशिश कर रहे हैं - या आप बस प्रयोगशाला में कंप्यूटर का उपयोग करना चाहते हैं या क्लस्टर? –

उत्तर

4

मैंने वास्तव में कभी भी सेलरी का उपयोग नहीं किया है, लेकिन मैंने मल्टीप्रोसेसिंग का उपयोग किया है।

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

आप सही हैं कि मल्टीप्रोसेसिंग केवल एक मशीन पर चल सकती है। लेकिन दूसरी तरफ, प्रक्रियाओं के बीच संचार बहुत तेज़ हो सकता है, उदाहरण के लिए साझा स्मृति का उपयोग करके। इसके अलावा यदि आपको बहुत बड़ी मात्रा में डेटा संसाधित करने की आवश्यकता है, तो आप स्थानीय डिस्क से डेटा को आसानी से पढ़ और लिख सकते हैं, और प्रक्रियाओं के बीच बस फ़ाइल नाम पास कर सकते हैं।

मुझे नहीं पता कि सेलेरी कार्य विफलताओं से कितनी अच्छी तरह से निपटेंगे। उदाहरण के लिए, कार्य कभी खत्म नहीं हो सकता है, या क्रैश हो सकता है, या हो सकता है कि आप किसी कार्य को मारने की क्षमता प्राप्त कर सकें यदि यह निश्चित समय सीमा में समाप्त नहीं हुआ हो। मुझे नहीं पता कि इसके लिए समर्थन जोड़ना कितना मुश्किल होगा यदि यह वहां नहीं है।

मल्टीप्रोसेसिंग बॉक्स के बाहर गलती सहनशीलता के साथ नहीं आती है, लेकिन आप इसे बिना किसी परेशानी के स्वयं बना सकते हैं।

+2

मैरीजिंग ओवरहेड की वजह से सेलेरी में वास्तव में मल्टीप्रोसेसिंग का उपयोग करने से अधिक ओवरहेड होता है। सेलेरी किसी भी रूप में कार्य विफलताओं के साथ बहुत अच्छी तरह से काम करता है, यह समय सीमा और भी बहुत कुछ का समर्थन करता है। सेलेरी मल्टीप्रोसेसिंग पूल (celery.concurrency.processes.pool.Pool) का एक बेहतर संस्करण का उपयोग करता है, जो समय सीमा का समर्थन करता है और एक सेवा के रूप में पूल चलाने से संबंधित कई बग को हल करता है (यानी हमेशा के लिए चल रहा है), और शट डाउन से संबंधित बग। कुछ लोग सेलेरी के पूल संस्करण का उपयोग करते हैं। – asksol

+0

कुछ लिंक: http://docs.celeryproject.org/en/latest/userguide/workers.html#time-limits http://docs.celeryproject.org/en/latest/userguide/workers.html#revoking-tasks पूल विकल्प: http://docs.celeryproject.org/en/latest/internals/reference/celery.concurrency.processes.pool.html#celery.concurrency.processes.pool.Pool http://docs.celeryproject.org/ एन/नवीनतम/आंतरिक/संदर्भ/celery.concurrency.processes.pool.html # celery.concurrency.processes.pool.Pool.apply_async – asksol

+2

आप मल्टीप्रोसेसिंग का उपयोग करके मशीनों में भी काम वितरित कर सकते हैं, लेकिन मैं ऐसा करने की अनुशंसा नहीं करता। इसे उत्पादन की गुणवत्ता बनाना संभवतः काफी प्रयास करेगा, और सेलेरी में पहले से ही एक समुदाय है जो इन समस्याओं को हल कर रहा है। – asksol

17

मैंने यह तय करने के लिए अभी एक परीक्षण समाप्त किया है कि multiprocessing.Pool और साझा सरणी पर ओवरहेड के रूप में कितना सेलेरी जोड़ती है। परीक्षण एक (2 9 2, 353, 1652) uint16 सरणी पर wiener फ़िल्टर चलाता है। दोनों संस्करण एक ही चंकिंग का उपयोग करते हैं (मोटे तौर पर: उपलब्ध सीपीयू की संख्या के वर्ग रूट द्वारा 2 9 2,353 आयामों को विभाजित करें)। दो अजवाइन संस्करणों की कोशिश की गई: एक समाधान मसालेदार डेटा भेजता है, दूसरा प्रत्येक कार्यकर्ता में अंतर्निहित डेटा फ़ाइल खोलता है।

परिणाम: मेरे 16 कोर i7 सीपीयू अजवाइन पर लगभग 16s, multiprocessing.Pool साझा एरे के साथ 15s के बारे में लगता है। मुझे यह अंतर आश्चर्यजनक रूप से छोटा लगता है।

ग्रैन्युलरिटी बढ़ने से अंतर स्पष्ट रूप से बढ़ जाता है (अजवाइन को अधिक संदेश पास करना पड़ता है): अजवाइन 15 एस, multiprocessing.Pool 12 लेता है।

ध्यान रखें कि अजवाइन कर्मचारी मेजबान पर पहले ही चल रहे थे जबकि पूल श्रमिकों को प्रत्येक रन पर फोर्क किया गया था।मुझे यकीन है कि कैसे मैं शुरुआत में पूल बहु शुरू के बाद से मैं प्रारंभकर्ता में साझा सरणियों गुजारें सकता नहीं कर रहा हूँ:

with closing(Pool(processes=mp.cpu_count(), initializer=poolinit_gen, initargs=(sourcearrays, resarrays))) as p: 

और केवल resarrays ताला लगा द्वारा संरक्षित हैं।

+1

मैं माप से पूल सेटअप को अलग करने में कामयाब रहा लेकिन इससे लगभग कोई फर्क नहीं पड़ता (जैसा कि अपेक्षित, कांटा सस्ता है)। किसी अन्य डेटासेट (276, 385, 3821) के साथ प्रयास करना: मसालेदार स्थानांतरण 38 के माध्यम से अजवाइन, multiprocessing.Pool 27s। ईमानदारी से मुझे अजवाइन के साथ काम करने के लिए और अधिक आरामदायक लगता है और यह प्रसंस्करण समय हस्तांतरण समय से वास्तव में लंबे समय तक अन्य मशीनों पर प्रसंस्करण का प्रतिनिधि हो सकता है। एक मशीन पर, प्रदर्शन अंतर केवल बड़े डेटासेट के लिए ध्यान देने योग्य हो जाता है। –

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