tf.saved_model.save
| Просмотреть исходный код на GitHub |
Экспортирует объект tf.Module (и подклассы) obj в формат SavedModel.
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 | Необязательно, один из трех типов:
|
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