Spec-Zone.ru › TensorFlow 2.9

tf.saved_model.save

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

Экспортирует объект tf.Module (и подклассы) 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
)

Объект obj должен быть наследником класса Trackable.

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

class Adder(tf.Module):
  @tf.function(input_signature=[tf.TensorSpec(shape=[], dtype=tf.float32)])
  def add(self, x):
    return x + x
model = Adder()
tf.saved_model.save(model, '/tmp/adder')

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

Подписи

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

Пример:

class Adder(tf.Module):
  @tf.function
  def add(self, x):
    return x + x
model = Adder()
tf.saved_model.save(
  model, '/tmp/adder',signatures=model.add.get_concrete_function(
    tf.TensorSpec([], tf.float32)))

Если у @tf.function нет подписи ввода и get_concrete_function не вызывается для этого метода, функция не будет непосредственно вызываемой в восстановленном SavedModel.

Пример:

class Adder(tf.Module):
  @tf.function
  def add(self, x):
    return x + x
model = Adder()
tf.saved_model.save(model, '/tmp/adder')
restored = tf.saved_model.load('/tmp/adder')
restored.add(1.)
Traceback (most recent call last):

ValueError: Found zero restored functions for caller function.

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

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

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

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

_Использование tf.savedmodel.save с моделями Keras

Хотя Keras имеет собственный API сохранения и загрузки, эта функция может быть использована для экспорта моделей Keras. Например, экспорт с заданной подписью:

class Adder(tf.keras.Model):
  @tf.function(input_signature=[tf.TensorSpec(shape=[], dtype=tf.string)])
  def concat(self, x):
     return x + x
model = Adder()
tf.saved_model.save(model, '/tmp/adder')

Экспорт из функции без фиксированной подписи:

class Adder(tf.keras.Model):
  @tf.function
  def concat(self, x):
     return x + x
model = Adder()
tf.saved_model.save(
  model, '/tmp/adder',
  signatures=model.concat.get_concrete_function(
    tf.TensorSpec(shape=[], dtype=tf.string, name="string_input")))

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

x = tf.keras.layers.Input((4,), name="x")
y = tf.keras.layers.Dense(5, name="out")(x)
model = tf.keras.Model(x, y)
tf.saved_model.save(model, '/tmp/saved_model/')

Экспортированный SavedModel принимает "x" с формой [None, 4] и возвращает "out" с формой [None, 5]

Переменные и контрольные точки

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

tf.function не жестко кодирует аннотации устройств извне тела функции, вместо этого используя контекст вызова. Это означает, например, что экспорт модели, работающей на GPU, и ее использование на CPU, как правило, работает, за исключением некоторых случаев:

  • tf.device аннотации внутри тела функции будут жестко закодированы в экспортированной модели; такой тип аннотаций не рекомендуется.
  • Операции, специфичные для устройства, например, с "cuDNN" в названии или со специфическими для устройства макетами, могут вызвать проблемы.
  • Для ConcreteFunctions, активные стратегии распределения приведут к жесткому кодированию размещения устройств в функции.

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

Аргументы
obj Отслеживаемый объект (например, tf.Module или tf.train.Checkpoint) для экспорта.
export_dir Директория для записи SavedModel.
signatures Необязательно, один из трех типов:
  • tf.function с указанной подписью ввода, который будет использовать ключевой стандартный код обслуживания;
  • результат f.get_concrete_function для функции, декорированной @tf.function f, в этом случае f будет использоваться для генерации подписи для SavedModel по ключевому значению стандартного кода обслуживания;
  • словарь, который отображает ключи подписи на экземпляры tf.function с подписями ввода или конкретные функции. Ключи такого словаря могут быть произвольными строками, но, как правило, взяты из модуля tf.saved_model.signature_constants.
options Объект tf.saved_model.SaveOptions для настройки параметров сохранения.
Исключения
ValueError Если obj не отслеживается.

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

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

Нельзя вызывать из тела функции.

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

Spec-Zone.ru

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