2012-09-02 16 views
8

मैं एक छोटे तंत्रिका नेटवर्क का विकास कर रहा हूं जिसके पैरामीटर को बहुत अनुकूलन की आवश्यकता है, इसलिए बहुत सारे प्रोसेसिंग समय हैं। मैंने cProfile के साथ अपनी स्क्रिप्ट प्रोफाइल की है और प्रोसेसर समय का 80% क्या होता है NumPy dot फ़ंक्शन, शेष numpy.linalg.solve फ़ंक्शन के साथ मैट्रिक्स उलटा है। numpy का मेरा वर्तमान संस्करण blas का उपयोग करता है, या ऐसा लगता है, क्योंकि numpy.core._dotblas.dot उस कार्य के रूप में प्रकट होता है जो प्रसंस्करण के कुल समय का 80% लेता है।पायथन में मैट्रिक्स गुणा को कैसे बढ़ाया जाए?

चूंकि यह मेरे तंत्रिका नेटवर्क का मूल है और क्योंकि मुझे इसे बहुत अधिक चलाने की ज़रूरत है, तो कोई मामूली गति लाभ मुझे कई बार दोहराए गए पैरामीटर अनुकूलन पर बहुत समय बचा सकता है।

अधिक सटीक: मैट्रिक्स गुणा मैट्रिक्स पर है जिसमें कम से कम 100 * 100 500 * 500 तक का आकार होता है। मेरे पास 12 कोर के साथ एक कंप्यूटर है और समानांतर में विभिन्न तंत्रिका नेटवर्क पैरामीटर ऑप्टिमाइज़ेशन चलाने के लिए अब तक उनका उपयोग करें, लेकिन शायद मैट्रिक्स गुणा समानांतर में किया जा सकता है?

आपके समय के लिए धन्यवाद!

उत्तर:

मैं कुछ दिनों के परीक्षण और स्थापित करने की स्थापना रद्द करने पुस्तकालयों ... यहाँ मैं क्या परीक्षण किया का परिणाम है खर्च: Ubuntu (12.04) के अपने संस्करण पर डिफ़ॉल्ट रूप से और Numpy की respository स्थापित संस्करण, बीएलएएस पुस्तकालय एटीएलएएस पुस्तकालय हैं। मैंने कुछ परीक्षण किए हैं जो विशेष रूप से उन परिचितों पर सुधार को दर्शाते हैं जिनमें मुझे रूचि है, इसलिए इन परिणामों को अंतिम उत्तर के रूप में व्याख्या नहीं किया जाना चाहिए। इन गणनाओं में 500 * 500 और 1000 * 1000 मैट्रिक्स के साथ 55000 पुनरावृत्तियों लूप में एक मैट्रिक्स गुणा (डॉट उत्पाद) शामिल है। मैं 12 कोर के साथ एक ज़ीऑन X5675 @ 3.07GHZ के साथ एक एचपी जेड 800 वर्कस्टेशन का उपयोग करता हूं। सभी परिणाम (प्रतिशत) वर्णित स्थिति और संदर्भ के बीच तुलना हैं जो यहां पैक किए गए ATLAS लाइब्रेरी हैं।

  • Scipy.sparse module: मैं अगर मैं इसे सही तरीके से सेट नहीं जानता लेकिन एक 10% विरल साथ, इस मॉड्यूल का उपयोग कर OpenBLAS और MKL 1500 * 1500 मैट्रिक्स से शुरू उपयोगी हो जाता है। यदि आपके पास सुझाव है कि उन्हें सही तरीके से कैसे उपयोग किया जाए, तो मुझे रूचि है!
  • ओपनब्लैस के साथ मुझे 500 * 500 मैट्रिक्स के लिए 33% की गति वृद्धि मिली लेकिन 1000 * 1000 के लिए 160%। लेकिन ओपनबीएलएस के साथ, scipy.sparse मॉड्यूल बेहतर प्रदर्शन नहीं करता है लेकिन वास्तव में बदतर है।
  • यहां बड़ा विजेता एमकेएल पुस्तकालय है। मूल एटलस पुस्तकालयों से 1000 * 1000 मैट्रिक्स के साथ त्वरण 230% तक चला जाता है! 500 * 500 मैट्रिक्स के लिए, त्वरण अधिक मामूली (100%) है लेकिन अभी भी बहुत अच्छा है। इसके अलावा ओपनएमपी के साथ संकलन के साथ, मैट्रिक्स गुणाएं मेरे 12 प्रोसेसर पर चल सकती हैं और यहां एमकेएल पुस्तकालयों के साथ एक प्रोसेसर की तुलना में यह दोगुनी तेज है। लेकिन यह प्रसंस्करण शक्ति का अपशिष्ट है, समानांतर में स्क्रिप्ट/मैट्रिक्स-गुणाओं को चलाने के लिए मल्टीप्रोसेसिंग मॉड्यूल का उपयोग करना अधिक कुशल है।

उत्तर

7

आप पहले से ही नहीं कर रहे हैं, तो आप Intel MKL की तरह एक बहुत अनुकूलित BLAS पुस्तकालय के लिए numpy जोड़ने की कोशिश कर सकते हैं (जो free-as-in-beer for non-commercial use या discounted for academic use है, जो जाहिरा तौर पर के रूप में गैर वाणिज्यिक गिनती नहीं करता है; instructions from Intel for using it with numpy) या OpenBLAS (मुक्त -as-इन-भाषण)। Enthought Python Distribution भी है, जो एमकेएल से पहले से जुड़ा हुआ है और शिक्षाविदों के लिए फ्री-इन-इन-बीयर है। यह आपके मैट्रिक्स गुणाओं को स्वचालित रूप से समानांतर कर सकता है और अधिकांश लिनक्स डिस्ट्रोज़ पर सामान्य संदर्भ BLAS/ATLAS स्थापना से कहीं अधिक तेज़ हो सकता है, या जो कुछ भी आप उपयोग कर रहे हैं।

अन्यथा, केवल एक चीज जो मुझे पता है कि आप कर सकते हैं, कुछ गणितीय चालें होंगी जो कि कई गुणाओं/हलकों की गणना नहीं करनी चाहिए।यह जानने के बिना कि आप क्या कर रहे हैं, वहां कोई सुझाव देना मुश्किल है।

मुझे लगता है कि आपकी matrices घने हैं, क्योंकि वे आमतौर पर तंत्रिका जाल में हैं, लेकिन यदि आप कुछ असामान्य कर रहे हैं scipy.sparse भी मदद कर सकता है।

+0

ओपनब्लास एक अच्छा मुफ्त विकल्प है जो चीजों को काफी तेज़ी से बढ़ा सकता है। उदाहरण के लिए अधिकांश लिनक्स सिस्टम पर यह बहुत आसानी से उपलब्ध होना चाहिए। – seberg

+0

मुझे एहसास नहीं हुआ कि एमकेएल मुक्त नहीं है (बीयर में); [ओपनबीएलएस] (http://xianyi.github.com/OpenBLAS/) शायद एक अच्छा विकल्प है। हालांकि, ईपीडी शिक्षाविदों के लिए स्वतंत्र है। – Dougal

+0

मेरा तंत्रिका नेट वास्तव में स्पैस (10% कनेक्टिविटी) है, मुझे 20% की गति मिलती है, जो कि कुछ भी नहीं बल्कि बेहतर है। आप ओपनबीएलएस के बारे में बात करते हैं, क्या यह मेरे वर्तमान संस्करण की तुलना में तेजी से चलता है जो पहले से ही बीएलएएस के संस्करण का उपयोग करता है? – PierreE

4

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

दूसरी तरफ, आप जांच सकते हैं कि आपकी नम्पी और बीएलएएस लाइब्रेरी को आपके आर्किटेक्चर पर यथासंभव कुशलता से संकलित किया गया है या नहीं। उदाहरण के लिए, यदि आप Numpy संकलन पर OpenMP लाइब्रेरी को सक्रिय कर सकते हैं, तो यह डेटा-स्तर समांतरता का उपयोग करके आपकी समस्या पर एकाधिक कोरों को काम करने की अनुमति देगा। यदि आपके कंप्यूटर पर एकाधिक कोर हैं और आपके कंप्यूटेशंस सीपीयू-बाउंड हैं तो यह स्पीडअप का एक महत्वपूर्ण स्रोत हो सकता है। यदि आपकी तरह की समस्या यह अनुमति देती है, तो आप कई कंप्यूटरों पर अपने काम को प्रसारित करने के लिए एक कार्य-आधारित समांतर प्रोग्रामिंग लाइब्रेरी (SCOOP [अस्वीकरण: मैंने इसे लिखा है], Celery इत्यादि) का उपयोग भी कर सकते हैं।

अंतिम उपाय के रूप में, एक और संभावना नई हार्डवेयर खरीदने के लिए होगी। यह सॉफ़्टवेयर को कोड की एक पंक्ति को बदले बिना संभावित रूप से तेज़ी से चलाता है।

+0

धन्यवाद, मैं जांचता हूं कि ब्लैस का कौन सा संस्करण स्थापित है और ओपनएमपी सक्रिय के साथ संकलित करने का प्रयास करें। यह कितना जटिल है? – PierreE

+0

@pierotiste: यह * निक्स-आधारित सिस्टम पर इतना मुश्किल नहीं होना चाहिए। यह Numpy recompiling नए पुस्तकालयों और/या झंडे के साथ जोड़ने जबकि होनी चाहिए। अधिक जानकारी के लिए आपको ब्लॉग या नम्पी मैनुअल के लिए ऑनलाइन जांच करनी चाहिए। पुस्तकालयों आप चुनते हैं पर निर्भर करता है, यह आवश्यक कदम बदल जाता है हो सकता है। – Soravux