文章範例是使用 TensorFlow 2.3 version
檢查指定的目錄位置,存放的是否為真的 SavedModel 物件。
tf.saved_model.contains_saved_model(
export_dir
)
從指定的資料夾,載入 SavedModel 物件。
tf.saved_model.load(
export_dir, tags=None, options=None
)
load 和 signatures
imported = tf.saved_model.load(path)
f = imported.signatures["serving_default"]
print(f(x=tf.constant([[1.]])))
與 trackable 物件
exported = tf.train.Checkpoint(v=tf.Variable(3.))
exported.f = tf.function(
lambda x: exported.v * x,
input_signature=[tf.TensorSpec(shape=None, dtype=tf.float32)])
tf.saved_model.save(exported, path)
imported = tf.saved_model.load(path)
assert 3. == imported.v.numpy()
assert 6. == imported.f(x=tf.constant(2.)).numpy()
Keras Model 是可 trackable 的物件,因此可以將它存為 SavedModel 物件,但這裡產生的物件並不是真的 Keras 物件,所以不具有 (即不具有 Keras 物件裡的 fit, predict 等函式,但有一些屬性和函式仍然可用:例如 variables, trainable_variables 和 __call__
。
model = tf.keras.Model(...)
tf.saved_model.save(model, path)
imported = tf.saved_model.load(path)
outputs = imported(inputs)
如果想要將物件,重新轉為 Keras 物件,可以使用 tf.keras.models.load_model
函式。
將 obj 物件匯出成可被 Trackable 的 SavedModel 物件。
TensorFlow SavedModel 格式文件: https://github.com/tensorflow/tensorflow/blob/master/tensorflow/python/saved_model/README.md
tf.saved_model.save(
obj, export_dir, signatures=None, options=None
)
只要是用有
Trackable
特質的物件,就代表可以被 Tensorflow Serving 使用。
class Adder(tf.Module):
@tf.function(input_signature=[tf.TensorSpec(shape=None, dtype=tf.float32)])
def add(self, x):
return x + x + 1.
to_export = Adder()
tf.saved_model.save(to_export, '/tmp/adder')
tf.keras.Model 物件也可以被 Trackable。
class Model(tf.keras.Model):
@tf.function(input_signature=[tf.TensorSpec(shape=[None], dtype=tf.string)])
def serve(self, serialized):
...
m = Model()
tf.saved_model.save(m, '/tmp/saved_model/')
class Model(tf.keras.Model):
@tf.function
def call(self, x):
...
m = Model()
tf.saved_model.save(
m, '/tmp/saved_model/',
signatures=m.call.get_concrete_function(
tf.TensorSpec(shape=[None, 3], dtype=tf.float32, name="inp")))