TensorFlow मॉडल परोसना

यह ट्यूटोरियल आपको दिखाता है कि प्रशिक्षित TensorFlow मॉडल को निर्यात करने के लिए TensorFlow सर्विंग घटकों का उपयोग कैसे करें और इसे परोसने के लिए मानक Tensorflow_model_server का उपयोग करें। यदि आप पहले से ही TensorFlow सर्विंग से परिचित हैं, और आप इस बारे में अधिक जानना चाहते हैं कि सर्वर इंटरनल कैसे काम करता है, तो TensorFlow सर्विंग उन्नत ट्यूटोरियल देखें।

यह ट्यूटोरियल एक सरल सॉफ्टमैक्स रिग्रेशन मॉडल का उपयोग करता है जो हस्तलिखित अंकों को वर्गीकृत करता है। यह फैशन एमएनआईएसटी डेटासेट का उपयोग करके छवि वर्गीकरण पर टेन्सरफ्लो ट्यूटोरियल में पेश किए गए के समान है।

इस ट्यूटोरियल के कोड में दो भाग हैं:

  • एक पायथन फ़ाइल, mnist_saven_model.py , जो मॉडल को प्रशिक्षित और निर्यात करती है।

  • एक मॉडलसर्वर बाइनरी जिसे या तो Apt का उपयोग करके स्थापित किया जा सकता है, या C++ फ़ाइल ( main.cc ) से संकलित किया जा सकता है। TensorFlow सर्विंग मॉडलसर्वर नए निर्यातित मॉडलों की खोज करता है और उनकी सेवा के लिए एक gRPC सेवा चलाता है।

आरंभ करने से पहले, पहले डॉकर इंस्टॉल करें

TensorFlow मॉडल को प्रशिक्षित करें और निर्यात करें

प्रशिक्षण चरण के लिए, TensorFlow ग्राफ को TensorFlow सत्र sess में लॉन्च किया गया है, जिसमें इनपुट टेंसर (छवि) x के रूप में और आउटपुट टेंसर (सॉफ्टमैक्स स्कोर) y के रूप में है।

फिर हम मॉडल को निर्यात करने के लिए TensorFlow के SavedModelBuilder मॉड्यूल का उपयोग करते हैं। SavedModelBuilder प्रशिक्षित मॉडल के "स्नैपशॉट" को विश्वसनीय भंडारण में सहेजता है ताकि इसे बाद में अनुमान के लिए लोड किया जा सके।

SavedModel प्रारूप के विवरण के लिए, कृपया SavedModel README.md पर दस्तावेज़ देखें।

mnist_saven_model.py से, मॉडल को डिस्क पर सहेजने की सामान्य प्रक्रिया को दर्शाने के लिए निम्नलिखित एक संक्षिप्त कोड स्निपेट है।

export_path_base = sys.argv[-1]
export_path = os.path.join(
    tf.compat.as_bytes(export_path_base),
    tf.compat.as_bytes(str(FLAGS.model_version)))
print('Exporting trained model to', export_path)
builder = tf.saved_model.builder.SavedModelBuilder(export_path)
builder.add_meta_graph_and_variables(
    sess, [tf.compat.v1.saved_model.tag_constants.SERVING],
    signature_def_map={
        'predict_images':
            prediction_signature,
        tf.compat.v1.saved_model.signature_constants
            .DEFAULT_SERVING_SIGNATURE_DEF_KEY:
            classification_signature,
    },
    main_op=tf.compat.v1.tables_initializer(),
    strip_default_attrs=True)
builder.save()

SavedModelBuilder.__init__ निम्नलिखित तर्क लेता है:

  • export_path निर्यात निर्देशिका का पथ है।

यदि यह मौजूद नहीं है तो SavedModelBuilder निर्देशिका बनाएगा। उदाहरण में, हम निर्यात निर्देशिका प्राप्त करने के लिए कमांड लाइन तर्क और FLAGS.model_version जोड़ते हैं। FLAGS.model_version मॉडल का संस्करण निर्दिष्ट करता है। आपको उसी मॉडल का नया संस्करण निर्यात करते समय एक बड़ा पूर्णांक मान निर्दिष्ट करना चाहिए। प्रत्येक संस्करण को दिए गए पथ के अंतर्गत एक अलग उप-निर्देशिका में निर्यात किया जाएगा।

आप निम्नलिखित तर्कों के साथ SavedModelBuilder.add_meta_graph_and_variables() का उपयोग करके बिल्डर में मेटा ग्राफ़ और वेरिएबल जोड़ सकते हैं:

  • sess TensorFlow सत्र है जो आपके द्वारा निर्यात किए जा रहे प्रशिक्षित मॉडल को रखता है।

  • tags टैग का सेट है जिसके साथ मेटा ग्राफ़ को सहेजना है। इस मामले में, चूंकि हम सर्विंग में ग्राफ़ का उपयोग करना चाहते हैं, हम पूर्वनिर्धारित सेव्डमॉडल टैग स्थिरांक से serve टैग का उपयोग करते हैं। अधिक विवरण के लिए, tag_constents.py और संबंधित TensorFlow API दस्तावेज़ देखें।

  • signature_def_map मेटा ग्राफ़ में जोड़ने के लिए टेंसरफ्लो::सिग्नेचरडिफ में हस्ताक्षर के लिए उपयोगकर्ता द्वारा प्रदत्त कुंजी का मानचित्र निर्दिष्ट करता है। हस्ताक्षर निर्दिष्ट करता है कि किस प्रकार का मॉडल निर्यात किया जा रहा है, और इनपुट/आउटपुट टेंसर को अनुमान चलाते समय बांधना होगा।

    विशेष हस्ताक्षर कुंजी serving_default डिफ़ॉल्ट सर्विंग हस्ताक्षर निर्दिष्ट करती है। डिफॉल्ट सर्विंग सिग्नेचर डीफ़ कुंजी, हस्ताक्षर से संबंधित अन्य स्थिरांक के साथ, सेव्डमॉडल हस्ताक्षर स्थिरांक के भाग के रूप में परिभाषित की गई है। अधिक विवरण के लिए, signature_constents.py और संबंधित TensorFlow API दस्तावेज़ देखें।

    इसके अलावा, सिग्नेचर डिफ़्स को आसानी से बनाने में मदद करने के लिए, सेव्डमॉडल एपीआई सिग्नेचर डिफ़ यूटिल्स प्रदान करता है .. विशेष रूप से, मूल mnist_saven_model.py फ़ाइल में, हम predict_signature और classification_signature बनाने के लिए signature_def_utils.build_signature_def() उपयोग करते हैं।

    predict_signature कैसे परिभाषित किया जाता है, इसके उदाहरण के रूप में, उपयोगिता निम्नलिखित तर्क लेती है:

    • inputs={'images': tensor_info_x} इनपुट टेंसर जानकारी निर्दिष्ट करता है।

    • outputs={'scores': tensor_info_y} स्कोर टेंसर जानकारी निर्दिष्ट करता है।

    • method_name अनुमान के लिए उपयोग की जाने वाली विधि है। पूर्वानुमान अनुरोधों के लिए, इसे tensorflow/serving/predict पर सेट किया जाना चाहिए। अन्य विधि नामों के लिए, signature_constents.py और संबंधित TensorFlow API दस्तावेज़ देखें।

ध्यान दें कि tensor_info_x और tensor_info_y में यहां परिभाषित tensorflow::TensorInfo प्रोटोकॉल बफ़र की संरचना है। आसानी से टेंसर इन्फोस बनाने के लिए, TensorFlow SavedModel API संबंधित TensorFlow API दस्तावेज़ के साथ utils.py भी प्रदान करता है।

यह भी ध्यान दें कि images और scores टेंसर उपनाम नाम हैं। वे कोई भी अद्वितीय स्ट्रिंग हो सकते हैं जो आप चाहते हैं, और वे टेंसर x और y के तार्किक नाम बन जाएंगे जिन्हें आप बाद में भविष्यवाणी अनुरोध भेजते समय टेंसर बाइंडिंग के लिए संदर्भित करते हैं।

उदाहरण के लिए, यदि x 'long_tensor_name_foo' नाम वाले टेंसर को संदर्भित करता है और y 'जेनरेटेड_टेंसर_नाम_बार' नाम वाले टेंसर को संदर्भित करता है, तो builder टेंसर लॉजिकल नाम को वास्तविक नाम मैपिंग ('images' -> 'long_tensor_name_foo') और ('scores) में संग्रहीत करेगा। ' -> 'जेनरेटेड_टेंसर_नाम_बार')। यह उपयोगकर्ता को अनुमान चलाते समय इन टेंसरों को उनके तार्किक नामों के साथ संदर्भित करने की अनुमति देता है।

चलो इसे चलाओ!

सबसे पहले, यदि आपने अभी तक ऐसा नहीं किया है, तो इस रिपॉजिटरी को अपनी स्थानीय मशीन पर क्लोन करें:

git clone https://github.com/tensorflow/serving.git
cd serving

यदि निर्यात निर्देशिका पहले से मौजूद है तो उसे साफ़ करें:

rm -rf /tmp/mnist

आइए अब मॉडल को प्रशिक्षित करें:

tools/run_in_docker.sh python tensorflow_serving/example/mnist_saved_model.py \
  /tmp/mnist

इसका परिणाम ऐसा आउटपुट होना चाहिए जो इस प्रकार दिखे:

Training model...

...

Done training!
Exporting trained model to models/mnist
Done exporting!

आइए अब निर्यात निर्देशिका पर एक नज़र डालें।

$ ls /tmp/mnist
1

जैसा कि ऊपर बताया गया है, मॉडल के प्रत्येक संस्करण को निर्यात करने के लिए एक उप-निर्देशिका बनाई जाएगी। FLAGS.model_version का डिफ़ॉल्ट मान 1 है, इसलिए संबंधित उप-निर्देशिका 1 बनाई जाती है।

$ ls /tmp/mnist/1
saved_model.pb variables

प्रत्येक संस्करण उप-निर्देशिका में निम्नलिखित फ़ाइलें होती हैं:

  • saved_model.pb क्रमबद्ध टेंसरफ़्लो::सेव्डमॉडल है। इसमें मॉडल की एक या अधिक ग्राफ़ परिभाषाएँ, साथ ही हस्ताक्षर जैसे मॉडल के मेटाडेटा भी शामिल हैं।

  • variables वे फ़ाइलें हैं जिनमें ग्राफ़ के क्रमबद्ध वेरिएबल होते हैं।

इसके साथ, आपका TensorFlow मॉडल निर्यात हो गया है और लोड होने के लिए तैयार है!

निर्यातित मॉडल को मानक TensorFlow मॉडलसर्वर के साथ लोड करें

सर्विंग के लिए मॉडल को आसानी से लोड करने के लिए डॉकर सर्विंग छवि का उपयोग करें:

docker run -p 8500:8500 \
--mount type=bind,source=/tmp/mnist,target=/models/mnist \
-e MODEL_NAME=mnist -t tensorflow/serving &

सर्वर का परीक्षण करें

हम सर्वर का परीक्षण करने के लिए प्रदत्त mnist_client उपयोगिता का उपयोग कर सकते हैं। क्लाइंट एमएनआईएसटी परीक्षण डेटा डाउनलोड करता है, उन्हें सर्वर पर अनुरोध के रूप में भेजता है, और अनुमान त्रुटि दर की गणना करता है।

tools/run_in_docker.sh python tensorflow_serving/example/mnist_client.py \
  --num_tests=1000 --server=127.0.0.1:8500

इसे कुछ इस तरह आउटपुट करना चाहिए

    ...
    Inference error rate: 11.13%

हम प्रशिक्षित सॉफ्टमैक्स मॉडल के लिए लगभग 90% सटीकता की उम्मीद करते हैं और हमें पहले 1000 परीक्षण छवियों के लिए 11% अनुमान त्रुटि दर मिलती है। यह पुष्टि करता है कि सर्वर प्रशिक्षित मॉडल को सफलतापूर्वक लोड और चलाता है!