ดูบน TensorFlow.org | ทำงานใน Google Colab | ดูแหล่งที่มาบน GitHub | ดาวน์โหลดโน๊ตบุ๊ค |
SavedModel มีโปรแกรม TensorFlow ที่สมบูรณ์ รวมถึงพารามิเตอร์ที่ผ่านการฝึกอบรม (เช่น tf.Variable
s) และการคำนวณ ไม่ต้องใช้รหัสการสร้างแบบจำลองดั้งเดิมในการทำงาน ซึ่งทำให้มีประโยชน์สำหรับการแบ่งปันหรือปรับใช้กับ TFLite , TensorFlow.js , TensorFlow Serving หรือ TensorFlow Hub
คุณสามารถบันทึกและโหลดโมเดลในรูปแบบ SavedModel โดยใช้ API ต่อไปนี้:
-
tf.saved_model
API ระดับต่ำ เอกสารนี้อธิบายวิธีใช้ API นี้โดยละเอียด- บันทึก:
tf.saved_model.save(model, path_to_dir)
- โหลด:
model = tf.saved_model.load(path_to_dir)
- บันทึก:
-
tf.keras.Model
API ระดับสูง อ้างถึง คู่มือการบันทึกและจัดลำดับ keras - หากคุณต้องการบันทึก/โหลดน้ำหนักระหว่างการฝึก โปรดดู คู่มือจุดตรวจ
การสร้าง 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.utils.load_img(file, target_size=[224, 224])
plt.imshow(img)
plt.axis('off')
x = tf.keras.utils.img_to_array(img)
x = tf.keras.applications.mobilenet.preprocess_input(
x[tf.newaxis,...])
Downloading data from https://storage.googleapis.com/download.tensorflow.org/example_images/grace_hopper.jpg 65536/61306 [================================] - 0s 0us/step 73728/61306 [====================================] - 0s 0us/step
คุณจะใช้รูปภาพของ 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-10-27 01:24:27.831628: W tensorflow/python/util/util.cc:348] Sets are not currently considered sequences, but this may change in the future, so consider avoiding using them. INFO:tensorflow:Assets written to: /tmp/tmpbf9fpzwt/mobilenet/1/assets
บันทึกเส้นทางเป็นไปตามแบบแผนที่ใช้โดย 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
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ตัวยึดตำแหน่ง22
ไดเรกทอรี 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
ที่พบผ่านการข้ามผ่านแบบเรียกซ้ำจะถูกบันทึก (ดูบทช่วย สอน 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/tmpbf9fpzwt/module_no_signatures/assets
กำลังโหลดและใช้งานโมเดลที่กำหนดเอง
เมื่อคุณโหลด SavedModel ใน Python แอตทริบิวต์ tf.Variable
ทั้งหมด วิธี tf.function
-decorated และ tf.Module
จะถูกกู้คืนในโครงสร้างอ็อบเจ็กต์เดียวกันกับ tf.Module
ที่บันทึกไว้ดั้งเดิม
imported = tf.saved_model.load(module_no_signatures_path)
assert imported(tf.constant(3.)).numpy() == 3
imported.mutate(tf.constant(2.))
assert imported(tf.constant(3.)).numpy() == 6
เนื่องจากไม่มีการบันทึกโค้ด 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__
ธรรมดาเพื่อจัดการกับกรณีขั้นสูงของการปรับแต่งอย่างละเอียด TensorFlow Hub แนะนำให้จัดเตรียมสิ่งต่อไปนี้ (ถ้ามี) ใน SavedModels ที่แชร์เพื่อจุดประสงค์ในการปรับแต่ง:
- หากโมเดลใช้ dropout หรือเทคนิคอื่นที่ forward pass แตกต่างกันระหว่างการ
training=
และการอนุมาน (เช่น การทำให้เป็นมาตรฐานแบบแบตช์) เมธอด__call__
จะใช้อาร์กิวเมนต์ที่เป็นทางเลือก ค่า Python-valued ที่ตั้งค่าเริ่มต้นเป็นFalse
แต่สามารถตั้งค่าเป็นTrue
ได้ - ถัดจากแอตทริบิวต์
__call__
มีแอตทริบิวต์ ..variable
และ.trainable_variable
พร้อมรายการตัวแปรที่เกี่ยวข้อง ตัวแปรที่เดิมสามารถฝึกได้ แต่มีไว้เพื่อหยุดนิ่งระหว่างการปรับจูนแบบละเอียด จะถูกละเว้นจาก ..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/tmpbf9fpzwt/module_with_signature/assets
imported_with_signatures = tf.saved_model.load(module_with_signature_path)
list(imported_with_signatures.signatures.keys())
['serving_default']
หากต้องการส่งออกหลายลายเซ็น ให้ส่งพจนานุกรมของคีย์ลายเซ็นไปที่ ConcreteFunctions แต่ละคีย์ลายเซ็นสอดคล้องกับ ConcreteFunction หนึ่งรายการ
module_multiple_signatures_path = os.path.join(tmpdir, 'module_with_multiple_signatures')
signatures = {"serving_default": call,
"array_input": module.__call__.get_concrete_function(tf.TensorSpec([None], tf.float32))}
tf.saved_model.save(module, module_multiple_signatures_path, signatures=signatures)
Tracing with Tensor("x:0", shape=(None,), dtype=float32) Tracing with Tensor("x:0", shape=(None,), dtype=float32) INFO:tensorflow:Assets written to: /tmp/tmpbf9fpzwt/module_with_multiple_signatures/assets
imported_with_multiple_signatures = tf.saved_model.load(module_multiple_signatures_path)
list(imported_with_multiple_signatures.signatures.keys())
['serving_default', 'array_input']
โดยค่าเริ่มต้น ชื่อเทนเซอร์เอาต์พุตจะค่อนข้างทั่วไป เช่น output_0
ในการควบคุมชื่อของเอาต์พุต ให้แก้ไข tf.function
ของคุณเพื่อส่งคืนพจนานุกรมที่จับคู่ชื่อเอาต์พุตกับเอาต์พุต ชื่อของอินพุตได้มาจากชื่อ 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/tmpbf9fpzwt/module_with_output_name/assets
imported_with_output_name = tf.saved_model.load(module_output_path)
imported_with_output_name.signatures['serving_default'].structured_outputs
{'custom_output_name': TensorSpec(shape=(), dtype=tf.float32, name='custom_output_name')}
โหลด 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
เพื่อรันการคำนวณกราฟ ผ่านอินพุต จากนั้นแสดง (และเลือกที่จะบันทึก) เอาต์พุต นี่คือไวยากรณ์:
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
เพื่อเขียนทับไฟล์เอาต์พุตที่มีอยู่