ترحيل سير العمل SavedModel

عرض على TensorFlow.org تشغيل في Google Colab عرض المصدر على جيثب تحميل دفتر

بمجرد ترحيل النموذج الخاص بك من الرسوم البيانية وجلسات TensorFlow 1 إلى TensorFlow 2 APIs ، مثل tf.function و tf.Module و tf.keras.Model ، يمكنك ترحيل نموذج حفظ وتحميل التعليمات البرمجية. يقدم دفتر الملاحظات هذا أمثلة حول كيفية الحفظ والتحميل بتنسيق SavedModel في TensorFlow 1 و TensorFlow 2. فيما يلي نظرة عامة سريعة على تغييرات API ذات الصلة للترحيل من TensorFlow 1 إلى TensorFlow 2:

TensorFlow 1 الهجرة إلى TensorFlow 2
إنقاذ tf.compat.v1.saved_model.Builder
tf.compat.v1.saved_model.simple_save
tf.saved_model.save
كيراس: tf.keras.models.save_model
جار التحميل tf.compat.v1.saved_model.load tf.saved_model.load
كراس: tf.keras.models.load_model
التوقيعات : مجموعة من المدخلات
والموترات الناتج ذلك
يمكن استخدامها لتشغيل
تم إنشاؤه باستخدام *.signature_def utils
(على سبيل المثال tf.compat.v1.saved_model.predict_signature_def )
اكتب tf.function وقم بتصديرها باستخدام وسيطة signatures
في tf.saved_model.save .
تصنيف
والانحدار
:
أنواع خاصة من التوقيعات
ولدت مع
tf.compat.v1.saved_model.classification_signature_def ،
tf.compat.v1.saved_model.regression_signature_def ،
وبعض الصادرات المقدر.
تمت إزالة نوعي التوقيع هذين من TensorFlow 2.
إذا كانت مكتبة العرض تتطلب أسماء هذه الطرق ،
tf.compat.v1.saved_model.signature_def_utils.MethodNameUpdater .

للحصول على شرح أكثر عمقًا للتخطيط ، راجع قسم التغييرات من TensorFlow 1 إلى TensorFlow 2 أدناه.

يثبت

توضح الأمثلة أدناه كيفية تصدير وتحميل نموذج TensorFlow الوهمي نفسه (المُعرَّف على أنه add_two أدناه) إلى تنسيق SavedModel باستخدام واجهات برمجة تطبيقات TensorFlow 1 و TensorFlow 2. ابدأ بإعداد وظائف الاستيراد والمرافق:

import tensorflow as tf
import tensorflow.compat.v1 as tf1
import shutil

def remove_dir(path):
  try:
    shutil.rmtree(path)
  except:
    pass

def add_two(input):
  return input + 2

TensorFlow 1: حفظ وتصدير SavedModel

في TensorFlow 1 ، يمكنك استخدام tf.compat.v1.saved_model.Builder و tf.compat.v1.saved_model.simple_save و tf.estimator.Estimator.export_saved_model لإنشاء وحفظ وتصدير الرسم البياني TensorFlow والجلسة:

1. احفظ الرسم البياني كنموذج SavedModel مع SavedModelBuilder

remove_dir("saved-model-builder")

with tf.Graph().as_default() as g:
  with tf1.Session() as sess:
    input = tf1.placeholder(tf.float32, shape=[])
    output = add_two(input)
    print("add two output: ", sess.run(output, {input: 3.}))

    # Save with SavedModelBuilder
    builder = tf1.saved_model.Builder('saved-model-builder')
    sig_def = tf1.saved_model.predict_signature_def(
        inputs={'input': input},
        outputs={'output': output})
    builder.add_meta_graph_and_variables(
        sess, tags=["serve"], signature_def_map={
            tf.saved_model.DEFAULT_SERVING_SIGNATURE_DEF_KEY: sig_def
    })
    builder.save()
add two output:  5.0
WARNING:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.7/site-packages/tensorflow/python/saved_model/signature_def_utils_impl.py:208: 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:No assets to save.
INFO:tensorflow:No assets to write.
INFO:tensorflow:SavedModel written to: saved-model-builder/saved_model.pb
!saved_model_cli run --dir simple-save --tag_set serve \
 --signature_def serving_default --input_exprs input=10
Traceback (most recent call last):
  File "/tmpfs/src/tf_docs_env/bin/saved_model_cli", line 8, in <module>
    sys.exit(main())
  File "/tmpfs/src/tf_docs_env/lib/python3.7/site-packages/tensorflow/python/tools/saved_model_cli.py", line 1211, in main
    args.func(args)
  File "/tmpfs/src/tf_docs_env/lib/python3.7/site-packages/tensorflow/python/tools/saved_model_cli.py", line 769, in run
    init_tpu=args.init_tpu, tf_debug=args.tf_debug)
  File "/tmpfs/src/tf_docs_env/lib/python3.7/site-packages/tensorflow/python/tools/saved_model_cli.py", line 417, in run_saved_model_with_feed_dict
    tag_set)
  File "/tmpfs/src/tf_docs_env/lib/python3.7/site-packages/tensorflow/python/tools/saved_model_utils.py", line 117, in get_meta_graph_def
    saved_model = read_saved_model(saved_model_dir)
  File "/tmpfs/src/tf_docs_env/lib/python3.7/site-packages/tensorflow/python/tools/saved_model_utils.py", line 55, in read_saved_model
    raise IOError("SavedModel file does not exist at: %s" % saved_model_dir)
OSError: SavedModel file does not exist at: simple-save

2. بناء نموذج المحفوظ للخدمة

remove_dir("simple-save")

with tf.Graph().as_default() as g:
  with tf1.Session() as sess:
    input = tf1.placeholder(tf.float32, shape=[])
    output = add_two(input)
    print("add_two output: ", sess.run(output, {input: 3.}))

    tf1.saved_model.simple_save(
        sess, 'simple-save',
        inputs={'input': input},
        outputs={'output': output})
add_two output:  5.0
WARNING:tensorflow:From /tmp/ipykernel_26511/250978412.py:12: simple_save (from tensorflow.python.saved_model.simple_save) 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.simple_save.
INFO:tensorflow:Assets added to graph.
INFO:tensorflow:No assets to write.
INFO:tensorflow:SavedModel written to: simple-save/saved_model.pb
!saved_model_cli run --dir simple-save --tag_set serve \
 --signature_def serving_default --input_exprs input=10
WARNING:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.7/site-packages/tensorflow/python/tools/saved_model_cli.py:453: load (from tensorflow.python.saved_model.loader_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.loader.load or tf.compat.v1.saved_model.load. There will be a new function for importing SavedModels in Tensorflow 2.0.
INFO:tensorflow:Saver not created because there are no variables in the graph to restore
INFO:tensorflow:The specified SavedModel has no variables; no checkpoints were restored.
Result for output key output:
12.0

3. تصدير الرسم البياني للاستدلال المقدر كنموذج SavedModel

في تعريف النموذج model_fn المقدر (المحدد أدناه) ، يمكنك تحديد التوقيعات في النموذج الخاص بك عن طريق إرجاع export_outputs في tf.estimator.EstimatorSpec . هناك أنواع مختلفة من المخرجات:

ستنتج أنواع توقيع التصنيف والانحدار والتنبؤ ، على التوالي.

عندما يتم تصدير المقدر مع tf.estimator.Estimator.export_saved_model ، سيتم حفظ هذه التوقيعات مع النموذج.

def model_fn(features, labels, mode):
  output = add_two(features['input'])
  step = tf1.train.get_global_step()
  return tf.estimator.EstimatorSpec(
      mode,
      predictions=output,
      train_op=step.assign_add(1),
      loss=tf.constant(0.),
      export_outputs={
          tf.saved_model.DEFAULT_SERVING_SIGNATURE_DEF_KEY: \
          tf.estimator.export.PredictOutput({'output': output})})
est = tf.estimator.Estimator(model_fn, 'estimator-checkpoints')

# Train for one step to create a checkpoint.
def train_fn():
  return tf.data.Dataset.from_tensors({'input': 3.})
est.train(train_fn, steps=1)

# This utility function `build_raw_serving_input_receiver_fn` takes in raw
# tensor features and builds an "input serving receiver function", which
# creates placeholder inputs to the model.
serving_input_fn = tf.estimator.export.build_raw_serving_input_receiver_fn(
    {'input': tf.constant(3.)})  # Pass in a dummy input batch.
estimator_path = est.export_saved_model('exported-estimator', serving_input_fn)

# Estimator's export_saved_model creates a time stamped directory. Move this
# to a set path so it can be inspected with `saved_model_cli` in the cell below.
!rm -rf estimator-model
import shutil
shutil.move(estimator_path, 'estimator-model')
INFO:tensorflow:Using default config.
INFO:tensorflow:Using config: {'_model_dir': 'estimator-checkpoints', '_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, '_checkpoint_save_graph_def': True, '_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.7/site-packages/tensorflow/python/training/training_util.py:401: 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.
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 estimator-checkpoints/model.ckpt.
INFO:tensorflow:Calling checkpoint listeners after saving checkpoint 0...
INFO:tensorflow:loss = 0.0, step = 1
INFO:tensorflow:Calling checkpoint listeners before saving checkpoint 1...
INFO:tensorflow:Saving checkpoints for 1 into estimator-checkpoints/model.ckpt.
INFO:tensorflow:Calling checkpoint listeners after saving checkpoint 1...
INFO:tensorflow:Loss for final step: 0.0.
INFO:tensorflow:Calling model_fn.
INFO:tensorflow:Done calling model_fn.
INFO:tensorflow:Signatures INCLUDED in export for Classify: None
INFO:tensorflow:Signatures INCLUDED in export for Regress: None
INFO:tensorflow:Signatures INCLUDED in export for Predict: ['serving_default']
INFO:tensorflow:Signatures INCLUDED in export for Train: None
INFO:tensorflow:Signatures INCLUDED in export for Eval: None
INFO:tensorflow:Restoring parameters from estimator-checkpoints/model.ckpt-1
INFO:tensorflow:Assets added to graph.
INFO:tensorflow:No assets to write.
INFO:tensorflow:SavedModel written to: exported-estimator/temp-1636162129/saved_model.pb
'estimator-model'
!saved_model_cli run --dir estimator-model --tag_set serve \
 --signature_def serving_default --input_exprs input=[10]
WARNING:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.7/site-packages/tensorflow/python/tools/saved_model_cli.py:453: load (from tensorflow.python.saved_model.loader_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.loader.load or tf.compat.v1.saved_model.load. There will be a new function for importing SavedModels in Tensorflow 2.0.
INFO:tensorflow:Restoring parameters from estimator-model/variables/variables
Result for output key output:
[12.]

TensorFlow 2: حفظ وتصدير SavedModel

حفظ وتصدير SavedModel المعرفة مع tf.Module

لتصدير النموذج الخاص بك في TensorFlow 2 ، يجب عليك تحديد tf.Module أو tf.keras.Model للاحتفاظ بجميع المتغيرات والوظائف الخاصة بنموذجك. بعد ذلك ، يمكنك استدعاء tf.saved_model.save لإنشاء SavedModel. راجع حفظ نموذج مخصص في دليل تنسيق SavedModel لمعرفة المزيد.

class MyModel(tf.Module):
  @tf.function
  def __call__(self, input):
    return add_two(input)

model = MyModel()

@tf.function
def serving_default(input):
  return {'output': model(input)}

signature_function = serving_default.get_concrete_function(
    tf.TensorSpec(shape=[], dtype=tf.float32))
tf.saved_model.save(
    model, 'tf2-save', signatures={
        tf.saved_model.DEFAULT_SERVING_SIGNATURE_DEF_KEY: signature_function})
INFO:tensorflow:Assets written to: tf2-save/assets
2021-11-06 01:28:53.105391: W tensorflow/python/util/util.cc:368] Sets are not currently considered sequences, but this may change in the future, so consider avoiding using them.
l10n-placeholder16 l10n-placeholder17 l10n-placeholder17l10n-placeholder17 l10n-placeholder15
!saved_model_cli run --dir tf2-save --tag_set serve \
 --signature_def serving_default --input_exprs input=10
WARNING:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.7/site-packages/tensorflow/python/tools/saved_model_cli.py:453: load (from tensorflow.python.saved_model.loader_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.loader.load or tf.compat.v1.saved_model.load. There will be a new function for importing SavedModels in Tensorflow 2.0.
INFO:tensorflow:Restoring parameters from tf2-save/variables/variables
Result for output key output:
12.0

حفظ وتصدير SavedModel المحدد مع Keras

يمكن لواجهات برمجة تطبيقات Keras للحفظ والتصدير - Mode.save أو tf.keras.models.save_model - تصدير SavedModel من ملف tf.keras.Model . تحقق من نماذج حفظ وتحميل Keras لمزيد من التفاصيل.

inp = tf.keras.Input(3)
out = add_two(inp)
model = tf.keras.Model(inputs=inp, outputs=out)

@tf.function(input_signature=[tf.TensorSpec(shape=[], dtype=tf.float32)])
def serving_default(input):
  return {'output': model(input)}

model.save('keras-model', save_format='tf', signatures={
        tf.saved_model.DEFAULT_SERVING_SIGNATURE_DEF_KEY: serving_default})
WARNING:tensorflow:Compiled the loaded model, but the compiled metrics have yet to be built. `model.compile_metrics` will be empty until you train or evaluate the model.
WARNING:tensorflow:Model was constructed with shape (None, 3) for input KerasTensor(type_spec=TensorSpec(shape=(None, 3), dtype=tf.float32, name='input_1'), name='input_1', description="created by layer 'input_1'"), but it was called on an input with incompatible shape ().
INFO:tensorflow:Assets written to: keras-model/assets
!saved_model_cli run --dir keras-model --tag_set serve \
 --signature_def serving_default --input_exprs input=10
WARNING:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.7/site-packages/tensorflow/python/tools/saved_model_cli.py:453: load (from tensorflow.python.saved_model.loader_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.loader.load or tf.compat.v1.saved_model.load. There will be a new function for importing SavedModels in Tensorflow 2.0.
INFO:tensorflow:Restoring parameters from keras-model/variables/variables
Result for output key output:
12.0

تحميل نموذج المحفوظ

يمكن تحميل نموذج SavedModel المحفوظ مع أي من واجهات برمجة التطبيقات المذكورة أعلاه باستخدام TensorFlow 1 أو TensorFlow APIs.

يمكن استخدام TensorFlow 1 SavedModel بشكل عام للاستدلال عند تحميله في TensorFlow 2 ، ولكن التدريب (إنشاء التدرجات) يكون ممكنًا فقط إذا كان SavedModel يحتوي على متغيرات الموارد . يمكنك التحقق من نوع المتغيرات - إذا كان المتغير dtype يحتوي على "_ref" ، فهو متغير مرجعي.

يمكن تحميل TensorFlow 2 SavedModel وتنفيذه من TensorFlow 1 طالما تم حفظ SavedModel بالتوقيعات.

تحتوي الأقسام أدناه على نماذج تعليمات برمجية توضح كيفية تحميل SavedModels المحفوظة في الأقسام السابقة ، واستدعاء التوقيع المُصدَّر.

TensorFlow 1: تحميل نموذج SavedModel مع tf.saved_model.load

في TensorFlow 1 ، يمكنك استيراد SavedModel مباشرة إلى الرسم البياني الحالي والجلسة باستخدام tf.saved_model.load . يمكنك استدعاء Session.run على أسماء المدخلات والمخرجات الموتر:

def load_tf1(path, input):
  print('Loading from', path)
  with tf.Graph().as_default() as g:
    with tf1.Session() as sess:
      meta_graph = tf1.saved_model.load(sess, ["serve"], path)
      sig_def = meta_graph.signature_def[tf.saved_model.DEFAULT_SERVING_SIGNATURE_DEF_KEY]
      input_name = sig_def.inputs['input'].name
      output_name = sig_def.outputs['output'].name
      print('  Output with input', input, ': ', 
            sess.run(output_name, feed_dict={input_name: input}))

load_tf1('saved-model-builder', 5.)
load_tf1('simple-save', 5.)
load_tf1('estimator-model', [5.])  # Estimator's input must be batched.
load_tf1('tf2-save', 5.)
load_tf1('keras-model', 5.)
Loading from saved-model-builder
WARNING:tensorflow:From /tmp/ipykernel_26511/1548963983.py:5: load (from tensorflow.python.saved_model.loader_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.loader.load or tf.compat.v1.saved_model.load. There will be a new function for importing SavedModels in Tensorflow 2.0.
INFO:tensorflow:Saver not created because there are no variables in the graph to restore
INFO:tensorflow:The specified SavedModel has no variables; no checkpoints were restored.
  Output with input 5.0 :  7.0
Loading from simple-save
INFO:tensorflow:Saver not created because there are no variables in the graph to restore
INFO:tensorflow:The specified SavedModel has no variables; no checkpoints were restored.
  Output with input 5.0 :  7.0
Loading from estimator-model
INFO:tensorflow:Restoring parameters from estimator-model/variables/variables
  Output with input [5.0] :  [7.]
Loading from tf2-save
INFO:tensorflow:Restoring parameters from tf2-save/variables/variables
  Output with input 5.0 :  7.0
Loading from keras-model
INFO:tensorflow:Restoring parameters from keras-model/variables/variables
  Output with input 5.0 :  7.0

TensorFlow 2: قم بتحميل نموذج محفوظ بـ tf.saved_model

في TensorFlow 2 ، يتم تحميل الكائنات في كائن Python الذي يخزن المتغيرات والوظائف. هذا متوافق مع النماذج المحفوظة من TensorFlow 1.

تحقق من tf.saved_model.load مستندات API وتحميل واستخدام قسم نموذج مخصص من دليل تنسيق SavedModel للحصول على التفاصيل.

def load_tf2(path, input):
  print('Loading from', path)
  loaded = tf.saved_model.load(path)
  out = loaded.signatures[tf.saved_model.DEFAULT_SERVING_SIGNATURE_DEF_KEY](
      tf.constant(input))['output']
  print('  Output with input', input, ': ', out)

load_tf2('saved-model-builder', 5.)
load_tf2('simple-save', 5.)
load_tf2('estimator-model', [5.])  # Estimator's input must be batched.
load_tf2('tf2-save', 5.)
load_tf2('keras-model', 5.)
Loading from saved-model-builder
INFO:tensorflow:Saver not created because there are no variables in the graph to restore
  Output with input 5.0 :  tf.Tensor(7.0, shape=(), dtype=float32)
Loading from simple-save
INFO:tensorflow:Saver not created because there are no variables in the graph to restore
  Output with input 5.0 :  tf.Tensor(7.0, shape=(), dtype=float32)
Loading from estimator-model
  Output with input [5.0] :  tf.Tensor([7.], shape=(1,), dtype=float32)
Loading from tf2-save
  Output with input 5.0 :  tf.Tensor(7.0, shape=(), dtype=float32)
Loading from keras-model
  Output with input 5.0 :  tf.Tensor(7.0, shape=(), dtype=float32)

يمكن أيضًا للنماذج المحفوظة باستخدام TensorFlow 2 API الوصول إلى tf.function والمتغيرات المرتبطة بالنموذج (بدلاً من تلك التي تم تصديرها كتوقيعات). فمثلا:

loaded = tf.saved_model.load('tf2-save')
print('restored __call__:', loaded.__call__)
print('output with input 5.', loaded(5))
restored __call__: <tensorflow.python.saved_model.function_deserialization.RestoredFunction object at 0x7f30cc940990>
output with input 5. tf.Tensor(7.0, shape=(), dtype=float32)

TensorFlow 2: قم بتحميل نموذج محفوظ باستخدام Keras

تسمح لك واجهة برمجة تطبيقات تحميل tf.keras.models.load_model - tf.keras.models.load_model - بإعادة تحميل نموذج محفوظ إلى كائن Keras Model. لاحظ أن هذا يسمح لك فقط بتحميل SavedModels المحفوظة مع Keras ( Model.save أو tf.keras.models.save_model ).

يجب تحميل النماذج المحفوظة بواسطة tf.saved_model.save بـ tf.saved_model.load . يمكنك تحميل نموذج Keras المحفوظ باستخدام Model.save باستخدام tf.saved_model.load ولكنك ستحصل فقط على الرسم البياني TensorFlow. راجع مستندات tf.keras.models.load_model API واحفظ دليل نماذج Keras وتحميله للحصول على التفاصيل.

loaded_model = tf.keras.models.load_model('keras-model')
loaded_model.predict_on_batch(tf.constant([1, 3, 4]))
WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.
WARNING:tensorflow:Model was constructed with shape (None, 3) for input KerasTensor(type_spec=TensorSpec(shape=(None, 3), dtype=tf.float32, name='input_1'), name='input_1', description="created by layer 'input_1'"), but it was called on an input with incompatible shape (3,).
array([3., 5., 6.], dtype=float32)

GraphDef و MetaGraphDef

لا توجد طريقة مباشرة لتحميل GraphDef MetaGraphDef إلى TF2. ومع ذلك ، يمكنك تحويل كود TF1 الذي يستورد الرسم البياني إلى وظيفة concrete_function TF2 باستخدام v1.wrap_function .

أولاً ، احفظ MetaGraphDef:

# Save a simple multiplication computation:
with tf.Graph().as_default() as g:
  x = tf1.placeholder(tf.float32, shape=[], name='x')
  v = tf.Variable(3.0, name='v')
  y = tf.multiply(x, v, name='y')
  with tf1.Session() as sess:
    sess.run(v.initializer)
    print(sess.run(y, feed_dict={x: 5}))
    s = tf1.train.Saver()
    s.export_meta_graph('multiply.pb', as_text=True)
    s.save(sess, 'multiply_values.ckpt')
15.0

باستخدام واجهات برمجة تطبيقات TF1 ، يمكنك استخدام tf1.train.import_meta_graph لاستيراد الرسم البياني واستعادة القيم:

with tf.Graph().as_default() as g:
  meta = tf1.train.import_meta_graph('multiply.pb')
  x = g.get_tensor_by_name('x:0')
  y = g.get_tensor_by_name('y:0')
  with tf1.Session() as sess:
    meta.restore(sess, 'multiply_values.ckpt')
    print(sess.run(y, feed_dict={x: 5}))
INFO:tensorflow:Restoring parameters from multiply_values.ckpt
15.0

لا توجد واجهات برمجة تطبيقات TF2 لتحميل الرسم البياني ، ولكن لا يزال بإمكانك استيراده إلى وظيفة ملموسة يمكن تنفيذها في الوضع الحثيث:

def import_multiply():
  # Any graph-building code is allowed here.
  tf1.train.import_meta_graph('multiply.pb')

# Creates a tf.function with all the imported elements in the function graph.
wrapped_import = tf1.wrap_function(import_multiply, [])
import_graph = wrapped_import.graph
x = import_graph.get_tensor_by_name('x:0')
y = import_graph.get_tensor_by_name('y:0')

# Restore the variable values.
tf1.train.Saver(wrapped_import.variables).restore(
    sess=None, save_path='multiply_values.ckpt')

# Create a concrete function by pruning the wrap_function (similar to sess.run).
multiply_fn = wrapped_import.prune(feeds=x, fetches=y)

# Run this function
multiply_fn(tf.constant(5.))  # inputs to concrete functions must be Tensors.
WARNING:tensorflow:Saver is deprecated, please switch to tf.train.Checkpoint or tf.keras.Model.save_weights for training checkpoints. When executing eagerly variables do not necessarily have unique names, and so the variable.name-based lookups Saver performs are error-prone.
INFO:tensorflow:Restoring parameters from multiply_values.ckpt
<tf.Tensor: shape=(), dtype=float32, numpy=15.0>

التغييرات من TensorFlow 1 إلى TensorFlow 2

يسرد هذا القسم شروط حفظ وتحميل المفاتيح من TensorFlow 1 ومكافئاتها من TensorFlow 2 وما الذي تغير.

نموذج

SavedModel هو تنسيق يخزن برنامج TensorFlow كامل مع المعلمات والحسابات. يحتوي على تواقيع مستخدمة من قبل منصات الخدمة لتشغيل النموذج.

تنسيق الملف نفسه لم يتغير بشكل كبير ، لذلك يمكن تحميل SavedModels وعرضها باستخدام واجهات برمجة تطبيقات TensorFlow 1 أو TensorFlow 2.

الاختلافات بين TensorFlow 1 و TensorFlow 2

لم يتم تحديث حالات استخدام العرض والاستدلال في TensorFlow 2 ، بصرف النظر عن تغييرات واجهة برمجة التطبيقات - تم تقديم التحسين في القدرة على إعادة استخدام النماذج التي تم تحميلها من SavedModel وتأليفها.

في TensorFlow 2 ، يتم تمثيل البرنامج بواسطة كائنات مثل tf.Variable أو tf.Module أو نماذج Keras ذات المستوى الأعلى ( tf.keras.Model ) والطبقات ( tf.keras.layers ). لا يوجد المزيد من المتغيرات العامة التي تحتوي على قيم مخزنة في الجلسة ، والرسم البياني موجود الآن في tf.function مختلفة. وبالتالي ، أثناء تصدير النموذج ، يحفظ SavedModel كل الرسوم البيانية للمكون والوظيفة بشكل منفصل.

عند كتابة برنامج TensorFlow باستخدام TensorFlow Python APIs ، يجب عليك إنشاء كائن لإدارة المتغيرات والوظائف والموارد الأخرى. بشكل عام ، يتم تحقيق ذلك باستخدام واجهات برمجة تطبيقات Keras ، ولكن يمكنك أيضًا إنشاء الكائن عن طريق إنشاء أو tf.Module فئة فرعية.

تقوم طرازي Keras ( tf.keras.Model ) و tf.Module تلقائيًا بتتبع المتغيرات والوظائف المرتبطة بها. يحفظ SavedModel هذه الاتصالات بين الوحدات النمطية والمتغيرات والوظائف ، بحيث يمكن استعادتها عند التحميل.

التوقيعات

التواقيع هي نقاط النهاية لـ SavedModel — تخبر المستخدم بكيفية تشغيل النموذج والمدخلات المطلوبة.

في TensorFlow 1 ، يتم إنشاء التواقيع من خلال سرد موترات الإدخال والإخراج. في TensorFlow 2 ، يتم إنشاء التوقيعات عن طريق تمرير وظائف محددة. (اقرأ المزيد عن وظائف TensorFlow في مقدمة الرسوم البيانية ودليل الدالة tf.) باختصار ، يتم إنشاء وظيفة ملموسة من دالة tf.function :

# Option 1: Specify an input signature.
@tf.function(input_signature=[...])
def fn(...):
  ...
  return outputs

tf.saved_model.save(model, path, signatures={
    'name': fn
})
# Option 2: Call `get_concrete_function`
@tf.function
def fn(...):
  ...
  return outputs

tf.saved_model.save(model, path, signatures={
    'name': fn.get_concrete_function(...)
})

Session.run

في TensorFlow 1 ، يمكنك استدعاء Session.run بالرسم البياني المستورد طالما أنك تعرف بالفعل أسماء الموتر. يتيح لك ذلك استرداد قيم المتغيرات المستعادة ، أو تشغيل أجزاء من النموذج لم يتم تصديرها في التواقيع.

في TensorFlow 2 ، يمكنك الوصول مباشرة إلى متغير ، مثل مصفوفة الأوزان ( kernel ):

model = tf.Module()
model.dense_layer = tf.keras.layers.Dense(...)
tf.saved_model.save('my_saved_model')
loaded = tf.saved_model.load('my_saved_model')
loaded.dense_layer.kernel

أو اتصل tf.function المرفقة بكائن النموذج: على سبيل المثال ، loaded.__call__ .

على عكس TF1 ، لا توجد طريقة لاستخراج أجزاء من دالة والوصول إلى القيم الوسيطة. يجب عليك تصدير جميع الوظائف المطلوبة في الكائن المحفوظ.

ملاحظات ترحيل خدمة TensorFlow

تم إنشاء SavedModel في الأصل للعمل مع خدمة TensorFlow . تقدم هذه المنصة أنواعًا مختلفة من طلبات التنبؤ: التصنيف والتراجع والتنبؤ.

تسمح لك TensorFlow 1 API بإنشاء هذه الأنواع من التوقيعات باستخدام الأدوات المساعدة:

يقيد التصنيف ( classification_signature_def ) والانحدار ( regression_signature_def ) المدخلات والمخرجات ، لذلك يجب أن تكون المدخلات tf.Example ، ويجب أن تكون المخرجات classes أو scores أو prediction . وفي الوقت نفسه ، لا توجد قيود على توقع التوقيع ( predict_signature_def ).

تتوافق نماذج SavedModels التي تم تصديرها باستخدام TensorFlow 2 API مع خدمة TensorFlow ، ولكنها ستحتوي فقط على توقيعات التنبؤ. تمت إزالة توقيعات التصنيف والانحدار.

إذا طلبت استخدام توقيعات التصنيف والانحدار ، فيمكنك تعديل SavedModel المُصدَّر باستخدام tf.compat.v1.saved_model.signature_def_utils.MethodNameUpdater .

الخطوات التالية

لمعرفة المزيد حول SavedModels في TensorFlow 2 ، راجع الأدلة التالية:

إذا كنت تستخدم TensorFlow Hub ، فقد تجد هذه الأدلة مفيدة: