Spec-Zone.ru › TensorFlow 2.3

tf.saved_model.save

Просмотреть исходный код на GitHub

Экспортирует объект Trackable obj в формат SavedModel.

Просмотр псевдонимов

Псевдонимы совместимости для миграции

Подробнее см. в руководстве по миграции.

tf.compat.v1.saved_model.experimental.save, tf.compat.v1.saved_model.save

tf.saved_model.save(
    obj, export_dir, signatures=None, options=None
)

Пример использования:

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

Полученный SavedModel может быть обработан с именем входа "x", значение которого может иметь любую форму и тип float32.

Необязательный аргумент signatures управляет тем, какие методы в obj будут доступны программам, которые используют SavedModel (например, серверным API). Функции Python могут быть помечены @tf.function(input_signature=...) и переданы в качестве подписей напрямую или лениво с помощью вызова get_concrete_function для метода, помеченного @tf.function.

Если аргумент signatures опущен, obj будет искать методы, помеченные @tf.function. Если найдено ровно один @tf.function, этот метод будет использоваться в качестве стандартной подписи для SavedModel. Это поведение ожидается в будущем, когда будет добавлен соответствующий символ tf.saved_model.load. В этот момент подписи будут полностью необязательными, а все @tf.function , прикрепленные к obj или его зависимостям, будут экспортированы для использования с load.

При вызове подписи в экспортированном SavedModel аргументы Tensor идентифицируются по имени. По умолчанию эти имена берутся из имен аргументов функции Python. Их можно переопределить, указав аргумент name=... в соответствующем объекте tf.TensorSpec. Явное именование необходимо, если несколько Tensor передаются через один аргумент функции Python.

Выходы функций, используемых в качестве signatures, должны быть либо плоскими списками, в этом случае выходы будут пронумерованы, либо словарем, сопоставляющим строковые ключи с Tensor, в этом случае ключи будут использоваться для именования выходов.

Подписи доступны в объектах, возвращаемых tf.saved_model.load как атрибут .signatures. Это зарезервированный атрибут: вызов tf.saved_model.save для объекта с пользовательским атрибутом .signatures вызовет исключение.

Поскольку объекты tf.keras.Model также являются Trackable, эту функцию можно использовать для экспорта моделей Keras. Например, экспорт с указанной подписью:

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

tf.keras.Model экземпляры, созданные из входных и выходных данных, уже имеют подпись и поэтому не требуют декоратора @tf.function или аргумента signatures. Если ни то, ни другое не указано, экспортируется основной проход модели.

x = input_layer.Input((4,), name="x")
y = core.Dense(5, name="out")(x)
model = training.Model(x, y)
tf.saved_model.save(model, '/tmp/saved_model/')
# The exported SavedModel takes "x" with shape [None, 4] and returns "out"
# with shape [None, 5]

Переменные должны отслеживаться путем их присвоения в качестве атрибута отслеживаемого объекта или непосредственно атрибуту obj. Объекты TensorFlow (например, слои из tf.keras.layers, оптимизаторы из tf.train) автоматически отслеживают свои переменные. Это та же схема отслеживания, которую использует tf.train.Checkpoint, и экспортированный объект Checkpoint может быть восстановлен как контрольная точка обучения путем указания tf.train.Checkpoint.restore на подкаталог "variables/" SavedModel. В настоящее время переменные являются единственными поддерживаемыми объектами состояния tf.saved_model.save, но в будущем будут поддерживаться и другие (например, таблицы).

tf.function не кодирует аннотации устройств извне тела функции, вместо этого используя контекст вызова. Это означает, что, например, экспорт модели, работающей на графическом процессоре, и ее использование на процессоре обычно работает, за исключением некоторых случаев. Аннотации tf.device внутри тела функции будут закодированы в экспортированной модели; этот тип аннотации не рекомендуется. Операции, зависящие от устройства, например, с "cuDNN" в имени или с макетами, специфичными для устройства, могут вызвать проблемы. В настоящее время исключением является DistributionStrategy: активные стратегии распределения приведут к жесткой кодировке размещения устройств в функции. Экспорт вычисления на одном устройстве и импорт в рамках DistributionStrategy в настоящее время не поддерживаются, но могут быть в будущем.

SavedModel, экспортированный с помощью tf.saved_model.save , автоматически удаляет атрибуты с значениями по умолчанию, что устраняет один из источников несовместимости, когда потребитель SavedModel использует более старую версию TensorFlow, чем создатель. Однако существуют и другие источники несовместимости, которые не обрабатываются автоматически, например, когда экспортированная модель содержит операции, для которых у потребителя нет определений.

Одна tf.function может генерировать множество ConcreteFunctions. Если инструмент на нижнем уровне хочет обратиться ко всем конкретным функциям, сгенерированным одной tf.function, вы можете использовать аргумент function_aliases для хранения отображения от псевдонима к всем именам конкретных функций. Например:

class MyModel:
@tf.function
def func():
  ...

@tf.function
def serve():
  ...
  func()

model = MyModel()
signatures = {
    'serving_default': model.serve.get_concrete_function(),
}
options = tf.saved_model.SaveOptions(function_aliases={
    'my_func': func,
})
tf.saved_model.save(model, export_dir, signatures, options)
Аргументы
obj Экспортируемый объект trackable.
export_dir Директория для записи SavedModel.
signatures Необязательный, либо tf.function с указанной подписью входа, либо результат f.get_concrete_function для функции, помеченной @tf.function f, в этом случае f будет использоваться для генерации подписи SavedModel под ключом стандартной подписи. signatures также может быть словарем, в котором отображаются ключи подписи либо tf.function экземпляры с подписями входа, либо конкретные функции. Ключи такого словаря могут быть произвольными строками, но обычно они из модуля tf.saved_model.signature_constants.
options Необязательный, объект tf.saved_model.SaveOptions, определяющий параметры сохранения.
Исключения
ValueError Если obj не является отслеживаемым.

Совместимость с Eager

Недостаточно хорошо поддерживается при построении графа. Начиная с TensorFlow 1.x, tf.compat.v1.enable_eager_execution() должен быть запущен первым. Вызов tf.saved_model.save в цикле при построении графа из TensorFlow 1.x добавит новые операции сохранения в стандартный граф в каждом цикле.

Не должен вызываться внутри тела функции.

© 2020 The TensorFlow Authors. All rights reserved.
Licensed under the Creative Commons Attribution License 3.0.
Code samples licensed under the Apache 2.0 License.
https://www.tensorflow.org/versions/r2.3/api_docs/python/tf/saved_model/save

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API