2013-01-02 34 views
5

मैं एक वेब अनुप्रयोग (एक पिरामिड पर चल रहा) में एक कस्टम टैगर को शामिल करना चाहता हूं जो मैं विकसित कर रहा हूं। मेरे पास एनएलटीके का उपयोग कर मेरी स्थानीय मशीन पर टैगर ठीक काम कर रहा है, लेकिन मैंने पढ़ा है कि एनएलटीके उत्पादन के लिए अपेक्षाकृत धीमी है।एनएलटीके एक उत्पादन वेब अनुप्रयोग पर

ऐसा लगता है कि टैगर को संग्रहीत करने का मानक तरीका इसे पिक करना है। मेरी मशीन पर, 11.7 एमबी अचार फ़ाइल लोड करने में कुछ सेकंड लगते हैं।

  1. NLTK उत्पादन के लिए भी व्यावहारिक है? क्या मुझे scikit-learn या यहां तक ​​कि महाउट की तरह कुछ देखना चाहिए?

  2. यदि एनएलटीके पर्याप्त है, तो यह सुनिश्चित करने का सबसे अच्छा तरीका क्या है कि यह मेमोरी का सही ढंग से उपयोग करता है आदि?

+1

सबसे पहले, क्या आप पाइथन 2 का उपयोग कर रहे हैं? यदि हां, तो क्या आप 'अचार' या 'सीपीकल' का उपयोग कर रहे हैं? 'CPickle' पर स्विच करना (या पायथन 3 पर, जहां दो कार्यान्वयन एक मॉड्यूल में विलय हो जाते हैं) आपके कुछ सेकंड को कुछ दर्जन मिलियन में बदल सकते हैं। वैकल्पिक रूप से, यदि आपको सभी अनुरोधों के लिए एक ही टैगर का उपयोग करने की आवश्यकता है, तो प्रत्येक अनुरोध के लिए इसे क्यों लोड करें? इसे एक बार लोड करें (या प्रति प्रक्रिया एक बार, या जो कुछ भी मुझे पिरामिड नहीं पता), और फिर इससे कोई फर्क नहीं पड़ता कि यह कितना समय लगता है। – abarnert

+2

उपरोक्त सबूत के लिए, इसे आज़माएं: 'p = cPickle.dumps (रेंज (1250000)); प्रिंट timeit.timeit (lambda: pickle.loads (संख्या), संख्या = 1); प्रिंट timeit.timeit (lambda: cPickle.loads, संख्या = 1) '। मुझे अपने सिस्टम पर 4.9 6 बनाम 0.35 एस मिलते हैं। – abarnert

+0

मैं पाइथन 2 और सामान्य अचार का उपयोग कर रहा हूं। मैं सीपीकल पर एक नज़र डालेगा। हाँ, मैं फ़ाइल को लोड करने का सबसे अच्छा तरीका पूरी तरह से पूरी तरह से सुनिश्चित नहीं था। मुझे पिरामिड – abroekhof

उत्तर

5

मैं text-processing चलाता हूं और इसके NLP APIs से संबंधित है, और यह लगभग 2 दर्जन विभिन्न मसालेदार मॉडल का उपयोग करता है, जो एक Django ऐप (nginx के पीछे बंदूक) द्वारा लोड किया जाता है। मॉडल जितनी जल्दी हो सके लोड हो जाते हैं, और एक बार लोड होने पर, वे स्मृति में रहते हैं। इसका मतलब है कि जब भी मैं बंदूक सर्वर को पुनरारंभ करता हूं, मॉडल के लिए आवश्यक पहले अनुरोधों को लोड होने के लिए कुछ सेकंड इंतजार करना पड़ता है, लेकिन प्रत्येक बाद के अनुरोध को उस मॉडल का उपयोग करना पड़ता है जो पहले से ही रैम में कैश किया गया है। पुनरारंभ केवल तब होता है जब मैं नई सुविधाओं को तैनात करता हूं, जिसमें आम तौर पर मॉडल को अपडेट करना शामिल होता है, इसलिए मुझे उन्हें फिर से लोड करना होगा। इसलिए यदि आप अक्सर कोड परिवर्तन करने की अपेक्षा नहीं करते हैं, और लगातार अनुरोध समय पर मजबूत आवश्यकताएं नहीं हैं, तो आपको शायद एक अलग डिमन की आवश्यकता नहीं है।

आरंभिक लोड समय के अलावा, मुख्य सीमित कारक स्मृति है। मेरे पास वर्तमान में केवल 1 कार्यकर्ता प्रक्रिया है, क्योंकि जब सभी मॉडलों को स्मृति में लोड किया जाता है, तो एक प्रक्रिया में 1 जीबी (वाईएमएमवी, और एक 11 एमबी पिकल फ़ाइल के लिए, आपकी मेमोरी आवश्यकताएं बहुत कम हो सकती हैं)। पहले से लोड किए गए मॉडल के साथ एक व्यक्तिगत अनुरोध को प्रोसेस करना पर्याप्त तेज़ है (आमतौर पर < 50ms) कि मुझे वर्तमान में 1 से अधिक कार्यकर्ता की आवश्यकता नहीं है, और यदि मैंने किया, तो सबसे आसान समाधान अधिक कार्यकर्ता प्रक्रियाओं को चलाने के लिए पर्याप्त रैम जोड़ना है।

यदि आप स्मृति के बारे में चिंतित हैं, तो scikit-learn में देखें, क्योंकि समकक्ष मॉडल एनएलटीके की तुलना में काफी कम स्मृति का उपयोग कर सकते हैं। लेकिन, वे जरूरी तेज़ या अधिक सटीक नहीं हैं।

+0

पूरी तरह से उत्तर के लिए धन्यवाद, यह बहुत उपयोगी है। क्या आप मुझे मॉड्यूल को प्रारंभिकरण पर स्मृति में लोड करने की दिशा में इंगित कर सकते हैं? मैं गुगलिंग "Django कैश", आदि गया है, लेकिन मैं यह सुनिश्चित करना चाहता हूं कि मैं सही सामग्री को देख रहा हूं। – abroekhof

+0

मेरे कुछ मॉड्यूल में, मैं एक खाली निर्देश घोषित करता हूं, और फिर उन कार्यों में जिन्हें मॉडल की आवश्यकता होती है, मैं जांचता हूं कि मॉडल ताना में है या नहीं, और यदि नहीं, तो मैं इसे लोड करने के लिए अचार फ़ाइल नाम के साथ nltk.data.load का उपयोग करता हूं , और निर्देश में एक संदर्भ स्टोर। फिर उस फ़ंक्शन के लिए सभी भावी कॉल पहले से लोड किए गए मॉडल का उपयोग करेंगे। यदि आप तुरंत मॉडल लोड करना चाहते हैं, तो आप इसे मॉड्यूल स्तर पर कर सकते हैं, और बस इसे "mymodel = nltk.data.load ('path/to/model.pickle')" घोषित करें। – Jacob

2

सबसे अच्छा तरीका शुरू हुआ प्रतीक्षा अवधि को कम करने के लिए एक डेमॉन (लगातार सेवा) के रूप में टैगर है कि आपके वेब ऐप्लिकेशन को टैग करने के लिए पाठ के स्निपेट भेजता है चलाने के लिए है। इस तरह आपका टैगर केवल तभी लोड होता है जब सिस्टम बूट हो जाता है और यदि/जब डिमन को पुनरारंभ करने की आवश्यकता होती है।

केवल आप तय कर सकते हैं कि एनएलटीके आपकी आवश्यकताओं के लिए पर्याप्त तेज़ है या नहीं। एक बार टैगर लोड होने के बाद, आपने शायद देखा होगा कि एनएलटीके बिना किसी देरी के टेक्स्ट के कई पृष्ठों को टैग कर सकता है। लेकिन संसाधन खपत और समवर्ती उपयोगकर्ताओं की संख्या चीजों को जटिल कर सकती है।

+0

हां, लोड होने के बाद एनएलटीके की टैगिंग गति पर्याप्त प्रतीत होती है, इसलिए यह एक प्रश्न होगा कि एकाधिक उपयोगकर्ताओं के साथ क्या होता है। डेमन्स मेरे लिए एक बिल्कुल नया क्षेत्र है। क्या इसमें ट्विस्ट या पाइरो और क्यूइंग सिस्टम जैसे कुछ का उपयोग करना शामिल होगा? – abroekhof

+0

आपके ओएस के आधार पर अनगिनत विकल्प हैं, कंकुरेंसी की अपेक्षित स्तर, सीपीयू की संख्या (आपके पास "श्रमिकों का पूल हो सकता है) आदि। जैकब का जवाब एक संभावित सेटअप का वर्णन करता है। – alexis