ML Community Day คือวันที่ 9 พฤศจิกายน! ร่วมกับเราสำหรับการปรับปรุงจาก TensorFlow, JAX และอื่น ๆ เรียนรู้เพิ่มเติม

การใช้รูปแบบ SavedModel

ดูบน TensorFlow.org ทำงานใน Google Colab ดูแหล่งที่มาบน GitHub ดาวน์โหลดโน๊ตบุ๊ค

SavedModel มีโปรแกรมที่สมบูรณ์ TensorFlow รวมทั้งพารามิเตอร์การฝึกอบรม (เช่น tf.Variable s) และการคำนวณ มันไม่จำเป็นต้องใช้รูปแบบเดิมรหัสเพื่อใช้ในการสร้างซึ่งทำให้มันมีประโยชน์สำหรับใช้งานร่วมกันหรือการปรับใช้กับ TFLite , TensorFlow.js , TensorFlow ให้บริการ หรือ TensorFlow Hub

คุณสามารถบันทึกและโหลดโมเดลในรูปแบบ SavedModel โดยใช้ API ต่อไปนี้:

การสร้าง SavedModel จาก Keras

สำหรับการแนะนำอย่างรวดเร็ว ส่วนนี้จะส่งออกโมเดล Keras ที่ได้รับการฝึกอบรมล่วงหน้าและให้บริการคำขอการจัดประเภทรูปภาพด้วย คู่มือที่เหลือจะกรอกรายละเอียดและหารือเกี่ยวกับวิธีอื่นๆ ในการสร้าง 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.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
73728/61306 [====================================] - 0s 0us/step

png

คุณจะใช้รูปภาพของ Grace Hopper เป็นตัวอย่างที่กำลังดำเนินการ และโมเดลการจัดประเภทรูปภาพที่ฝึกล่วงหน้าของ Keras เนื่องจากใช้งานง่าย โมเดลที่กำหนดเองก็ใช้งานได้เช่นกัน และจะกล่าวถึงในรายละเอียดในภายหลัง

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-09-22 20:37:56.476712: 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/tmpiq7_1gwc/mobilenet/1/assets

บันทึกเส้นทางต่อไปนี้การประชุมที่ใช้โดยผู้ให้บริการที่ TensorFlow องค์ประกอบเส้นทางที่ผ่านมา ( 1/ ที่นี่) คือหมายเลขรุ่นสำหรับแบบของคุณ - มันช่วยให้เครื่องมือเช่น Tensorflow ให้บริการเหตุผลเกี่ยวกับความสดใหม่ญาติ

คุณสามารถโหลดกลับ SavedModel เข้าหลามกับ 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']

การเรียกใช้ SavedModel ใน TensorFlow Serving

SavedModels ใช้งานได้จาก Python (เพิ่มเติมจากด้านล่าง) แต่สภาพแวดล้อมการใช้งานจริงมักใช้บริการเฉพาะสำหรับการอนุมานโดยไม่ต้องใช้โค้ด Python ตั้งค่าได้ง่ายจาก SavedModel โดยใช้ TensorFlow Serving

ดู TensorFlow ให้บริการกวดวิชา REST สำหรับ tensorflow ให้บริการเช่นแบบ end-to-end

รูปแบบ SavedModel บนดิสก์

SavedModel เป็นไดเร็กทอรีที่มีลายเซ็นต่อเนื่องและสถานะที่จำเป็นในการรัน ซึ่งรวมถึงค่าตัวแปรและคำศัพท์

ls {mobilenet_save_path}
assets  saved_model.pb  variables

saved_model.pb ร้านค้าไฟล์โปรแกรมจริง TensorFlow หรือรุ่นและชุดของลายเซ็นชื่อที่ระบุในแต่ละฟังก์ชั่นที่รับปัจจัยการผลิตเมตริกซ์และผลิตเอาท์พุทเมตริกซ์

SavedModels อาจมีหลายสายพันธุ์ของรูปแบบ (หลาย v1.MetaGraphDefs ระบุกับ --tag_set ธง saved_model_cli ) แต่นี่เป็นเรื่องยาก APIs ซึ่งสร้างหลายสายพันธุ์ของรูปแบบ ได้แก่ 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 ไดเรกทอรีสำหรับไฟล์ใด ๆ ที่ไม่ได้ใช้โดยกราฟ TensorFlow สำหรับข้อมูลตัวอย่างเช่นสำหรับผู้บริโภคเกี่ยวกับสิ่งที่จะทำอย่างไรกับ SavedModel TensorFlow เองไม่ได้ใช้ไดเรกทอรีนี้

กำลังบันทึกโมเดลแบบกำหนดเอง

tf.saved_model.save สนับสนุนการบันทึก tf.Module วัตถุและ subclasses ของมันเช่น tf.keras.Layer และ tf.keras.Model

ดู Let 's ตัวอย่างของการประหยัดและฟื้นฟูหนึ่ง 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 -decorated วิธีการและ tf.Module s พบผ่านทางข้าม recursive จะถูกบันทึกไว้ (ดู ด่านกวดวิชา สำหรับข้อมูลเพิ่มเติมเกี่ยวกับการข้ามผ่าน recursive นี้.) อย่างไรก็ตามคุณลักษณะหลามใด ๆ ฟังก์ชั่นและข้อมูลจะหายไป ซึ่งหมายความว่าเมื่อ tf.function จะถูกบันทึกไว้ไม่มีรหัสหลามจะถูกบันทึกไว้

หากไม่ได้บันทึกโค้ด Python แล้ว SavedModel จะรู้วิธีกู้คืนฟังก์ชันได้อย่างไร

สั้น ๆ , tf.function ทำงานโดยการติดตามรหัสหลามเพื่อสร้าง ConcreteFunction (เสื้อคลุม callable รอบ tf.Graph ) เมื่อประหยัด tf.function , คุณจริงๆประหยัด tf.function แคชของ ConcreteFunctions

ต้องการเรียนรู้เพิ่มเติมเกี่ยวกับความสัมพันธ์ระหว่าง tf.function และ ConcreteFunctions ดูที่ คู่มือ 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/tmpiq7_1gwc/module_no_signatures/assets

กำลังโหลดและใช้งานโมเดลที่กำหนดเอง

เมื่อคุณโหลด SavedModel ในหลามทั้งหมด tf.Variable คุณลักษณะ tf.function -decorated วิธีการและ tf.Module s มีการบูรณะในโครงสร้างวัตถุเหมือนกับต้นฉบับที่บันทึกไว้ 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'),), {})].

การปรับจูนเบื้องต้น

ออบเจ็กต์ตัวแปรพร้อมใช้งาน และคุณสามารถ backprop ผ่านฟังก์ชันที่นำเข้าได้ นั่นก็เพียงพอแล้วที่จะปรับแต่ง (เช่น ฝึกใหม่) SavedModel ในกรณีง่ายๆ

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

การปรับจูนทั่วไป

SavedModel จาก Keras ให้ รายละเอียดเพิ่มเติม กว่าธรรมดา __call__ ไปยังที่อยู่กรณีที่สูงขึ้นของการปรับจูน TensorFlow Hub แนะนำให้จัดเตรียมสิ่งต่อไปนี้ (ถ้ามี) ใน SavedModels ที่แชร์เพื่อจุดประสงค์ในการปรับแต่ง:

  • หากใช้รูปแบบการออกกลางคันหรือเทคนิคอื่นที่แตกต่างไปข้างหน้าผ่านระหว่างการฝึกอบรมและการอนุมาน (เช่นการฟื้นฟูแบทช์) ที่ __call__ วิธีการใช้เวลาเลือกหลามมูลค่า training= โต้แย้งว่าค่าเริ่มต้น False แต่สามารถตั้งค่าให้ True
  • ถัดไปไปที่ __call__ แอตทริบิวต์มี .variable และ .trainable_variable แอตทริบิวต์กับรายการที่สอดคล้องกันของตัวแปร ตัวแปรที่เป็นสุวินัยเดิม แต่จะหมายถึงการถูกแช่แข็งในช่วงปรับจูนจะถูกตัดออกจาก .trainable_variables
  • เพื่อประโยชน์ของกรอบเช่น Keras ที่เป็นตัวแทนของ regularizers น้ำหนักเป็นคุณลักษณะของชั้นหรือรุ่นย่อยที่มียังสามารถเป็น .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 ให้บริการและ saved_model_cli สามารถโต้ตอบกับ SavedModels เพื่อช่วยให้เครื่องมือเหล่านี้กำหนดว่า ConcreteFunctions ใดที่จะใช้ คุณต้องระบุลายเซ็นที่ให้บริการ tf.keras.Model s โดยอัตโนมัติระบุการให้บริการลายเซ็น แต่คุณจะต้องประกาศอย่างชัดแจ้งลายเซ็นที่ให้บริการสำหรับโมดูลของเราเอง

โดยค่าเริ่มต้นไม่มีลายเซ็นมีการประกาศในที่กำหนดเอง tf.Module

assert len(imported.signatures) == 0

ต้องการประกาศลายเซ็นให้บริการระบุ ConcreteFunction ใช้ signatures kwarg เมื่อระบุลายเซ็นเดียวที่สำคัญลายเซ็นของมันจะเป็น '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/tmpiq7_1gwc/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/tmpiq7_1gwc/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 จะกลับพจนานุกรมที่แมปชื่อส่งออกไปยังเอาท์พุต ชื่อของอินพุตได้มาจากชื่อ arg ของฟังก์ชัน Python

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

โหลด SavedModel ใน C++

c ++ รุ่นของ SavedModel รถตักดิน มี API ในการโหลด SavedModel จากเส้นทางขณะที่ช่วยให้ SessionOptions และ RunOptions คุณต้องระบุแท็กที่เกี่ยวข้องกับกราฟที่จะโหลด เวอร์ชันที่โหลดของ SavedModel เรียกว่า SavedModelBundle และมี MetaGraphDef และเซสชันภายในที่โหลด

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

รายละเอียดของอินเตอร์เฟสบรรทัดคำสั่ง SavedModel

คุณสามารถใช้ SavedModel Command Line Interface (CLI) เพื่อตรวจสอบและดำเนินการ SavedModel ตัวอย่างเช่นคุณสามารถใช้ CLI ในการตรวจสอบรูปแบบของ SignatureDef s CLI ช่วยให้คุณยืนยันได้อย่างรวดเร็วว่าอินพุต Tensor dtype และรูปร่างตรงกับโมเดล นอกจากนี้ หากคุณต้องการทดสอบโมเดลของคุณ คุณสามารถใช้ CLI เพื่อตรวจสอบสติโดยส่งตัวอย่างอินพุตในรูปแบบต่างๆ (เช่น นิพจน์ Python) แล้วดึงเอาต์พุต

ติดตั้ง SavedModel CLI

โดยทั่วไปแล้ว คุณสามารถติดตั้ง TensorFlow ได้ด้วยวิธีใดวิธีหนึ่งต่อไปนี้:

  • โดยการติดตั้งไบนารี TensorFlow ที่สร้างไว้ล่วงหน้า
  • โดยการสร้าง TensorFlow จากซอร์สโค้ด

หากคุณติดตั้ง TensorFlow ผ่านที่สร้างไว้ล่วงหน้า TensorFlow ไบนารีแล้ว SavedModel CLI ติดตั้งอยู่บนระบบของคุณที่ชื่อพา ธ bin/saved_model_cli

ถ้าคุณสร้าง TensorFlow จากซอร์สโค้ดคุณต้องเรียกใช้คำสั่งเพิ่มเติมต่อไปนี้เพื่อสร้าง saved_model_cli :

$ bazel build tensorflow/python/tools:saved_model_cli

ภาพรวมของคำสั่ง

SavedModel CLI รองรับคำสั่งสองคำสั่งต่อไปนี้บน SavedModel:

  • show ซึ่งแสดงให้เห็นว่าการคำนวณที่มีอยู่จาก SavedModel
  • run ซึ่งไหลคำนวณจาก SavedModel

show คำสั่ง

SavedModel มีมากกว่าหนึ่งสายพันธุ์รุ่น (เทคนิค v1.MetaGraphDef s) ระบุโดยแท็กชุดของพวกเขา ที่จะให้บริการรูปแบบที่คุณอาจสงสัยว่าสิ่งที่ชนิดของ SignatureDef s อยู่ในแต่ละรุ่นแตกต่างและสิ่งที่เป็นปัจจัยการผลิตและผลของพวกเขา show คำสั่งให้คุณตรวจสอบเนื้อหาของ SavedModel ในการสั่งซื้อลำดับชั้น นี่คือไวยากรณ์:

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

เพื่อแสดงให้เห็นปัจจัยการผลิตทั้งหมดและผล 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 คำสั่งเพื่อเรียกใช้การคำนวณกราฟผ่านปัจจัยการผลิตและการแสดงแล้ว (และเลือกที่ประหยัด) ผลลัพธ์ที่ได้ นี่คือไวยากรณ์:

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 numpy ในแฟ้ม
  • --input_exprs ตัวเลือกที่ช่วยให้คุณสามารถที่จะผ่านการแสดงออกหลาม
  • --input_examples ตัวเลือกที่ช่วยให้คุณสามารถที่จะผ่าน tf.train.Example

--inputs

ที่จะผ่านการป้อนข้อมูลในแฟ้มที่ระบุ --inputs ตัวเลือกซึ่งจะมีรูปแบบทั่วไปต่อไปนี้:

--inputs <INPUTS>

ที่อินพุตเป็นรูปแบบหนึ่งต่อไปนี้:

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

คุณอาจจะผ่านหลายอินพุต ถ้าคุณทำผ่านปัจจัยการผลิตหลายรายการให้ใช้เครื่องหมายอัฒภาคเพื่อแยกแต่ละของปัจจัยการผลิต

saved_model_cli ใช้ numpy.load โหลดชื่อไฟล์ ชื่อไฟล์อาจจะอยู่ในรูปแบบใด ๆ ต่อไปนี้:

  • .npy
  • .npz
  • รูปแบบดอง

.npy ไฟล์เสมอมี ndarray numpy ดังนั้นเมื่อโหลดจาก .npy ไฟล์เนื้อหาจะได้รับมอบหมายโดยตรงกับเมตริกซ์การป้อนข้อมูลที่ระบุ ถ้าคุณระบุ variable_name กับที่ .npy ไฟล์ variable_name จะถูกละเว้นและคำเตือนที่จะออก

เมื่อโหลดจาก .npz ไฟล์ (ซิป) คุณเลือกอาจระบุ variable_name เพื่อระบุตัวแปรภายใน zip ไฟล์ที่จะโหลดสำหรับคีย์การป้อนข้อมูลเมตริกซ์ ถ้าคุณไม่ได้ระบุ variable_name ให้ SavedModel CLI จะตรวจสอบว่ามีเพียงหนึ่งไฟล์จะรวมอยู่ในไฟล์ซิปและโหลดสำหรับคีย์เมตริกซ์การป้อนข้อมูลที่ระบุ

เมื่อโหลดจากไฟล์ดองหากไม่มี variable_name ระบุไว้ในวงเล็บสิ่งที่อยู่ภายในไฟล์ดองจะถูกส่งผ่านไปยังคีย์เมตริกซ์การป้อนข้อมูลที่ระบุ มิฉะนั้น SavedModel CLI จะถือว่าพจนานุกรมจะถูกเก็บไว้ในแฟ้มดองและความคุ้มค่าที่สอดคล้องกับ variable_name จะใช้

--input_exprs

ที่จะผ่านปัจจัยการผลิตผ่านการแสดงออกหลามระบุ --input_exprs ตัวเลือก ซึ่งจะเป็นประโยชน์สำหรับเมื่อคุณไม่ได้มีไฟล์ข้อมูลโกหกรอบ แต่ยังคงต้องการที่จะมีสุขภาพจิตดีตรวจสอบรุ่นที่มีปัจจัยบางอย่างง่ายที่ตรงกับ dtype และรูปร่างของรูปแบบของ SignatureDef s ตัวอย่างเช่น:

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

นอกจากนิพจน์ Python แล้ว คุณยังสามารถส่งฟังก์ชัน numpy ได้อีกด้วย ตัวอย่างเช่น:

`<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 เขียนทับไฟล์ที่ส่งออกที่มีอยู่