यह दस्तावेज़ बताता है कि सेवा के लिए नए (संस्करणों के) मॉडल या डेटा की खोज के लिए विभिन्न भंडारण प्रणालियों की निगरानी के लिए टेन्सरफ्लो सर्विंग का विस्तार कैसे किया जाए। विशेष रूप से, इसमें एक मॉड्यूल बनाने और उपयोग करने का तरीका शामिल है जो नए उप-पथों की उपस्थिति के लिए स्टोरेज सिस्टम पथ की निगरानी करता है, जहां प्रत्येक उप-पथ लोड करने के लिए एक नए सर्व करने योग्य संस्करण का प्रतिनिधित्व करता है। उस प्रकार के मॉड्यूल को Source<StoragePath>
कहा जाता है, क्योंकि यह StoragePath
प्रकार की वस्तुओं को उत्सर्जित करता है ( string
में टाइप किया गया)। इसे एक SourceAdapter
के साथ बनाया जा सकता है जो स्रोत द्वारा खोजे गए दिए गए पथ से एक सर्व करने योग्य Loader
बनाता है।
सबसे पहले, व्यापकता के बारे में एक नोट
सर्व करने योग्य डेटा के लिए हैंडल के रूप में पथों का उपयोग करना आवश्यक नहीं है; यह केवल सिस्टम में सर्वेबल्स को शामिल करने का एक तरीका दिखाता है। भले ही आपका वातावरण पथों में सर्व करने योग्य डेटा को समाहित नहीं करता है, यह दस्तावेज़ आपको मुख्य सार से परिचित कराएगा। आपके पास आपके वातावरण के अनुकूल प्रकारों के लिए Source<T>
और SourceAdapter<T1, T2>
मॉड्यूल बनाने का विकल्प है (उदाहरण के लिए आरपीसी या पब/उप संदेश, डेटाबेस रिकॉर्ड), या बस एक मोनोलिथिक Source<std::unique_ptr<Loader>>
बनाने का विकल्प है। Source<std::unique_ptr<Loader>>
जो सीधे सर्व करने योग्य लोडर उत्सर्जित करता है।
बेशक, आपका स्रोत किसी भी प्रकार का डेटा उत्सर्जित करता है (चाहे वह POSIX पथ, Google क्लाउड स्टोरेज पथ, या RPC हैंडल हो), ऐसे मॉड्यूल की आवश्यकता होती है जो उसके आधार पर सर्वेबल्स को लोड करने में सक्षम हों। ऐसे मॉड्यूल को SourceAdapters
कहा जाता है। एक कस्टम बनाना कस्टम सर्व करने योग्य दस्तावेज़ में वर्णित है। TensorFlow सर्विंग, TensorFlow द्वारा समर्थित फ़ाइल सिस्टम में पथों के आधार पर TensorFlow सत्रों को इंस्टेंट करने के लिए एक के साथ आती है। कोई भी RandomAccessFile
एब्स्ट्रैक्शन ( tensorflow/core/public/env.h
) का विस्तार करके TensorFlow में अतिरिक्त फ़ाइल सिस्टम के लिए समर्थन जोड़ सकता है।
यह दस्तावेज़ एक ऐसा स्रोत बनाने पर केंद्रित है जो TensorFlow-समर्थित फ़ाइल सिस्टम में पथ उत्सर्जित करता है। यह TensorFlow मॉडल की सेवा के लिए पहले से मौजूद मॉड्यूल के साथ अपने स्रोत का उपयोग करने के तरीके के साथ समाप्त होता है।
अपना स्रोत बनाना
हमारे पास एक Source<StoragePath>
का संदर्भ कार्यान्वयन है, जिसे FileSystemStoragePathSource
कहा जाता है ( sources/storage_path/file_system_storage_path_source*
पर)। FileSystemStoragePathSource
एक विशेष फ़ाइल सिस्टम पथ की निगरानी करता है, संख्यात्मक उप-निर्देशिकाओं पर नज़र रखता है, और इनमें से नवीनतम को उस संस्करण के रूप में रिपोर्ट करता है जिसे वह लोड करना चाहता है। यह दस्तावेज़ FileSystemStoragePathSource
के मुख्य पहलुओं पर चलता है। आपको FileSystemStoragePathSource
की एक प्रति बनाना और फिर अपनी आवश्यकताओं के अनुरूप इसे संशोधित करना सुविधाजनक लग सकता है।
सबसे पहले, FileSystemStoragePathSource
, Source<StoragePath>
एपीआई को लागू करता है, जो कि Source<T>
एपीआई की एक विशेषज्ञता है, जिसमें StoragePath
से जुड़ा T
। एपीआई में एक एकल विधि SetAspiredVersionsCallback()
शामिल है, जो एक क्लोजर प्रदान करती है जिसे स्रोत यह संचार करने के लिए लागू कर सकता है कि वह लोड किए जाने वाले सर्व करने योग्य संस्करणों का एक विशेष सेट चाहता है।
FileSystemStoragePathSource
बहुत सरल तरीके से आकांक्षी-संस्करण कॉलबैक का उपयोग करता है: यह समय-समय पर फ़ाइल सिस्टम का निरीक्षण करता है (अनिवार्य रूप से ls
कर रहा है), और यदि इसे एक या अधिक पथ मिलते हैं जो सर्व करने योग्य संस्करणों की तरह दिखते हैं तो यह निर्धारित करता है कि कौन सा नवीनतम संस्करण है और आह्वान करता है आकार एक की सूची के साथ कॉलबैक जिसमें केवल वह संस्करण शामिल है (डिफ़ॉल्ट कॉन्फ़िगरेशन के तहत)। इसलिए, किसी भी समय FileSystemStoragePathSource
अधिकतम एक सर्व करने योग्य लोड करने का अनुरोध करता है, और इसका कार्यान्वयन स्वयं को स्टेटलेस रखने के लिए कॉलबैक की निष्क्रियता का लाभ उठाता है (समान तर्कों के साथ कॉलबैक को बार-बार लागू करने में कोई नुकसान नहीं है)।
FileSystemStoragePathSource
में एक स्थिर आरंभीकरण फ़ैक्टरी ( Create()
विधि) है, जो कॉन्फ़िगरेशन प्रोटोकॉल संदेश लेता है। कॉन्फ़िगरेशन संदेश में मॉनिटर के लिए आधार पथ और मॉनिटरिंग अंतराल जैसे विवरण शामिल हैं। इसमें उत्सर्जित होने वाली सर्व करने योग्य स्ट्रीम का नाम भी शामिल है। (वैकल्पिक दृष्टिकोण गहरी निर्देशिका पदानुक्रम के अवलोकन के आधार पर कई सर्व करने योग्य धाराओं को उत्सर्जित करने के लिए बेस पथ से सर्व करने योग्य स्ट्रीम नाम निकाल सकते हैं; वे वेरिएंट संदर्भ कार्यान्वयन के दायरे से परे हैं।)
कार्यान्वयन के बड़े हिस्से में एक थ्रेड शामिल होता है जो समय-समय पर फ़ाइल सिस्टम की जांच करता है, साथ ही किसी भी संख्यात्मक उप-पथ को पहचानने और क्रमबद्ध करने के लिए कुछ तर्क भी देता है। थ्रेड को SetAspiredVersionsCallback()
के अंदर लॉन्च किया गया है ( Create()
में नहीं) क्योंकि यही वह बिंदु है जहां स्रोत को "शुरू" होना चाहिए और जानता है कि आकांक्षी-संस्करण अनुरोध कहां भेजना है।
TensorFlow सत्र लोड करने के लिए अपने स्रोत का उपयोग करना
आप संभवतः अपने नए स्रोत मॉड्यूल का उपयोग SavedModelBundleSourceAdapter
( servables/tensorflow/saved_model_bundle_source_adapter*
) के साथ करना चाहेंगे, जो आपके स्रोत द्वारा उत्सर्जित प्रत्येक पथ को TensorFlow निर्यात के रूप में व्याख्या करेगा, और प्रत्येक पथ को TensorFlow SavedModelBundle
सर्व करने योग्य लोडर में परिवर्तित करेगा। आप संभवतः SavedModelBundle
एडाप्टर को AspiredVersionsManager
में प्लग करेंगे, जो वास्तव में सर्वेबल्स को लोड करने और परोसने का ख्याल रखता है। एक कार्यशील सर्वर लाइब्रेरी प्राप्त करने के लिए इन तीन प्रकार के मॉड्यूल को एक साथ जोड़ने का एक अच्छा उदाहरण servables/tensorflow/simple_servers.cc
में पाया जाता है। यहां मुख्य कोड प्रवाह का विवरण दिया गया है (खराब त्रुटि प्रबंधन के साथ; वास्तविक कोड अधिक सावधान रहना चाहिए):
सबसे पहले, एक प्रबंधक बनाएँ:
std::unique_ptr<AspiredVersionsManager> manager = ...;
फिर, एक SavedModelBundle
स्रोत एडाप्टर बनाएं और इसे प्रबंधक में प्लग करें:
std::unique_ptr<SavedModelBundleSourceAdapter> bundle_adapter;
SavedModelBundleSourceAdapterConfig config;
// ... populate 'config' with TensorFlow options.
TF_CHECK_OK(SavedModelBundleSourceAdapter::Create(config, &bundle_adapter));
ConnectSourceToTarget(bundle_adapter.get(), manager.get());
अंत में, अपना पथ स्रोत बनाएं और इसे SavedModelBundle
एडाप्टर में प्लग करें:
auto your_source = new YourPathSource(...);
ConnectSourceToTarget(your_source, bundle_adapter.get());
ConnectSourceToTarget()
फ़ंक्शन ( core/target.h
में परिभाषित) किसी Source<T>
को Target<T>
से कनेक्ट करने के लिए केवल SetAspiredVersionsCallback()
को आमंत्रित करता है ( Target
एक मॉड्यूल है जो एस्पायर्ड-वर्जन अनुरोधों को पकड़ता है, यानी एक एडॉप्टर या मैनेजर ).