Start separating the type TF_ConcreteFunction from TF_SignatureDefFunction. The two have significant enough differences in semantics and implementation that they should have different representations; see the comments in tensorflow/cc/saved_model/experimental/public/signature_def_function.h for more details.
PiperOrigin-RevId: 327117128 Change-Id: I54d5f5ca0ed51599b21e7b322e1d292212243871
This commit is contained in:
parent
4a96705a6f
commit
1e87951747
@ -44,7 +44,9 @@ cc_library(
|
|||||||
],
|
],
|
||||||
deps = [
|
deps = [
|
||||||
":concrete_function",
|
":concrete_function",
|
||||||
|
":signature_def_function",
|
||||||
"//tensorflow/core:lib",
|
"//tensorflow/core:lib",
|
||||||
|
"@com_google_absl//absl/strings",
|
||||||
],
|
],
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -70,6 +72,26 @@ cc_library(
|
|||||||
],
|
],
|
||||||
)
|
)
|
||||||
|
|
||||||
|
cc_library(
|
||||||
|
name = "signature_def_function",
|
||||||
|
hdrs = [
|
||||||
|
"signature_def_function.h",
|
||||||
|
],
|
||||||
|
deps = [
|
||||||
|
":signature_def_function_metadata",
|
||||||
|
"//tensorflow/c/eager:immediate_execution_operation",
|
||||||
|
"//tensorflow/c/eager:immediate_execution_tensor_handle",
|
||||||
|
"@com_google_absl//absl/types:span",
|
||||||
|
],
|
||||||
|
)
|
||||||
|
|
||||||
|
cc_library(
|
||||||
|
name = "signature_def_function_metadata",
|
||||||
|
hdrs = [
|
||||||
|
"signature_def_function_metadata.h",
|
||||||
|
],
|
||||||
|
)
|
||||||
|
|
||||||
cc_library(
|
cc_library(
|
||||||
name = "test_utils",
|
name = "test_utils",
|
||||||
testonly = True,
|
testonly = True,
|
||||||
@ -115,6 +137,7 @@ cc_library(
|
|||||||
":concrete_function",
|
":concrete_function",
|
||||||
":saved_model_api",
|
":saved_model_api",
|
||||||
":saved_model_utils",
|
":saved_model_utils",
|
||||||
|
":signature_def_function",
|
||||||
"//tensorflow/c:tensor_interface",
|
"//tensorflow/c:tensor_interface",
|
||||||
"//tensorflow/c/eager:immediate_execution_context",
|
"//tensorflow/c/eager:immediate_execution_context",
|
||||||
"//tensorflow/c/eager:immediate_execution_tensor_handle",
|
"//tensorflow/c/eager:immediate_execution_tensor_handle",
|
||||||
|
@ -26,10 +26,14 @@ limitations under the License.
|
|||||||
|
|
||||||
namespace tensorflow {
|
namespace tensorflow {
|
||||||
|
|
||||||
// Note that ConcreteFunctions's lifetimes are effectively bound
|
// ConcreteFunctions correspond to an instance of a tf.function with a known set
|
||||||
// to the SavedModel they are loaded from, since they retain pointers
|
// of inputs (either through get_concrete_function) or an input_signature.
|
||||||
// to the TensorHandles owned by the SavedModel, and the FunctionDef
|
// ConcreteFunction attempts to preserve the user-facing semantics of the
|
||||||
// of the SavedModel.
|
// tf.function python API and can take a limited set of types as arguments
|
||||||
|
// (to be modeled in tensorflow::Value), not just Tensors.
|
||||||
|
// SavedModelAPI's ConcreteFunctions' lifetimes are bound to the SavedModel they
|
||||||
|
// are loaded from, since they retain pointers to the TensorHandles owned by the
|
||||||
|
// SavedModel, and the FunctionDef of the SavedModel.
|
||||||
// Note(bmzhao): This class is only TEMPORARILY virtual, as a way to unblock
|
// Note(bmzhao): This class is only TEMPORARILY virtual, as a way to unblock
|
||||||
// TFRT integration with TF Serving. Do not add more virtual implementations of
|
// TFRT integration with TF Serving. Do not add more virtual implementations of
|
||||||
// this class. Eventually we want to remove this virtual base class indirection
|
// this class. Eventually we want to remove this virtual base class indirection
|
||||||
|
@ -22,6 +22,7 @@ limitations under the License.
|
|||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
#include "tensorflow/c/experimental/saved_model/core/concrete_function.h"
|
#include "tensorflow/c/experimental/saved_model/core/concrete_function.h"
|
||||||
|
#include "tensorflow/c/experimental/saved_model/core/signature_def_function.h"
|
||||||
#include "tensorflow/core/platform/status.h"
|
#include "tensorflow/core/platform/status.h"
|
||||||
|
|
||||||
namespace tensorflow {
|
namespace tensorflow {
|
||||||
@ -39,11 +40,11 @@ class SavedModelAPI {
|
|||||||
virtual Status GetFunction(const std::string& function_path,
|
virtual Status GetFunction(const std::string& function_path,
|
||||||
ConcreteFunction** function) = 0;
|
ConcreteFunction** function) = 0;
|
||||||
|
|
||||||
// Retrieve a function from a SavedModel, using the key of the
|
// Retrieve a SignatureDefFunction from a SavedModel, using the key of the
|
||||||
// SignatureDef map:
|
// SignatureDef map:
|
||||||
// https://github.com/tensorflow/tensorflow/blob/69b08900b1e991d84bce31f3b404f5ed768f339f/tensorflow/core/protobuf/meta_graph.proto#L89
|
// https://github.com/tensorflow/tensorflow/blob/69b08900b1e991d84bce31f3b404f5ed768f339f/tensorflow/core/protobuf/meta_graph.proto#L89
|
||||||
virtual Status GetSignatureDefFunction(const std::string& signature_def_key,
|
virtual Status GetSignatureDefFunction(const std::string& signature_def_key,
|
||||||
ConcreteFunction** function) = 0;
|
SignatureDefFunction** function) = 0;
|
||||||
|
|
||||||
virtual std::vector<ConcreteFunction*> ListFunctions() = 0;
|
virtual std::vector<ConcreteFunction*> ListFunctions() = 0;
|
||||||
|
|
||||||
|
@ -0,0 +1,62 @@
|
|||||||
|
/* 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.
|
||||||
|
==============================================================================*/
|
||||||
|
|
||||||
|
#ifndef TENSORFLOW_C_EXPERIMENTAL_SAVED_MODEL_CORE_SIGNATURE_DEF_FUNCTION_H_
|
||||||
|
#define TENSORFLOW_C_EXPERIMENTAL_SAVED_MODEL_CORE_SIGNATURE_DEF_FUNCTION_H_
|
||||||
|
|
||||||
|
#include <memory>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
#include "absl/types/span.h"
|
||||||
|
#include "tensorflow/c/eager/immediate_execution_operation.h"
|
||||||
|
#include "tensorflow/c/eager/immediate_execution_tensor_handle.h"
|
||||||
|
#include "tensorflow/c/experimental/saved_model/core/signature_def_function_metadata.h"
|
||||||
|
|
||||||
|
namespace tensorflow {
|
||||||
|
|
||||||
|
// See tensorflow/cc/experimental/saved_model/public/signature_def_function.h
|
||||||
|
// for SignatureDefFunction's intended user-facing semantics.
|
||||||
|
// This class is the "implementation" C++ part of the C++/C/C++ sandwich for
|
||||||
|
// a SignatureDefFunction.
|
||||||
|
// Note(bmzhao): Implementation-wise, SignatureDefFunctions are always saved as
|
||||||
|
// a "BareConcreteFunction", w/o a FunctionSpec, rather than a SavedFunction:
|
||||||
|
// https://github.com/tensorflow/tensorflow/blob/9bcefa44cd335c1db4a703a13da09f29ae1bbdb2/tensorflow/core/protobuf/saved_object_graph.proto#L60
|
||||||
|
// Additionally they are guaranteed to be children of the .signatures attribute
|
||||||
|
// of the root object, where the child object "name" is the signature_def key:
|
||||||
|
// https://github.com/tensorflow/tensorflow/blob/9bcefa44cd335c1db4a703a13da09f29ae1bbdb2/tensorflow/python/saved_model/signature_serialization.py#L181-L230
|
||||||
|
// One of the critical requirements of SignatureDef functions is that their
|
||||||
|
// inputs and outputs are "named". For example, a `.signatures` function:
|
||||||
|
// a. Requires users to pass: kwargs of all inputs:
|
||||||
|
// https://github.com/tensorflow/tensorflow/blob/26c4ee0c833e74f94d0102d8b005c41a28b44445/tensorflow/python/saved_model/signature_serialization.py#L119-L126
|
||||||
|
// b. Returns a dictionary of named outputs.
|
||||||
|
// https://github.com/tensorflow/tensorflow/blob/26c4ee0c833e74f94d0102d8b005c41a28b44445/tensorflow/python/saved_model/signature_serialization.py#L153-L161
|
||||||
|
// Since SignatureDefFunctions do not have FunctionSpecs, but guarantee the
|
||||||
|
// dictionary of inputs/outputs, we can parse these dictionaries' keys to obtain
|
||||||
|
// the input/output names of the SignatureDef:
|
||||||
|
// https://github.com/tensorflow/tensorflow/blob/9bcefa44cd335c1db4a703a13da09f29ae1bbdb2/tensorflow/core/protobuf/meta_graph.proto#L318-L321
|
||||||
|
class SignatureDefFunction {
|
||||||
|
public:
|
||||||
|
virtual ~SignatureDefFunction() = default;
|
||||||
|
|
||||||
|
// Creates a "Call" Op used to execute the function.
|
||||||
|
virtual Status MakeCallOp(absl::Span<AbstractTensorHandle* const> inputs,
|
||||||
|
ImmediateOpPtr* out) const = 0;
|
||||||
|
|
||||||
|
virtual const SignatureDefFunctionMetadata& GetFunctionMetadata() const = 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace tensorflow
|
||||||
|
|
||||||
|
#endif // TENSORFLOW_C_EXPERIMENTAL_SAVED_MODEL_CORE_SIGNATURE_DEF_FUNCTION_H_
|
@ -0,0 +1,27 @@
|
|||||||
|
/* 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.
|
||||||
|
==============================================================================*/
|
||||||
|
|
||||||
|
#ifndef TENSORFLOW_C_EXPERIMENTAL_SAVED_MODEL_CORE_SIGNATURE_DEF_FUNCTION_METADATA_H_
|
||||||
|
#define TENSORFLOW_C_EXPERIMENTAL_SAVED_MODEL_CORE_SIGNATURE_DEF_FUNCTION_METADATA_H_
|
||||||
|
|
||||||
|
namespace tensorflow {
|
||||||
|
|
||||||
|
class SignatureDefFunctionMetadata {
|
||||||
|
// TODO(bmzhao): Fill in with fields as necessary
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace tensorflow
|
||||||
|
|
||||||
|
#endif // TENSORFLOW_C_EXPERIMENTAL_SAVED_MODEL_CORE_SIGNATURE_DEF_FUNCTION_METADATA_H_
|
@ -34,6 +34,7 @@ limitations under the License.
|
|||||||
#include "tensorflow/c/experimental/saved_model/core/revived_types/tf_concrete_function.h"
|
#include "tensorflow/c/experimental/saved_model/core/revived_types/tf_concrete_function.h"
|
||||||
#include "tensorflow/c/experimental/saved_model/core/revived_types/variable.h"
|
#include "tensorflow/c/experimental/saved_model/core/revived_types/variable.h"
|
||||||
#include "tensorflow/c/experimental/saved_model/core/saved_model_utils.h"
|
#include "tensorflow/c/experimental/saved_model/core/saved_model_utils.h"
|
||||||
|
#include "tensorflow/c/experimental/saved_model/core/signature_def_function.h"
|
||||||
#include "tensorflow/cc/saved_model/bundle_v2.h"
|
#include "tensorflow/cc/saved_model/bundle_v2.h"
|
||||||
#include "tensorflow/cc/saved_model/constants.h"
|
#include "tensorflow/cc/saved_model/constants.h"
|
||||||
#include "tensorflow/core/framework/attr_value.pb.h"
|
#include "tensorflow/core/framework/attr_value.pb.h"
|
||||||
@ -305,7 +306,7 @@ Status TFSavedModelAPI::GetFunction(const std::string& function_path,
|
|||||||
}
|
}
|
||||||
|
|
||||||
Status TFSavedModelAPI::GetSignatureDefFunction(
|
Status TFSavedModelAPI::GetSignatureDefFunction(
|
||||||
const std::string& signature_def_key, ConcreteFunction** function) {
|
const std::string& signature_def_key, SignatureDefFunction** function) {
|
||||||
// TODO(bmzhao): Add support for retrieving a signaturedef function.
|
// TODO(bmzhao): Add support for retrieving a signaturedef function.
|
||||||
return errors::Unimplemented(
|
return errors::Unimplemented(
|
||||||
"Retrieving SignatureDef functions is unimplemented currently");
|
"Retrieving SignatureDef functions is unimplemented currently");
|
||||||
|
@ -28,6 +28,7 @@ limitations under the License.
|
|||||||
#include "tensorflow/c/experimental/saved_model/core/revived_types/tensorhandle_convertible.h"
|
#include "tensorflow/c/experimental/saved_model/core/revived_types/tensorhandle_convertible.h"
|
||||||
#include "tensorflow/c/experimental/saved_model/core/revived_types/tf_concrete_function.h"
|
#include "tensorflow/c/experimental/saved_model/core/revived_types/tf_concrete_function.h"
|
||||||
#include "tensorflow/c/experimental/saved_model/core/saved_model_api.h"
|
#include "tensorflow/c/experimental/saved_model/core/saved_model_api.h"
|
||||||
|
#include "tensorflow/c/experimental/saved_model/core/signature_def_function.h"
|
||||||
#include "tensorflow/cc/saved_model/bundle_v2.h"
|
#include "tensorflow/cc/saved_model/bundle_v2.h"
|
||||||
#include "tensorflow/core/platform/status.h"
|
#include "tensorflow/core/platform/status.h"
|
||||||
|
|
||||||
@ -55,7 +56,7 @@ class TFSavedModelAPI : public SavedModelAPI {
|
|||||||
ConcreteFunction** function) override;
|
ConcreteFunction** function) override;
|
||||||
|
|
||||||
Status GetSignatureDefFunction(const std::string& signature_def_key,
|
Status GetSignatureDefFunction(const std::string& signature_def_key,
|
||||||
ConcreteFunction** function) override;
|
SignatureDefFunction** function) override;
|
||||||
|
|
||||||
static Status Load(
|
static Status Load(
|
||||||
const std::string& directory,
|
const std::string& directory,
|
||||||
|
@ -142,6 +142,8 @@ cc_library(
|
|||||||
":concrete_function_list_type",
|
":concrete_function_list_type",
|
||||||
":concrete_function_type",
|
":concrete_function_type",
|
||||||
":saved_model_api_type",
|
":saved_model_api_type",
|
||||||
|
":signature_def_function",
|
||||||
|
":signature_def_function_type",
|
||||||
"//tensorflow/c:c_api_macros",
|
"//tensorflow/c:c_api_macros",
|
||||||
"//tensorflow/c:tf_status",
|
"//tensorflow/c:tf_status",
|
||||||
"//tensorflow/c:tf_status_internal",
|
"//tensorflow/c:tf_status_internal",
|
||||||
@ -165,6 +167,77 @@ cc_library(
|
|||||||
],
|
],
|
||||||
)
|
)
|
||||||
|
|
||||||
|
cc_library(
|
||||||
|
name = "signature_def_function",
|
||||||
|
srcs = [
|
||||||
|
"signature_def_function.cc",
|
||||||
|
],
|
||||||
|
hdrs = [
|
||||||
|
"//tensorflow/c/experimental/saved_model/public:signature_def_function.h",
|
||||||
|
],
|
||||||
|
copts = tf_copts(),
|
||||||
|
visibility = [
|
||||||
|
"//tensorflow/c/experimental/saved_model/public:__pkg__",
|
||||||
|
],
|
||||||
|
deps = [
|
||||||
|
":signature_def_function_metadata",
|
||||||
|
":signature_def_function_metadata_type",
|
||||||
|
":signature_def_function_type",
|
||||||
|
"//tensorflow/c:c_api_macros",
|
||||||
|
"//tensorflow/c:tf_status_internal",
|
||||||
|
"//tensorflow/c/eager:abstract_tensor_handle",
|
||||||
|
"//tensorflow/c/eager:c_api",
|
||||||
|
"//tensorflow/c/eager:immediate_execution_operation",
|
||||||
|
"//tensorflow/c/eager:tfe_op_internal",
|
||||||
|
"//tensorflow/c/eager:tfe_tensorhandle_internal",
|
||||||
|
"//tensorflow/c/experimental/saved_model/core:signature_def_function",
|
||||||
|
"//tensorflow/c/experimental/saved_model/core:signature_def_function_metadata",
|
||||||
|
"//tensorflow/core:lib",
|
||||||
|
"@com_google_absl//absl/types:span",
|
||||||
|
],
|
||||||
|
)
|
||||||
|
|
||||||
|
cc_library(
|
||||||
|
name = "signature_def_function_type",
|
||||||
|
hdrs = [
|
||||||
|
"signature_def_function_type.h",
|
||||||
|
],
|
||||||
|
deps = [
|
||||||
|
"//tensorflow/c:conversion_macros",
|
||||||
|
"//tensorflow/c/experimental/saved_model/core:signature_def_function",
|
||||||
|
],
|
||||||
|
)
|
||||||
|
|
||||||
|
cc_library(
|
||||||
|
name = "signature_def_function_metadata",
|
||||||
|
srcs = [
|
||||||
|
"signature_def_function_metadata.cc",
|
||||||
|
],
|
||||||
|
hdrs = [
|
||||||
|
"//tensorflow/c/experimental/saved_model/public:signature_def_function_metadata.h",
|
||||||
|
],
|
||||||
|
copts = tf_copts(),
|
||||||
|
visibility = [
|
||||||
|
"//tensorflow/c/experimental/saved_model/public:__pkg__",
|
||||||
|
],
|
||||||
|
deps = [
|
||||||
|
":signature_def_function_metadata_type",
|
||||||
|
"//tensorflow/c:c_api_macros",
|
||||||
|
"//tensorflow/c/experimental/saved_model/core:signature_def_function_metadata",
|
||||||
|
],
|
||||||
|
)
|
||||||
|
|
||||||
|
cc_library(
|
||||||
|
name = "signature_def_function_metadata_type",
|
||||||
|
hdrs = [
|
||||||
|
"signature_def_function_metadata_type.h",
|
||||||
|
],
|
||||||
|
deps = [
|
||||||
|
"//tensorflow/c:conversion_macros",
|
||||||
|
"//tensorflow/c/experimental/saved_model/core:signature_def_function_metadata",
|
||||||
|
],
|
||||||
|
)
|
||||||
|
|
||||||
tf_cc_test(
|
tf_cc_test(
|
||||||
name = "saved_model_api_test",
|
name = "saved_model_api_test",
|
||||||
size = "small",
|
size = "small",
|
||||||
|
@ -26,6 +26,7 @@ limitations under the License.
|
|||||||
#include "tensorflow/c/experimental/saved_model/internal/concrete_function_list_type.h"
|
#include "tensorflow/c/experimental/saved_model/internal/concrete_function_list_type.h"
|
||||||
#include "tensorflow/c/experimental/saved_model/internal/concrete_function_type.h"
|
#include "tensorflow/c/experimental/saved_model/internal/concrete_function_type.h"
|
||||||
#include "tensorflow/c/experimental/saved_model/internal/saved_model_api_type.h"
|
#include "tensorflow/c/experimental/saved_model/internal/saved_model_api_type.h"
|
||||||
|
#include "tensorflow/c/experimental/saved_model/internal/signature_def_function_type.h"
|
||||||
#include "tensorflow/c/tf_status.h"
|
#include "tensorflow/c/tf_status.h"
|
||||||
#include "tensorflow/c/tf_status_internal.h"
|
#include "tensorflow/c/tf_status_internal.h"
|
||||||
#include "tensorflow/core/common_runtime/eager/context.h"
|
#include "tensorflow/core/common_runtime/eager/context.h"
|
||||||
@ -106,9 +107,11 @@ TF_ConcreteFunction* TF_GetSavedModelConcreteFunction(TF_SavedModel* model,
|
|||||||
return tensorflow::wrap(result);
|
return tensorflow::wrap(result);
|
||||||
}
|
}
|
||||||
|
|
||||||
TF_CAPI_EXPORT extern TF_ConcreteFunction* TF_GetSavedModelSignatureDefFunction(
|
TF_CAPI_EXPORT extern TF_SignatureDefFunction*
|
||||||
TF_SavedModel* model, const char* signature_def_key, TF_Status* status) {
|
TF_GetSavedModelSignatureDefFunction(TF_SavedModel* model,
|
||||||
tensorflow::ConcreteFunction* result = nullptr;
|
const char* signature_def_key,
|
||||||
|
TF_Status* status) {
|
||||||
|
tensorflow::SignatureDefFunction* result = nullptr;
|
||||||
tensorflow::Status get_function_status =
|
tensorflow::Status get_function_status =
|
||||||
tensorflow::unwrap(model)->GetSignatureDefFunction(signature_def_key,
|
tensorflow::unwrap(model)->GetSignatureDefFunction(signature_def_key,
|
||||||
&result);
|
&result);
|
||||||
|
@ -0,0 +1,53 @@
|
|||||||
|
/* 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.
|
||||||
|
==============================================================================*/
|
||||||
|
|
||||||
|
#include "tensorflow/c/experimental/saved_model/public/signature_def_function.h"
|
||||||
|
|
||||||
|
#include "absl/types/span.h"
|
||||||
|
#include "tensorflow/c/eager/abstract_tensor_handle.h"
|
||||||
|
#include "tensorflow/c/eager/immediate_execution_operation.h"
|
||||||
|
#include "tensorflow/c/eager/tfe_op_internal.h"
|
||||||
|
#include "tensorflow/c/eager/tfe_tensorhandle_internal.h"
|
||||||
|
#include "tensorflow/c/experimental/saved_model/core/signature_def_function.h"
|
||||||
|
#include "tensorflow/c/experimental/saved_model/core/signature_def_function_metadata.h"
|
||||||
|
#include "tensorflow/c/experimental/saved_model/internal/signature_def_function_metadata_type.h"
|
||||||
|
#include "tensorflow/c/experimental/saved_model/internal/signature_def_function_type.h"
|
||||||
|
#include "tensorflow/c/tf_status_internal.h"
|
||||||
|
#include "tensorflow/core/platform/status.h"
|
||||||
|
|
||||||
|
extern "C" {
|
||||||
|
|
||||||
|
TF_SignatureDefFunctionMetadata* TF_SignatureDefFunctionGetMetadata(
|
||||||
|
TF_SignatureDefFunction* func) {
|
||||||
|
return tensorflow::wrap(const_cast<tensorflow::SignatureDefFunctionMetadata*>(
|
||||||
|
&tensorflow::unwrap(func)->GetFunctionMetadata()));
|
||||||
|
}
|
||||||
|
|
||||||
|
TFE_Op* TF_SignatureDefFunctionMakeCallOp(TF_SignatureDefFunction* func,
|
||||||
|
TFE_TensorHandle** inputs,
|
||||||
|
int num_inputs, TF_Status* status) {
|
||||||
|
tensorflow::ImmediateOpPtr call_op;
|
||||||
|
absl::Span<tensorflow::AbstractTensorHandle* const> input_span(
|
||||||
|
reinterpret_cast<tensorflow::AbstractTensorHandle**>(
|
||||||
|
tensorflow::unwrap(inputs)),
|
||||||
|
static_cast<size_t>(num_inputs));
|
||||||
|
status->status = tensorflow::unwrap(func)->MakeCallOp(input_span, &call_op);
|
||||||
|
if (!status->status.ok()) {
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
return tensorflow::wrap(call_op.release());
|
||||||
|
}
|
||||||
|
|
||||||
|
} // end extern "C"
|
@ -0,0 +1,20 @@
|
|||||||
|
/* 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.
|
||||||
|
==============================================================================*/
|
||||||
|
|
||||||
|
#include "tensorflow/c/experimental/saved_model/public/signature_def_function_metadata.h"
|
||||||
|
|
||||||
|
#include "tensorflow/c/experimental/saved_model/internal/signature_def_function_metadata_type.h"
|
||||||
|
|
||||||
|
// TODO(bmzhao): Add getter functions here as necessary.
|
@ -0,0 +1,31 @@
|
|||||||
|
/* 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.
|
||||||
|
==============================================================================*/
|
||||||
|
|
||||||
|
#ifndef TENSORFLOW_C_EXPERIMENTAL_SAVED_MODEL_INTERNAL_SIGNATURE_DEF_FUNCTION_METADATA_TYPE_H_
|
||||||
|
#define TENSORFLOW_C_EXPERIMENTAL_SAVED_MODEL_INTERNAL_SIGNATURE_DEF_FUNCTION_METADATA_TYPE_H_
|
||||||
|
|
||||||
|
#include "tensorflow/c/conversion_macros.h"
|
||||||
|
#include "tensorflow/c/experimental/saved_model/core/signature_def_function_metadata.h"
|
||||||
|
|
||||||
|
typedef struct TF_SignatureDefFunctionMetadata TF_SignatureDefFunctionMetadata;
|
||||||
|
|
||||||
|
namespace tensorflow {
|
||||||
|
|
||||||
|
DEFINE_CONVERSION_FUNCTIONS(tensorflow::SignatureDefFunctionMetadata,
|
||||||
|
TF_SignatureDefFunctionMetadata)
|
||||||
|
|
||||||
|
} // namespace tensorflow
|
||||||
|
|
||||||
|
#endif // TENSORFLOW_C_EXPERIMENTAL_SAVED_MODEL_INTERNAL_SIGNATURE_DEF_FUNCTION_METADATA_TYPE_H_
|
@ -0,0 +1,31 @@
|
|||||||
|
/* 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.
|
||||||
|
==============================================================================*/
|
||||||
|
|
||||||
|
#ifndef TENSORFLOW_C_EXPERIMENTAL_SAVED_MODEL_INTERNAL_SIGNATURE_DEF_FUNCTION_TYPE_H_
|
||||||
|
#define TENSORFLOW_C_EXPERIMENTAL_SAVED_MODEL_INTERNAL_SIGNATURE_DEF_FUNCTION_TYPE_H_
|
||||||
|
|
||||||
|
#include "tensorflow/c/conversion_macros.h"
|
||||||
|
#include "tensorflow/c/experimental/saved_model/core/signature_def_function.h"
|
||||||
|
|
||||||
|
typedef struct TF_SignatureDefFunction TF_SignatureDefFunction;
|
||||||
|
|
||||||
|
namespace tensorflow {
|
||||||
|
|
||||||
|
DEFINE_CONVERSION_FUNCTIONS(tensorflow::SignatureDefFunction,
|
||||||
|
TF_SignatureDefFunction)
|
||||||
|
|
||||||
|
} // namespace tensorflow
|
||||||
|
|
||||||
|
#endif // TENSORFLOW_C_EXPERIMENTAL_SAVED_MODEL_INTERNAL_SIGNATURE_DEF_FUNCTION_TYPE_H_
|
@ -24,6 +24,8 @@ exports_files(
|
|||||||
"concrete_function_list.h",
|
"concrete_function_list.h",
|
||||||
"function_metadata.h",
|
"function_metadata.h",
|
||||||
"saved_model_api.h",
|
"saved_model_api.h",
|
||||||
|
"signature_def_function.h",
|
||||||
|
"signature_def_function_metadata.h",
|
||||||
],
|
],
|
||||||
visibility = ["//tensorflow/c/experimental/saved_model/internal:__pkg__"],
|
visibility = ["//tensorflow/c/experimental/saved_model/internal:__pkg__"],
|
||||||
)
|
)
|
||||||
@ -39,6 +41,8 @@ cc_library(
|
|||||||
":concrete_function_list",
|
":concrete_function_list",
|
||||||
":function_metadata",
|
":function_metadata",
|
||||||
":saved_model_api",
|
":saved_model_api",
|
||||||
|
":signature_def_function",
|
||||||
|
":signature_def_function_metadata",
|
||||||
],
|
],
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -61,3 +65,13 @@ alias(
|
|||||||
name = "saved_model_api",
|
name = "saved_model_api",
|
||||||
actual = "//tensorflow/c/experimental/saved_model/internal:saved_model_api",
|
actual = "//tensorflow/c/experimental/saved_model/internal:saved_model_api",
|
||||||
)
|
)
|
||||||
|
|
||||||
|
alias(
|
||||||
|
name = "signature_def_function",
|
||||||
|
actual = "//tensorflow/c/experimental/saved_model/internal:signature_def_function",
|
||||||
|
)
|
||||||
|
|
||||||
|
alias(
|
||||||
|
name = "signature_def_function_metadata",
|
||||||
|
actual = "//tensorflow/c/experimental/saved_model/internal:signature_def_function_metadata",
|
||||||
|
)
|
||||||
|
@ -21,6 +21,8 @@ limitations under the License.
|
|||||||
#include "tensorflow/c/experimental/saved_model/public/concrete_function_list.h"
|
#include "tensorflow/c/experimental/saved_model/public/concrete_function_list.h"
|
||||||
#include "tensorflow/c/experimental/saved_model/public/function_metadata.h"
|
#include "tensorflow/c/experimental/saved_model/public/function_metadata.h"
|
||||||
#include "tensorflow/c/experimental/saved_model/public/saved_model_api.h"
|
#include "tensorflow/c/experimental/saved_model/public/saved_model_api.h"
|
||||||
|
#include "tensorflow/c/experimental/saved_model/public/signature_def_function.h"
|
||||||
|
#include "tensorflow/c/experimental/saved_model/public/signature_def_function_metadata.h"
|
||||||
// IWYU pragma: end_exports
|
// IWYU pragma: end_exports
|
||||||
|
|
||||||
#endif // TENSORFLOW_C_EXPERIMENTAL_SAVED_MODEL_PUBLIC_C_SAVED_MODEL_API_H_
|
#endif // TENSORFLOW_C_EXPERIMENTAL_SAVED_MODEL_PUBLIC_C_SAVED_MODEL_API_H_
|
||||||
|
@ -40,6 +40,13 @@ TF_CAPI_EXPORT extern TF_FunctionMetadata* TF_ConcreteFunctionGetMetadata(
|
|||||||
// The caller is responsible for deleting the returned TFE_Op. If op
|
// The caller is responsible for deleting the returned TFE_Op. If op
|
||||||
// construction fails, `status` will be non-OK and the returned pointer will be
|
// construction fails, `status` will be non-OK and the returned pointer will be
|
||||||
// null.
|
// null.
|
||||||
|
// TODO(bmzhao): Remove this function in a subsequent change; Design + implement
|
||||||
|
// a Function Execution interface for ConcreteFunction that accepts a tagged
|
||||||
|
// union of types (tensorflow::Value). This effectively requires moving much of
|
||||||
|
// the implementation of function.py/def_function.py to C++, and exposing a
|
||||||
|
// high-level API here. A strawman for what this interface could look like:
|
||||||
|
// TF_Value* TF_ExecuteFunction(TFE_Context*, TF_ConcreteFunction*, TF_Value*
|
||||||
|
// inputs, int num_inputs, TF_Status* status);
|
||||||
TF_CAPI_EXPORT extern TFE_Op* TF_ConcreteFunctionGetCallOp(
|
TF_CAPI_EXPORT extern TFE_Op* TF_ConcreteFunctionGetCallOp(
|
||||||
TF_ConcreteFunction* func, TFE_TensorHandle** inputs, int num_inputs,
|
TF_ConcreteFunction* func, TFE_TensorHandle** inputs, int num_inputs,
|
||||||
TF_Status* status);
|
TF_Status* status);
|
||||||
|
@ -19,6 +19,7 @@ limitations under the License.
|
|||||||
#include "tensorflow/c/c_api_macros.h"
|
#include "tensorflow/c/c_api_macros.h"
|
||||||
#include "tensorflow/c/experimental/saved_model/public/concrete_function.h"
|
#include "tensorflow/c/experimental/saved_model/public/concrete_function.h"
|
||||||
#include "tensorflow/c/experimental/saved_model/public/concrete_function_list.h"
|
#include "tensorflow/c/experimental/saved_model/public/concrete_function_list.h"
|
||||||
|
#include "tensorflow/c/experimental/saved_model/public/signature_def_function.h"
|
||||||
#include "tensorflow/c/tf_status.h"
|
#include "tensorflow/c/tf_status.h"
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
@ -91,10 +92,13 @@ TF_CAPI_EXPORT extern TF_ConcreteFunction* TF_GetSavedModelConcreteFunction(
|
|||||||
// status - Set to OK on success and an appropriate error on failure.
|
// status - Set to OK on success and an appropriate error on failure.
|
||||||
// Returns:
|
// Returns:
|
||||||
// If status is not OK, returns nullptr. Otherwise, returns a
|
// If status is not OK, returns nullptr. Otherwise, returns a
|
||||||
// TF_ConcreteFunction instance. Once `model` is deleted, all
|
// TF_SignatureDefFunction instance. Once `model` is deleted, all
|
||||||
// `TF_ConcreteFunctions` retrieved from it are invalid, and have been deleted.
|
// `TF_SignatureDefFunctions` retrieved from it are invalid, and have been
|
||||||
TF_CAPI_EXPORT extern TF_ConcreteFunction* TF_GetSavedModelSignatureDefFunction(
|
// deleted.
|
||||||
TF_SavedModel* model, const char* signature_def_key, TF_Status* status);
|
TF_CAPI_EXPORT extern TF_SignatureDefFunction*
|
||||||
|
TF_GetSavedModelSignatureDefFunction(TF_SavedModel* model,
|
||||||
|
const char* signature_def_key,
|
||||||
|
TF_Status* status);
|
||||||
|
|
||||||
// Returns a list of all ConcreteFunctions stored in this SavedModel.
|
// Returns a list of all ConcreteFunctions stored in this SavedModel.
|
||||||
// The lifetime of the returned list is bound to `model`.
|
// The lifetime of the returned list is bound to `model`.
|
||||||
|
@ -0,0 +1,50 @@
|
|||||||
|
/* 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.
|
||||||
|
==============================================================================*/
|
||||||
|
|
||||||
|
#ifndef TENSORFLOW_C_EXPERIMENTAL_SAVED_MODEL_PUBLIC_SIGNATURE_DEF_FUNCTION_H_
|
||||||
|
#define TENSORFLOW_C_EXPERIMENTAL_SAVED_MODEL_PUBLIC_SIGNATURE_DEF_FUNCTION_H_
|
||||||
|
|
||||||
|
#include "tensorflow/c/c_api_macros.h"
|
||||||
|
#include "tensorflow/c/eager/c_api.h"
|
||||||
|
#include "tensorflow/c/experimental/saved_model/public/signature_def_function_metadata.h"
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif // __cplusplus
|
||||||
|
|
||||||
|
// An opaque type that corresponds to a SignatureDefFunction loaded from a
|
||||||
|
// SavedModel.
|
||||||
|
typedef struct TF_SignatureDefFunction TF_SignatureDefFunction;
|
||||||
|
|
||||||
|
// Returns FunctionMetadata associated with `func`. Metadata's lifetime is
|
||||||
|
// bound to `func`, which is bound to the TF_SavedModel it was loaded from.
|
||||||
|
TF_CAPI_EXPORT extern TF_SignatureDefFunctionMetadata*
|
||||||
|
TF_SignatureDefFunctionGetMetadata(TF_SignatureDefFunction* func);
|
||||||
|
|
||||||
|
// Returns a TFE_Op suitable for executing this function. Caller must provide
|
||||||
|
// all function inputs in `inputs`, and must not add any additional inputs on
|
||||||
|
// the returned op. (i.e. don't call TFE_OpAddInput or TFE_OpAddInputList).
|
||||||
|
// The caller is responsible for deleting the returned TFE_Op. If op
|
||||||
|
// construction fails, `status` will be non-OK and the returned pointer will be
|
||||||
|
// null.
|
||||||
|
TF_CAPI_EXPORT extern TFE_Op* TF_SignatureDefFunctionMakeCallOp(
|
||||||
|
TF_SignatureDefFunction* func, TFE_TensorHandle** inputs, int num_inputs,
|
||||||
|
TF_Status* status);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
} // end extern "C"
|
||||||
|
#endif // __cplusplus
|
||||||
|
|
||||||
|
#endif // TENSORFLOW_C_EXPERIMENTAL_SAVED_MODEL_PUBLIC_SIGNATURE_DEF_FUNCTION_H_
|
@ -0,0 +1,31 @@
|
|||||||
|
/* 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.
|
||||||
|
==============================================================================*/
|
||||||
|
|
||||||
|
#ifndef TENSORFLOW_C_EXPERIMENTAL_SAVED_MODEL_PUBLIC_SIGNATURE_DEF_FUNCTION_METADATA_H_
|
||||||
|
#define TENSORFLOW_C_EXPERIMENTAL_SAVED_MODEL_PUBLIC_SIGNATURE_DEF_FUNCTION_METADATA_H_
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif // __cplusplus
|
||||||
|
|
||||||
|
// An opaque type that corresponds to a SignatureDefFunction loaded from a
|
||||||
|
// SavedModel.
|
||||||
|
typedef struct TF_SignatureDefFunctionMetadata TF_SignatureDefFunctionMetadata;
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
} // end extern "C"
|
||||||
|
#endif // __cplusplus
|
||||||
|
|
||||||
|
#endif // TENSORFLOW_C_EXPERIMENTAL_SAVED_MODEL_PUBLIC_SIGNATURE_DEF_FUNCTION_METADATA_H_
|
@ -51,8 +51,32 @@ cc_library(
|
|||||||
deps = [
|
deps = [
|
||||||
":concrete_function",
|
":concrete_function",
|
||||||
":concrete_function_list",
|
":concrete_function_list",
|
||||||
|
":signature_def_function",
|
||||||
"//tensorflow/c/experimental/saved_model/public:saved_model_api",
|
"//tensorflow/c/experimental/saved_model/public:saved_model_api",
|
||||||
"//tensorflow/cc/experimental/base/public:runtime",
|
"//tensorflow/cc/experimental/base/public:runtime",
|
||||||
"//tensorflow/cc/experimental/base/public:status",
|
"//tensorflow/cc/experimental/base/public:status",
|
||||||
],
|
],
|
||||||
)
|
)
|
||||||
|
|
||||||
|
cc_library(
|
||||||
|
name = "signature_def_function",
|
||||||
|
hdrs = [
|
||||||
|
"signature_def_function.h",
|
||||||
|
],
|
||||||
|
deps = [
|
||||||
|
":signature_def_function_metadata",
|
||||||
|
"//tensorflow/c/eager:c_api",
|
||||||
|
"//tensorflow/c/experimental/saved_model/public:signature_def_function",
|
||||||
|
"//tensorflow/cc/experimental/base/public:status",
|
||||||
|
],
|
||||||
|
)
|
||||||
|
|
||||||
|
cc_library(
|
||||||
|
name = "signature_def_function_metadata",
|
||||||
|
hdrs = [
|
||||||
|
"signature_def_function_metadata.h",
|
||||||
|
],
|
||||||
|
deps = [
|
||||||
|
"//tensorflow/c/experimental/saved_model/public:signature_def_function_metadata",
|
||||||
|
],
|
||||||
|
)
|
||||||
|
@ -26,6 +26,7 @@ limitations under the License.
|
|||||||
#include "tensorflow/cc/experimental/base/public/status.h"
|
#include "tensorflow/cc/experimental/base/public/status.h"
|
||||||
#include "tensorflow/cc/saved_model/experimental/public/concrete_function.h"
|
#include "tensorflow/cc/saved_model/experimental/public/concrete_function.h"
|
||||||
#include "tensorflow/cc/saved_model/experimental/public/concrete_function_list.h"
|
#include "tensorflow/cc/saved_model/experimental/public/concrete_function_list.h"
|
||||||
|
#include "tensorflow/cc/saved_model/experimental/public/signature_def_function.h"
|
||||||
|
|
||||||
namespace tensorflow {
|
namespace tensorflow {
|
||||||
namespace experimental {
|
namespace experimental {
|
||||||
@ -80,8 +81,8 @@ class SavedModelAPI {
|
|||||||
// If status is not OK, returns nullptr. Otherwise, returns a
|
// If status is not OK, returns nullptr. Otherwise, returns a
|
||||||
// tensorflow::cc::ConcreteFunction pointer. The lifetime of this pointer
|
// tensorflow::cc::ConcreteFunction pointer. The lifetime of this pointer
|
||||||
// is bound to SavedModelAPI it was loaded from.
|
// is bound to SavedModelAPI it was loaded from.
|
||||||
ConcreteFunction* GetSignatureDefFunction(const std::string& function_path,
|
SignatureDefFunction* GetSignatureDefFunction(
|
||||||
Status* status);
|
const std::string& function_path, Status* status);
|
||||||
|
|
||||||
// Lists all Conrete Functions available from the SavedModel.
|
// Lists all Conrete Functions available from the SavedModel.
|
||||||
std::vector<ConcreteFunction*> ListFunctions();
|
std::vector<ConcreteFunction*> ListFunctions();
|
||||||
@ -140,14 +141,14 @@ inline ConcreteFunction* SavedModelAPI::GetConcreteFunction(
|
|||||||
return ConcreteFunction::wrap(function);
|
return ConcreteFunction::wrap(function);
|
||||||
}
|
}
|
||||||
|
|
||||||
inline ConcreteFunction* SavedModelAPI::GetSignatureDefFunction(
|
inline SignatureDefFunction* SavedModelAPI::GetSignatureDefFunction(
|
||||||
const std::string& function_path, Status* status) {
|
const std::string& function_path, Status* status) {
|
||||||
TF_ConcreteFunction* function = TF_GetSavedModelSignatureDefFunction(
|
TF_SignatureDefFunction* function = TF_GetSavedModelSignatureDefFunction(
|
||||||
saved_model_.get(), function_path.c_str(), status->GetTFStatus());
|
saved_model_.get(), function_path.c_str(), status->GetTFStatus());
|
||||||
if (!status->ok()) {
|
if (!status->ok()) {
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
return ConcreteFunction::wrap(function);
|
return SignatureDefFunction::wrap(function);
|
||||||
}
|
}
|
||||||
|
|
||||||
inline std::vector<ConcreteFunction*> SavedModelAPI::ListFunctions() {
|
inline std::vector<ConcreteFunction*> SavedModelAPI::ListFunctions() {
|
||||||
|
@ -0,0 +1,89 @@
|
|||||||
|
/* 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.
|
||||||
|
==============================================================================*/
|
||||||
|
|
||||||
|
#ifndef TENSORFLOW_CC_SAVED_MODEL_EXPERIMENTAL_PUBLIC_SIGNATURE_DEF_FUNCTION_H_
|
||||||
|
#define TENSORFLOW_CC_SAVED_MODEL_EXPERIMENTAL_PUBLIC_SIGNATURE_DEF_FUNCTION_H_
|
||||||
|
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
#include "tensorflow/c/eager/c_api.h"
|
||||||
|
#include "tensorflow/c/experimental/saved_model/public/signature_def_function.h"
|
||||||
|
#include "tensorflow/cc/experimental/base/public/status.h"
|
||||||
|
#include "tensorflow/cc/saved_model/experimental/public/signature_def_function_metadata.h"
|
||||||
|
|
||||||
|
namespace tensorflow {
|
||||||
|
namespace experimental {
|
||||||
|
namespace cc {
|
||||||
|
|
||||||
|
// SignatureDefFunctions are functions that correspond to either:
|
||||||
|
// "signatures" saved from a TF2 SavedModel APIs:
|
||||||
|
// https://github.com/tensorflow/tensorflow/blob/8ce0600f58ed84a8c84a7bbdb014d1f09e44f4c8/tensorflow/python/saved_model/save.py#L830-L854
|
||||||
|
// Or the "SignatureDefMap" saved from TF1 SavedModel APIs:
|
||||||
|
// https://github.com/tensorflow/tensorflow/blob/8ce0600f58ed84a8c84a7bbdb014d1f09e44f4c8/tensorflow/python/saved_model/load_v1_in_v2_test.py#L170-L174
|
||||||
|
// In both cases, a SignatureDef is serialized as a SignatureDef protobuf:
|
||||||
|
// https://github.com/tensorflow/tensorflow/blob/8ce0600f58ed84a8c84a7bbdb014d1f09e44f4c8/tensorflow/core/protobuf/meta_graph.proto#L260-L330
|
||||||
|
// and represents a computation defined by a TF subgraph.
|
||||||
|
// These Signatures were primarily designed to be interoperable with the legacy
|
||||||
|
// TF 1 Session-based C++ SavedModelBundle loading APIs:
|
||||||
|
// https://github.com/tensorflow/tensorflow/blob/26c4ee0c833e74f94d0102d8b005c41a28b44445/tensorflow/cc/saved_model/loader.h#L96-L108
|
||||||
|
// SignatureDefFunctions have different semantics from regular TF2
|
||||||
|
// ConcreteFunctions, and are mainly intended provide a serving-friendly
|
||||||
|
// transition point from the TF1 Session API.
|
||||||
|
// First, SignatureDefFunctions have different calling conventions.
|
||||||
|
// SignatureDefFunctions' inputs and outputs are constrained to **flattened
|
||||||
|
// lists of TensorHandles only**. They do not support more exotic input/output
|
||||||
|
// types (like optionals, generators, etc). Additionally, this flattening means
|
||||||
|
// they will not preserve the exact interface of the original tf.function they
|
||||||
|
// were traced from, as things like composite tensors decay into their
|
||||||
|
// internal dense tensor representation.
|
||||||
|
// Second, all inputs and outputs are "named", and these names are load bearing
|
||||||
|
// (eg: they are part of the interface of tensorflow_serving):
|
||||||
|
// https://github.com/tensorflow/serving/blob/e0d247b2e4050713194b8fad0be24a0636df7209/tensorflow_serving/apis/predict.proto#L21
|
||||||
|
// https://github.com/tensorflow/serving/blob/e0d247b2e4050713194b8fad0be24a0636df7209/tensorflow_serving/apis/predict.proto#L39
|
||||||
|
// The name of each input/output is stored in the corresponding tf::Argument in
|
||||||
|
// SignatureDefFunctionMetadata::arguments(). Users must ensure the order of
|
||||||
|
// TensorHandles passed to the function matches with the order of named
|
||||||
|
// arguments. Similarly the name of the outputs is stored in
|
||||||
|
// SignatureDefFunctionMetadata::returns().
|
||||||
|
class SignatureDefFunction final {
|
||||||
|
public:
|
||||||
|
// Returns FunctionMetadata associated with this ConcreteFunction.
|
||||||
|
const SignatureDefFunctionMetadata* GetFunctionMetadata();
|
||||||
|
|
||||||
|
private:
|
||||||
|
friend class SavedModelAPI;
|
||||||
|
friend class ConcreteFunctionList;
|
||||||
|
|
||||||
|
// TODO(bmzhao): Consider adding a macro for wrapping/unwrapping
|
||||||
|
// when moving out of experimental.
|
||||||
|
static SignatureDefFunction* wrap(TF_SignatureDefFunction* p) {
|
||||||
|
return reinterpret_cast<SignatureDefFunction*>(p);
|
||||||
|
}
|
||||||
|
static TF_SignatureDefFunction* unwrap(SignatureDefFunction* p) {
|
||||||
|
return reinterpret_cast<TF_SignatureDefFunction*>(p);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
inline const SignatureDefFunctionMetadata*
|
||||||
|
SignatureDefFunction::GetFunctionMetadata() {
|
||||||
|
return SignatureDefFunctionMetadata::wrap(
|
||||||
|
TF_SignatureDefFunctionGetMetadata(unwrap(this)));
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace cc
|
||||||
|
} // namespace experimental
|
||||||
|
} // namespace tensorflow
|
||||||
|
|
||||||
|
#endif // TENSORFLOW_CC_SAVED_MODEL_EXPERIMENTAL_PUBLIC_SIGNATURE_DEF_FUNCTION_H_
|
@ -0,0 +1,47 @@
|
|||||||
|
/* 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.
|
||||||
|
==============================================================================*/
|
||||||
|
|
||||||
|
#ifndef TENSORFLOW_CC_SAVED_MODEL_EXPERIMENTAL_PUBLIC_SIGNATURE_DEF_FUNCTION_METADATA_H_
|
||||||
|
#define TENSORFLOW_CC_SAVED_MODEL_EXPERIMENTAL_PUBLIC_SIGNATURE_DEF_FUNCTION_METADATA_H_
|
||||||
|
|
||||||
|
#include <memory>
|
||||||
|
|
||||||
|
#include "tensorflow/c/experimental/saved_model/public/signature_def_function_metadata.h"
|
||||||
|
|
||||||
|
namespace tensorflow {
|
||||||
|
namespace experimental {
|
||||||
|
namespace cc {
|
||||||
|
|
||||||
|
// SignatureDefFunctionMetadata stores additional information on each input
|
||||||
|
// and output's names, dtypes, and shape.
|
||||||
|
class SignatureDefFunctionMetadata final {
|
||||||
|
// TODO(bmzhao): Add getters here as necessary.
|
||||||
|
private:
|
||||||
|
friend class SignatureDefFunction;
|
||||||
|
static SignatureDefFunctionMetadata* wrap(
|
||||||
|
TF_SignatureDefFunctionMetadata* p) {
|
||||||
|
return reinterpret_cast<SignatureDefFunctionMetadata*>(p);
|
||||||
|
}
|
||||||
|
static TF_SignatureDefFunctionMetadata* unwrap(
|
||||||
|
SignatureDefFunctionMetadata* p) {
|
||||||
|
return reinterpret_cast<TF_SignatureDefFunctionMetadata*>(p);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace cc
|
||||||
|
} // namespace experimental
|
||||||
|
} // namespace tensorflow
|
||||||
|
|
||||||
|
#endif // TENSORFLOW_CC_SAVED_MODEL_EXPERIMENTAL_PUBLIC_SIGNATURE_DEF_FUNCTION_METADATA_H_
|
Loading…
Reference in New Issue
Block a user