Как мне хранить метаданные в TensorFlow SavedModel? - PullRequest
0 голосов
/ 19 января 2019

Мы обучаем множество вариаций нашей модели с различной конфигурацией и требующей различной предварительной обработки входных данных (где предварительная обработка выполняется вне TensorFlow). Я хотел бы экспортировать наши модели как SavedModels, и я думаю, что у нас будет API-сервер, который будет обеспечивать доступ к моделям и обрабатывать предварительную обработку и общаться с сервером TensorFlow, используя конфигурацию, которую он будет извлекать из метаданных модели через TensorFlow. сервер. Метаданные модели могут быть структурированы как JSON или могут использовать буфер протокола. Мне неясно, какие передовые практики существуют вокруг этого. В частности, буфер протокола MetaInfoDef имеет три различных поля, которые, как представляется, предназначены для хранения метаданных (meta_graph_version, any_info и tags). Но я не смог найти ни одного примера использования любого, кроме поля tags.

// User specified Version string. Can be the name of the model and revision,
// steps this model has been trained to, etc.
string meta_graph_version = 1;

[...]

// A serialized protobuf. Can be the time this meta graph is created, or
// modified, or name of the model.
google.protobuf.Any any_info = 3;

// User supplied tag(s) on the meta_graph and included graph_def.
//
// MetaGraphDefs should be tagged with their capabilities or use-cases.
// Examples: "train", "serve", "gpu", "tpu", etc.
// These tags enable loaders to access the MetaGraph(s) appropriate for a
// specific use-case or runtime environment.
repeated string tags = 4;

(хотя я не уверен, что все эти три поля можно получить одинаково, используя клиентский API для обслуживания TensorFlow?)

Ответы [ 2 ]

0 голосов
/ 23 апреля 2019

@ gmr, Добавление прото в коллекцию через tf.add_to_collection вместе с builder.add_meta_graph_and_variables должно решить вашу проблему.

Код длято же самое упомянуто ниже:

# Mention the path below where you want the model to be stored
export_dir = "/usr/local/google/home/abc/Jupyter_Notebooks/export"

tf.gfile.DeleteRecursively(export_dir)

tf.reset_default_graph()

# Check below for other ways of adding Proto to Collection
tf.add_to_collection("my_proto_collection", "my_proto_serialized")

builder = tf.saved_model.builder.SavedModelBuilder(export_dir)
with tf.Session() as session:
  builder.add_meta_graph_and_variables(
      session,
      tags=[tf.saved_model.tag_constants.SERVING])
  builder.save()

Код для других способов добавления прото в коллекцию показан ниже:

tf.add_to_collection("your_collection_name", str(your_proto)) или

any_buf = any_pb2.Any()

tf.add_to_collection("your_collection_name",
         any_buf.Pack(your_proto))

Файл .pb save_model.pb, сохраненный по указанному вами пути (export_dir), выглядит примерно так, как указано ниже:

{   # (tensorflow.SavedModel) size=89B
  saved_model_schema_version: 1
  meta_graphs: {    # (tensorflow.MetaGraphDef) size=85B
    meta_info_def: {    # (tensorflow.MetaGraphDef.MetaInfoDef) size=29B
      stripped_op_list: {   # (tensorflow.OpList) size=0B
      } # meta_graphs[0].meta_info_def.stripped_op_list
      tags    : [ "serve" ] # size=5
      tensorflow_version    : "1.13.1"  # size=9
      tensorflow_git_version: "unknown" # size=7
    }   # meta_graphs[0].meta_info_def
    graph_def: {    # (tensorflow.GraphDef) size=4B
      versions: {   # (tensorflow.VersionDef) size=2B
        producer     : 23
      } # meta_graphs[0].graph_def.versions
    }   # meta_graphs[0].graph_def
    collection_def: {   # (tensorflow.MetaGraphDef.CollectionDefEntry) size=46B
      key  : "my_proto_collection"  # size=19
      value: {  # (tensorflow.CollectionDef) size=23B
        bytes_list: {   # (tensorflow.CollectionDef.BytesList) size=21B
          value: [ "my_proto_serialized" ]  # size=19
        }   # meta_graphs[0].collection_def[0].value.bytes_list
      } # meta_graphs[0].collection_def[0].value
    }   # meta_graphs[0].collection_def[0]
  } # meta_graphs[0]
}
0 голосов
/ 28 марта 2019

Команда для извлечения метаданных с помощью Client API (REST) ​​показана ниже

GET http://host:port/v1/models/${MODEL_NAME}[/versions/${MODEL_VERSION}]/metadata

/ versionings / $ {MODEL_VERSION} является необязательным. Если опущено, в ответе возвращаются метаданные модели для последней версии.

Более подробную информацию можно найти по ссылке https://www.tensorflow.org/tfx/serving/api_rest/ => API метаданных модели

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...