tf.keras.export.ExportArchive
ExportArchive используется для записи артефактов SavedModel (например, для выполнения вывода).
tf.keras.export.ExportArchive()
Если у вас есть модель или слой Keras, который вы хотите экспортировать в формате SavedModel для обслуживания (например, с помощью TensorFlow-Serving), можно использовать ExportArchive для настройки необходимых конечных точек обслуживания и их сигнатур. Просто создайте экземпляр ExportArchive, используйте track() для регистрации используемых слоёв или моделей, а затем вызовите метод add_endpoint(), чтобы зарегистрировать новую конечную точку обслуживания. После этого используйте метод write_out(), чтобы сохранить артефакт.
В результате будет создан артефакт SavedModel, который можно повторно загрузить с помощью tf.saved_model.load.
Примеры:
Вот как экспортировать модель для выполнения вывода.
export_archive = ExportArchive()
export_archive.track(model)
export_archive.add_endpoint(
name="serve",
fn=model.call,
input_signature=[tf.TensorSpec(shape=(None, 3), dtype=tf.float32)],
)
export_archive.write_out("path/to/location")
# Elsewhere, we can reload the artifact and serve it.
# The endpoint we added is available as a method:
serving_model = tf.saved_model.load("path/to/location")
outputs = serving_model.serve(inputs)
Вот как экспортировать модель с одной конечной точкой для выполнения вывода и одной конечной точкой для прямого прохода в режиме обучения (например, с включённым dropout).
export_archive = ExportArchive()
export_archive.track(model)
export_archive.add_endpoint(
name="call_inference",
fn=lambda x: model.call(x, training=False),
input_signature=[tf.TensorSpec(shape=(None, 3), dtype=tf.float32)],
)
export_archive.add_endpoint(
name="call_training",
fn=lambda x: model.call(x, training=True),
input_signature=[tf.TensorSpec(shape=(None, 3), dtype=tf.float32)],
)
export_archive.write_out("path/to/location")
Примечание об отслеживании ресурсов:
ExportArchive может автоматически отслеживать все tf.Variables, используемые его конечными точками, поэтому в большинстве случаев вызывать .track(model) необязательно. Однако если ваша модель использует слои поиска, такие как IntegerLookup, StringLookup или TextVectorization, их необходимо явно отслеживать с помощью .track(model).
Явное отслеживание также необходимо, если вам требуется получать доступ к свойствам variables, trainable_variables или non_trainable_variables восстановленного архива.
| Атрибуты | |
|---|---|
non_trainable_variables | |
trainable_variables | |
variables | |
Методы
add_endpoint
add_endpoint(
name, fn, input_signature=None, jax2tf_kwargs=None
)
Зарегистрировать новую конечную точку обслуживания.
| Аргументы | |
|---|---|
name | Строка — имя конечной точки. |
fn | Функция. Она должна использовать только ресурсы (например, объекты tf.Variable или объекты tf.lookup.StaticHashTable), доступные в моделях или слоях, отслеживаемых объектом ExportArchive (можно вызвать .track(model), чтобы начать отслеживание новой модели). Форма и тип данных входных аргументов функции должны быть известны. Для этого можно либо 1) убедиться, что fn — это tf.function, которую вызвали хотя бы один раз, либо 2) передать аргумент |
input_signature | Используется для указания формы и типа данных входных аргументов fn. Список объектов tf.TensorSpec (по одному на каждый позиционный входной аргумент fn). Допускаются вложенные аргументы (пример функциональной модели с двумя входными аргументами см. ниже). |
jax2tf_kwargs | Необязательный аргумент. Словарь аргументов, передаваемых в jax2tf. Поддерживается только при использовании бэкенда JAX. См. документацию по jax2tf.convert. Значения для native_serialization и polymorphic_shapes вычисляются автоматически, если они не заданы. |
| Возвращает | |
|---|---|
tf.function, оборачивающую fn, добавленную в архив. |
Пример:
Добавление конечной точки с помощью аргумента input_signature, если у модели один входной аргумент:
export_archive = ExportArchive()
export_archive.track(model)
export_archive.add_endpoint(
name="serve",
fn=model.call,
input_signature=[tf.TensorSpec(shape=(None, 3), dtype=tf.float32)],
)
Добавление конечной точки с помощью аргумента input_signature, если у модели два позиционных входных аргумента:
export_archive = ExportArchive()
export_archive.track(model)
export_archive.add_endpoint(
name="serve",
fn=model.call,
input_signature=[
tf.TensorSpec(shape=(None, 3), dtype=tf.float32),
tf.TensorSpec(shape=(None, 4), dtype=tf.float32),
],
)
Добавление конечной точки с помощью аргумента input_signature, если у модели один входной аргумент, представляющий собой список из двух тензоров (например, у функциональной модели с двумя входами):
model = keras.Model(inputs=[x1, x2], outputs=outputs)
export_archive = ExportArchive()
export_archive.track(model)
export_archive.add_endpoint(
name="serve",
fn=model.call,
input_signature=[
[
tf.TensorSpec(shape=(None, 3), dtype=tf.float32),
tf.TensorSpec(shape=(None, 4), dtype=tf.float32),
],
],
)
Этот способ также работает со входными данными в виде словаря:
model = keras.Model(inputs={"x1": x1, "x2": x2}, outputs=outputs)
export_archive = ExportArchive()
export_archive.track(model)
export_archive.add_endpoint(
name="serve",
fn=model.call,
input_signature=[
{
"x1": tf.TensorSpec(shape=(None, 3), dtype=tf.float32),
"x2": tf.TensorSpec(shape=(None, 4), dtype=tf.float32),
},
],
)
Добавление конечной точки, представляющей собой tf.function:
@tf.function()
def serving_fn(x):
return model(x)
# The function must be traced, i.e. it must be called at least once.
serving_fn(tf.random.normal(shape=(2, 3)))
export_archive = ExportArchive()
export_archive.track(model)
export_archive.add_endpoint(name="serve", fn=serving_fn)
add_variable_collection
add_variable_collection(
name, variables
)
Зарегистрировать набор переменных, доступных после повторной загрузки.
| Аргументы | |
|---|---|
name | Строковое имя коллекции. |
variables | Кортеж, список или множество экземпляров tf.Variable. |
Пример:
export_archive = ExportArchive()
export_archive.track(model)
# Register an endpoint
export_archive.add_endpoint(
name="serve",
fn=model.call,
input_signature=[tf.TensorSpec(shape=(None, 3), dtype=tf.float32)],
)
# Save a variable collection
export_archive.add_variable_collection(
name="optimizer_variables", variables=model.optimizer.variables)
export_archive.write_out("path/to/location")
# Reload the object
revived_object = tf.saved_model.load("path/to/location")
# Retrieve the variables
optimizer_variables = revived_object.optimizer_variables
track
track(
resource
)
Отслеживать переменные (и другие ресурсы) слоя или модели.
По умолчанию все переменные, используемые функцией конечной точки, автоматически отслеживаются при вызове add_endpoint(). Однако ресурсы, не являющиеся переменными, например таблицы поиска, необходимо отслеживать вручную. Обратите внимание, что таблицы поиска, используемые во встроенных слоях Keras (TextVectorization, IntegerLookup, StringLookup), автоматически отслеживаются в add_endpoint().
| Аргументы | |
|---|---|
resource | Отслеживаемый ресурс TensorFlow. |
write_out
write_out(
filepath, options=None
)
Записать соответствующую модель SavedModel на диск.
| Аргументы | |
|---|---|
filepath | Объект str или pathlib.Path. Путь для сохранения артефакта. |
options | Объект tf.saved_model.SaveOptions, задающий параметры сохранения SavedModel. |
Примечание о TF-Serving: все конечные точки, зарегистрированные с помощью add_endpoint(), становятся доступными для TF-Serving в артефакте SavedModel. Кроме того, первая зарегистрированная конечная точка становится доступна под псевдонимом "serving_default" (если конечная точка с именем "serving_default" не была зарегистрирована вручную ранее), поскольку TF-Serving требует, чтобы эта конечная точка была задана.
© 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/api_docs/python/tf/keras/export/ExportArchive