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

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

SavedModel มีโปรแกรม TensorFlow ที่สมบูรณ์ รวมถึงพารามิเตอร์ที่ผ่านการฝึกอบรม (เช่น tf.Variable s) และการคำนวณ ไม่ต้องใช้รหัสการสร้างแบบจำลองดั้งเดิมในการทำงาน ซึ่งทำให้มีประโยชน์สำหรับการแบ่งปันหรือปรับใช้กับ TFLite , TensorFlow.js , TensorFlow Serving หรือ 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

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
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
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)
INFO:tensorflow:Assets written to: /tmp/tmpfcgkddlh/mobilenet/1/assets

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

คุณสามารถโหลด SavedModel กลับเข้าไปใน Python ด้วย tf.saved_model.load และดูว่ารูปภาพของ Admiral Hopper ถูกจัดประเภทอย่างไร

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 Serving REST สำหรับตัวอย่างการให้บริการเทนเซอร์โฟลว์ตั้งแต่ต้นทางถึงปลายทาง

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

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

ls {mobilenet_save_path}
assets  saved_model.pb  variables

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

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
2021-02-11 02:25:22.757135: I tensorflow/stream_executor/platform/default/dso_loader.cc:49] Successfully opened dynamic library libcudart.so.11.0
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 และคลาสย่อย เช่น 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 -decorated วิธีการและ tf.Module s พบผ่านทางข้าม recursive จะถูกบันทึกไว้ (ดู บทช่วยสอน Checkpoint สำหรับข้อมูลเพิ่มเติมเกี่ยวกับการข้ามผ่านแบบเรียกซ้ำนี้) อย่างไรก็ตาม แอตทริบิวต์ ฟังก์ชัน และข้อมูลของ Python ใดๆ จะสูญหาย ซึ่งหมายความว่าเมื่อบันทึก tf.function จะไม่มีการบันทึกโค้ด Python

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

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

หากต้องการเรียนรู้เพิ่มเติมเกี่ยวกับความสัมพันธ์ระหว่าง 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/tmpfcgkddlh/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

เนื่องจากไม่มีการบันทึกโค้ด Python การเรียก 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__ ธรรมดาเพื่อ __call__ กับกรณีขั้นสูงของการปรับแต่งอย่างละเอียด TensorFlow Hub แนะนำให้จัดเตรียมสิ่งต่อไปนี้ (ถ้ามี) ใน SavedModels ที่แชร์เพื่อจุดประสงค์ในการปรับแต่ง:

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

โดยค่าเริ่มต้น จะไม่มีการประกาศลายเซ็นใน 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/tmpfcgkddlh/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/tmpfcgkddlh/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/tmpfcgkddlh/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++

ตัว โหลด SavedModel เวอร์ชัน C++ จัดเตรียม 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 ของโมเดลได้ 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 เป็นแบบใดในตัวแปรแต่ละรุ่น และอินพุตและเอาต์พุตคืออะไร คำสั่ง 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 คำสั่ง 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 จำนวนมากในไฟล์ได้
  • --input_exprs ตัวเลือกช่วยให้คุณสามารถส่งผ่านนิพจน์ Python
  • --input_examples ตัวเลือกช่วยให้คุณสามารถส่งผ่าน tf.train.Example

--inputs

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

--inputs <INPUTS>

โดยที่ INPUTS เป็นรูปแบบใดรูปแบบหนึ่งต่อไปนี้:

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

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

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

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

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

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

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

--input_exprs

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

`<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 เพื่อเขียนทับไฟล์เอาต์พุตที่มีอยู่