From 7fc995e61bfacce25d29eb039c55fa3096e61ef3 Mon Sep 17 00:00:00 2001 From: Scott Zhu Date: Mon, 22 Mar 2021 09:44:40 -0700 Subject: [PATCH] Change the keras saved_model metadata to use the copied version data from keras. This is trying to isolate the dependency from keras to TF so that OSS keras could rely on the PIP package only (the proto build deps is not available from PIP). The version information is current populated with dummy data, and not being consumed by the Keras code. Remove the old field and replace with new version should have no impact for any existing saved saved_model binaries. PiperOrigin-RevId: 364339229 --- keras/protobuf/BUILD | 8 ++++- keras/protobuf/saved_metadata.proto | 9 ++++-- keras/protobuf/versions.proto | 49 +++++++++++++++++++++++++++++ keras/saving/saved_model/load.py | 2 +- keras/saving/saved_model/save.py | 2 +- 5 files changed, 64 insertions(+), 6 deletions(-) create mode 100644 keras/protobuf/versions.proto diff --git a/keras/protobuf/BUILD b/keras/protobuf/BUILD index 0aa1a8223d39..7caa951ff9e7 100644 --- a/keras/protobuf/BUILD +++ b/keras/protobuf/BUILD @@ -19,5 +19,11 @@ tf_proto_library( name = "saved_metadata_proto", srcs = ["saved_metadata.proto"], cc_api_version = 2, - protodeps = ["@org_tensorflow//tensorflow/core:protos_all"], + protodeps = [":versions_proto"], +) + +tf_proto_library( + name = "versions_proto", + srcs = ["versions.proto"], + cc_api_version = 2, ) diff --git a/keras/protobuf/saved_metadata.proto b/keras/protobuf/saved_metadata.proto index f004db325c3a..264a6974cd34 100644 --- a/keras/protobuf/saved_metadata.proto +++ b/keras/protobuf/saved_metadata.proto @@ -18,7 +18,7 @@ syntax = "proto3"; package third_party.py.keras.protobuf; -import "tensorflow/core/framework/versions.proto"; +import "keras/protobuf/versions.proto"; message SavedMetadata { // Nodes represent trackable objects in the SavedModel. The data for every @@ -28,8 +28,8 @@ message SavedMetadata { // Metadata of an individual Keras object. message SavedObject { - // Version defined by the code serializing this Keras object. - .tensorflow.VersionDef version = 1; + reserved 1; // For previous VersionDef info. + // Index of the node in the SavedModel SavedObjectGraph. int32 node_id = 2; // String path from root (e.g. "root.child_layer") @@ -44,4 +44,7 @@ message SavedObject { // Metadata containing a JSON-serialized object with the non-TensorFlow // attributes for this Keras object. string metadata = 5; + + // Version defined by the code serializing this Keras object. + third_party.py.keras.protobuf.VersionDef version = 6; } diff --git a/keras/protobuf/versions.proto b/keras/protobuf/versions.proto new file mode 100644 index 000000000000..0bf954fa8827 --- /dev/null +++ b/keras/protobuf/versions.proto @@ -0,0 +1,49 @@ +/* Copyright 2020 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ +// Protobuf containing the version for each Keras object saved in a SavedModel. + +syntax = "proto3"; + +package third_party.py.keras.protobuf; + +// This file is a copy of the TensorFlow Versions proto. +// Keep this file in sync with the source proto definition at +// https://github.com/tensorflow/tensorflow/blob/master/tensorflow/core/framework/versions.proto + +// Version information for a piece of serialized data +// +// There are different types of versions for each type of data +// (GraphDef, etc.), but they all have the same common shape +// described here. +// +// Each consumer has "consumer" and "min_producer" versions (specified +// elsewhere). A consumer is allowed to consume this data if +// +// producer >= min_producer +// consumer >= min_consumer +// consumer not in bad_consumers +// +// LINT.IfChange +message VersionDef { + // The version of the code that produced this data. + int32 producer = 1; + + // Any consumer below this version is not allowed to consume this data. + int32 min_consumer = 2; + + // Specific consumer versions which are disallowed (e.g. due to bugs). + repeated int32 bad_consumers = 3; +} +// LINT.ThenChange(third_party/tensorflow/core/framework/versions.proto) diff --git a/keras/saving/saved_model/load.py b/keras/saving/saved_model/load.py index 8be0c0cf7ada..3b0cc090a34d 100644 --- a/keras/saving/saved_model/load.py +++ b/keras/saving/saved_model/load.py @@ -25,11 +25,11 @@ from google.protobuf import message -from tensorflow.core.framework import versions_pb2 from keras import backend from keras import regularizers from keras.engine import input_spec from keras.protobuf import saved_metadata_pb2 +from keras.protobuf import versions_pb2 from keras.saving import saving_utils from keras.saving.saved_model import constants from keras.saving.saved_model import json_utils diff --git a/keras/saving/saved_model/save.py b/keras/saving/saved_model/save.py index b3ecb0adb618..8f2eb3de0456 100644 --- a/keras/saving/saved_model/save.py +++ b/keras/saving/saved_model/save.py @@ -21,9 +21,9 @@ import os -from tensorflow.core.framework import versions_pb2 from keras import backend as K from keras.protobuf import saved_metadata_pb2 +from keras.protobuf import versions_pb2 from keras.saving import saving_utils from keras.saving.saved_model import constants from keras.saving.saved_model import save_impl