2017-05-29 13 views
10

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

मैं predesigned server framework का उपयोग predesigned batching framework के साथ टेन्सफोर्लो सर्विसिंग की प्रारंभिक रिलीज का उपयोग कर रहा हूं। मैं --batching ध्वज का उपयोग करके बैचिंग सक्षम कर रहा हूं और batch_timeout_micros = 10000 और max_batch_size = 1000 सेट किया है। लॉगिंग पुष्टि करता है कि बैचिंग सक्षम है और GPU का उपयोग किया जा रहा है।

हालांकि, सेवा सर्वर पर अनुरोध भेजते समय बैचिंग का न्यूनतम प्रभाव होता है। 5 अनुरोध भेजने के साथ समय के उपयोग के संदर्भ में लगभग 50 अनुरोध भेजकर लगभग रैखिक रूप से स्केल। दिलचस्प बात यह है कि सर्वर के predict() प्रत्येक अनुरोध के लिए एक बार चलाया जाता है (here देखें), जो मुझे बताता है कि बैचिंग को ठीक तरह से संभाला नहीं जा रहा है।

क्या मुझे कुछ याद आ रही है? बैचिंग के साथ क्या गलत है मैं कैसे जांचूं?


ध्यान दें कि यह How to do batching in Tensorflow Serving? से अलग है के रूप में यह सवाल केवल कैसे एक भी क्लाइंट से कई अनुरोध भेजने के लिए की जांच करता है, लेकिन Tensorflow सेवित के परदे के पीछे कई अलग-अलग अनुरोध के लिए बैचिंग सक्षम करने के लिए कैसे नहीं।

उत्तर

4

(मैं सर्वर ढांचे के साथ परिचित नहीं हूँ, लेकिन मैं एचपीसी के साथ और, पुस्तकालयों TF GPU पर अपनी डॉट उत्पादों और convolutions करने के लिए उपयोग करता cuBLAS और cuDNN के साथ काफी परिचित हूँ)

कई मुद्दों कर रहे हैं जो बैच आकार के साथ निराशाजनक प्रदर्शन स्केलिंग का कारण बन सकता है।

आई/ओ भूमि के ऊपर, जिसके द्वारा मैं नेटवर्क स्थानान्तरण, डिस्क एक्सेस (बड़े डेटा के लिए), क्रमबद्धता, अक्रमांकन और इसी तरह के cruft मतलब है। ये चीजें डेटा के आकार में रैखिक होती हैं।

इस ओवरहेड को देखने के लिए, मेरा सुझाव है कि आप 2 मॉडल तैनात करें: एक जिसे आपको वास्तव में चाहिए, और जो छोटा है, लेकिन उसी I/O का उपयोग करता है, फिर एक दूसरे से आवश्यक समय घटाएं।

इस बार अंतर जटिल मॉडल को चलाने के समय के समान होना चाहिए, जब आप सीधे I/O ओवरहेड के बिना इसका उपयोग करते हैं।

यदि बाधाएं I/O में हैं, तो GPU कार्य को तेज करना अपरिहार्य है।

ध्यान दें कि बैच आकार को बढ़ाने से GPU तेज हो जाता है, यह पूरी चीज धीमा कर सकता है, क्योंकि GPU को पूरे बैच के I/O के लिए अभी भी काम करना शुरू करने के लिए इंतजार करना पड़ता है।

cuDNN स्केलिंग: हालात matmul की तरह, बड़े बैच आकार की जरूरत है उनके इष्टतम प्रवाह प्राप्त करने के लिए, लेकिन का उपयोग कर convolutions cuDNN सकता है नहीं (कम से कम यह नहीं मेरा अनुभव रहा है, लेकिन इस संस्करण और GPU मेहराब पर निर्भर कर सकते)

रैम, जीपीयू रैम, या पीसीआई बैंडविड्थ-सीमित मॉडल: यदि आपके मॉडल की बाधा इनमें से किसी में है, तो शायद यह बड़े बैच आकारों से लाभ नहीं उठाएगी।

यह जांचने का तरीका सीधे आपके मॉडल को चलाने के लिए है (शायद नकली इनपुट के साथ), उपरोक्त समय अंतर के समय की तुलना करें और इसे बैच आकार के फ़ंक्शन के रूप में प्लॉट करें।


वैसे, performance guide, एक बात आप NCHW लेआउट का उपयोग कर रहा है, अगर आप पहले से ही नहीं कर रहे हैं की कोशिश कर सकते अनुसार। वहाँ अन्य युक्तियाँ हैं।

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