2015-06-17 6 views
16

मुझे एक प्रोग्राम को अनुकूलित करने में कठिनाई हो रही है जो कि इसके अधिकांश कार्यों के लिए ad एस conjugateGradientDescent फ़ंक्शन पर निर्भर है।स्वचालित भेदभाव से अधिक प्रदर्शन कैसे प्राप्त करें?

असल में मेरा कोड old papers code का अनुवाद है जो मैटलैब और सी में लिखा गया है। मैंने इसे माप नहीं लिया है, लेकिन यह कोड प्रति सेकंड कई पुनरावृत्तियों पर चल रहा है। मेरा यात्रा प्रति कुछ मिनटों के अंतराल में है ...

कोड इस खजाने में उपलब्ध है:

प्रश्न में कोड का पालन करके चलाया जा सकता है ये आदेश:

$ cd aer-utils 
$ cabal sandbox init 
$ cabal sandbox add-source ../aer 
$ cabal run learngabors 

जीएचसी का उपयोग करना सुविधाओं की रूपरेखा रहा है मैं पुष्टि की है कि वंश हिस्सा है कि समय के सबसे अधिक लेने वास्तव में है:

Flamegraph of one iteration

(इंटरैक्टिव संस्करण यहाँ: https://dl.dropboxusercontent.com/u/2359191/learngabors.svg)

-s मुझे बता रहा है कि उत्पादकता काफी है कम:

Productivity 33.6% of total user, 33.6% of total elapsed 

मैं दो चीजें हैं जो उच्च प्रदर्शन को जन्म दे सकता देखते हैं क्या इकट्ठे हुए हैं से:

  • अनबॉक्सिंग: वर्तमान में मैं कस्टम मैट्रिक्स कार्यान्वयन (src/Data/SimpleMat.hs में) का उपयोग करता हूं। मैट्रिस के साथ काम करने के लिए यह एकमात्र तरीका था जिसे मैं ad प्राप्त कर सकता था (देखें: How to do automatic differentiation on hmatrix?)। मेरा अनुमान है कि newtype Mat w h a = Mat (Unboxed.Vector a) जैसे मैट्रिक्स प्रकार का उपयोग करके अनबॉक्सिंग और संलयन के कारण बेहतर प्रदर्शन प्राप्त होगा। मुझे some code मिला है जिसमें ad अनबॉक्स किए गए वैक्टर के लिए उदाहरण हैं, लेकिन अब तक मैं इन्हें conjugateGradientFunction के साथ उपयोग करने में सक्षम नहीं हूं।

  • मैट्रिक्स डेरिवेटिव: एक ईमेल मैं बस पल एडवर्ड कहा गया है कि यह Forward उदाहरणों से भरा मैट्रिक्स के बजाय मैट्रिक्स प्रकार के लिए Forward उदाहरणों का उपयोग करने के बेहतर होगा पर नहीं मिल सकते हैं। मुझे यह पता चल गया है कि इसे कैसे प्राप्त किया जाए, लेकिन अभी तक यह पता लगाना है कि मैं इसे ad एस प्रकार वर्गों के संदर्भ में कैसे कार्यान्वित करता हूं।

यह शायद एक सवाल है कि बहुत विस्तृत इतने पर जवाब देना, इसलिए यदि आप मुझे यहाँ मदद करने के लिए तैयार हैं, Github पर मुझसे संपर्क करने के लिए स्वतंत्र महसूस होती है।

+0

दर्शकों के लिए प्रश्न: क्या कैबल रन हुड के नीचे रनहास्केल की तरह कुछ उपयोग करता है, यानी समस्या का हिस्सा है कि इस कोड को संकलित करने के बजाय व्याख्या किया जा रहा है? –

+1

@ जॉनएफ.मिलर 'कैबल रन' संकलित कोड चलाता है। जीएचसीआई (यानी उपयोग ': मुख्य') से एक ही चीज़ चलाना भी धीमा है। – fho

उत्तर

3

आप वर्तमान ad लाइब्रेरी के लिए सबसे खराब स्थिति परिदृश्य में भाग रहे हैं।

FWIW- आप "मैट्रिक्स/वेक्टर विज्ञापन" के साथ मौजूदा ad कक्षाओं/प्रकारों का उपयोग करने में सक्षम नहीं होंगे।यह एक काफी बड़े इंजीनियरिंग प्रयास होगा https://github.com/ekmett/ad/issues/2

के रूप में देखने के कारण है कि आप Unbox नहीं कर सकते हैं: conjugateGradientKahn मोड या अपने कार्यों पर आगे मोड के दो स्तर उपयोग करने की क्षमता की आवश्यकता है। पूर्व इसे अनबॉक्स किए गए वैक्टरों के साथ काम करने से रोकता है, क्योंकि डेटा प्रकार सिंटैक्स पेड़ लेते हैं, और इन्हें अनबॉक्स नहीं किया जा सकता है। विभिन्न तकनीकी कारणों से मुझे यह पता नहीं लगाया गया है कि इसे मानक Reverse मोड जैसे निश्चित आकार के 'टेप' के साथ कैसे काम करना है।

मुझे लगता है कि यहां "दाएं" उत्तर हमारे लिए बैठना है और यह पता लगाने के लिए है कि मैट्रिक्स/वेक्टर एडी को सही तरीके से कैसे प्राप्त किया जाए और पैकेज में एकीकृत किया जाए, लेकिन मैं कबूल करता हूं कि मुझे अभी थोड़ा सा समय देने के लिए थोड़ा सा समय दिया गया है यह ध्यान देने योग्य है।

यदि आपको irc.freenode.net पर # हैकेल-लेंस द्वारा स्विंग करने का मौका मिलता है तो मुझे इस जगह में डिज़ाइनों के बारे में बात करने और सलाह देने में खुशी होगी। एलेक्स लैंग भी ad पर बहुत काम कर रहा है और अक्सर वहां मौजूद होता है और विचार हो सकते हैं।

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