TensorFlow RNN को TensorFlow Lite में परिवर्तित करना

अवलोकन

TensorFlow Lite, TensorFlow RNN मॉडल को TensorFlow Lite के फ़्यूज्ड LSTM संचालन में परिवर्तित करने का समर्थन करता है। फ़्यूज़्ड ऑपरेशन उनके अंतर्निहित कर्नेल कार्यान्वयन के प्रदर्शन को अधिकतम करने के लिए मौजूद हैं, साथ ही क्वांटिज़ेशन जैसे जटिल परिवर्तनों को परिभाषित करने के लिए एक उच्च स्तरीय इंटरफ़ेस प्रदान करते हैं।

चूँकि TensorFlow में RNN API के कई प्रकार हैं, इसलिए हमारा दृष्टिकोण दो प्रकार का रहा है:

  1. Keras LSTM जैसे मानक TensorFlow RNN API के लिए मूल समर्थन प्रदान करें। यह अनुशंसित विकल्प है.
  2. प्लग-इन करने और TensorFlow Lite में परिवर्तित होने के लिए उपयोगकर्ता-परिभाषित RNN कार्यान्वयन के लिए रूपांतरण बुनियादी ढांचे में एक इंटरफ़ेस प्रदान करें। हम लिंग्वो के LSTMCellSimple और LayerNormalizedLSTMCellSimple RNN इंटरफेस का उपयोग करके ऐसे रूपांतरण के कुछ आउट ऑफ बॉक्स उदाहरण प्रदान करते हैं।

कनवर्टर एपीआई

यह सुविधा TensorFlow 2.3 रिलीज़ का हिस्सा है। यह टीएफ-नाइटली पिप या हेड से भी उपलब्ध है।

यह रूपांतरण कार्यक्षमता सेव्डमॉडल के माध्यम से या सीधे केरस मॉडल से टेन्सरफ्लो लाइट में परिवर्तित होने पर उपलब्ध होती है। उदाहरण उपयोग देखें.

सहेजे गए मॉडल से

# build a saved model. Here concrete_function is the exported function
# corresponding to the TensorFlow model containing one or more
# Keras LSTM layers.
saved_model, saved_model_dir = build_saved_model_lstm(...)
saved_model.save(saved_model_dir, save_format="tf", signatures=concrete_func)

# Convert the model.
converter = TFLiteConverter.from_saved_model(saved_model_dir)
tflite_model = converter.convert()

केरस मॉडल से

# build a Keras model
keras_model = build_keras_lstm(...)

# Convert the model.
converter = TFLiteConverter.from_keras_model(keras_model)
tflite_model = converter.convert()

उदाहरण

केरस LSTM से लेकर TensorFlow Lite Colab, TensorFlow Lite दुभाषिया के साथ शुरू से अंत तक उपयोग को दर्शाता है।

TensorFlow RNNs API समर्थित

हम Keras LSTM को TensorFlow Lite में आउट-ऑफ़-द-बॉक्स रूपांतरण का समर्थन करते हैं। यह कैसे काम करता है इसके विवरण के लिए कृपया केरस एलएसटीएम इंटरफ़ेस देखें और यहां रूपांतरण तर्क के लिए।

केरस ऑपरेशन परिभाषा के संबंध में टेन्सरफ्लो लाइट के एलएसटीएम अनुबंध को उजागर करना भी महत्वपूर्ण है:

  1. इनपुट टेंसर का आयाम 0 बैच आकार है।
  2. recurrent_weight टेंसर का आयाम 0 आउटपुट की संख्या है।
  3. वजन और आवर्तक_कर्नेल टेंसर स्थानांतरित हो जाते हैं।
  4. ट्रांसपोज़्ड वेट, ट्रांसपोज़्ड रिकरंट_कर्नेल और बायस टेंसर को आयाम 0 के साथ 4 समान आकार के टेंसर में विभाजित किया गया है। ये इनपुट गेट, फ़ॉरगेट गेट, सेल और आउटपुट गेट के अनुरूप हैं।

केरस एलएसटीएम वेरिएंट

समय प्रमुख

उपयोगकर्ता टाइम-मेजर या नो-टाइम-मेजर चुन सकते हैं। केरस एलएसटीएम फ़ंक्शन डीईएफ़ विशेषताओं में एक समय-प्रमुख विशेषता जोड़ता है। यूनिडायरेक्शनल अनुक्रम LSTM के लिए, हम बस unidirecional_sequence_lstm के समय प्रमुख विशेषता को मैप कर सकते हैं।

द्विदिशात्मक LSTM

द्विदिशात्मक LSTM को दो केरस LSTM परतों के साथ कार्यान्वित किया जा सकता है, एक आगे के लिए और एक पीछे के लिए, उदाहरण यहां देखें। एक बार जब हम go_backward विशेषता देखते हैं, तो हम इसे बैकवर्ड LSTM के रूप में पहचानते हैं, फिर हम फॉरवर्ड और बैकवर्ड LSTM को एक साथ समूहित करते हैं। यह भविष्य का काम है. वर्तमान में, यह TensorFlow Lite मॉडल में दो UnidirectionalSequenceLSTM ऑपरेशन बनाता है।

उपयोगकर्ता-परिभाषित LSTM रूपांतरण उदाहरण

TensorFlow Lite उपयोगकर्ता परिभाषित LSTM कार्यान्वयन को परिवर्तित करने का एक तरीका भी प्रदान करता है। यहां हम लिंगवो के एलएसटीएम का उपयोग एक उदाहरण के रूप में करते हैं कि इसे कैसे कार्यान्वित किया जा सकता है। विवरण के लिए कृपया यहां lingvo.LSTMCellSimple इंटरफ़ेस और रूपांतरण तर्क देखें। हम यहां lingvo.LayerNormalizedLSTMCellSimple इंटरफ़ेस और इसके रूपांतरण तर्क में लिंगवो की अन्य LSTM परिभाषाओं का एक उदाहरण भी प्रदान करते हैं।

TensorFlow Lite पर "अपना खुद का TensorFlow RNN लाएँ"।

यदि किसी उपयोगकर्ता का RNN इंटरफ़ेस मानक समर्थित इंटरफ़ेस से भिन्न है, तो कुछ विकल्प हैं:

विकल्प 1: आरएनएन इंटरफ़ेस को केरस आरएनएन इंटरफ़ेस में अनुकूलित करने के लिए टेन्सरफ़्लो पायथन में एडाप्टर कोड लिखें। इसका मतलब है कि उत्पन्न RNN इंटरफ़ेस के फ़ंक्शन पर tf_implements एनोटेशन के साथ एक tf.function जो कि केरस LSTM परत द्वारा उत्पन्न एनोटेशन के समान है। इसके बाद, Keras LSTM के लिए उपयोग की जाने वाली वही रूपांतरण API काम करेगी।

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

इस तरह के रूपांतरण प्रवाह का एक पूरा उदाहरण लिंग्वो का LSTMCellSimple से TensorFlow Lite रूपांतरण है।

लिंग्वो में LSTMCellSimple को यहां परिभाषित किया गया है। इस LSTM सेल से प्रशिक्षित मॉडल को निम्नानुसार TensorFlow Lite में परिवर्तित किया जा सकता है:

  1. LSTMCellSimple के सभी उपयोगों को tf.function में tf_implements एनोटेशन के साथ लपेटें जिसे इस प्रकार लेबल किया गया है (उदाहरण के लिए lingvo.LSTMCellSimple यहां एक अच्छा एनोटेशन नाम होगा)। सुनिश्चित करें कि उत्पन्न tf.function रूपांतरण कोड में अपेक्षित फ़ंक्शन के इंटरफ़ेस से मेल खाता है। यह एनोटेशन और रूपांतरण कोड जोड़ने वाले मॉडल लेखक के बीच एक अनुबंध है।
  2. TensorFlow Lite फ़्यूज्ड LSTM ऑप रूपांतरण में कस्टम कंपोजिट ऑप को प्लग इन करने के लिए रेडी-कंपोजिट-फंक्शन पास का विस्तार करें। LSTMCellSimple रूपांतरण कोड देखें।

    रूपांतरण अनुबंध:

  3. वजन और प्रक्षेपण टेंसरों को स्थानांतरित किया जाता है।

  4. {इनपुट, आवर्ती} से {सेल, इनपुट गेट, फॉरगेट गेट, आउटपुट गेट} को ट्रांसपोज़्ड वेट टेंसर को काटकर निकाला जाता है।

  5. {बायस} से {सेल, इनपुट गेट, फॉरगेट गेट, आउटपुट गेट} को बायस टेंसर को काटकर निकाला जाता है।

  6. ट्रांसपोज़्ड प्रोजेक्शन टेंसर को काटकर प्रक्षेपण निकाला जाता है।

  7. इसी तरह का रूपांतरण LayerNormalizedLSTMCellSimple के लिए लिखा गया है।

  8. TensorFlow Lite रूपांतरण बुनियादी ढांचे के बाकी हिस्सों, जिसमें परिभाषित सभी MLIR पास के साथ-साथ TensorFlow Lite फ़्लैटबफ़र को अंतिम निर्यात भी शामिल है, का पुन: उपयोग किया जा सकता है।

ज्ञात मुद्दे/सीमाएँ

  1. वर्तमान में केवल स्टेटलेस केरस एलएसटीएम (केरस में डिफ़ॉल्ट व्यवहार) को परिवर्तित करने के लिए समर्थन है। स्टेटफुल केरस LSTM रूपांतरण भविष्य का काम है।
  2. अंतर्निहित स्टेटलेस केरस एलएसटीएम परत का उपयोग करके और उपयोगकर्ता प्रोग्राम में राज्य को स्पष्ट रूप से प्रबंधित करके एक स्टेटफुल केरस एलएसटीएम परत को मॉडल करना अभी भी संभव है। ऐसे TensorFlow प्रोग्राम को अभी भी यहां वर्णित सुविधा का उपयोग करके TensorFlow Lite में परिवर्तित किया जा सकता है।
  3. द्विदिशात्मक LSTM को वर्तमान में TensorFlow Lite में दो UnidirectionalSequenceLSTM संचालन के रूप में तैयार किया गया है। इसे एकल BidirectionalSequenceLSTM ऑप से प्रतिस्थापित किया जाएगा।