यह दस्तावेज़ उन उपयोगकर्ताओं के लिए है जिन्हें TensorFlow के विभिन्न संस्करणों (या तो कोड या डेटा के लिए) में बैकवर्ड संगतता की आवश्यकता है, और उन डेवलपर्स के लिए जो संगतता को बनाए रखते हुए TensorFlow को संशोधित करना चाहते हैं।
सिमेंटिक संस्करण 2.0
TensorFlow अपने सार्वजनिक एपीआई के लिए सिमेंटिक वर्जनिंग 2.0 ( सेम्वर ) का अनुसरण करता है। TensorFlow के प्रत्येक रिलीज़ संस्करण का फ़ॉर्म MAJOR.MINOR.PATCH
है। उदाहरण के लिए, TensorFlow संस्करण 1.2.3 में MAJOR
संस्करण 1, MINOR
संस्करण 2 और PATCH
संस्करण 3 है। प्रत्येक संख्या में परिवर्तन के निम्नलिखित अर्थ हैं:
प्रमुख : संभावित रूप से पीछे की ओर असंगत परिवर्तन। पिछली प्रमुख रिलीज़ के साथ काम करने वाला कोड और डेटा आवश्यक रूप से नई रिलीज़ के साथ काम नहीं करेगा। हालाँकि, कुछ मामलों में मौजूदा TensorFlow ग्राफ़ और चेकपॉइंट नई रिलीज़ में स्थानांतरित हो सकते हैं; डेटा संगतता पर विवरण के लिए ग्राफ़ और चेकपॉइंट की संगतता देखें।
माइनर : बैकवर्ड संगत सुविधाएँ, गति में सुधार, आदि। कोड और डेटा जो पिछली छोटी रिलीज़ के साथ काम करते थे और जो केवल गैर-प्रयोगात्मक सार्वजनिक एपीआई पर निर्भर करते हैं, अपरिवर्तित काम करना जारी रखेंगे। सार्वजनिक एपीआई क्या है और क्या नहीं है, इसके विवरण के लिए , क्या शामिल है देखें।
पैच : पश्चगामी संगत बग समाधान।
उदाहरण के लिए, रिलीज़ 1.0.0 ने रिलीज़ 0.12.1 से पीछे की ओर असंगत परिवर्तन प्रस्तुत किए। हालाँकि, रिलीज़ 1.1.1, रिलीज़ 1.0.0 के साथ पीछे की ओर संगत था।
क्या ढका हुआ है
केवल TensorFlow के सार्वजनिक API छोटे और पैच संस्करणों में पश्चगामी संगत हैं। सार्वजनिक एपीआई से मिलकर बनता है
tensorflow
मॉड्यूल और उसके सबमॉड्यूल में सभी प्रलेखित पायथन फ़ंक्शंस और कक्षाएं, को छोड़कर- निजी प्रतीक: कोई भी फ़ंक्शन, वर्ग, आदि, जिसका नाम
_
से शुरू होता है - प्रायोगिक और
tf.contrib
प्रतीक, विवरण के लिए नीचे देखें।
ध्यान दें कि
examples/
औरtools/
निर्देशिकाओं में कोडtensorflow
पायथन मॉड्यूल के माध्यम से पहुंच योग्य नहीं है और इस प्रकार संगतता गारंटी द्वारा कवर नहीं किया गया है।यदि कोई प्रतीक
tensorflow
पायथन मॉड्यूल या उसके सबमॉड्यूल के माध्यम से उपलब्ध है, लेकिन दस्तावेजीकृत नहीं है, तो इसे सार्वजनिक एपीआई का हिस्सा नहीं माना जाता है।- निजी प्रतीक: कोई भी फ़ंक्शन, वर्ग, आदि, जिसका नाम
अनुकूलता एपीआई (पायथन में,
tf.compat
मॉड्यूल)। प्रमुख संस्करणों में, हम उपयोगकर्ताओं को नए प्रमुख संस्करण में परिवर्तन में मदद करने के लिए उपयोगिताएँ और अतिरिक्त समापन बिंदु जारी कर सकते हैं। ये एपीआई प्रतीक अप्रचलित हैं और समर्थित नहीं हैं (यानी, हम कोई सुविधाएँ नहीं जोड़ेंगे, और हम कमजोरियों को ठीक करने के अलावा अन्य बग को ठीक नहीं करेंगे), लेकिन वे हमारी संगतता गारंटी के अंतर्गत आते हैं।टेंसरफ्लो सी एपीआई:
निम्नलिखित प्रोटोकॉल बफ़र फ़ाइलें:
TensorFlow Lite के लिए अलग संस्करण संख्या
वर्तमान में TensorFlow Lite को TensorFlow के एक भाग के रूप में वितरित किया जाता है। हालाँकि, हम भविष्य में अन्य TensorFlow API की तुलना में एक अलग शेड्यूल पर TensorFlow Lite API में परिवर्तन जारी करने का अधिकार सुरक्षित रखते हैं, या यहां तक कि TensorFlow Lite को एक अलग स्रोत वितरण और/या TensorFlow की तुलना में एक अलग स्रोत रिपॉजिटरी में स्थानांतरित करने का अधिकार सुरक्षित रखते हैं।
इस वजह से, हम TensorFlow Lite ( tensorflow/lite/version.h
में TFLITE_VERSION_STRING
, और tensorflow/lite/c/c_api.h
में TfLiteVersion()
) के लिए TensorFlow ( tensorflow/core/public/version.h
में TF_VERSION_STRING
) की तुलना में एक अलग संस्करण संख्या का उपयोग करते हैं। tensorflow/core/public/version.h
, और TF_Version()
tensorflow/c/c_api.h
में)। वर्तमान में, इन दोनों संस्करण संख्याओं का मान समान है। लेकिन भविष्य में, वे अलग हो सकते हैं; उदाहरण के लिए, हम TensorFlow लाइट के लिए प्रमुख संस्करण संख्या बढ़ा सकते हैं, TensorFlow के लिए प्रमुख संस्करण संख्या बढ़ाए बिना, या इसके विपरीत।
TensorFlow Lite संस्करण संख्या द्वारा कवर की गई API सतह में निम्नलिखित सार्वजनिक API शामिल हैं:
टेंसरफ्लो लाइट सी एपीआई:
टेन्सरफ्लो लाइट एंड्रॉइड (जावा/कोटलिन) एपीआई:
-
org.tensorflow.lite
में: -
org.tensorflow.lite.gpu
में:
-
टेन्सरफ्लो लाइट ऑब्जेक्टिव-सी एपीआई:
- टेंसरफ्लो/लाइट/ओबीजेसी/एपिस/
- TFLCoreMLDelegate.h
- TFLDelegate.h
- TFLइंटरप्रेटर.एच
- TFLInterpreterOptions.h
- TFLMetalDelegate.h
- TFLQuantizationParameters.h
- TFLSignatureRunner.h
- TFLTensorFlowLite.h
- TFLTensor.h
- टेंसरफ्लो/लाइट/ओबीजेसी/एपिस/
TensorFlow लाइट स्विफ्ट एपीआई:
- टेंसरफ्लो/लाइट/स्विफ्ट/स्रोत/ ।
- CoreMLDelegate.स्विफ्ट
- प्रतिनिधि.स्विफ्ट
- इंटरप्रेटर एरर.स्विफ्ट
- दुभाषिया.स्विफ्ट
- मेटलडेलीगेट.स्विफ्ट
- मॉडल.स्विफ्ट
- क्वांटिज़ेशनपैरामीटर.स्विफ्ट
- सिग्नेचर रनर एरर.स्विफ्ट
- सिग्नेचर रनर.स्विफ्ट
- TensorFlowLite.स्विफ्ट
- टेंसर.स्विफ्ट
- टेंसरफ्लो/लाइट/स्विफ्ट/स्रोत/ ।
प्रायोगिक प्रतीकों को शामिल नहीं किया गया है; विवरण के लिए नीचे देखें.
TensorFlow Lite एक्सटेंशन API के लिए अलग संस्करण संख्या
TensorFlow Lite, TensorFlow Lite दुभाषिया को "कस्टम ऑप्स" के साथ विस्तारित करने के लिए C API प्रदान करता है, जो एक ग्राफ़, या "डेलीगेट्स" में उपयोगकर्ता-परिभाषित संचालन प्रदान करता है, जो एक ग्राफ़ (या ग्राफ़ के सबसेट के लिए) के लिए गणना को सौंपने की अनुमति देता है। एक कस्टम बैकएंड. ये एपीआई, जिन्हें हम सामूहिक रूप से "टेंसरफ्लो लाइट एक्सटेंशन एपीआई" कहते हैं, को टेन्सरफ्लो लाइट कार्यान्वयन के कुछ विवरणों पर अधिक गहन निर्भरता की आवश्यकता होती है।
हम भविष्य में इन एपीआई में परिवर्तन जारी करने का अधिकार सुरक्षित रखते हैं, जिसमें संभावित रूप से गैर-बैकवर्ड-संगत परिवर्तन भी शामिल हैं, अन्य टेन्सरफ्लो लाइट एपीआई की तुलना में एक अलग शेड्यूल पर। इसलिए हम TensorFlow Lite एक्सटेंशन API के लिए TensorFlow Lite या TensorFlow के संस्करण संख्याओं (जो पिछले अनुभाग में वर्णित थे) की तुलना में एक अलग संस्करण संख्या का उपयोग करते हैं। हम TensorFlow Lite एक्सटेंशन API संस्करण ( tensorflow/lite/version.h
में TFLITE_EXTENSION_APIS_VERSION_STRING
, और tensorflow/lite/c/c_api.h
में TfLiteExtensionApisVersion()) प्राप्त करने के लिए TensorFlow Lite संस्करण 2.15 में कुछ नए API पेश कर रहे हैं। TensorFlow Lite एक्सटेंशन API की संस्करण संख्या वर्तमान में TensorFlow और TensorFlow Lite की संस्करण संख्या के समान है। लेकिन भविष्य में, वे अलग हो सकते हैं; उदाहरण के लिए, हम TensorFlow Lite एक्सटेंशन API के लिए प्रमुख संस्करण संख्या बढ़ा सकते हैं, TensorFlow Lite के लिए प्रमुख संस्करण संख्या बढ़ाए बिना, या इसके विपरीत।
TensorFlow Lite एक्सटेंशन API संस्करण संख्या द्वारा कवर की गई API सतह में निम्नलिखित सार्वजनिक API शामिल हैं:
- टेंसरफ़्लो/लाइट/c/c_api_opaque.h
- टेंसरफ्लो/लाइट/सी/कॉमन.एच
- टेंसरफ्लो/लाइट/सी/बिल्टिन_ओपी_डेटा.एच
- टेंसरफ़्लो/लाइट/बिल्टिन_ऑप्स.एच
फिर, प्रायोगिक प्रतीकों को शामिल नहीं किया गया है; विवरण के लिए नीचे देखें.
क्या कवर नहीं किया गया है
TensorFlow के कुछ भाग किसी भी समय पिछड़े असंगत तरीकों से बदल सकते हैं। इसमे शामिल है:
प्रायोगिक एपीआई : विकास को सुविधाजनक बनाने के लिए, हम स्पष्ट रूप से प्रयोगात्मक के रूप में चिह्नित कुछ एपीआई प्रतीकों को संगतता गारंटी से छूट देते हैं। विशेष रूप से, निम्नलिखित किसी भी अनुकूलता गारंटी के अंतर्गत नहीं आते हैं:
-
tf.contrib
मॉड्यूल या उसके सबमॉड्यूल में कोई प्रतीक; - कोई भी प्रतीक (मॉड्यूल, फ़ंक्शन, तर्क, संपत्ति, वर्ग, स्थिरांक, प्रकार, पैकेज, आदि) जिसके नाम में
experimental
याExperimental
शामिल है; या - कोई भी प्रतीक जिसके पूर्णतः योग्य नाम में एक मॉड्यूल या वर्ग या पैकेज शामिल है जो स्वयं प्रयोगात्मक है। इसमें
experimental
कहे जाने वाले किसी भी प्रोटोकॉल बफ़र के फ़ील्ड और उपसंदेश शामिल हैं।
-
अन्य भाषाएँ : Python और C के अलावा अन्य भाषाओं में TensorFlow API, जैसे:
- C++ (
tensorflow/cc/
में हेडर फ़ाइलों के माध्यम से उजागर)। - जावा ,
- जाना
- जावास्क्रिप्ट
और विशेष रूप से जावा/कोटलिन, सी, ऑब्जेक्टिव-सी और स्विफ्ट के अलावा अन्य भाषाओं में टेन्सरफ्लो लाइट एपीआई
- C++ (
tensorflow/lite/
में हेडर फ़ाइलों के माध्यम से उजागर)
- C++ (
समग्र ऑप्स का विवरण: पायथन में कई सार्वजनिक फ़ंक्शन ग्राफ़ में कई आदिम ऑप्स तक विस्तारित होते हैं, और ये विवरण
GraphDef
एस के रूप में डिस्क पर सहेजे गए किसी भी ग्राफ़ का हिस्सा होंगे। छोटी रिलीज़ के लिए ये विवरण बदल सकते हैं। विशेष रूप से, प्रतिगमन परीक्षण जो ग्राफ़ के बीच सटीक मिलान की जांच करते हैं, छोटे रिलीज में टूटने की संभावना है, भले ही ग्राफ़ का व्यवहार अपरिवर्तित होना चाहिए और मौजूदा चेकपॉइंट अभी भी काम करेंगे।फ़्लोटिंग पॉइंट संख्यात्मक विवरण: ऑप्स द्वारा गणना किए गए विशिष्ट फ़्लोटिंग पॉइंट मान किसी भी समय बदल सकते हैं। उपयोगकर्ताओं को केवल अनुमानित सटीकता और संख्यात्मक स्थिरता पर भरोसा करना चाहिए, गणना की गई विशिष्ट बिट्स पर नहीं। छोटे और पैच रिलीज़ में संख्यात्मक फ़ार्मुलों में परिवर्तन के परिणामस्वरूप तुलनीय या बेहतर सटीकता होनी चाहिए, इस चेतावनी के साथ कि मशीन लर्निंग में विशिष्ट फ़ार्मुलों की बेहतर सटीकता के परिणामस्वरूप समग्र प्रणाली के लिए सटीकता में कमी आ सकती है।
यादृच्छिक संख्याएँ: गणना की गई विशिष्ट यादृच्छिक संख्याएँ किसी भी समय बदल सकती हैं। उपयोगकर्ताओं को केवल लगभग सही वितरण और सांख्यिकीय ताकत पर भरोसा करना चाहिए, न कि गणना की गई विशिष्ट बिट्स पर। विवरण के लिए यादृच्छिक संख्या निर्माण मार्गदर्शिका देखें।
वितरित Tensorflow में संस्करण तिरछा: एक ही क्लस्टर में TensorFlow के दो अलग-अलग संस्करण चलाना असमर्थित है। वायर प्रोटोकॉल की पश्चगामी संगतता के बारे में कोई गारंटी नहीं है।
बग्स: यदि वर्तमान कार्यान्वयन स्पष्ट रूप से टूटा हुआ है, यानी, यदि यह दस्तावेज़ीकरण का खंडन करता है या यदि एक प्रसिद्ध और अच्छी तरह से परिभाषित इच्छित व्यवहार को उचित रूप से कार्यान्वित नहीं किया जाता है तो हम पिछड़े असंगत व्यवहार (हालांकि एपीआई नहीं) में परिवर्तन करने का अधिकार सुरक्षित रखते हैं एक बग के लिए. उदाहरण के लिए, यदि कोई ऑप्टिमाइज़र एक प्रसिद्ध ऑप्टिमाइज़ेशन एल्गोरिदम को लागू करने का दावा करता है लेकिन बग के कारण उस एल्गोरिदम से मेल नहीं खाता है, तो हम ऑप्टिमाइज़र को ठीक कर देंगे। हमारा समाधान अभिसरण के लिए गलत व्यवहार के आधार पर कोड को तोड़ सकता है। हम रिलीज़ नोट्स में ऐसे बदलावों को नोट करेंगे।
अप्रयुक्त एपीआई: हम उन एपीआई में पीछे की ओर असंगत परिवर्तन करने का अधिकार सुरक्षित रखते हैं जिनके लिए हमें कोई दस्तावेजी उपयोग नहीं मिलता है (गिटहब खोज के माध्यम से टेन्सरफ्लो उपयोग का ऑडिट करके)। ऐसा कोई भी बदलाव करने से पहले, हम अनाउंस@मेलिंग सूची में बदलाव करने के अपने इरादे की घोषणा करेंगे, किसी भी टूट-फूट (यदि लागू हो) को संबोधित करने के निर्देश प्रदान करेंगे, और अपने समुदाय को अपनी प्रतिक्रिया साझा करने का मौका देने के लिए दो सप्ताह तक प्रतीक्षा करेंगे। .
त्रुटि व्यवहार: हम त्रुटियों को गैर-त्रुटि व्यवहार से बदल सकते हैं। उदाहरण के लिए, हम किसी त्रुटि को बढ़ाने के बजाय परिणाम की गणना करने के लिए फ़ंक्शन को बदल सकते हैं, भले ही वह त्रुटि दस्तावेजित हो। हम त्रुटि संदेशों के पाठ को बदलने का अधिकार भी सुरक्षित रखते हैं। इसके अलावा, त्रुटि का प्रकार तब तक बदल सकता है जब तक कि दस्तावेज़ में किसी विशिष्ट त्रुटि स्थिति के लिए अपवाद प्रकार निर्दिष्ट न किया गया हो।
सेव्डमॉडल, ग्राफ़ और चेकप्वाइंट की संगतता
SavedModel, TensorFlow प्रोग्राम में उपयोग करने के लिए पसंदीदा क्रमांकन प्रारूप है। सेव्डमॉडल में दो भाग होते हैं: एक या अधिक ग्राफ़ GraphDefs
और एक चेकपॉइंट के रूप में एन्कोड किए गए। ग्राफ़ चलाए जाने वाले ऑप्स के डेटा प्रवाह का वर्णन करते हैं, और चेकपॉइंट्स में ग्राफ़ में चर के सहेजे गए टेंसर मान होते हैं।
कई TensorFlow उपयोगकर्ता SavedModels बनाते हैं, और उन्हें TensorFlow के बाद के रिलीज़ के साथ लोड और निष्पादित करते हैं। सेम्वर के अनुपालन में, TensorFlow के एक संस्करण के साथ लिखे गए SavedModels को उसी प्रमुख रिलीज़ के साथ TensorFlow के बाद के संस्करण के साथ लोड और मूल्यांकन किया जा सकता है।
हम समर्थित SaveModels के लिए अतिरिक्त गारंटी देते हैं। हम एक SavedModel कहते हैं जो TensorFlow प्रमुख संस्करण N
में केवल गैर-पदावनत, गैर-प्रयोगात्मक, गैर-संगतता API का उपयोग करके बनाया गया था, जो संस्करण N
में समर्थित SavedModel है । TensorFlow प्रमुख संस्करण N
में समर्थित किसी भी SaveModel को TensorFlow प्रमुख संस्करण N+1
के साथ लोड और निष्पादित किया जा सकता है। हालाँकि, ऐसे मॉडल को बनाने या संशोधित करने के लिए आवश्यक कार्यक्षमता अब उपलब्ध नहीं हो सकती है, इसलिए यह गारंटी केवल अनमॉडिफाइड सेव्डमॉडल पर लागू होती है।
हम यथासंभव लंबे समय तक बैकवर्ड संगतता को संरक्षित करने का प्रयास करेंगे, ताकि क्रमबद्ध फ़ाइलें लंबे समय तक उपयोग योग्य रहें।
ग्राफ़डेफ़ अनुकूलता
ग्राफ़ को GraphDef
प्रोटोकॉल बफ़र के माध्यम से क्रमबद्ध किया जाता है। ग्राफ़ में पीछे की ओर असंगत परिवर्तनों को सुविधाजनक बनाने के लिए, प्रत्येक GraphDef
में TensorFlow संस्करण से अलग एक संस्करण संख्या होती है। उदाहरण के लिए, GraphDef
संस्करण 17 ने reciprocal
के पक्ष में inv
ऑप को अस्वीकृत कर दिया। शब्दार्थ हैं:
TensorFlow का प्रत्येक संस्करण
GraphDef
संस्करणों के अंतराल का समर्थन करता है। यह अंतराल पैच रिलीज़ के दौरान स्थिर रहेगा, और केवल छोटे रिलीज़ के दौरान बढ़ेगा।GraphDef
संस्करण के लिए समर्थन छोड़ना केवल TensorFlow की एक प्रमुख रिलीज़ के लिए होगा (और केवल SavedModels के लिए गारंटीकृत संस्करण समर्थन के साथ संरेखित होगा)।नए बनाए गए ग्राफ़ को नवीनतम
GraphDef
संस्करण संख्या निर्दिष्ट की गई है।यदि TensorFlow का दिया गया संस्करण ग्राफ़ के
GraphDef
संस्करण का समर्थन करता है, तो यह उसी व्यवहार के साथ लोड और मूल्यांकन करेगा जैसा कि TensorFlow संस्करण ने इसे उत्पन्न करने के लिए उपयोग किया था (फ़्लोटिंग पॉइंट संख्यात्मक विवरण और ऊपर उल्लिखित यादृच्छिक संख्याओं को छोड़कर), प्रमुख की परवाह किए बिना TensorFlow का संस्करण। विशेष रूप से, एक ग्राफ़डिफ़ जो टेन्सरफ्लो के एक संस्करण में चेकपॉइंट फ़ाइल के साथ संगत है (जैसे कि सेव्डमॉडल में मामला है) बाद के संस्करणों में उस चेकपॉइंट के साथ संगत रहेगा, जब तक कि ग्राफ़डिफ़ समर्थित है।ध्यान दें कि यह केवल ग्राफ़डिफ़्स (और सेव्डमॉडल) में क्रमबद्ध ग्राफ़ पर लागू होता है: कोड जो एक चेकपॉइंट पढ़ता है, वह TensorFlow के एक अलग संस्करण को चलाने वाले समान कोड द्वारा उत्पन्न चेकपॉइंट्स को पढ़ने में सक्षम नहीं हो सकता है।
यदि (मामूली) रिलीज़ में
GraphDef
ऊपरी सीमा को एक्स तक बढ़ा दिया जाता है, तो निचली सीमा को एक्स तक बढ़ाने में कम से कम छह महीने लगेंगे। उदाहरण के लिए (हम यहां काल्पनिक संस्करण संख्याओं का उपयोग कर रहे हैं):- TensorFlow 1.2
GraphDef
संस्करण 4 से 7 का समर्थन कर सकता है। - TensorFlow 1.3
GraphDef
संस्करण 8 जोड़ सकता है और संस्करण 4 से 8 का समर्थन कर सकता है। - कम से कम छह महीने बाद, TensorFlow 2.0.0 केवल संस्करण 8 को छोड़कर, संस्करण 4 से 7 के लिए समर्थन बंद कर सकता है।
ध्यान दें कि क्योंकि TensorFlow के प्रमुख संस्करण आमतौर पर 6 महीने से अधिक समय के अंतराल पर प्रकाशित होते हैं, ऊपर वर्णित समर्थित SaveModels की गारंटी GraphDefs के लिए 6 महीने की गारंटी से कहीं अधिक मजबूत है।
- TensorFlow 1.2
अंत में, जब GraphDef
संस्करण के लिए समर्थन हटा दिया जाता है, तो हम ग्राफ़ को नए समर्थित GraphDef
संस्करण में स्वचालित रूप से परिवर्तित करने के लिए उपकरण प्रदान करने का प्रयास करेंगे।
TensorFlow का विस्तार करते समय ग्राफ़ और चेकपॉइंट संगतता
यह अनुभाग केवल GraphDef
प्रारूप में असंगत परिवर्तन करते समय प्रासंगिक है, जैसे ऑप्स जोड़ते समय, ऑप्स हटाते समय, या मौजूदा ऑप्स की कार्यक्षमता को बदलते समय। अधिकांश उपयोगकर्ताओं के लिए पिछला अनुभाग पर्याप्त होना चाहिए।
पीछे और आंशिक रूप से आगे की अनुकूलता
हमारी संस्करण योजना की तीन आवश्यकताएँ हैं:
- TensorFlow के पुराने संस्करणों के साथ बनाए गए लोडिंग ग्राफ़ और चेकपॉइंट का समर्थन करने के लिए बैकवर्ड संगतता ।
- उन परिदृश्यों का समर्थन करने के लिए अग्रेषित संगतता जहां ग्राफ़ या चेकपॉइंट के निर्माता को उपभोक्ता से पहले TensorFlow के नए संस्करण में अपग्रेड किया जाता है।
- TensorFlow को असंगत तरीकों से विकसित करने में सक्षम करें। उदाहरण के लिए, ऑप्स हटाना, विशेषताएँ जोड़ना और विशेषताएँ हटाना।
ध्यान दें कि जबकि GraphDef
संस्करण तंत्र टेन्सरफ़्लो संस्करण से अलग है, GraphDef
प्रारूप में पीछे की ओर असंगत परिवर्तन अभी भी सिमेंटिक वर्जनिंग द्वारा प्रतिबंधित हैं। इसका मतलब है कि कार्यक्षमता को केवल TensorFlow के MAJOR
संस्करणों (जैसे 1.7
से 2.0
) के बीच हटाया या बदला जा सकता है। इसके अतिरिक्त, पैच रिलीज़ (उदाहरण के लिए 1.x.1
से 1.x.2
) के भीतर आगे की अनुकूलता लागू की जाती है।
बैकवर्ड और फॉरवर्ड संगतता प्राप्त करने के लिए और यह जानने के लिए कि प्रारूपों में परिवर्तन कब लागू करना है, ग्राफ़ और चेकपॉइंट्स में मेटाडेटा होता है जो बताता है कि वे कब उत्पादित किए गए थे। नीचे दिए गए अनुभाग TensorFlow कार्यान्वयन और GraphDef
संस्करणों को विकसित करने के लिए दिशानिर्देशों का विवरण देते हैं।
स्वतंत्र डेटा संस्करण योजनाएँ
ग्राफ़ और चेकपॉइंट के लिए अलग-अलग डेटा संस्करण हैं। दोनों डेटा प्रारूप एक-दूसरे से भिन्न दरों पर और TensorFlow से भिन्न दरों पर विकसित होते हैं। दोनों संस्करण प्रणालियाँ core/public/version.h
में परिभाषित हैं। जब भी कोई नया संस्करण जोड़ा जाता है, तो हेडर में एक नोट जोड़ा जाता है जिसमें यह बताया जाता है कि क्या बदलाव हुआ और तारीख क्या है।
डेटा, निर्माता और उपभोक्ता
हम निम्नलिखित प्रकार की डेटा संस्करण जानकारी के बीच अंतर करते हैं:
- उत्पादक : बायनेरिज़ जो डेटा उत्पन्न करते हैं। उत्पादकों के पास एक संस्करण (
producer
) और एक न्यूनतम उपभोक्ता संस्करण होता है जिसके साथ वे संगत होते हैं (min_consumer
)। - उपभोक्ता : बायनेरिज़ जो डेटा का उपभोग करते हैं। उपभोक्ताओं के पास एक संस्करण (
consumer
) और एक न्यूनतम निर्माता संस्करण होता है जिसके साथ वे संगत होते हैं (min_producer
)।
संस्करणित डेटा के प्रत्येक टुकड़े में एक VersionDef versions
फ़ील्ड होता है जो उस producer
रिकॉर्ड करता है जिसने डेटा बनाया है, min_consumer
जिसके साथ यह संगत है, और bad_consumers
संस्करणों की एक सूची है जो अस्वीकृत हैं।
डिफ़ॉल्ट रूप से, जब कोई निर्माता कुछ डेटा बनाता है, तो डेटा निर्माता के producer
और min_consumer
संस्करणों को प्राप्त करता है। यदि विशिष्ट उपभोक्ता संस्करणों में बग होने की जानकारी हो और उन्हें टाला जाना चाहिए तो bad_consumers
सेट किया जा सकता है। यदि निम्नलिखित सभी सत्य हैं तो एक उपभोक्ता डेटा का एक टुकड़ा स्वीकार कर सकता है:
-
consumer
>= डेटा काmin_consumer
- डेटा का
producer
>= उपभोक्ता काmin_producer
-
consumer
डेटा केbad_consumers
में नहीं है
चूँकि निर्माता और उपभोक्ता दोनों एक ही TensorFlow कोड आधार से आते हैं, core/public/version.h
में एक मुख्य डेटा संस्करण होता है जिसे संदर्भ के आधार पर या तो producer
या consumer
के रूप में माना जाता है और min_consumer
और min_producer
दोनों (क्रमशः उत्पादकों और उपभोक्ताओं द्वारा आवश्यक) . विशेष रूप से,
-
GraphDef
संस्करणों के लिए, हमारे पासTF_GRAPH_DEF_VERSION
,TF_GRAPH_DEF_VERSION_MIN_CONSUMER
, औरTF_GRAPH_DEF_VERSION_MIN_PRODUCER
हैं। - चेकपॉइंट संस्करणों के लिए, हमारे पास
TF_CHECKPOINT_VERSION
,TF_CHECKPOINT_VERSION_MIN_CONSUMER
, औरTF_CHECKPOINT_VERSION_MIN_PRODUCER
हैं।
किसी मौजूदा ऑप में डिफ़ॉल्ट के साथ एक नई विशेषता जोड़ें
नीचे दिए गए मार्गदर्शन का पालन करने से आपको आगे की अनुकूलता तभी मिलती है जब ऑप्स का सेट नहीं बदला गया हो:
- यदि आगे की अनुकूलता वांछित है, तो
SavedModelBuilder
वर्ग कीtf.saved_model.SavedModelBuilder.add_meta_graph_and_variables
औरtf.saved_model.SavedModelBuilder.add_meta_graph
विधियों याtf.estimator.Estimator.export_saved_model
का उपयोग करके मॉडल निर्यात करते समयstrip_default_attrs
True
पर सेट करें। - यह मॉडल के उत्पादन/निर्यात के समय डिफ़ॉल्ट मूल्यवान विशेषताओं को हटा देता है। यह सुनिश्चित करता है कि डिफ़ॉल्ट मान का उपयोग करने पर निर्यातित
tf.MetaGraphDef
में नई ऑप-विशेषता शामिल नहीं है। - इस नियंत्रण के होने से पुराने उपभोक्ताओं (उदाहरण के लिए, सेवारत बाइनरी जो प्रशिक्षण बाइनरी से पीछे हैं) को मॉडल लोड करना जारी रखने और मॉडल सेवा में रुकावटों को रोकने की अनुमति मिल सकती है।
ग्राफ़डेफ़ संस्करण विकसित करना
यह अनुभाग बताता है कि GraphDef
प्रारूप में विभिन्न प्रकार के परिवर्तन करने के लिए इस संस्करण तंत्र का उपयोग कैसे करें।
एक ऑप जोड़ें
एक ही समय में उपभोक्ताओं और उत्पादकों दोनों के लिए नया ऑप जोड़ें, और GraphDef
संस्करण को न बदलें। इस प्रकार का परिवर्तन स्वचालित रूप से बैकवर्ड संगतता है, और आगे की संगतता योजना को प्रभावित नहीं करता है क्योंकि मौजूदा निर्माता स्क्रिप्ट अचानक नई कार्यक्षमता का उपयोग नहीं करेगी।
एक ऑप जोड़ें और इसका उपयोग करने के लिए मौजूदा पायथन रैपर्स को स्विच करें
- नई उपभोक्ता कार्यक्षमता लागू करें और
GraphDef
संस्करण को बढ़ाएँ। - यदि रैपर्स को केवल उन मामलों में नई कार्यक्षमता का उपयोग करना संभव है जो पहले काम नहीं करते थे, तो रैपर्स को अब अपडेट किया जा सकता है।
- नई कार्यक्षमता का उपयोग करने के लिए पायथन रैपर बदलें।
min_consumer
न बढ़ाएं, क्योंकि जो मॉडल इस ऑप का उपयोग नहीं करते हैं उन्हें टूटना नहीं चाहिए।
किसी ऑप की कार्यक्षमता को हटाएँ या प्रतिबंधित करें
- प्रतिबंधित ऑप या कार्यक्षमता का उपयोग न करने के लिए सभी निर्माता स्क्रिप्ट (स्वयं TensorFlow नहीं) को ठीक करें।
-
GraphDef
संस्करण को बढ़ाएं और नई उपभोक्ता कार्यक्षमता लागू करें जो नए संस्करण और उससे ऊपर ग्राफ़डिफ़्स के लिए हटाए गए ऑप या कार्यक्षमता पर प्रतिबंध लगाती है। यदि संभव हो, तो TensorFlow को प्रतिबंधित कार्यक्षमता के साथGraphDefs
उत्पादन बंद कर दें। ऐसा करने के लिए,REGISTER_OP(...).Deprecated(deprecated_at_version, message)
जोड़ें। - पश्चगामी संगतता उद्देश्यों के लिए एक प्रमुख रिलीज़ की प्रतीक्षा करें।
- (2) से
min_producer
GraphDef संस्करण में बढ़ाएं और कार्यक्षमता को पूरी तरह से हटा दें।
किसी ऑप की कार्यक्षमता बदलें
-
SomethingV2
या इससे मिलता-जुलता नाम का एक नया समान ऑप जोड़ें और इसे जोड़ने और मौजूदा पायथन रैपर्स को इसका उपयोग करने के लिए स्विच करने की प्रक्रिया से गुजरें। आगे की अनुकूलता सुनिश्चित करने के लिए पायथन रैपर बदलते समय compat.py में सुझाए गए चेक का उपयोग करें। - पुराने ऑप को हटा दें (पिछली संगतता के कारण केवल प्रमुख संस्करण परिवर्तन के साथ ही ऐसा हो सकता है)।
- पुराने ऑप वाले उपभोक्ताओं को बाहर करने के लिए
min_consumer
बढ़ाएँ, पुराने ऑप कोSomethingV2
के उपनाम के रूप में वापस जोड़ें, और इसका उपयोग करने के लिए मौजूदा पायथन रैपर्स को स्विच करने की प्रक्रिया से गुजरें। -
SomethingV2
हटाने की प्रक्रिया से गुजरें।
एकल असुरक्षित उपभोक्ता संस्करण पर प्रतिबंध लगाएं
-
GraphDef
संस्करण को टक्कर दें और सभी नए ग्राफ़डिफ़्स के लिए ख़राब संस्करण कोbad_consumers
में जोड़ें। यदि संभव हो, तो केवल GraphDefs के लिएbad_consumers
में जोड़ें जिसमें एक निश्चित ऑप या समान शामिल हो। - यदि मौजूदा उपभोक्ताओं के पास ख़राब संस्करण है, तो उन्हें यथाशीघ्र बाहर कर दें।