Update README.md for python/saved_model, see tensorflow.org for most up-to-date documentation re SavedModel.

PiperOrigin-RevId: 343382276
Change-Id: I8a00684d74059a2a84971af98f88591ed5577496
This commit is contained in:
Monica Song 2020-11-19 15:29:06 -08:00 committed by TensorFlower Gardener
parent 71275b37a7
commit 819eb34070

View File

@ -3,49 +3,37 @@
[TOC]
## Overview
This document describes SavedModel, the universal serialization format for
SavedModel is the universal serialization format for
[TensorFlow](https://www.tensorflow.org/) models.
SavedModel provides a language-neutral format to save machine-learned models
SavedModel provides a language-neutral format to save machine-learning models
that is recoverable and hermetic. It enables higher-level systems and tools to
produce, consume and transform TensorFlow models.
## Features
## Guides
* [Using the SavedModel Format](https://www.tensorflow.org/guide/saved_model)
* [Save and load Keras models](https://www.tensorflow.org/guide/keras/save_and_serialize)
* [Save and load with checkpointing in Keras](https://www.tensorflow.org/tutorials/keras/save_and_load)
* [Training checkpoints](https://www.tensorflow.org/guide/checkpoint)
* [Save and load a model using a distribution strategy](https://www.tensorflow.org/tutorials/distribute/save_and_load)
The following is a summary of the features in SavedModel:
* Multiple graphs sharing a single set of variables and assets can be added to a
single SavedModel. Each graph is associated with a specific set of tags to
allow identification during a load or restore operation.
* Support for `SignatureDefs`
* Graphs that are used for inference tasks typically have a set of inputs
and outputs. This is called a `Signature`.
* SavedModel uses [SignatureDefs](https://github.com/tensorflow/tensorflow/blob/master/tensorflow/core/protobuf/meta_graph.proto)
to allow generic support for signatures that may need to be saved with the graphs.
* For commonly used SignatureDefs in the context of TensorFlow Serving,
please see documentation [here](https://github.com/tensorflow/serving/blob/master/tensorflow_serving/g3doc/signature_defs.md).
* Support for `Assets`.
* For cases where ops depend on external files for initialization, such as
vocabularies, SavedModel supports this via `assets`.
* Assets are copied to the SavedModel location and can be read when loading
a specific meta graph def.
* Support to clear devices before generating the SavedModel.
## [Public API](https://www.tensorflow.org/api_docs/python/tf/saved_model)
* [`tf.saved_model.save`](https://www.tensorflow.org/api_docs/python/tf/saved_model/save)
* [`tf.saved_model.load`](https://www.tensorflow.org/api_docs/python/tf/saved_model/load)
* [`tf.saved_model.SaveOptions`](https://www.tensorflow.org/api_docs/python/tf/saved_model/SaveOptions)
* [`tf.saved_model.LoadOptions`](https://www.tensorflow.org/api_docs/python/tf/saved_model/LoadOptions)
* [`tf.saved_model.Asset`](https://www.tensorflow.org/api_docs/python/tf/saved_model/Asset)
* [`tf.saved_model.contains_saved_model`](https://www.tensorflow.org/api_docs/python/tf/saved_model/contains_saved_model)
The following is a summary of features that are NOT supported in SavedModel.
Higher-level frameworks and tools that use SavedModel may provide these.
### Related Modules and Functions
* [`tf.keras.models.save_model`](https://www.tensorflow.org/api_docs/python/tf/keras/models/save_model)
* [`tf.keras.models.load_model`](https://www.tensorflow.org/api_docs/python/tf/keras/models/load_model)
* [`tf.train.Checkpoint`](https://www.tensorflow.org/api_docs/python/tf/train/Checkpoint)
* Implicit versioning.
* Garbage collection.
* Atomic writes to the SavedModel location.
## Background
SavedModel manages and builds upon existing TensorFlow primitives such as
`TensorFlow Saver` and `MetaGraphDef`. Specifically, SavedModel wraps a [TensorFlow Saver](https://github.com/tensorflow/tensorflow/tree/master/tensorflow/python/training/saver.py).
The Saver is primarily used to generate the variable checkpoints. SavedModel
will replace the existing [TensorFlow Inference Model Format](https://github.com/tensorflow/tensorflow/blob/master/tensorflow/contrib/session_bundle/README.md)
as the canonical way to export TensorFlow graphs for serving.
## Components
## The SavedModel Format
A SavedModel directory has the following structure:
```
@ -57,72 +45,23 @@ variables/
saved_model.pb
```
* SavedModel protocol buffer
* `saved_model.pb` or `saved_model.pbtxt`
* Includes the graph definitions as `MetaGraphDef` protocol buffers.
* Assets
* Subfolder called `assets`.
* Contains auxiliary files such as vocabularies, etc.
* Extra assets
* Subfolder where higher-level libraries and users can add their own assets
that co-exist with the model, but are not loaded by the graph.
* This subfolder is not managed by the SavedModel libraries.
* Variables
* Subfolder called `variables`.
* Includes output from the [TensorFlow Saver](https://github.com/tensorflow/tensorflow/tree/master/tensorflow/python/training/saver.py).
* `variables.data-?????-of-?????`
* `variables.index`
* SavedModel protocol buffer
* [`saved_model.pb`](https://github.com/tensorflow/tensorflow/blob/master/tensorflow/core/protobuf/saved_model.proto)
or `saved_model.pbtxt`
* Includes the graph definitions as `MetaGraphDef` protocol buffers.
* Assets
* Subfolder called `assets`.
* Contains auxiliary files such as vocabularies, etc.
* Extra assets
* Subfolder where higher-level libraries and users can add their own
assets that co-exist with the model, but are not loaded by the graph.
* This subfolder is not managed by the SavedModel libraries.
* Variables
* Subfolder called `variables`.
* `variables.data-?????-of-?????`
* `variables.index`
## APIs
The APIs for building and loading a SavedModel are described in this section.
### Builder
The SavedModel [builder](https://github.com/tensorflow/tensorflow/blob/master/tensorflow/python/saved_model/builder.py)
is implemented in Python.
The `SavedModelBuilder` class provides functionality to save multiple meta graph
defs, associated variables and assets.
To build a SavedModel, the first meta graph must be saved with variables.
Subsequent meta graphs will simply be saved with their graph definitions. If
assets need to be saved and written or copied to disk, they can be provided
when the meta graph def is added. If multiple meta graph defs are associated
with an asset of the same name, only the first version is retained.
#### Tags
Each meta graph added to the SavedModel must be annotated with user specified
tags, which reflect the meta graph capabilities or use-cases.
More specifically, these tags typically annotate a meta graph with its
functionality (e.g. serving or training), and possibly hardware specific aspects
such as GPU.
In the SavedModel, the meta graph def whose tag-set exactly matches those
specified in the loader API, will be the one loaded by the loader.
If no meta graph def is found matching the specified tags, an error is returned.
For example, a loader with a requirement to serve on GPU hardware would be able
to load only meta graph annotated with tags='serve,gpu' by specifying this set
of tags in tensorflow::LoadSavedModel(...).
#### Usage
The typical usage of `builder` is as follows:
~~~python
export_dir = ...
...
builder = tf.saved_model.builder.SavedModelBuilder(export_dir)
with tf.Session(graph=tf.Graph()) as sess:
...
builder.add_meta_graph_and_variables(sess,
[tf.saved_model.tag_constants.TRAINING],
signature_def_map=foo_signatures,
assets_collection=foo_assets)
...
with tf.Session(graph=tf.Graph()) as sess:
...
builder.add_meta_graph(["bar-tag", "baz-tag"])
...
builder.save()
~~~
---
#### Stripping Default valued attributes
The SavedModelBuilder class allows users to control whether default-valued
@ -152,60 +91,3 @@ models regenerated with newer training binaries.
TIP: If you care about forward compatibility, then set `strip_default_attrs`
to `True` while using `SavedModelBuilder.add_meta_graph_and_variables` and
`SavedModelBuilder.add_meta_graph`.
### Loader
The SavedModel loader is implemented in C++ and Python.
#### Python
The Python version of the SavedModel [loader](https://github.com/tensorflow/tensorflow/blob/master/tensorflow/python/saved_model/loader.py)
provides load and restore capability for a SavedModel. The `load` operation
requires the session in which to restore the graph definition and variables, the
tags used to identify the meta graph def to load and the location of the
SavedModel. Upon a load, the subset of variables and assets supplied as part of
the specific meta graph def, will be restored into the supplied session.
~~~python
export_dir = ...
...
with tf.Session(graph=tf.Graph()) as sess:
tf.saved_model.loader.load(sess, [tag_constants.TRAINING], export_dir)
...
~~~
#### C++
The C++ version of the SavedModel [loader](https://github.com/tensorflow/tensorflow/blob/master/tensorflow/cc/saved_model/loader.h)
provides an API to load a SavedModel from a path, while allowing
`SessionOptions` and `RunOptions`. Similar to the Python version, the C++
version requires the tags associated with the graph to be loaded, to be
specified. The loaded version of SavedModel is referred to as `SavedModelBundle`
and contains the meta graph def and the session within which it is loaded.
~~~c++
const string export_dir = ...
SavedModelBundle bundle;
...
LoadSavedModel(session_options, run_options, export_dir, {kSavedModelTagTrain},
&bundle);
~~~
### Constants
SavedModel offers the flexibility to build and load TensorFlow graphs for a
variety of use-cases. For the set of most common expected use-cases,
SavedModel's APIs provide a set of constants in Python and C++ that are easy to
reuse and share across tools consistently.
#### Tag constants
Sets of tags can be used to uniquely identify a `MetaGraphDef` saved in a
SavedModel. A subset of commonly used tags is specified in:
* [Python](https://github.com/tensorflow/tensorflow/blob/master/tensorflow/python/saved_model/tag_constants.py)
* [C++](https://github.com/tensorflow/tensorflow/blob/master/tensorflow/cc/saved_model/tag_constants.h).
#### Signature constants
SignatureDefs are used to define the signature of a computation supported in a
TensorFlow graph. Commonly used input keys, output keys and method names are
defined in:
* [Python](https://github.com/tensorflow/tensorflow/blob/master/tensorflow/python/saved_model/signature_constants.py)
* [C++](https://github.com/tensorflow/tensorflow/blob/master/tensorflow/cc/saved_model/signature_constants.h).