From 35f0302e2f27cbee9d160bffcad8c1d213e24298 Mon Sep 17 00:00:00 2001 From: Sergei Lebedev <slebedev@google.com> Date: Tue, 17 Sep 2019 07:30:06 -0700 Subject: [PATCH] Removed shape function registration from python_op_gen Shape inference is done in C++ and the registered Python functions are never invoked. PiperOrigin-RevId: 269564601 --- tensorflow/contrib/cloud/BUILD | 2 -- tensorflow/contrib/ffmpeg/BUILD | 3 --- tensorflow/python/BUILD | 3 --- tensorflow/python/build_defs.bzl | 2 +- tensorflow/python/framework/python_op_gen.cc | 18 +++++---------- tensorflow/python/framework/python_op_gen.h | 4 ++-- .../python/framework/python_op_gen_main.cc | 22 ++++++++----------- tensorflow/tensorflow.bzl | 8 +++---- 8 files changed, 21 insertions(+), 41 deletions(-) diff --git a/tensorflow/contrib/cloud/BUILD b/tensorflow/contrib/cloud/BUILD index 31dca4d186f..b64df500ea8 100644 --- a/tensorflow/contrib/cloud/BUILD +++ b/tensorflow/contrib/cloud/BUILD @@ -26,14 +26,12 @@ tf_gen_op_libs( tf_gen_op_wrapper_py( name = "gen_bigquery_reader_ops", out = "python/ops/gen_bigquery_reader_ops.py", - require_shape_functions = True, deps = [":bigquery_reader_ops_op_lib"], ) tf_gen_op_wrapper_py( name = "gen_gcs_config_ops", out = "python/ops/gen_gcs_config_ops.py", - require_shape_functions = True, visibility = ["//tensorflow:internal"], deps = [":gcs_config_ops_op_lib"], ) diff --git a/tensorflow/contrib/ffmpeg/BUILD b/tensorflow/contrib/ffmpeg/BUILD index 69af00ce98d..526fb350733 100644 --- a/tensorflow/contrib/ffmpeg/BUILD +++ b/tensorflow/contrib/ffmpeg/BUILD @@ -79,7 +79,6 @@ cc_library( tf_gen_op_wrapper_py( name = "decode_audio_op_py", - require_shape_functions = True, visibility = ["//visibility:private"], deps = [ ":decode_audio_op_cc", @@ -88,7 +87,6 @@ tf_gen_op_wrapper_py( tf_gen_op_wrapper_py( name = "encode_audio_op_py", - require_shape_functions = True, visibility = ["//visibility:private"], deps = [ ":encode_audio_op_cc", @@ -97,7 +95,6 @@ tf_gen_op_wrapper_py( tf_gen_op_wrapper_py( name = "decode_video_op_py", - require_shape_functions = True, visibility = ["//visibility:private"], deps = [ ":decode_video_op_cc", diff --git a/tensorflow/python/BUILD b/tensorflow/python/BUILD index 79e386b6254..36bae7fa769 100644 --- a/tensorflow/python/BUILD +++ b/tensorflow/python/BUILD @@ -2020,7 +2020,6 @@ tf_gen_op_wrapper_private_py( tf_gen_op_wrapper_private_py( name = "bitwise_ops_gen", - require_shape_functions = True, visibility = [ "//learning/brain/python/ops:__pkg__", "//tensorflow/compiler/tests:__pkg__", @@ -2053,7 +2052,6 @@ tf_gen_op_wrapper_private_py( tf_gen_op_wrapper_private_py( name = "audio_ops_gen", - require_shape_functions = True, visibility = [ "//learning/brain/python/ops:__pkg__", "//tensorflow/contrib/framework:__pkg__", @@ -2319,7 +2317,6 @@ tf_gen_op_wrapper_private_py( tf_gen_op_wrapper_private_py( name = "user_ops_gen", - require_shape_functions = False, ) tf_gen_op_wrapper_private_py( diff --git a/tensorflow/python/build_defs.bzl b/tensorflow/python/build_defs.bzl index 51f3195b768..0f31610feaa 100644 --- a/tensorflow/python/build_defs.bzl +++ b/tensorflow/python/build_defs.bzl @@ -14,7 +14,7 @@ def tf_gen_op_wrapper_private_py( name, out = None, deps = [], - require_shape_functions = True, + require_shape_functions = False, visibility = []): if not name.endswith("_gen"): fail("name must end in _gen") diff --git a/tensorflow/python/framework/python_op_gen.cc b/tensorflow/python/framework/python_op_gen.cc index 7b5c066c455..5c93d12653b 100644 --- a/tensorflow/python/framework/python_op_gen.cc +++ b/tensorflow/python/framework/python_op_gen.cc @@ -979,7 +979,7 @@ void GenEagerPythonOp::AddRawOpExport(const string& parameters) { } string GetPythonOps(const OpList& ops, const ApiDefMap& api_defs, - const std::vector<string>& hidden_ops, bool require_shapes, + const std::vector<string>& hidden_ops, const string& source_file_name = "") { string result; // Header @@ -1008,8 +1008,6 @@ from tensorflow.python.eager import execute as _execute from tensorflow.python.framework import dtypes as _dtypes from tensorflow.core.framework import op_def_pb2 as _op_def_pb2 -# Needed to trigger the call to _set_call_cpp_shape_fn. -from tensorflow.python.framework import common_shapes as _common_shapes from tensorflow.python.framework import op_def_registry as _op_def_registry from tensorflow.python.framework import ops as _ops from tensorflow.python.framework import op_def_library as _op_def_library @@ -1067,11 +1065,6 @@ from tensorflow.python.util.tf_export import tf_export strings::StrAppend(&result, GetEagerPythonOp(op_def, *api_def, function_name)); - if (!require_shapes) { - strings::StrAppend(&result, "_ops.RegisterShape(\"", op_def.name(), - "\")(None)\n\n"); - } - auto added = out->Add(); *added = op_def; RemoveNonDeprecationDescriptionsFromOpDef(added); @@ -1094,11 +1087,10 @@ from tensorflow.python.util.tf_export import tf_export } // namespace void PrintPythonOps(const OpList& ops, const ApiDefMap& api_defs, - const std::vector<string>& hidden_ops, bool require_shapes, + const std::vector<string>& hidden_ops, const string& source_file_name) { - printf("%s", GetPythonOps(ops, api_defs, hidden_ops, require_shapes, - source_file_name) - .c_str()); + printf("%s", + GetPythonOps(ops, api_defs, hidden_ops, source_file_name).c_str()); } string GetPythonWrappers(const char* op_list_buf, size_t op_list_len) { @@ -1107,7 +1099,7 @@ string GetPythonWrappers(const char* op_list_buf, size_t op_list_len) { ops.ParseFromString(op_list_str); ApiDefMap api_def_map(ops); - return GetPythonOps(ops, api_def_map, {}, false); + return GetPythonOps(ops, api_def_map, {}); } } // namespace tensorflow diff --git a/tensorflow/python/framework/python_op_gen.h b/tensorflow/python/framework/python_op_gen.h index 7e754fd1224..22fcc452fbb 100644 --- a/tensorflow/python/framework/python_op_gen.h +++ b/tensorflow/python/framework/python_op_gen.h @@ -28,8 +28,8 @@ namespace tensorflow { // Optional fourth argument is the name of the original C++ source file // where the ops' REGISTER_OP() calls reside. void PrintPythonOps(const OpList& ops, const ApiDefMap& api_defs, - const std::vector<string>& hidden_ops, bool require_shapes, - const string& source_file_name = ""); + const std::vector<string>& hidden_ops, + const string& source_file_name); // Get the python wrappers for a list of ops in a OpList. // `op_list_buf` should be a pointer to a buffer containing diff --git a/tensorflow/python/framework/python_op_gen_main.cc b/tensorflow/python/framework/python_op_gen_main.cc index 872d4990bd9..2f0ef70fe67 100644 --- a/tensorflow/python/framework/python_op_gen_main.cc +++ b/tensorflow/python/framework/python_op_gen_main.cc @@ -107,7 +107,7 @@ string InferSourceFileName(const char* argv_zero) { void PrintAllPythonOps(const std::vector<string>& op_list, const std::vector<string>& api_def_dirs, - const string& source_file_name, bool require_shapes, + const string& source_file_name, bool op_list_is_whitelist) { OpList ops; OpRegistry::Global()->Export(false, &ops); @@ -133,10 +133,9 @@ void PrintAllPythonOps(const std::vector<string>& op_list, *pruned_ops.mutable_op()->Add() = op_def; } } - PrintPythonOps(pruned_ops, api_def_map, {}, require_shapes, - source_file_name); + PrintPythonOps(pruned_ops, api_def_map, {}, source_file_name); } else { - PrintPythonOps(ops, api_def_map, op_list, require_shapes, source_file_name); + PrintPythonOps(ops, api_def_map, op_list, source_file_name); } } @@ -151,29 +150,26 @@ int main(int argc, char* argv[]) { // Usage: // gen_main api_def_dir1,api_def_dir2,... - // [ @FILENAME | OpName[,OpName]* ] (0 | 1) [0 | 1] - if (argc < 3) { + // [ @FILENAME | OpName[,OpName]* ] [0 | 1] + if (argc < 2) { return -1; } std::vector<tensorflow::string> api_def_dirs = tensorflow::str_util::Split( argv[1], ",", tensorflow::str_util::SkipEmpty()); - if (argc == 3) { + if (argc == 2) { tensorflow::PrintAllPythonOps({}, api_def_dirs, source_file_name, - tensorflow::string(argv[2]) == "1", false /* op_list_is_whitelist */); - } else if (argc == 4) { + } else if (argc == 3) { std::vector<tensorflow::string> hidden_ops; TF_CHECK_OK(tensorflow::ParseOpListCommandLine(argv[2], &hidden_ops)); tensorflow::PrintAllPythonOps(hidden_ops, api_def_dirs, source_file_name, - tensorflow::string(argv[3]) == "1", false /* op_list_is_whitelist */); - } else if (argc == 5) { + } else if (argc == 4) { std::vector<tensorflow::string> op_list; TF_CHECK_OK(tensorflow::ParseOpListCommandLine(argv[2], &op_list)); tensorflow::PrintAllPythonOps(op_list, api_def_dirs, source_file_name, - tensorflow::string(argv[3]) == "1", - tensorflow::string(argv[4]) == "1"); + tensorflow::string(argv[3]) == "1"); } else { return -1; } diff --git a/tensorflow/tensorflow.bzl b/tensorflow/tensorflow.bzl index c8c358cd974..34af7bd4288 100644 --- a/tensorflow/tensorflow.bzl +++ b/tensorflow/tensorflow.bzl @@ -839,7 +839,7 @@ def tf_gen_op_wrappers_cc( # deps: list of dependencies for the intermediate tool used to generate the # python target. NOTE these `deps` are not applied to the final python # library target itself. -# require_shape_functions: leave this as False. +# require_shape_functions: Unused. Leave this as False. # hidden_file: optional file that contains a list of op names to make private # in the generated Python module. Each op name should be on a line by # itself. Lines that start with characters that are invalid op name @@ -863,6 +863,8 @@ def tf_gen_op_wrapper_py( op_whitelist = [], cc_linkopts = [], api_def_srcs = []): + _ = require_shape_functions # Unused. + if (hidden or hidden_file) and op_whitelist: fail("Cannot pass specify both hidden and op_whitelist.") @@ -920,8 +922,7 @@ def tf_gen_op_wrapper_py( srcs = api_def_srcs + [hidden_file], tools = [tool_name] + tf_binary_additional_srcs(), cmd = ("$(location " + tool_name + ") " + api_def_args_str + - " @$(location " + hidden_file + ") " + - ("1" if require_shape_functions else "0") + " > $@"), + " @$(location " + hidden_file + ") > $@"), ) else: native.genrule( @@ -931,7 +932,6 @@ def tf_gen_op_wrapper_py( tools = [tool_name] + tf_binary_additional_srcs(), cmd = ("$(location " + tool_name + ") " + api_def_args_str + " " + op_list_arg + " " + - ("1" if require_shape_functions else "0") + " " + ("1" if op_list_is_whitelist else "0") + " > $@"), )