diff --git a/tensorflow/api_template.__init__.py b/tensorflow/api_template.__init__.py index f13623b0d57d3b59bb9455a46a9fab29fee25784..d81cf067eb07e88e2b8a86cf5643674235eb3f3b 100644 --- a/tensorflow/api_template.__init__.py +++ b/tensorflow/api_template.__init__.py @@ -35,8 +35,9 @@ _tf_api_dir = _os.path.dirname(_os.path.dirname(bitwise.__file__)) # pylint: di if _tf_api_dir not in __path__: __path__.append(_tf_api_dir) -# Calls to enable and disable features. -enable_eager_execution() # pylint: disable=undefined-variable +# Enable TF2 behaviors +from tensorflow.python.compat import compat as _compat # pylint: disable=g-import-not-at-top +_compat.enable_v2_behavior() # These symbols appear because we import the python package which # in turn imports from tensorflow.core and tensorflow.python. They diff --git a/tensorflow/python/compat/BUILD b/tensorflow/python/compat/BUILD index e0a1c8e0571879e9661cdb0714cc6a794b7ea455..9f2ce8c676e77480106c525bdc9c6440c599acec 100644 --- a/tensorflow/python/compat/BUILD +++ b/tensorflow/python/compat/BUILD @@ -9,7 +9,10 @@ py_library( srcs = ["compat.py"], srcs_version = "PY2AND3", visibility = ["//tensorflow:internal"], - deps = ["//tensorflow/python:util"], + deps = [ + "//tensorflow/python:tf2", + "//tensorflow/python:util", + ], ) tf_py_test( diff --git a/tensorflow/python/compat/compat.py b/tensorflow/python/compat/compat.py index f83af0a583390282ea76fa79c42234bd8d99362a..156680e08178dd4a7c13ab8c6376cb9cbf2ff588 100644 --- a/tensorflow/python/compat/compat.py +++ b/tensorflow/python/compat/compat.py @@ -23,6 +23,12 @@ from __future__ import division from __future__ import print_function import datetime + +from tensorflow.python import tf2 +from tensorflow.python.framework import ops +from tensorflow.python.framework import tensor_shape +from tensorflow.python.ops import variable_scope + from tensorflow.python.util import tf_contextlib from tensorflow.python.util.tf_export import tf_export @@ -132,3 +138,40 @@ def forward_compatibility_horizon(year, month, day): yield finally: _FORWARD_COMPATIBILITY_HORIZON = old_compat_date + + +@tf_export(v1=["enable_v2_behavior"]) +def enable_v2_behavior(): + """Enables TensorFlow 2.x behaviors. + + This function can be called at the beginning of the program (before `Tensors`, + `Graphs` or other structures have been created, and before devices have been + initialized. It switches all global behaviors that are different between + TensorFlow 1.x and 2.x to behave as intended for 2.x. + + This function is called in the main TensorFlow `__init__.py` file, user should + not need to call it, except during complex migrations. + """ + tf2.enable() # Switches TensorArrayV2 and control flow V2 + ops.enable_eager_execution() + tensor_shape.enable_v2_tensorshape() # Also switched by tf2 + variable_scope.enable_resource_variables() + + +@tf_export(v1=["disable_v2_behavior"]) +def disable_v2_behavior(): + """Enables TensorFlow 2.x behaviors. + + This function can be called at the beginning of the program (before `Tensors`, + `Graphs` or other structures have been created, and before devices have been + initialized. It switches all global behaviors that are different between + TensorFlow 1.x and 2.x to behave as intended for 1.x. + + User can call this function to disable 2.x behavior during complex migrations. + """ + tf2.disable() # Switches TensorArrayV2 and control flow V2 + ops.disable_eager_execution() + tensor_shape.disable_v2_tensorshape() # Also switched by tf2 + variable_scope.disable_resource_variables() + + diff --git a/tensorflow/python/framework/ops.py b/tensorflow/python/framework/ops.py index b5175d3c93bff6de590a4da4382e2dc531299560..6c1a9c6f735bcbe99dd25f82d54b00fd463225b3 100644 --- a/tensorflow/python/framework/ops.py +++ b/tensorflow/python/framework/ops.py @@ -5393,7 +5393,7 @@ def inside_function(): return get_default_graph().building_function -@tf_export("enable_eager_execution") +@tf_export(v1=["enable_eager_execution"]) def enable_eager_execution(config=None, device_policy=None, execution_mode=None): @@ -5464,6 +5464,17 @@ def enable_eager_execution(config=None, server_def=None) +@tf_export(v1=["disable_eager_execution"]) +def disable_eager_execution(): + """Disables eager execution. + + This function can only be called before any Graphs, Ops, or Tensors have been + created. It can be used at the beginning of the program for complex migration + projects from TensorFlow 1.x to 2.x. + """ + context.default_execution_mode = context.GRAPH_MODE + + def enable_eager_execution_internal(config=None, device_policy=None, execution_mode=None, @@ -5471,6 +5482,7 @@ def enable_eager_execution_internal(config=None, """Enables eager execution for the lifetime of this program. Most of the doc string for enable_eager_execution is relevant here as well. + Args: config: See enable_eager_execution doc string device_policy: See enable_eager_execution doc string diff --git a/tensorflow/python/tf2.py b/tensorflow/python/tf2.py index c9782a71199f73a1fc6207ea4e9568b6bac9c00a..a8b0d6b7c54fd95850e9dac07a07f870835fd714 100644 --- a/tensorflow/python/tf2.py +++ b/tensorflow/python/tf2.py @@ -25,6 +25,21 @@ from __future__ import print_function import os +_force_enable = False + + +def enable(): + """Enables v2 behaviors.""" + global _force_enable + _force_enable = True + + +def disable(): + """Disables v2 behaviors (TF2_BEHAVIOR env variable is still respected).""" + global _force_enable + _force_enable = False + + def enabled(): """Returns True iff TensorFlow 2.0 behavior should be enabled.""" - return os.getenv("TF2_BEHAVIOR") is not None + return _force_enable or os.getenv("TF2_BEHAVIOR") is not None diff --git a/tensorflow/tools/api/golden/v1/tensorflow.pbtxt b/tensorflow/tools/api/golden/v1/tensorflow.pbtxt index 490b4a847f1ee1d133723cd866ae3cafdd5cd777..584c74f99d896e45de06fa020413b8edd4440afb 100644 --- a/tensorflow/tools/api/golden/v1/tensorflow.pbtxt +++ b/tensorflow/tools/api/golden/v1/tensorflow.pbtxt @@ -1052,10 +1052,18 @@ tf_module { name: "dimension_value" argspec: "args=[\'dimension\'], varargs=None, keywords=None, defaults=None" } + member_method { + name: "disable_eager_execution" + argspec: "args=[], varargs=None, keywords=None, defaults=None" + } member_method { name: "disable_resource_variables" argspec: "args=[], varargs=None, keywords=None, defaults=None" } + member_method { + name: "disable_v2_behavior" + argspec: "args=[], varargs=None, keywords=None, defaults=None" + } member_method { name: "disable_v2_tensorshape" argspec: "args=[], varargs=None, keywords=None, defaults=None" @@ -1096,6 +1104,10 @@ tf_module { name: "enable_resource_variables" argspec: "args=[], varargs=None, keywords=None, defaults=None" } + member_method { + name: "enable_v2_behavior" + argspec: "args=[], varargs=None, keywords=None, defaults=None" + } member_method { name: "enable_v2_tensorshape" argspec: "args=[], varargs=None, keywords=None, defaults=None" diff --git a/tensorflow/tools/api/golden/v2/tensorflow.pbtxt b/tensorflow/tools/api/golden/v2/tensorflow.pbtxt index f5e1545657e2095de6eeccbe58eed93d8f7ec75a..cb38ae0b49863b98b29b480f164d11b60987ba3b 100644 --- a/tensorflow/tools/api/golden/v2/tensorflow.pbtxt +++ b/tensorflow/tools/api/golden/v2/tensorflow.pbtxt @@ -608,10 +608,6 @@ tf_module { name: "einsum" argspec: "args=[\'equation\'], varargs=inputs, keywords=kwargs, defaults=None" } - member_method { - name: "enable_eager_execution" - argspec: "args=[\'config\', \'device_policy\', \'execution_mode\'], varargs=None, keywords=None, defaults=[\'None\', \'None\', \'None\'], " - } member_method { name: "ensure_shape" argspec: "args=[\'x\', \'shape\', \'name\'], varargs=None, keywords=None, defaults=[\'None\'], " diff --git a/tensorflow/tools/compatibility/renames_v2.py b/tensorflow/tools/compatibility/renames_v2.py index 62032449a425092fd3ed6a90d9d9df906d99f9bb..b1b5d9e8c45004dbed62f9a9c3bdaf5ebd385499 100644 --- a/tensorflow/tools/compatibility/renames_v2.py +++ b/tensorflow/tools/compatibility/renames_v2.py @@ -126,7 +126,9 @@ renames = { 'tf.digamma': 'tf.math.digamma', 'tf.dimension_at_index': 'tf.compat.v1.dimension_at_index', 'tf.dimension_value': 'tf.compat.v1.dimension_value', + 'tf.disable_eager_execution': 'tf.compat.v1.disable_eager_execution', 'tf.disable_resource_variables': 'tf.compat.v1.disable_resource_variables', + 'tf.disable_v2_behavior': 'tf.compat.v1.disable_v2_behavior', 'tf.disable_v2_tensorshape': 'tf.compat.v1.disable_v2_tensorshape', 'tf.distributions.Bernoulli': 'tf.compat.v1.distributions.Bernoulli', 'tf.distributions.Beta': 'tf.compat.v1.distributions.Beta', @@ -147,7 +149,9 @@ renames = { 'tf.distributions.Uniform': 'tf.compat.v1.distributions.Uniform', 'tf.distributions.kl_divergence': 'tf.compat.v1.distributions.kl_divergence', 'tf.div': 'tf.compat.v1.div', + 'tf.enable_eager_execution': 'tf.compat.v1.enable_eager_execution', 'tf.enable_resource_variables': 'tf.compat.v1.enable_resource_variables', + 'tf.enable_v2_behavior': 'tf.compat.v1.enable_v2_behavior', 'tf.enable_v2_tensorshape': 'tf.compat.v1.enable_v2_tensorshape', 'tf.encode_base64': 'tf.io.encode_base64', 'tf.erf': 'tf.math.erf',