2014-05-21 5 views
5

क्या हमारे पास थानो में numpy.max(X, axis=None) के संस्करण की एक GPU त्वरित है। मैंने प्रलेखन में देखा और theano.tensor.max(X, axis=None) पाया, लेकिन यह numpy कार्यान्वयन से 4-5 गुना धीमी है।क्या हैनो में एक GPU त्वरित numpy.max (एक्स, अक्ष = 0) कार्यान्वयन है?

मैं आपको आश्वस्त कर सकता हूं, यह मैट्रिक्स आकार की कुछ खराब पसंद के कारण धीमा नहीं है। Theano.tensor.exp के नीचे समान मैट्रिक्स इसके numpy समकक्ष से 40 गुना तेज है।

कोई सुझाव?

उत्तर

5

पिछले जवाब आंशिक है। सुझाव काम नहीं करना चाहिए, क्योंकि आसपास के काम को अंतिम संकलित कोड में उपयोग किया जाता है। अनुकूलन है जो इस परिवर्तन को स्वचालित रूप से करेगा।

प्रश्न का शीर्षक सामग्री के समान नहीं है। वे धुरी तर्क से भिन्न होते हैं। मैं दोनों सवालों का जवाब दूंगा।

यदि अक्ष 0 है या कोई नहीं है तो हम मैट्रिक्स के लिए उस ऑपरेशन के लिए GPU पर इसका समर्थन करते हैं। यदि धुरी कोई नहीं है, तो हमारे पास बुनियादी कार्यान्वयन है जो अच्छी तरह अनुकूल नहीं है क्योंकि समानांतर करना मुश्किल है। यदि धुरी 0 है, तो हमारे पास बुनियादी कार्यान्वयन है, लेकिन यह तेज़ है क्योंकि समानांतर करना आसान है।

इसके अलावा, आपने अपना समय कैसे किया? यदि आप केवल उस ऑपरेशन के साथ एक फ़ंक्शन करते हैं और डिवाइस की तुलना करने के लिए डिवाइस = जीपीयू झंडे के माध्यम से इसका परीक्षण करते हैं, तो इसमें सीपीयू और जीपीयू के बीच स्थानांतरण समय शामिल होगा। यह एक मेमोरी बाध्य ऑपरेशन है, इसलिए यदि आप अपने टाइममिंग में स्थानांतरण शामिल करते हैं, तो व्यक्तिगत रूप से मुझे उस मामले के लिए कोई स्पीड ऑप की उम्मीद नहीं है। केवल जीपीयू ऑपरेशन देखने के लिए, थानो प्रोफाइलर का उपयोग करें: Theano flag profile = True के साथ चलाएं।

+0

हां, मैं पूरी प्रतिलिपि + गणना कर रहा था। मैं थानो प्रोफाइलर का प्रयास करूंगा। मैं कॉपीिंग ओवरहेड्स सहित अधिकतम (एक्स, अक्ष = 0) 'ऑपरेशन को तेज़ करना चाहता हूं। मुझे लगता है कि किसी भी मैट्रिक्स आकार के लिए इसे प्राप्त करने में सक्षम नहीं है। आपकी क्या सलाह है? – hrs

+2

जैसा कि मैंने जवाब में बताने की कोशिश की, मुझे नहीं लगता कि आप अधिकतम कमी के लिए तेजी से बढ़ने में सक्षम होंगे यदि आप किसी भी प्रणाली के साथ स्थानांतरण समय शामिल करते हैं, न केवल थानो। सीपीयू पर कमी करने के लिए, बाधा स्मृति से पढ़ने है।जीपीयू में स्थानांतरण करना एक धीमी रफ्तार से चल रहा है, फिर सीपीयू कोर द्वारा सीपीयू मेमोरी से पढ़ना। यदि आप जीपीयू की गति चाहते हैं जिसमें स्थानांतरण शामिल है, तो आपको GPU पर अधिक गणना करने की आवश्यकता है। – nouiz

3

max और exp संचालन मौलिक रूप से अलग हैं; exp (और अन्य ऑपरेशंस जैसे sin इत्यादि) एक तत्वपूर्ण ऑपरेशन है जो शर्मनाक रूप से समांतर है, जबकि max को समानांतर प्रोसेसिंग स्कैन एल्गोरिदम की आवश्यकता होती है जो मूल रूप से सरणी पर जोड़ी तुलना के पेड़ का निर्माण करता है। max को गति देना असंभव नहीं है, लेकिन यह exp जितना आसान नहीं है।

वैसे भी, max की theano कार्यान्वयन मूल रूप से निम्नलिखित लाइनों के होते हैं (थेनो/टेन्सर/basic.py में):

try: 
    out = max_and_argmax(x, axis)[0] 
except Exception: 
    out = CAReduce(scal.maximum, axis)(x) 

जहां max_and_argmax कस्टम कोड का एक समूह है कि, मेरी आंखों के लिए, औजार numpy का उपयोग कर अधिकतम + argmax ऑपरेशन, और CAReduce एक सामान्य जीपीयू-त्वरित स्कैन ऑपरेशन है जो फ़ॉलबैक के रूप में उपयोग किया जाता है (जो टिप्पणियों के अनुसार grad आदि का समर्थन नहीं करता है)। आप सीधे वापस आने का उपयोग करके देखें और क्या है कि कुछ इस तरह तेजी से होता है, हो सकता है देख सकते हैं:

from theano.tensor.elemwise import CAReduce 
from theano.scalar import maximum 

def mymax(X, axis=None): 
    CAReduce(maximum, axis)(X) 
+0

यह चीजों को बेहतर बनाने में प्रतीत नहीं होता था, कम से कम प्रदर्शन अब सीपीयू के बराबर है। मैंने बस सुनिश्चित करने के लिए विभिन्न मैट्रिक्स आकारों की कोशिश की। – hrs

+0

संपादित करें: यह मेरे बड़े matrices के लिए अभी भी 4 गुना धीमा है। – hrs

+2

आश्चर्य की बात नहीं है, अधिकतम खोज स्मृति स्मृति है। – tillsten