SavedModel ফরম্যাট ব্যবহার করে

TensorFlow.org-এ দেখুন Google Colab-এ চালান GitHub-এ উৎস দেখুন নোটবুক ডাউনলোড করুন

একটি SavedModel-এ একটি সম্পূর্ণ TensorFlow প্রোগ্রাম রয়েছে, যার মধ্যে প্রশিক্ষিত প্যারামিটার (যেমন, tf.Variable . Variable s) এবং গণনা রয়েছে। এটি চালানোর জন্য মূল মডেল বিল্ডিং কোডের প্রয়োজন নেই, যা এটিকে TFLite , TensorFlow.js , TensorFlow সার্ভিং , বা TensorFlow হাবের সাথে ভাগ বা স্থাপনের জন্য উপযোগী করে তোলে৷

আপনি নিম্নলিখিত API ব্যবহার করে SavedModel বিন্যাসে একটি মডেল সংরক্ষণ এবং লোড করতে পারেন:

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

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

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.list_physical_devices('GPU')
for device in physical_devices:
  tf.config.experimental.set_memory_growth(device, 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.utils.load_img(file, target_size=[224, 224])
plt.imshow(img)
plt.axis('off')
x = tf.keras.utils.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
73728/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
24576/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 [==============================] - 0s 0us/step
17235968/17225924 [==============================] - 0s 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)
2021-10-27 01:24:27.831628: W tensorflow/python/util/util.cc:348] Sets are not currently considered sequences, but this may change in the future, so consider avoiding using them.
INFO:tensorflow:Assets written to: /tmp/tmpbf9fpzwt/mobilenet/1/assets

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

আপনি tf.saved_model.load দিয়ে Python-এ 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')}

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

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 সার্ভিং ব্যবহার করে একটি SavedModel থেকে এটি সেট আপ করা সহজ।

এন্ড-টু-এন্ড টেনসরফ্লো-সার্ভিং উদাহরণের জন্য TensorFlow Serving REST টিউটোরিয়াল দেখুন।

ডিস্কে সংরক্ষিত মডেল বিন্যাস

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

ls {mobilenet_save_path}
assets  saved_model.pb  variables

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

SavedModels-এ মডেলের একাধিক রূপ থাকতে পারে (একাধিক v1.MetaGraphDefs , --tag_set পতাকা দ্বারা saved_model_cli এ চিহ্নিত), কিন্তু এটি বিরল। যে APIগুলি একটি মডেলের একাধিক রূপ তৈরি করে তার মধ্যে রয়েছে tf.Estimator.experimental_export_all_saved_models এবং TensorFlow 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-00001  variables.index

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

TensorFlow গ্রাফ দ্বারা ব্যবহার করা হয়নি এমন কোনো ফাইলের জন্য SavedModels-এর একটি assets.extra ডিরেক্টরি থাকতে পারে, যেমন SavedModel-এর সাথে কী করতে হবে সে সম্পর্কে ভোক্তাদের জন্য তথ্য। TensorFlow নিজেই এই ডিরেক্টরি ব্যবহার করে না।

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

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

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

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

tf.function এবং ConcreteFunction-এর মধ্যে সম্পর্ক সম্পর্কে আরও জানতে, 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/tmpbf9fpzwt/module_no_signatures/assets

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

যখন আপনি Python-এ একটি SavedModel লোড করেন, তখন সমস্ত tf.Variable বৈশিষ্ট্য, tf.function -সজ্জিত পদ্ধতি এবং 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__ থেকে আরও বিশদ প্রদান করে। TensorFlow Hub সূক্ষ্ম-টিউনিংয়ের উদ্দেশ্যে শেয়ার করা SavedModels-এ প্রযোজ্য হলে নিম্নলিখিতগুলি প্রদান করার সুপারিশ করে:

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

প্রাথমিক MobileNet উদাহরণে ফিরে গেলে, আপনি এর মধ্যে কয়েকটি দেখতে পাবেন:

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, ...

রপ্তানির সময় স্বাক্ষর উল্লেখ করা

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

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

assert len(imported.signatures) == 0

একটি পরিবেশন স্বাক্ষর ঘোষণা করতে, signatures kwarg ব্যবহার করে একটি ConcreteFunction নির্দিষ্ট করুন। একটি একক স্বাক্ষর নির্দিষ্ট করার সময়, এর স্বাক্ষর কী হবে '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/tmpbf9fpzwt/module_with_signature/assets
imported_with_signatures = tf.saved_model.load(module_with_signature_path)
list(imported_with_signatures.signatures.keys())
['serving_default']

একাধিক স্বাক্ষর রপ্তানি করতে, ConcreteFunctions-এ স্বাক্ষর কীগুলির একটি অভিধান পাস করুন। প্রতিটি স্বাক্ষর কী একটি ConcreteFunction এর সাথে মিলে যায়।

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/tmpbf9fpzwt/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/tmpbf9fpzwt/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')}

C++ এ একটি সংরক্ষিত মডেল লোড করুন

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

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

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

আপনি একটি SavedModel পরিদর্শন এবং কার্যকর করতে SavedModel কমান্ড লাইন ইন্টারফেস (CLI) ব্যবহার করতে পারেন। উদাহরণস্বরূপ, আপনি মডেলের SignatureDef s পরিদর্শন করতে CLI ব্যবহার করতে পারেন। CLI আপনাকে দ্রুত নিশ্চিত করতে সক্ষম করে যে ইনপুট টেনসরের টাইপ এবং আকৃতি মডেলের সাথে মেলে। তাছাড়া, আপনি যদি আপনার মডেল পরীক্ষা করতে চান, তাহলে আপনি CLI ব্যবহার করে বিভিন্ন ফরম্যাটে নমুনা ইনপুট পাস করে (উদাহরণস্বরূপ, পাইথন এক্সপ্রেশন) এবং তারপর আউটপুট আনতে পারেন

SavedModel CLI ইনস্টল করুন

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

  • একটি পূর্ব-নির্মিত টেনসরফ্লো বাইনারি ইনস্টল করার মাধ্যমে।
  • সোর্স কোড থেকে টেনসরফ্লো তৈরি করে।

আপনি যদি পূর্ব-নির্মিত TensorFlow বাইনারির মাধ্যমে TensorFlow ইনস্টল করেন, তাহলে SavedModel CLI ইতিমধ্যেই আপনার সিস্টেমে pathname bin/saved_model_cli এ ইনস্টল করা আছে।

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

$ bazel build tensorflow/python/tools:saved_model_cli

কমান্ডের ওভারভিউ

SavedModel CLI একটি SavedModel-এ নিম্নলিখিত দুটি কমান্ড সমর্থন করে:

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

আদেশ show

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

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

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

$ 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

একটি নির্দিষ্ট SignatureDef এর জন্য সমস্ত ইনপুট এবং আউটপুট TensorInfo দেখানোর জন্য, 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 কমান্ডটি চালু করুন, ইনপুট পাস করুন এবং তারপর আউটপুটগুলি প্রদর্শন করুন (এবং ঐচ্ছিকভাবে সংরক্ষণ করুন)। এখানে সিনট্যাক্স আছে:

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 বিকল্প আপনাকে ফাইলগুলিতে numpy ndarray পাস করতে সক্ষম করে।
  • --input_exprs বিকল্প আপনাকে পাইথন এক্সপ্রেশন পাস করতে সক্ষম করে।
  • --input_examples বিকল্প আপনাকে tf.train.Example পাস করতে সক্ষম করে।

--inputs

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

--inputs <INPUTS>

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

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

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

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

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

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

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

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

--input_exprs

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

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

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

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

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

--input_examples

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

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

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

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

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