Bu sayfa, Cloud Translation API ile çevrilmiştir.
Switch to English

SavedModel biçimini kullanma

TensorFlow.org üzerinde görüntüle Google Colab'da yayınla Kaynağı GitHub'da görüntüle Not defterini indir

Bir SavedModel, ağırlıklar ve hesaplama dahil olmak üzere eksiksiz bir TensorFlow programı içerir. Orijinal model oluşturma kodunun çalışmasını gerektirmez, bu da paylaşımı veya dağıtımı için yararlı kılar ( TFLite , TensorFlow.js , TensorFlow Sunumu veya TensorFlow Hub ile ).

Bu belge, düşük seviyeli tf.saved_model nasıl kullanılacağına ilişkin bazı ayrıntılara tf.saved_model :

Keras'tan Kayıtlı Model Oluşturma

Hızlı bir giriş için, bu bölüm önceden eğitilmiş bir Keras modelini dışa aktarır ve onunla görüntü sınıflandırma taleplerini sunar. Rehberin geri kalanı ayrıntıları dolduracak ve Kaydedildi Modellerini oluşturmanın diğer yollarını tartışacaktır.

 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

Grace Hopper görüntüsünü çalışan bir örnek olarak kullanacağız ve kullanımı kolay olduğu için Keras tarafından önceden eğitilmiş bir görüntü sınıflandırma modeli kullanacağız. Özel modeller de çalışır ve daha sonra ayrıntılı olarak ele alınacaktır.

 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']

Bu görüntünün en büyük tahmini "askeri üniforma" dır.

 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

Kaydetme yolu, son yol bileşeninin ( 1/ burada) modeliniz için bir sürüm numarası olduğu TensorFlow Serving tarafından kullanılan bir kuralı izler - Tensorflow Serving gibi araçların göreceli tazelik hakkında akıl yürütmesine izin verir.

SavedModel'i tf.saved_model.load ile Python'a geri tf.saved_model.load ve Amiral Hopper'ın görüntüsünün nasıl sınıflandırıldığını görebiliriz.

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

İçe aktarılan imzalar her zaman sözlükleri döndürür. İmza adlarını ve çıktı sözlüğü anahtarlarını özelleştirmek için, bkz. Dışa aktarma sırasında imza belirtme .

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

SavedModel'den çıkarım yapmak orijinal modelle aynı sonucu verir.

 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 Sunumunda Kayıtlı Model Çalıştırma

Kaydedilen Modeller Python'dan kullanılabilir (aşağıda daha fazlası), ancak üretim ortamları genellikle Python kodunu çalıştırmadan çıkarım için özel bir hizmet kullanır. Bu, TensorFlow Sunumu kullanılarak bir RegisteredModel'den kolayca kurulabilir.

Sunuma ilişkin daha fazla ayrıntı için tensorflow_model_server bir dizüstü bilgisayara veya yerel makinenize kurma talimatları da dahil olmak üzere TensorFlow Sunum REST öğreticisine bakın. Hızlı bir taslak olarak, yukarıda dışa aktarılan mobilenet modeline hizmet vermek için, model sunucusunu KaydedildiModel dizinine yönlendirin:

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

Sonra bir istek gönderin.

 !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"])
 

Ortaya çıkan predictions Python'un sonuçları ile aynıdır.

Diskteki SavedModel biçimi

Bir RegistedModel, serileştirilmiş imzalar ve değişken değerleri ve sözcük dağarcığı da dahil olmak üzere bunları çalıştırmak için gereken durumu içeren bir dizindir.

ls {mobilenet_save_path}
assets  saved_model.pb  variables

saved_model.pb dosyası, gerçek TensorFlow programını veya modelini ve her biri tensör girişlerini kabul eden ve tensör çıkışları üreten bir işlevi tanımlayan bir dizi imza içerir.

Kaydedilen Modeller, modelin birden çok varyantını içerebilir (- v1.MetaGraphDefs , --tag_set bayrağı ile saved_model_cli olarak saved_model_cli ), ancak bu nadirdir. Bir modelin birden çok varyantını oluşturan API'ler arasında tf.Estimator.experimental_export_all_saved_models ve 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 dizini standart bir eğitim kontrol noktası içerir (eğitim kontrol noktaları kılavuzuna bakın).

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

assets dizini, TensorFlow grafiği tarafından kullanılan dosyaları, örneğin kelime tablolarını başlatmak için kullanılan metin dosyalarını içerir. Bu örnekte kullanılmamıştır.

SavedModels, TensorFlow grafiği tarafından kullanılmayan dosyalar için bir assets.extra dizinine sahip olabilir, örneğin tüketiciler için KaydedildiModeli ile ne yapılacağı hakkında bilgi. TensorFlow'un kendisi bu dizini kullanmaz.

Özel bir modeli kaydetme

tf.saved_model.save , tf.Module nesnelerini ve tf.keras.Layer ve tf.keras.Model gibi alt sınıflarını kaydetmeyi destekler.

Bir tf.Module kaydetme ve geri yükleme 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()
 

Bir tasarruf zaman tf.Module , herhangi tf.Variable nitelikleri, tf.function yöntemleri -dekore ve tf.Module s özyinelemeli geçişi aracılığıyla bulunan kaydedilir. (Bu özyinelemeli geçiş hakkında daha fazla bilgi için Denetim Noktası öğreticisine bakın.) Ancak, Python öznitelikleri, işlevleri ve verileri kaybolur. Bu, bir tf.function kaydedildiğinde Python kodunun kaydedilmediği anlamına gelir.

Kaydedilmiş bir Python kodu yoksa, SavedModel işlevi nasıl geri yükleyeceğini nasıl bilir?

Kısaca, tf.function , Python kodunu izleyerek bir ConcreteFunction ( tf.Graph etrafında çağrılabilir bir sarıcı) oluşturmak için çalışır. Bir tf.function kaydederken, tf.function ConcreteFunctions önbelleğini gerçekten kaydedersiniz.

tf.function ve ConcreteFunctions arasındaki ilişki hakkında daha fazla bilgi edinmek için tf.function kılavuzuna bakın .

 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

Özel bir model yükleme ve kullanma

Python'a bir SavedModel yüklediğinizde, tüm tf.Variable öznitelikleri, tf.function -decorated yöntemleri ve tf.Module s, kaydedilen orijinal tf.Module aynı nesne yapısına geri yüklenir.

 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
 

Python kodu kaydedilmediğinden, yeni bir giriş imzasıyla tf.function çağrısı başarısız olur:

 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'),), {})].

Temel ince ayar

Değişken nesneler mevcuttur ve içe aktarılan işlevler ile geri dönüş yapabiliriz. Bu, bir Kaydedildi Modele basit durumlarda ince ayar yapmak (yani yeniden eğitmek) için yeterlidir.

 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

Genel ince ayar

Keras'tan bir SavedModel, daha gelişmiş ince ayar vakalarını ele __call__ için düz bir __call__ __'dan daha fazla ayrıntı sağlar. TensorFlow Hub, varsa, ince ayar amacıyla paylaşılan Kaydedildi Modellerinde aşağıdakilerin sağlanmasını önerir:

  • Model, bırakma veya ileri geçişin eğitim ve çıkarım (grup normalizasyonu gibi) arasında farklılık gösterdiği başka bir teknik kullanıyorsa, __call__ yöntemi isteğe bağlı, Python değerli training= bağımsız değişkenini varsayılan olarak False True olarak ayarlanabilir.
  • Yanındaki __call__ özniteliği vardır .variable ve .trainable_variable değişkenlerin gelen listeleri ile nitelikler. Başlangıçta eğitilebilir ancak ince ayar sırasında dondurulması gereken bir değişken .trainable_variables .
  • Ağırlık düzenleyicileri katmanların veya alt modellerin nitelikleri olarak temsil eden .regularization_losses gibi çerçeveler uğruna bir .regularization_losses niteliği de olabilir. Değerleri, toplam zarara eklenecek olan sıfır bağımsız değişken işlevlerinin bir listesini tutar.

İlk MobileNet örneğine geri dönersek, bunlardan bazılarını çalışırken görebiliriz:

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

Dışa aktarma sırasında imzaların belirtilmesi

TensorFlow Sunumu ve saved_model_cli gibi araçlar saved_model_cli ile etkileşime girebilir. Bu araçların hangi ConcreteFunctions'ın kullanılacağını belirlemesine yardımcı olmak için, hizmet imzalarını belirtmemiz gerekir. tf.keras.Model otomatik olarak sunum imzalarını belirtir, ancak özel modüllerimiz için açıkça bir sunum imzası beyan etmek zorundayız.

Varsayılan olarak, özel bir tf.Module imza bildirilmez.

 assert len(imported.signatures) == 0
 

Bir sunum imzası bildirmek için, signatures kwarg'ını kullanarak bir ConcreteFunction belirtin. Tek bir imza 'serving_default' , imza anahtarı 'serving_default' sabiti olarak kaydedilen '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']

Birden çok imzayı dışa aktarmak için ConcreteFunctions'a imza anahtarları sözlüğü iletin. Her imza anahtarı bir ConcreteFunction'a karşılık gelir.

 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']

Varsayılan olarak, çıkış tensörü adları output_0 gibi oldukça geneldir. Çıktıların adlarını kontrol etmek için, çıkış adlarını çıktılarla eşleştiren bir sözlük döndürmek için tf.function işlevinizi değiştirin. Girişlerin isimleri Python fonksiyon arg isimlerinden türetilir.

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

Tahmincilerden Kaydedilen Modeller

Tahminciler, tf.Estimator.export_saved_model tf.Estimator.export_saved_model yoluyla dışa tf.Estimator.export_saved_model . Ayrıntılar için Tahmincisi kılavuzuna bakın.

 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

Bu SavedModel, serileştirilmiş tf kabul eder. Sunum için yararlı olan tf.Example protokol tamponları. Ancak tf.saved_model.load ile tf.saved_model.load ve Python'dan çalıştırabiliriz.

 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 yerine ham tensörleri alan giriş işlevleri oluşturmanıza olanak tanır.

C ++ 'da bir RegisteredModel yükleyin

SavedModel yükleyicinin C ++ sürümü, SessionOptions ve RunOptions'a izin verirken, bir yoldan bir RegistModel yüklemek için bir API sağlar. Yüklenecek grafikle ilişkili etiketleri belirtmelisiniz. KayıtlıModel sürümü, KaydedildiModelBundle olarak adlandırılır ve MetaGraphDef'i ve içinde yüklendiği oturumu içerir.

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

SavedModel komut satırı arabiriminin ayrıntıları

Bir SavedModel'i incelemek ve yürütmek için SavedModel Komut Satırı Arabirimini (CLI) kullanabilirsiniz. Örneğin, modelin SignatureDef incelemek için CLI'yi kullanabilirsiniz. CLI, Tensor giriş tipinin ve şeklinin modele uyduğunu hızlı bir şekilde onaylamanızı sağlar. Dahası, modelinizi test etmek istiyorsanız, çeşitli biçimlerde (örneğin, Python ifadeleri) örnek girişleri iletip çıktıyı getirerek bir sağlık kontrolü yapmak için CLI'yi kullanabilirsiniz.

SavedModel CLI'yi yükleyin

Genel olarak, TensorFlow'u aşağıdaki iki yoldan biriyle kurabilirsiniz:

  • Önceden oluşturulmuş bir TensorFlow ikili dosyası yükleyerek.
  • Kaynak kodundan TensorFlow oluşturarak.

TensorFlow'u önceden oluşturulmuş bir TensorFlow ikili dosyasından yüklediyseniz, RegisteredModel CLI, sisteminize bin/saved_model_cli yol bin/saved_model_cli zaten yüklenmiştir.

Eğer kaynak kodundan TensorFlow inşa varsa, yapı için aşağıdaki ek komutu çalıştırmalısınız saved_model_cli :

 $ bazel build tensorflow/python/tools:saved_model_cli
 

Komutlara genel bakış

SavedModel CLI, bir SavedModel üzerinde aşağıdaki iki komutu destekler:

  • show bir SavedModel dan olan Şekil hesaplamaları mevcuttur.
  • Kaydedilmiş bir modülden bir hesaplama run .

show komut

Bir SavedModel, etiket kümeleri tarafından tanımlanan bir veya daha fazla model varyantı (teknik olarak v1.MetaGraphDef s) içerir. Bir modele hizmet etmek için, her model varyantında ne tür SignatureDef ler olduğunu ve bunların girdi ve çıktılarının ne olduğunu merak edebilirsiniz. show komutu, RegisteredModel'in içeriğini hiyerarşik sırada incelemenizi sağlar. İşte sözdizimi:

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

Örneğin, aşağıdaki komut, RegisteredModel'deki tüm kullanılabilir etiket kümelerini gösterir:

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

Aşağıdaki komut, bir etiket kümesi için kullanılabilir tüm SignatureDef anahtarlarını gösterir:

 $ 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"
 

Etiket kümesinde birden çok etiket varsa, her etiketi virgülle ayırarak tüm etiketleri belirtmeniz gerekir. Örneğin:

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

Belirli bir SignatureDef için TensorInfo'nun tüm giriş ve çıkışlarını göstermek için SignatureDef anahtarını signature_def seçeneğine iletin. Bu, daha sonra hesaplama grafiğini yürütmek için giriş tensörlerinin tensör anahtar değerini, dtype ve şeklini bilmek istediğinizde çok yararlıdır. Örneğin:

 $ 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'de mevcut tüm bilgileri göstermek için --all seçeneğini kullanın. Örneğin:

$ 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

komutu run

Bir grafik hesaplaması yapmak, girişleri geçmek ve sonra çıkışları görüntülemek (ve isteğe bağlı olarak kaydetmek) için run komutunu çağırın. İşte sözdizimi:

 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 komutu, girdileri modele geçirmek için aşağıdaki üç yolu sağlar:

  • --inputs seçeneği, dosyalara sayısal ndarray iletmenizi sağlar.
  • --input_exprs seçeneği Python ifadelerini --input_exprs sağlar.
  • --input_examples seçenek geçmesine olanak tf.train.Example .

--inputs

Girdi verilerini dosyalara --inputs için, aşağıdaki genel biçimi alan --inputs seçeneğini belirtin:

 --inputs <INPUTS>
 

burada INPUTS aşağıdaki biçimlerden biridir:

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

Birden çok GİRİŞ geçebilirsiniz. Birden çok giriş iletirseniz , GİRİŞLERİN her birini ayırmak için noktalı virgül kullanın.

saved_model_cli , dosya numpy.load yüklemek için numpy.load saved_model_cli kullanır. Dosya adı aşağıdaki biçimlerden herhangi birinde olabilir:

  • .npy
  • .npz
  • turşu formatı

Bir .npy dosyası her zaman bir numpy ndarray içerir. Bu nedenle, bir .npy dosyasından yüklenirken, içerik doğrudan belirtilen giriş tensörüne atanacaktır. Bu .npy dosyasıyla bir değişken_adı belirtirseniz, değişken_adı yoksayılır ve bir uyarı verilir.

Bir .npz (zip) dosyasından yüklerken, isteğe bağlı olarak, giriş tensörü anahtarı için yüklenecek zip dosyası içindeki değişkeni tanımlamak için bir değişken_adı belirtebilirsiniz. Bir değişken_adı belirtmezseniz, RegisteredModel CLI zip dosyasına yalnızca bir dosyanın dahil edildiğini kontrol eder ve belirtilen giriş tensörü anahtarı için yükler.

Turşu dosyasından yüklerken, köşeli parantez içinde herhangi bir variable_name belirtilmezse, turşu dosyasının içinde ne olursa olsun belirtilen giriş tensör anahtarına geçirilir. Aksi takdirde, RegisteredModel CLI, bir sözlüğün turşu dosyasında saklandığını ve değişken_adı'na karşılık gelen değerin kullanılacağını varsayar.

--input_exprs

Girdileri Python ifadelerinden geçirmek için --input_exprs seçeneğini belirtin. Bu, etrafta veri dosyaları olmadığında, ancak modelin SignatureDef tipine ve şekline uyan bazı basit girişlerle modeli kontrol etmek istediğinizde yararlı olabilir. Örneğin:

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

Python ifadelerine ek olarak, sayısal işlevleri de iletebilirsiniz. Örneğin:

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

( numpy modülünün np olarak zaten mevcut olduğunu unutmayın.)

--input_examples

tf.train.Example girdi olarak iletmek için --input_examples seçeneğini belirtin. Her giriş anahtarı için, sözlüğün bir listesini alır; burada her sözlük, tf.train.Example . Sözlük anahtarları özelliklerdir ve değerler her özellik için değer listeleridir. Örneğin:

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

Çıktıyı kaydet

Varsayılan olarak, SavedModel CLI çıktıyı stdout'a yazar. Bir dizin --outdir seçeneğine geçirilirse, çıktılar belirtilen dizinin altındaki çıktı tensör anahtarlarından sonra .npy dosyaları olarak kaydedilir.

Mevcut çıktı dosyalarının üzerine yazmak için --overwrite kullanın.