This page was translated by the Cloud Translation API.
Switch to English

সেভডমোডেল ফর্ম্যাট ব্যবহার করে

টেনসরফ্লো.আর.জে দেখুন গুগল কোলাবে চালান গিটহাবের উত্স দেখুন নোটবুক ডাউনলোড করুন

একটি সেভডমডেলে ওজন এবং গণনা সহ একটি সম্পূর্ণ টেনসরফ্লো প্রোগ্রাম থাকে। এটি চালানোর জন্য মূল মডেল ভবন কোড, যার ফলে এটি ভাগ করা বা মোতায়েন জন্য দরকারী তোলে (সঙ্গে প্রয়োজন হয় না TFLite , TensorFlow.js , TensorFlow পরিবেশন করছে , অথবা TensorFlow হাব )।

এই ডকুমেন্টটি কীভাবে নিম্ন-স্তরের tf.saved_model api ব্যবহার করবেন তার কিছু বিশদ ডাইভ করে:

কেরাস থেকে একটি সেভডমডেল তৈরি করা হচ্ছে

দ্রুত পরিচয়ের জন্য, এই বিভাগটি একটি প্রাক প্রশিক্ষিত কেরাস মডেল রফতানি করে এবং এর সাথে চিত্রের শ্রেণিবিন্যাসের অনুরোধগুলি সরবরাহ করে। গাইডের বাকি অংশ বিশদ পূরণ করবে এবং সেভডমডেলস তৈরির অন্যান্য উপায় নিয়ে আলোচনা করবে।

 import os
import tempfile

from matplotlib import pyplot as plt
import numpy as np
import tensorflow as tf

tmpdir = tempfile.mkdtemp()
 
 physical_devices = tf.config.experimental.list_physical_devices('GPU')
if physical_devices:
  tf.config.experimental.set_memory_growth(physical_devices[0], True)
 
 file = tf.keras.utils.get_file(
    "grace_hopper.jpg",
    "https://storage.googleapis.com/download.tensorflow.org/example_images/grace_hopper.jpg")
img = tf.keras.preprocessing.image.load_img(file, target_size=[224, 224])
plt.imshow(img)
plt.axis('off')
x = tf.keras.preprocessing.image.img_to_array(img)
x = tf.keras.applications.mobilenet.preprocess_input(
    x[tf.newaxis,...])
 
Downloading data from https://storage.googleapis.com/download.tensorflow.org/example_images/grace_hopper.jpg
65536/61306 [================================] - 0s 0us/step

PNG

আমরা চলমান উদাহরণ হিসাবে গ্রেস হপারের একটি চিত্র ব্যবহার করব এবং এটি ব্যবহার করা সহজ হওয়ায় একটি কেরাস প্রাক প্রশিক্ষিত চিত্র শ্রেণিবদ্ধকরণ মডেল ব্যবহার করব। কাস্টম মডেলগুলিও কাজ করে এবং পরে সেগুলি বিস্তারিতভাবে আচ্ছাদিত।

 labels_path = tf.keras.utils.get_file(
    'ImageNetLabels.txt',
    'https://storage.googleapis.com/download.tensorflow.org/data/ImageNetLabels.txt')
imagenet_labels = np.array(open(labels_path).read().splitlines())
 
Downloading data from https://storage.googleapis.com/download.tensorflow.org/data/ImageNetLabels.txt
16384/10484 [==============================================] - 0s 0us/step

 pretrained_model = tf.keras.applications.MobileNet()
result_before_save = pretrained_model(x)

decoded = imagenet_labels[np.argsort(result_before_save)[0,::-1][:5]+1]

print("Result before saving:\n", decoded)
 
Downloading data from https://storage.googleapis.com/tensorflow/keras-applications/mobilenet/mobilenet_1_0_224_tf.h5
17227776/17225924 [==============================] - 1s 0us/step
Result before saving:
 ['military uniform' 'bow tie' 'suit' 'bearskin' 'pickelhaube']

এই চিত্রটির শীর্ষস্থানীয় পূর্বাভাস হ'ল "সামরিক ইউনিফর্ম"।

 mobilenet_save_path = os.path.join(tmpdir, "mobilenet/1/")
tf.saved_model.save(pretrained_model, mobilenet_save_path)
 
WARNING:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.6/site-packages/tensorflow/python/ops/resource_variable_ops.py:1817: calling BaseResourceVariable.__init__ (from tensorflow.python.ops.resource_variable_ops) with constraint is deprecated and will be removed in a future version.
Instructions for updating:
If using Keras pass *_constraint arguments to layers.
INFO:tensorflow:Assets written to: /tmp/tmpmjpd1j0o/mobilenet/1/assets

সেভ-পাথটি টেনসরফ্লো সার্ভিং দ্বারা ব্যবহৃত একটি কনভেনশন অনুসরণ করে যেখানে সর্বশেষ পাথ উপাদান ( 1/ এখানে) আপনার মডেলের জন্য একটি সংস্করণ নম্বর - এটি টেনসরফ্লো পরিবেশনার মতো সরঞ্জামগুলিকে আপেক্ষিক তাজাতা সম্পর্কে যুক্তি দেয় allows

আমরা সেভডমডেল টি পিএফনে লোড করতে পারি tf.saved_model.load এবং অ্যাডমিরাল হপারের চিত্রটি কীভাবে শ্রেণিবদ্ধ করা হয়েছে তা দেখুন।

 loaded = tf.saved_model.load(mobilenet_save_path)
print(list(loaded.signatures.keys()))  # ["serving_default"]
 
['serving_default']

আমদানিকৃত স্বাক্ষর সর্বদা অভিধান ফেরত দেয়। স্বাক্ষরের নাম এবং আউটপুট অভিধান কীগুলি কাস্টমাইজ করতে, রফতানির সময় স্বাক্ষর নির্দিষ্ট করে দেখুন।

 infer = loaded.signatures["serving_default"]
print(infer.structured_outputs)
 
{'predictions': TensorSpec(shape=(None, 1000), dtype=tf.float32, name='predictions')}

সেভডমডেল থেকে অনুমান চালানো মূল মডেলের মতো একই ফলাফল দেয়।

 labeling = infer(tf.constant(x))[pretrained_model.output_names[0]]

decoded = imagenet_labels[np.argsort(labeling)[0,::-1][:5]+1]

print("Result after saving and loading:\n", decoded)
 
Result after saving and loading:
 ['military uniform' 'bow tie' 'suit' 'bearskin' 'pickelhaube']

টেনসরফ্লো পরিবেশনায় একটি সেভডমডেল চালানো

স্যাভডমোডেলগুলি পাইথন থেকে ব্যবহারযোগ্য (আরও নীচে তার উপরে) তবে উত্পাদন পরিবেশগুলি সাধারণত পাইথন কোডটি চালনা না করে অনুক্রমের জন্য একটি ডেডিকেটেড পরিষেবা ব্যবহার করে। টেনসরফ্লো পরিবেশন ব্যবহার করে একটি সেভডমডেল থেকে সেটআপ করা সহজ।

কোনও নোটবইয়ে বা আপনার স্থানীয় মেশিনে tensorflow_model_server ইনস্টল করার নির্দেশাবলী সহ পরিবেশন সম্পর্কে আরও বিশদ জানতে tensorflow_model_server সার্ভিং tensorflow_model_server টিউটোরিয়াল দেখুন। দ্রুত স্কেচ হিসাবে রফতানি হওয়া mobilenet মডেলটি পরিবেশন করতে কেবল স্যাভডমোডেল ডিরেক্টরিতে মডেল সার্ভারটি নির্দেশ করুন:

 nohup tensorflow_model_server \
  --rest_api_port=8501 \
  --model_name=mobilenet \
  --model_base_path="/tmp/mobilenet" >server.log 2>&1
 

তারপরে একটি অনুরোধ প্রেরণ করুন।

 !pip install -q requests
import json
import numpy
import requests
data = json.dumps({"signature_name": "serving_default",
                   "instances": x.tolist()})
headers = {"content-type": "application/json"}
json_response = requests.post('http://localhost:8501/v1/models/mobilenet:predict',
                              data=data, headers=headers)
predictions = numpy.array(json.loads(json_response.text)["predictions"])
 

ফলাফল predictions পাইথন থেকে প্রাপ্ত ফলাফলের মতো।

ডিস্কে সেভডমোডেল বিন্যাস

একটি সেভডমডেল হ'ল ডিরেক্টরি যা ক্রমিকযুক্ত স্বাক্ষর এবং এগুলি চালনার জন্য প্রয়োজনীয় রাষ্ট্র, ভেরিয়েবল মান এবং শব্দভাণ্ডার সহ।

ls {mobilenet_save_path}
assets  saved_model.pb  variables

saved_model.pb ফাইলটি প্রকৃত টেনসরফ্লো প্রোগ্রাম, বা মডেল এবং নামযুক্ত স্বাক্ষরের একটি সেট সংরক্ষণ করে, প্রতিটি এমন একটি ফাংশন সনাক্ত করে যা টেনসর ইনপুট গ্রহণ করে এবং টেনসর আউটপুট উত্পাদন করে।

স্যাভডমোডেলগুলিতে মডেলের একাধিক রূপ থাকতে পারে (একাধিক v1.MetaGraphDefs , v1.MetaGraphDefs --tag_set ফ্ল্যাগের সাহায্যে saved_model_cli তে saved_model_cli ) তবে এটি বিরল। একটি মডেলের একাধিক রূপ তৈরি করে এমন tf.Estimator.experimental_export_all_saved_models মধ্যে রয়েছে tf.Estimator.experimental_export_all_saved_models এবং tf.saved_model.Builder 1.x tf.saved_model.Builder

saved_model_cli show --dir {mobilenet_save_path} --tag_set serve
The given SavedModel MetaGraphDef contains SignatureDefs with the following keys:
SignatureDef key: "__saved_model_init_op"
SignatureDef key: "serving_default"

variables ডিরেক্টরিতে একটি স্ট্যান্ডার্ড প্রশিক্ষণ চেকপয়েন্ট থাকে (প্রশিক্ষণ চেকপয়েন্টগুলির গাইড দেখুন)।

ls {mobilenet_save_path}/variables
variables.data-00000-of-00002  variables.data-00001-of-00002  variables.index

assets ডিরেক্টরিতে টেনসরফ্লো গ্রাফ দ্বারা ব্যবহৃত ফাইল রয়েছে, উদাহরণস্বরূপ শব্দভাণ্ডার সারণী শুরু করার জন্য ব্যবহৃত টেক্সট ফাইলগুলি। এটি এই উদাহরণে অব্যবহৃত।

টেনসরফ্লো গ্রাফটি ব্যবহার না করে যে কোনও ফাইলগুলির জন্য assets.extra একটি সম্পদ assets.extra ডিরেক্টরি থাকতে পারে, উদাহরণস্বরূপ সেভডমোডেলটি কী করবেন সে সম্পর্কে গ্রাহকদের জন্য তথ্য। টেনসরফ্লো নিজেই এই ডিরেক্টরিটি ব্যবহার করে না।

একটি কাস্টম মডেল সংরক্ষণ করা হচ্ছে

tf.saved_model.save tf.Module অবজেক্ট এবং এর সাবক্লাস যেমন tf.keras.Layer এবং tf.keras.Model

আসুন একটি tf.Module সংরক্ষণ এবং পুনরুদ্ধারের উদাহরণ দেখুন।

 class CustomModule(tf.Module):

  def __init__(self):
    super(CustomModule, self).__init__()
    self.v = tf.Variable(1.)

  @tf.function
  def __call__(self, x):
    print('Tracing with', x)
    return x * self.v

  @tf.function(input_signature=[tf.TensorSpec([], tf.float32)])
  def mutate(self, new_v):
    self.v.assign(new_v)

module = CustomModule()
 

আপনি যখন কোনও tf.Variable সংরক্ষণ tf.Module , তখন যেকোনো tf.Variable বৈশিষ্ট্য, tf.function -decorated পদ্ধতি এবং tf.Module এর মাধ্যমে tf.Module গুলি পাওয়া যায়। (এই পুনরাবৃত্তিমূলক ট্র্যাভারসাল সম্পর্কে আরও তথ্যের জন্য চেকপয়েন্ট টিউটোরিয়াল দেখুন)) তবে, কোনও পাইথন বৈশিষ্ট্য, ফাংশন এবং ডেটা হারিয়ে গেছে। এর অর্থ এটি যখন একটি tf.function সংরক্ষণ করা হয়, তখন পাইথন কোড সংরক্ষণ করা হয় না।

যদি কোনও পাইথন কোড সংরক্ষণ না করা হয় তবে সেভডমডেল কীভাবে ফাংশনটি পুনরুদ্ধার করবেন তা জানেন?

সংক্ষেপে, tf.function একটি tf.Graph ( tf.Graph কাছাকাছি কলযোগ্য মোড়ক) তৈরি করার জন্য পাইথন কোড ট্রেস করে কাজ করে। একটি tf.function সংরক্ষণ করার tf.function , আপনি সত্যিই tf.function এর tf.function ক্যাশে সংরক্ষণ করছেন।

tf.function এবং tf.function মধ্যে সম্পর্ক সম্পর্কে আরও জানতে, tf.function গাইড দেখুন

 module_no_signatures_path = os.path.join(tmpdir, 'module_no_signatures')
module(tf.constant(0.))
print('Saving model...')
tf.saved_model.save(module, module_no_signatures_path)
 
Tracing with Tensor("x:0", shape=(), dtype=float32)
Saving model...
Tracing with Tensor("x:0", shape=(), dtype=float32)
INFO:tensorflow:Assets written to: /tmp/tmpmjpd1j0o/module_no_signatures/assets

লোড হচ্ছে এবং একটি কাস্টম মডেল ব্যবহার করছে

আপনি যখন পাইথনে একটি সেভডমোডেল লোড করেন, সমস্ত tf.Variable বৈশিষ্ট্য, tf.function -decorated পদ্ধতি এবং tf.Module গুলি মূল tf.Module হিসাবে একই বস্তু কাঠামোতে পুনরুদ্ধার করা হয়।

 imported = tf.saved_model.load(module_no_signatures_path)
assert imported(tf.constant(3.)).numpy() == 3
imported.mutate(tf.constant(2.))
assert imported(tf.constant(3.)).numpy() == 6
 

যেহেতু পাইথন কোড সংরক্ষণ করা হয়নি, একটি নতুন ইনপুট স্বাক্ষর সহ একটি tf.function কল করা ব্যর্থ হবে:

 imported(tf.constant([3.]))
 
ValueError: Could not find matching function to call for canonicalized inputs ((,), {}). Only existing signatures are [((TensorSpec(shape=(), dtype=tf.float32, name=u'x'),), {})].

বেসিক ফাইন টিউনিং

পরিবর্তনশীল অবজেক্টগুলি উপলভ্য এবং আমরা আমদানি করা ফাংশনগুলির মাধ্যমে ব্যাকপ্রপ করতে পারি। এটি স্যাভডমোডেলটিকে সাধারণ ক্ষেত্রে জরিমানা করার জন্য যথেষ্ট।

 optimizer = tf.optimizers.SGD(0.05)

def train_step():
  with tf.GradientTape() as tape:
    loss = (10. - imported(tf.constant(2.))) ** 2
  variables = tape.watched_variables()
  grads = tape.gradient(loss, variables)
  optimizer.apply_gradients(zip(grads, variables))
  return loss
 
 for _ in range(10):
  # "v" approaches 5, "loss" approaches 0
  print("loss={:.2f} v={:.2f}".format(train_step(), imported.v.numpy()))
 
loss=36.00 v=3.20
loss=12.96 v=3.92
loss=4.67 v=4.35
loss=1.68 v=4.61
loss=0.60 v=4.77
loss=0.22 v=4.86
loss=0.08 v=4.92
loss=0.03 v=4.95
loss=0.01 v=4.97
loss=0.00 v=4.98

সাধারণ সূক্ষ্ম সুরকরণ

কেরাসের একটি সেভডমডেল জরিমানা-সুরকরণের আরও উন্নত ক্ষেত্রে __call__ জন্য সরল __call__ চেয়ে আরও বিশদ সরবরাহ করে। টেনসরফ্লো হাব সূক্ষ্ম-সুরকরণের উদ্দেশ্যে ভাগ করা স্যাভডমোডেলসগুলিতে সেগুলি নিম্নলিখিত প্রয়োগ করার পরামর্শ দিচ্ছে:

  • যদি মডেলটি ড্রপআউট বা অন্য কোনও কৌশল ব্যবহার করে যাতে ফরোয়ার্ড পাস প্রশিক্ষণ এবং অনুমানের মধ্যে পৃথক হয় (যেমন ব্যাচের __call__ ), __call__ পদ্ধতিটি একটি __call__ , পাইথন-মূল্যবান training= যুক্তি গ্রহণ করে যা False ডিফল্ট হয় তবে True সেট করা যেতে পারে।
  • পরবর্তী __call__ গুণ, আছে .variable এবং .trainable_variable ভেরিয়েবল সংশ্লিষ্ট তালিকা সঙ্গে বৈশিষ্ট্যাবলী। একটি পরিবর্তনশীল যা মূলত প্রশিক্ষণযোগ্য ছিল তবে জরিমানা-সুরকরণের সময় হিমায়িত হওয়ার অর্থ .trainable_variables থেকে বাদ দেওয়া হয়েছে।
  • কেরাসের মতো ফ্রেমওয়ার্কের জন্য যা ওজন নিয়মিতকরণগুলিকে স্তর বা উপ-মডেলের বৈশিষ্ট্য হিসাবে উপস্থাপন করে, সেখানে একটি .regularization_losses বৈশিষ্ট্যও থাকতে পারে। এটিতে শূন্য-আর্গুমেন্ট ফাংশনগুলির একটি তালিকা রয়েছে যার মানগুলি সর্বমোট ক্ষতি ছাড়াও হয়।

প্রাথমিক মোবাইলনেটের উদাহরণে ফিরে গিয়ে, আমরা যারা কার্যক্রমে রয়েছি তাদের মধ্যে কিছু দেখতে পাচ্ছি:

 loaded = tf.saved_model.load(mobilenet_save_path)
print("MobileNet has {} trainable variables: {}, ...".format(
          len(loaded.trainable_variables),
          ", ".join([v.name for v in loaded.trainable_variables[:5]])))
 
MobileNet has 83 trainable variables: conv1/kernel:0, conv1_bn/gamma:0, conv1_bn/beta:0, conv_dw_1/depthwise_kernel:0, conv_dw_1_bn/gamma:0, ...

 trainable_variable_ids = {id(v) for v in loaded.trainable_variables}
non_trainable_variables = [v for v in loaded.variables
                           if id(v) not in trainable_variable_ids]
print("MobileNet also has {} non-trainable variables: {}, ...".format(
          len(non_trainable_variables),
          ", ".join([v.name for v in non_trainable_variables[:3]])))
 
MobileNet also has 54 non-trainable variables: conv1_bn/moving_mean:0, conv1_bn/moving_variance:0, conv_dw_1_bn/moving_mean:0, ...

রফতানির সময় স্বাক্ষরগুলি নির্দিষ্ট করে

saved_model_cli সার্ভিং এবং saved_model_cli মতো সরঞ্জামগুলি saved_model_cli সাথে ইন্টারেক্ট করতে পারে। এই সরঞ্জামগুলিতে কোন কংক্রিটফিউশনগুলি ব্যবহার করবেন তা নির্ধারণ করতে সহায়তা করার জন্য, আমাদের পরিবেশনকারী স্বাক্ষরগুলি নির্দিষ্ট করতে হবে। tf.keras.Model গুলি স্বয়ংক্রিয়ভাবে পরিবেশনকারী স্বাক্ষরগুলি নির্দিষ্ট করে, তবে আমাদের কাস্টম মডিউলগুলির জন্য আমাদের স্পষ্টভাবে একটি পরিবেশনকারী স্বাক্ষর ঘোষণা করতে হবে।

ডিফল্টরূপে, কাস্টম tf.Module এ কোনও স্বাক্ষর ঘোষণা করা হয় না।

 assert len(imported.signatures) == 0
 

একটি পরিবেশনকারী স্বাক্ষর ঘোষণার জন্য, signatures কোয়ার্গ ব্যবহার করে একটি কংক্রিটফানশন নির্দিষ্ট করুন। একটি একক স্বাক্ষর নির্দিষ্ট করার সময়, এর স্বাক্ষর কীটি 'serving_default' , যা ধ্রুবক tf.saved_model.DEFAULT_SERVING_SIGNATURE_DEF_KEY হিসাবে সংরক্ষণ করা হবে।

 module_with_signature_path = os.path.join(tmpdir, 'module_with_signature')
call = module.__call__.get_concrete_function(tf.TensorSpec(None, tf.float32))
tf.saved_model.save(module, module_with_signature_path, signatures=call)
 
Tracing with Tensor("x:0", dtype=float32)
Tracing with Tensor("x:0", dtype=float32)
INFO:tensorflow:Assets written to: /tmp/tmpmjpd1j0o/module_with_signature/assets

 imported_with_signatures = tf.saved_model.load(module_with_signature_path)
list(imported_with_signatures.signatures.keys())

 
['serving_default']

একাধিক স্বাক্ষর রফতানি করতে, কংক্রিটফিউশনগুলিতে স্বাক্ষর কীগুলির একটি অভিধান পাস করুন। প্রতিটি স্বাক্ষর কী একটি কংক্রিটফানশনের সাথে সম্পর্কিত।

 module_multiple_signatures_path = os.path.join(tmpdir, 'module_with_multiple_signatures')
signatures = {"serving_default": call,
              "array_input": module.__call__.get_concrete_function(tf.TensorSpec([None], tf.float32))}

tf.saved_model.save(module, module_multiple_signatures_path, signatures=signatures)
 
Tracing with Tensor("x:0", shape=(None,), dtype=float32)
Tracing with Tensor("x:0", shape=(None,), dtype=float32)
INFO:tensorflow:Assets written to: /tmp/tmpmjpd1j0o/module_with_multiple_signatures/assets

 imported_with_multiple_signatures = tf.saved_model.load(module_multiple_signatures_path)
list(imported_with_multiple_signatures.signatures.keys())
 
['serving_default', 'array_input']

ডিফল্টরূপে আউটপুট টেনসরের নামগুলি আউটপুট output_0 মতো মোটামুটি জেনেরিক। আউটপুটগুলির নামগুলি নিয়ন্ত্রণ করতে, আউটপুটগুলিতে আউটপুট নাম মানচিত্র করে এমন একটি অভিধান ফেরত দিতে আপনার tf.function পরিবর্তন করুন। ইনপুটগুলির নাম পাইথন ফাংশন আরগের নামগুলি থেকে নেওয়া।

 class CustomModuleWithOutputName(tf.Module):
  def __init__(self):
    super(CustomModuleWithOutputName, self).__init__()
    self.v = tf.Variable(1.)

  @tf.function(input_signature=[tf.TensorSpec([], tf.float32)])
  def __call__(self, x):
    return {'custom_output_name': x * self.v}

module_output = CustomModuleWithOutputName()
call_output = module_output.__call__.get_concrete_function(tf.TensorSpec(None, tf.float32))
module_output_path = os.path.join(tmpdir, 'module_with_output_name')
tf.saved_model.save(module_output, module_output_path,
                    signatures={'serving_default': call_output})
 
INFO:tensorflow:Assets written to: /tmp/tmpmjpd1j0o/module_with_output_name/assets

 imported_with_output_name = tf.saved_model.load(module_output_path)
imported_with_output_name.signatures['serving_default'].structured_outputs
 
{'custom_output_name': TensorSpec(shape=(), dtype=tf.float32, name='custom_output_name')}

প্রাক্কলনকারীদের থেকে সেভডমডেলস

অনুমানকারীরা tf.Estimator.export_saved_model এর মাধ্যমে tf.Estimator.export_saved_model । বিশদ জন্য Estimator গাইড দেখুন।

 input_column = tf.feature_column.numeric_column("x")
estimator = tf.estimator.LinearClassifier(feature_columns=[input_column])

def input_fn():
  return tf.data.Dataset.from_tensor_slices(
    ({"x": [1., 2., 3., 4.]}, [1, 1, 0, 0])).repeat(200).shuffle(64).batch(16)
estimator.train(input_fn)

serving_input_fn = tf.estimator.export.build_parsing_serving_input_receiver_fn(
  tf.feature_column.make_parse_example_spec([input_column]))
estimator_base_path = os.path.join(tmpdir, 'from_estimator')
estimator_path = estimator.export_saved_model(estimator_base_path, serving_input_fn)
 
INFO:tensorflow:Using default config.
WARNING:tensorflow:Using temporary folder as model directory: /tmp/tmp65c02lsq
INFO:tensorflow:Using config: {'_model_dir': '/tmp/tmp65c02lsq', '_tf_random_seed': None, '_save_summary_steps': 100, '_save_checkpoints_steps': None, '_save_checkpoints_secs': 600, '_session_config': allow_soft_placement: true
graph_options {
  rewrite_options {
    meta_optimizer_iterations: ONE
  }
}
, '_keep_checkpoint_max': 5, '_keep_checkpoint_every_n_hours': 10000, '_log_step_count_steps': 100, '_train_distribute': None, '_device_fn': None, '_protocol': None, '_eval_distribute': None, '_experimental_distribute': None, '_experimental_max_worker_delay_secs': None, '_session_creation_timeout_secs': 7200, '_service': None, '_cluster_spec': ClusterSpec({}), '_task_type': 'worker', '_task_id': 0, '_global_id_in_cluster': 0, '_master': '', '_evaluation_master': '', '_is_chief': True, '_num_ps_replicas': 0, '_num_worker_replicas': 1}
WARNING:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.6/site-packages/tensorflow/python/training/training_util.py:236: Variable.initialized_value (from tensorflow.python.ops.variables) is deprecated and will be removed in a future version.
Instructions for updating:
Use Variable.read_value. Variables in 2.X are initialized automatically both in eager and graph (inside tf.defun) contexts.
INFO:tensorflow:Calling model_fn.
WARNING:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.6/site-packages/tensorflow/python/feature_column/feature_column_v2.py:540: Layer.add_variable (from tensorflow.python.keras.engine.base_layer_v1) is deprecated and will be removed in a future version.
Instructions for updating:
Please use `layer.add_weight` method instead.
WARNING:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.6/site-packages/tensorflow/python/keras/optimizer_v2/ftrl.py:144: calling Constant.__init__ (from tensorflow.python.ops.init_ops) with dtype is deprecated and will be removed in a future version.
Instructions for updating:
Call initializer instance with the dtype argument instead of passing it to the constructor
INFO:tensorflow:Done calling model_fn.
INFO:tensorflow:Create CheckpointSaverHook.
INFO:tensorflow:Graph was finalized.
INFO:tensorflow:Running local_init_op.
INFO:tensorflow:Done running local_init_op.
INFO:tensorflow:Calling checkpoint listeners before saving checkpoint 0...
INFO:tensorflow:Saving checkpoints for 0 into /tmp/tmp65c02lsq/model.ckpt.
INFO:tensorflow:Calling checkpoint listeners after saving checkpoint 0...
INFO:tensorflow:loss = 0.6931472, step = 0
INFO:tensorflow:Calling checkpoint listeners before saving checkpoint 50...
INFO:tensorflow:Saving checkpoints for 50 into /tmp/tmp65c02lsq/model.ckpt.
INFO:tensorflow:Calling checkpoint listeners after saving checkpoint 50...
INFO:tensorflow:Loss for final step: 0.4131384.
INFO:tensorflow:Calling model_fn.
INFO:tensorflow:Done calling model_fn.
WARNING:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.6/site-packages/tensorflow/python/saved_model/signature_def_utils_impl.py:145: build_tensor_info (from tensorflow.python.saved_model.utils_impl) is deprecated and will be removed in a future version.
Instructions for updating:
This function will only be available through the v1 compatibility library as tf.compat.v1.saved_model.utils.build_tensor_info or tf.compat.v1.saved_model.build_tensor_info.
INFO:tensorflow:Signatures INCLUDED in export for Classify: ['serving_default', 'classification']
INFO:tensorflow:Signatures INCLUDED in export for Regress: ['regression']
INFO:tensorflow:Signatures INCLUDED in export for Predict: ['predict']
INFO:tensorflow:Signatures INCLUDED in export for Train: None
INFO:tensorflow:Signatures INCLUDED in export for Eval: None
INFO:tensorflow:Restoring parameters from /tmp/tmp65c02lsq/model.ckpt-50
INFO:tensorflow:Assets added to graph.
INFO:tensorflow:No assets to write.
INFO:tensorflow:SavedModel written to: /tmp/tmpmjpd1j0o/from_estimator/temp-1594862628/saved_model.pb

এই স্যাভডমোডেল সিরিয়ালাইজড টিএফ গ্রহণ করে tf.Example তবে আমরা এটিকে tf.saved_model.load দিয়ে লোড করে পাইথন থেকে চালাতে পারি।

 imported = tf.saved_model.load(estimator_path)

def predict(x):
  example = tf.train.Example()
  example.features.feature["x"].float_list.value.extend([x])
  return imported.signatures["predict"](
    examples=tf.constant([example.SerializeToString()]))
 
 print(predict(1.5))
print(predict(3.5))
 
{'all_classes': <tf.Tensor: shape=(1, 2), dtype=string, numpy=array([[b'0', b'1']], dtype=object)>, 'logistic': <tf.Tensor: shape=(1, 1), dtype=float32, numpy=array([[0.5451435]], dtype=float32)>, 'probabilities': <tf.Tensor: shape=(1, 2), dtype=float32, numpy=array([[0.45485654, 0.5451435 ]], dtype=float32)>, 'logits': <tf.Tensor: shape=(1, 1), dtype=float32, numpy=array([[0.18106687]], dtype=float32)>, 'class_ids': <tf.Tensor: shape=(1, 1), dtype=int64, numpy=array([[1]])>, 'classes': <tf.Tensor: shape=(1, 1), dtype=string, numpy=array([[b'1']], dtype=object)>, 'all_class_ids': <tf.Tensor: shape=(1, 2), dtype=int32, numpy=array([[0, 1]], dtype=int32)>}
{'all_classes': <tf.Tensor: shape=(1, 2), dtype=string, numpy=array([[b'0', b'1']], dtype=object)>, 'logistic': <tf.Tensor: shape=(1, 1), dtype=float32, numpy=array([[0.21604054]], dtype=float32)>, 'probabilities': <tf.Tensor: shape=(1, 2), dtype=float32, numpy=array([[0.7839595 , 0.21604055]], dtype=float32)>, 'logits': <tf.Tensor: shape=(1, 1), dtype=float32, numpy=array([[-1.2888912]], dtype=float32)>, 'class_ids': <tf.Tensor: shape=(1, 1), dtype=int64, numpy=array([[0]])>, 'classes': <tf.Tensor: shape=(1, 1), dtype=string, numpy=array([[b'0']], dtype=object)>, 'all_class_ids': <tf.Tensor: shape=(1, 2), dtype=int32, numpy=array([[0, 1]], dtype=int32)>}

tf.estimator.export.build_raw_serving_input_receiver_fn আপনাকে ইনপুট ফাংশন তৈরি করতে দেয় যা tf.train.Example s এর পরিবর্তে কাঁচা tf.train.Example

সি ++ এ একটি সেভডমডেল লোড করুন

স্যাভডমোডেল লোডার এর সি ++ সংস্করণটি সেশনঅপশন এবং রানঅপশনগুলি অনুমোদনের সময় কোনও পাথ থেকে একটি সেভডমডেল লোড করার জন্য একটি API সরবরাহ করে। লোড হওয়ার জন্য আপনাকে গ্রাফের সাথে যুক্ত ট্যাগগুলি নির্দিষ্ট করতে হবে। সেভডমোডেলের লোড সংস্করণটি স্যাভডমোডেলবান্ডেল হিসাবে উল্লেখ করা হয় এবং এতে মেটাগ্রাফডেফ এবং সেশনের মধ্যে এটি লোড হয়।

 const string export_dir = ...
SavedModelBundle bundle;
...
LoadSavedModel(session_options, run_options, export_dir, {kSavedModelTagTrain},
               &bundle);
 

সেভডমডেল কমান্ড লাইন ইন্টারফেসের বিশদ

আপনি স্যাভডমোডেলটি পরিদর্শন ও সম্পাদন করতে সেভডমডেল কমান্ড লাইন ইন্টারফেস (সিএলআই) ব্যবহার করতে পারেন। উদাহরণস্বরূপ, আপনি মডেলটির SignatureDef পরিদর্শন করতে CLI ব্যবহার করতে পারেন। সিএলআই আপনাকে দ্রুত তা নিশ্চিত করতে সক্ষম করে যে ইনপুট টেনসর dtype এবং আকারটি মডেলের সাথে মেলে। তদুপরি, আপনি যদি নিজের মডেলটি পরীক্ষা করতে চান, আপনি বিভিন্ন ফরম্যাটে নমুনা ইনপুটগুলি (উদাহরণস্বরূপ, পাইথন এক্সপ্রেশন) পাস করে এবং তারপরে আউটপুট আনার মাধ্যমে আপনি সিএলআই ব্যবহার করতে পারেন san

সেভডমোডেল সিএলআই ইনস্টল করুন

বিস্তৃতভাবে বলতে গেলে, আপনি নিম্নলিখিত দুটি উপায়ে যেকোন একটিতে টেনসরফ্লো ইনস্টল করতে পারেন:

  • প্রাক-বিল্ট টেনসরফ্লো বাইনারি ইনস্টল করে।
  • উত্স কোড থেকে টেনসরফ্লো তৈরি করে।

আপনি যদি প্রাক-বিল্ট টেনসরফ্লো বাইনারি মাধ্যমে টেনসরফ্লো ইনস্টল করেন তবে সেভডমোডেল সি এল এল ইতিমধ্যে আপনার সিস্টেমে bin/saved_model_cli ইনস্টল করা আছে।

যদি আপনি উত্স কোড থেকে saved_model_cli তৈরি করে থাকেন তবে saved_model_cli তৈরি করতে আপনাকে অবশ্যই নিম্নলিখিত অতিরিক্ত কমান্ডটি চালাতে হবে:

 $ bazel build tensorflow/python/tools:saved_model_cli
 

আদেশের ওভারভিউ

সেভডমোডেল সিএলআই একটি সেভডমডেলে নিম্নলিখিত দুটি কমান্ড সমর্থন করে:

  • show , যা সেভডমডেল থেকে উপলব্ধ গণনাগুলি দেখায়।
  • run , যা একটি সেভডমডেল থেকে একটি গণনা চালায়।

কমান্ড show

একটি সেভডমডেলে তাদের ট্যাগ-সেট দ্বারা চিহ্নিত এক বা একাধিক মডেলের রূপগুলি (প্রযুক্তিগতভাবে, v1.MetaGraphDef গুলি) থাকে। কোনও মডেল পরিবেশন করার জন্য, আপনি ভাবতে পারেন যে প্রতিটি মডেলের ভেরিয়েন্টে কী ধরণের SignatureDef রয়েছে এবং কী কী ইনপুট এবং আউটপুট রয়েছে। show কমান্ড আপনাকে সেভডমোডেলের বিষয়বস্তু স্তরক্রম অনুসারে পরীক্ষা করতে দেয়। এখানে বাক্য গঠন:

 usage: saved_model_cli show [-h] --dir DIR [--all]
[--tag_set TAG_SET] [--signature_def SIGNATURE_DEF_KEY]
 

উদাহরণস্বরূপ, নীচের কমান্ডটি সেভডমডেলে সমস্ত উপলভ্য ট্যাগ-সেট দেখায়:

 $ saved_model_cli show --dir /tmp/saved_model_dir
The given SavedModel contains the following tag-sets:
serve
serve, gpu
 

নিম্নলিখিত কমান্ডটি একটি ট্যাগ সেটের জন্য উপলভ্য সমস্ত SignatureDef কীগুলি দেখায়:

 $ saved_model_cli show --dir /tmp/saved_model_dir --tag_set serve
The given SavedModel `MetaGraphDef` contains `SignatureDefs` with the
following keys:
SignatureDef key: "classify_x2_to_y3"
SignatureDef key: "classify_x_to_y"
SignatureDef key: "regress_x2_to_y3"
SignatureDef key: "regress_x_to_y"
SignatureDef key: "regress_x_to_y2"
SignatureDef key: "serving_default"
 

যদি ট্যাগ-সেটটিতে একাধিক ট্যাগ থাকে তবে আপনাকে অবশ্যই সমস্ত ট্যাগ নির্দিষ্ট করতে হবে, প্রতিটি ট্যাগ একটি কমা দ্বারা পৃথক। উদাহরণ স্বরূপ:

$ saved_model_cli show --dir /tmp/saved_model_dir --tag_set serve,gpu

সমস্ত ইনপুট দেন একটি নির্দিষ্ট জন্য TensorInfo আউটপুট SignatureDef , মধ্যে পাস SignatureDef চাবিকাঠি signature_def বিকল্প। এটি পরে যখন আপনি গণনার গ্রাফটি সম্পাদন করতে পারেন তখন টেনসর কী মান, dtype এবং ইনপুট টেনারগুলির আকার জানতে চান এটি খুব কার্যকর। উদাহরণ স্বরূপ:

 $ saved_model_cli show --dir \
/tmp/saved_model_dir --tag_set serve --signature_def serving_default
The given SavedModel SignatureDef contains the following input(s):
  inputs['x'] tensor_info:
      dtype: DT_FLOAT
      shape: (-1, 1)
      name: x:0
The given SavedModel SignatureDef contains the following output(s):
  outputs['y'] tensor_info:
      dtype: DT_FLOAT
      shape: (-1, 1)
      name: y:0
Method name is: tensorflow/serving/predict
 

SavedModel সমস্ত উপলব্ধ তথ্য দেখাতে, ব্যবহার --all বিকল্প। উদাহরণ স্বরূপ:

$ saved_model_cli show --dir /tmp/saved_model_dir --all
MetaGraphDef with tag-set: 'serve' contains the following SignatureDefs:

signature_def['classify_x2_to_y3']:
  The given SavedModel SignatureDef contains the following input(s):
    inputs['inputs'] tensor_info:
        dtype: DT_FLOAT
        shape: (-1, 1)
        name: x2:0
  The given SavedModel SignatureDef contains the following output(s):
    outputs['scores'] tensor_info:
        dtype: DT_FLOAT
        shape: (-1, 1)
        name: y3:0
  Method name is: tensorflow/serving/classify

...

signature_def['serving_default']:
  The given SavedModel SignatureDef contains the following input(s):
    inputs['x'] tensor_info:
        dtype: DT_FLOAT
        shape: (-1, 1)
        name: x:0
  The given SavedModel SignatureDef contains the following output(s):
    outputs['y'] tensor_info:
        dtype: DT_FLOAT
        shape: (-1, 1)
        name: y:0
  Method name is: tensorflow/serving/predict

কমান্ড run

একটি গ্রাফ গণনা চালানোর জন্য run কমান্ডটি চাওয়া, ইনপুটগুলি পাস করা এবং তারপরে ফলাফলগুলি প্রদর্শন (এবং optionচ্ছিকভাবে সংরক্ষণ করা)। এখানে বাক্য গঠন:

 usage: saved_model_cli run [-h] --dir DIR --tag_set TAG_SET --signature_def
                           SIGNATURE_DEF_KEY [--inputs INPUTS]
                           [--input_exprs INPUT_EXPRS]
                           [--input_examples INPUT_EXAMPLES] [--outdir OUTDIR]
                           [--overwrite] [--tf_debug]
 

run কমান্ডটি মডেলটিতে ইনপুটগুলি পাস করার জন্য নিম্নলিখিত তিনটি উপায় সরবরাহ করে:

  • --inputs বিকল্পের সাহায্যে আপনাকে ফাইলগুলিতে নম্পি ndarray পাস করতে সক্ষম হয়।
  • --input_exprs বিকল্প আপনাকে পাইথন এক্সপ্রেশন পাস করতে সক্ষম করে।
  • --input_examples বিকল্পটি আপনাকে tf.train.Example পাস করতে সক্ষম করে।

--inputs

ফাইলগুলিতে ইনপুট ডেটা পাস করতে, --inputs বিকল্পটি নির্দিষ্ট করুন, যা নিম্নলিখিত সাধারণ বিন্যাসটি গ্রহণ করে:

 --inputs <INPUTS>
 

যেখানে ইনপুটগুলি নিম্নলিখিত ফর্ম্যাটগুলির একটি:

  • <input_key>=<filename>
  • <input_key>=<filename>[<variable_name>]

আপনি একাধিক INPUTS পাস করতে পারেন। আপনি একাধিক ইনপুট পাস না, একটি সেমিকোলন ব্যবহার ইনপুটগুলি প্রতিটি আলাদা করে রাখে।

saved_model_cli ব্যবহারসমূহ numpy.load ফাইলের নাম লোড করা হয়নি। ফাইলের নাম নিম্নলিখিত যে কোনও বিন্যাসে থাকতে পারে:

  • .npy
  • .npz
  • আচার বিন্যাস

একটি .npy ফাইলে সর্বদা একটি অদ্ভুত ndarray থাকে। সুতরাং, .npy ফাইল থেকে লোড করার সময়, সামগ্রীটি নির্দিষ্ট ইনপুট .npy সরাসরি বরাদ্দ করা হবে। আপনি যদি .npy ফাইল সহ একটি ভেরিয়েবল_নাম নির্দিষ্ট করেন তবে ভেরিয়েবল_নামটি উপেক্ষা করা হবে এবং একটি সতর্কতা জারি করা হবে।

.npz (জিপ) ফাইল থেকে লোড করার সময়, আপনি ইনপুট টেনসর কীটির জন্য লোড করতে জিপ ফাইলের মধ্যে ভেরিয়েবল সনাক্ত করতে .npz একটি ভেরিয়েবল_নাম নির্দিষ্ট করতে পারেন। যদি আপনি কোনও ভেরিয়েবল_নাম নির্দিষ্ট না করে থাকেন তবে সেভডমোডেল সিএলআই জিপ ফাইলের মধ্যে কেবল একটি ফাইল অন্তর্ভুক্ত রয়েছে কিনা তা পরীক্ষা করবে এবং নির্দিষ্ট ইনপুট টেনসর কীটির জন্য এটি লোড করবে।

একটি আচার ফাইল থেকে লোড করার সময় বর্গাকার বন্ধনীতে কোনও variable_name নির্দিষ্ট না করা থাকলে, আচার ফাইলের মধ্যে যা কিছু থাকে তা নির্দিষ্ট ইনপুট টেনসর কীতে পাস করা হবে। অন্যথায়, সেভডমোডেল সিএলআই অনুমান করবে যে একটি অভিধানের জন্য আচার ফাইল রয়েছে এবং ভ্যারিয়েবল_নামের সাথে মানটি ব্যবহার করা হবে।

--input_exprs

পাইথন এক্সপ্রেশনগুলির মাধ্যমে ইনপুটগুলি পাস করতে, --input_exprs বিকল্পটি নির্দিষ্ট করুন। আপনার চারপাশে থাকা ডেটা ফাইলগুলি না থাকার জন্য এটি কার্যকর হতে পারে তবে এখনও মডেলটির SignatureDef এর আকার এবং আকারের সাথে মেলে এমন কিছু সাধারণ ইনপুট দিয়ে মডেলটি পরীক্ষা করতে চান। উদাহরণ স্বরূপ:

 `<input_key>=[[1],[2],[3]]`
 

পাইথন এক্সপ্রেশন ছাড়াও, আপনি ন্যালি ফাংশনও পাস করতে পারেন। উদাহরণ স্বরূপ:

 `<input_key>=np.ones((32,32,3))`
 

(দ্রষ্টব্য যে numpy মডিউলটি আপনার কাছে np হিসাবে ইতিমধ্যে উপলব্ধ))

--input_examples

tf.train.Example কে ইনপুট হিসাবে পাস করতে, --input_examples বিকল্পটি উল্লেখ করুন। প্রতিটি ইনপুট কী এর জন্য এটি অভিধানের একটি তালিকা নেয়, যেখানে প্রতিটি tf.train.Example উদাহরণ tf.train.Example অভিধান কীগুলি হ'ল বৈশিষ্ট্য এবং মান প্রতিটি বৈশিষ্ট্যের মান তালিকা। উদাহরণ স্বরূপ:

 `<input_key>=[{"age":[22,24],"education":["BS","MS"]}]`
 

আউটপুট সংরক্ষণ করুন

ডিফল্টরূপে, সেভডমোডেল সি এল এল আউটপুটটি স্টডআউটে লিখে দেয়। ডিরেক্টরি যদি --outdir বিকল্পে --outdir তবে আউটপুটগুলি প্রদত্ত ডিরেক্টরিতে আউটপুট টেনসর কীগুলির নাম অনুসারে .npy ফাইল হিসাবে সংরক্ষণ করা হবে।

বিদ্যমান আউটপুট ফাইলগুলিকে ওভাররাইট করতে --overwrite ব্যবহার করুন।