मैं text-processing चलाता हूं और इसके NLP APIs से संबंधित है, और यह लगभग 2 दर्जन विभिन्न मसालेदार मॉडल का उपयोग करता है, जो एक Django ऐप (nginx के पीछे बंदूक) द्वारा लोड किया जाता है। मॉडल जितनी जल्दी हो सके लोड हो जाते हैं, और एक बार लोड होने पर, वे स्मृति में रहते हैं। इसका मतलब है कि जब भी मैं बंदूक सर्वर को पुनरारंभ करता हूं, मॉडल के लिए आवश्यक पहले अनुरोधों को लोड होने के लिए कुछ सेकंड इंतजार करना पड़ता है, लेकिन प्रत्येक बाद के अनुरोध को उस मॉडल का उपयोग करना पड़ता है जो पहले से ही रैम में कैश किया गया है। पुनरारंभ केवल तब होता है जब मैं नई सुविधाओं को तैनात करता हूं, जिसमें आम तौर पर मॉडल को अपडेट करना शामिल होता है, इसलिए मुझे उन्हें फिर से लोड करना होगा। इसलिए यदि आप अक्सर कोड परिवर्तन करने की अपेक्षा नहीं करते हैं, और लगातार अनुरोध समय पर मजबूत आवश्यकताएं नहीं हैं, तो आपको शायद एक अलग डिमन की आवश्यकता नहीं है।
आरंभिक लोड समय के अलावा, मुख्य सीमित कारक स्मृति है। मेरे पास वर्तमान में केवल 1 कार्यकर्ता प्रक्रिया है, क्योंकि जब सभी मॉडलों को स्मृति में लोड किया जाता है, तो एक प्रक्रिया में 1 जीबी (वाईएमएमवी, और एक 11 एमबी पिकल फ़ाइल के लिए, आपकी मेमोरी आवश्यकताएं बहुत कम हो सकती हैं)। पहले से लोड किए गए मॉडल के साथ एक व्यक्तिगत अनुरोध को प्रोसेस करना पर्याप्त तेज़ है (आमतौर पर < 50ms) कि मुझे वर्तमान में 1 से अधिक कार्यकर्ता की आवश्यकता नहीं है, और यदि मैंने किया, तो सबसे आसान समाधान अधिक कार्यकर्ता प्रक्रियाओं को चलाने के लिए पर्याप्त रैम जोड़ना है।
यदि आप स्मृति के बारे में चिंतित हैं, तो scikit-learn में देखें, क्योंकि समकक्ष मॉडल एनएलटीके की तुलना में काफी कम स्मृति का उपयोग कर सकते हैं। लेकिन, वे जरूरी तेज़ या अधिक सटीक नहीं हैं।
सबसे पहले, क्या आप पाइथन 2 का उपयोग कर रहे हैं? यदि हां, तो क्या आप 'अचार' या 'सीपीकल' का उपयोग कर रहे हैं? 'CPickle' पर स्विच करना (या पायथन 3 पर, जहां दो कार्यान्वयन एक मॉड्यूल में विलय हो जाते हैं) आपके कुछ सेकंड को कुछ दर्जन मिलियन में बदल सकते हैं। वैकल्पिक रूप से, यदि आपको सभी अनुरोधों के लिए एक ही टैगर का उपयोग करने की आवश्यकता है, तो प्रत्येक अनुरोध के लिए इसे क्यों लोड करें? इसे एक बार लोड करें (या प्रति प्रक्रिया एक बार, या जो कुछ भी मुझे पिरामिड नहीं पता), और फिर इससे कोई फर्क नहीं पड़ता कि यह कितना समय लगता है। – abarnert
उपरोक्त सबूत के लिए, इसे आज़माएं: 'p = cPickle.dumps (रेंज (1250000)); प्रिंट timeit.timeit (lambda: pickle.loads (संख्या), संख्या = 1); प्रिंट timeit.timeit (lambda: cPickle.loads, संख्या = 1) '। मुझे अपने सिस्टम पर 4.9 6 बनाम 0.35 एस मिलते हैं। – abarnert
मैं पाइथन 2 और सामान्य अचार का उपयोग कर रहा हूं। मैं सीपीकल पर एक नज़र डालेगा। हाँ, मैं फ़ाइल को लोड करने का सबसे अच्छा तरीका पूरी तरह से पूरी तरह से सुनिश्चित नहीं था। मुझे पिरामिड – abroekhof