From 256add6a5bc05c920c4381eca702d7a8ee05ca24 Mon Sep 17 00:00:00 2001 From: Priya Gupta Date: Sat, 13 Apr 2019 20:14:54 -0700 Subject: [PATCH] Add make_numpy_dataset to tf.distribute.Strategy (V1 and V2). We are removing it from the strategy.extended as well as removing strategy.experimental_make_numpy_iterator. Instead, we are adding this method in the main class. Users should use this method first and then distribute the returned dataset like other datasets. PiperOrigin-RevId: 243463153 --- .../python/distribute/distribute_lib.py | 38 +++++++++++++++++++ .../python/distribute/distribute_lib_test.py | 2 +- ...orflow.distribute.-mirrored-strategy.pbtxt | 4 ++ ...flow.distribute.-one-device-strategy.pbtxt | 4 ++ .../v1/tensorflow.distribute.-strategy.pbtxt | 4 ++ ...perimental.-central-storage-strategy.pbtxt | 4 ++ ...ntal.-multi-worker-mirrored-strategy.pbtxt | 4 ++ ...erimental.-parameter-server-strategy.pbtxt | 4 ++ ...tribute.experimental.-t-p-u-strategy.pbtxt | 4 ++ ...orflow.distribute.-mirrored-strategy.pbtxt | 4 ++ ...flow.distribute.-one-device-strategy.pbtxt | 4 ++ .../v2/tensorflow.distribute.-strategy.pbtxt | 4 ++ ...perimental.-central-storage-strategy.pbtxt | 4 ++ ...ntal.-multi-worker-mirrored-strategy.pbtxt | 4 ++ ...erimental.-parameter-server-strategy.pbtxt | 4 ++ ...tribute.experimental.-t-p-u-strategy.pbtxt | 4 ++ 16 files changed, 95 insertions(+), 1 deletion(-) diff --git a/tensorflow/python/distribute/distribute_lib.py b/tensorflow/python/distribute/distribute_lib.py index 061d5bcca91..7143ac03aef 100644 --- a/tensorflow/python/distribute/distribute_lib.py +++ b/tensorflow/python/distribute/distribute_lib.py @@ -370,6 +370,24 @@ class Strategy(object): return self.extended._make_input_fn_iterator( # pylint: disable=protected-access input_fn, replication_mode=replication_mode) + def experimental_make_numpy_dataset(self, numpy_input): + """Makes a dataset for input provided via a numpy array. + + This avoids adding `numpy_input` as a large constant in the graph, + and copies the data to the machine or machines that will be processing + the input. + + Args: + numpy_input: A nest of NumPy input arrays that will be distributed evenly + across all replicas. Note that lists of Numpy arrays are stacked, + as that is normal `tf.data.Dataset` behavior. + + Returns: + A `tf.data.Dataset` representing `numpy_input`. + """ + return self.extended.experimental_make_numpy_dataset( + numpy_input, session=None) + @doc_controls.do_not_generate_docs # DEPRECATED: TF 1.x only def experimental_run(self, fn, input_iterator=None): """DEPRECATED TF 1.x ONLY.""" @@ -696,6 +714,26 @@ class StrategyV1(Strategy): return super(StrategyV1, self).make_input_fn_iterator( input_fn, replication_mode) + def experimental_make_numpy_dataset(self, numpy_input, session=None): + """Makes a dataset for input provided via a numpy array. + + This avoids adding `numpy_input` as a large constant in the graph, + and copies the data to the machine or machines that will be processing + the input. + + Args: + numpy_input: A nest of NumPy input arrays that will be distributed evenly + across all replicas. Note that lists of Numpy arrays are stacked, + as that is normal `tf.data.Dataset` behavior. + session: (TensorFlow v1.x graph execution only) A session used for + initialization. + + Returns: + A `tf.data.Dataset` representing `numpy_input`. + """ + return self.extended.experimental_make_numpy_dataset( + numpy_input, session=session) + def experimental_run(self, fn, input_iterator=None): # pylint: disable=useless-super-delegation """Runs ops in `fn` on each replica, with inputs from `input_iterator`. diff --git a/tensorflow/python/distribute/distribute_lib_test.py b/tensorflow/python/distribute/distribute_lib_test.py index 5f12c634f52..c2d2e474bf2 100644 --- a/tensorflow/python/distribute/distribute_lib_test.py +++ b/tensorflow/python/distribute/distribute_lib_test.py @@ -341,7 +341,7 @@ class TestStrategyTest(test.TestCase): @_run_in_and_out_of_scope def testExperimentalMakeNumpyDataset(self, dist): numpy_input = np.ones([10], dtype=np.float32) - dataset = dist.extended.experimental_make_numpy_dataset(numpy_input) + dataset = dist.experimental_make_numpy_dataset(numpy_input) self.assertEqual( self.evaluate(dataset.reduce(0., lambda a, b: a + b)), 10.) diff --git a/tensorflow/tools/api/golden/v1/tensorflow.distribute.-mirrored-strategy.pbtxt b/tensorflow/tools/api/golden/v1/tensorflow.distribute.-mirrored-strategy.pbtxt index 498fc109665..be995ddb88f 100644 --- a/tensorflow/tools/api/golden/v1/tensorflow.distribute.-mirrored-strategy.pbtxt +++ b/tensorflow/tools/api/golden/v1/tensorflow.distribute.-mirrored-strategy.pbtxt @@ -32,6 +32,10 @@ tf_class { name: "experimental_local_results" argspec: "args=[\'self\', \'value\'], varargs=None, keywords=None, defaults=None" } + member_method { + name: "experimental_make_numpy_dataset" + argspec: "args=[\'self\', \'numpy_input\', \'session\'], varargs=None, keywords=None, defaults=[\'None\'], " + } member_method { name: "experimental_run" argspec: "args=[\'self\', \'fn\', \'input_iterator\'], varargs=None, keywords=None, defaults=[\'None\'], " diff --git a/tensorflow/tools/api/golden/v1/tensorflow.distribute.-one-device-strategy.pbtxt b/tensorflow/tools/api/golden/v1/tensorflow.distribute.-one-device-strategy.pbtxt index 4f6bf1a6a37..def51768a8b 100644 --- a/tensorflow/tools/api/golden/v1/tensorflow.distribute.-one-device-strategy.pbtxt +++ b/tensorflow/tools/api/golden/v1/tensorflow.distribute.-one-device-strategy.pbtxt @@ -32,6 +32,10 @@ tf_class { name: "experimental_local_results" argspec: "args=[\'self\', \'value\'], varargs=None, keywords=None, defaults=None" } + member_method { + name: "experimental_make_numpy_dataset" + argspec: "args=[\'self\', \'numpy_input\', \'session\'], varargs=None, keywords=None, defaults=[\'None\'], " + } member_method { name: "experimental_run" argspec: "args=[\'self\', \'fn\', \'input_iterator\'], varargs=None, keywords=None, defaults=[\'None\'], " diff --git a/tensorflow/tools/api/golden/v1/tensorflow.distribute.-strategy.pbtxt b/tensorflow/tools/api/golden/v1/tensorflow.distribute.-strategy.pbtxt index 7daf95b5d8d..f0ae286fa2e 100644 --- a/tensorflow/tools/api/golden/v1/tensorflow.distribute.-strategy.pbtxt +++ b/tensorflow/tools/api/golden/v1/tensorflow.distribute.-strategy.pbtxt @@ -31,6 +31,10 @@ tf_class { name: "experimental_local_results" argspec: "args=[\'self\', \'value\'], varargs=None, keywords=None, defaults=None" } + member_method { + name: "experimental_make_numpy_dataset" + argspec: "args=[\'self\', \'numpy_input\', \'session\'], varargs=None, keywords=None, defaults=[\'None\'], " + } member_method { name: "experimental_run" argspec: "args=[\'self\', \'fn\', \'input_iterator\'], varargs=None, keywords=None, defaults=[\'None\'], " diff --git a/tensorflow/tools/api/golden/v1/tensorflow.distribute.experimental.-central-storage-strategy.pbtxt b/tensorflow/tools/api/golden/v1/tensorflow.distribute.experimental.-central-storage-strategy.pbtxt index 63fd73498a8..1e4346725d9 100644 --- a/tensorflow/tools/api/golden/v1/tensorflow.distribute.experimental.-central-storage-strategy.pbtxt +++ b/tensorflow/tools/api/golden/v1/tensorflow.distribute.experimental.-central-storage-strategy.pbtxt @@ -32,6 +32,10 @@ tf_class { name: "experimental_local_results" argspec: "args=[\'self\', \'value\'], varargs=None, keywords=None, defaults=None" } + member_method { + name: "experimental_make_numpy_dataset" + argspec: "args=[\'self\', \'numpy_input\', \'session\'], varargs=None, keywords=None, defaults=[\'None\'], " + } member_method { name: "experimental_run" argspec: "args=[\'self\', \'fn\', \'input_iterator\'], varargs=None, keywords=None, defaults=[\'None\'], " diff --git a/tensorflow/tools/api/golden/v1/tensorflow.distribute.experimental.-multi-worker-mirrored-strategy.pbtxt b/tensorflow/tools/api/golden/v1/tensorflow.distribute.experimental.-multi-worker-mirrored-strategy.pbtxt index 8129a9c9146..526af67e520 100644 --- a/tensorflow/tools/api/golden/v1/tensorflow.distribute.experimental.-multi-worker-mirrored-strategy.pbtxt +++ b/tensorflow/tools/api/golden/v1/tensorflow.distribute.experimental.-multi-worker-mirrored-strategy.pbtxt @@ -32,6 +32,10 @@ tf_class { name: "experimental_local_results" argspec: "args=[\'self\', \'value\'], varargs=None, keywords=None, defaults=None" } + member_method { + name: "experimental_make_numpy_dataset" + argspec: "args=[\'self\', \'numpy_input\', \'session\'], varargs=None, keywords=None, defaults=[\'None\'], " + } member_method { name: "experimental_run" argspec: "args=[\'self\', \'fn\', \'input_iterator\'], varargs=None, keywords=None, defaults=[\'None\'], " diff --git a/tensorflow/tools/api/golden/v1/tensorflow.distribute.experimental.-parameter-server-strategy.pbtxt b/tensorflow/tools/api/golden/v1/tensorflow.distribute.experimental.-parameter-server-strategy.pbtxt index 14648a38582..07a8e0dcf67 100644 --- a/tensorflow/tools/api/golden/v1/tensorflow.distribute.experimental.-parameter-server-strategy.pbtxt +++ b/tensorflow/tools/api/golden/v1/tensorflow.distribute.experimental.-parameter-server-strategy.pbtxt @@ -32,6 +32,10 @@ tf_class { name: "experimental_local_results" argspec: "args=[\'self\', \'value\'], varargs=None, keywords=None, defaults=None" } + member_method { + name: "experimental_make_numpy_dataset" + argspec: "args=[\'self\', \'numpy_input\', \'session\'], varargs=None, keywords=None, defaults=[\'None\'], " + } member_method { name: "experimental_run" argspec: "args=[\'self\', \'fn\', \'input_iterator\'], varargs=None, keywords=None, defaults=[\'None\'], " diff --git a/tensorflow/tools/api/golden/v1/tensorflow.distribute.experimental.-t-p-u-strategy.pbtxt b/tensorflow/tools/api/golden/v1/tensorflow.distribute.experimental.-t-p-u-strategy.pbtxt index 8273c9981a5..b18d33be7ce 100644 --- a/tensorflow/tools/api/golden/v1/tensorflow.distribute.experimental.-t-p-u-strategy.pbtxt +++ b/tensorflow/tools/api/golden/v1/tensorflow.distribute.experimental.-t-p-u-strategy.pbtxt @@ -36,6 +36,10 @@ tf_class { name: "experimental_local_results" argspec: "args=[\'self\', \'value\'], varargs=None, keywords=None, defaults=None" } + member_method { + name: "experimental_make_numpy_dataset" + argspec: "args=[\'self\', \'numpy_input\', \'session\'], varargs=None, keywords=None, defaults=[\'None\'], " + } member_method { name: "experimental_run" argspec: "args=[\'self\', \'fn\', \'input_iterator\'], varargs=None, keywords=None, defaults=[\'None\'], " diff --git a/tensorflow/tools/api/golden/v2/tensorflow.distribute.-mirrored-strategy.pbtxt b/tensorflow/tools/api/golden/v2/tensorflow.distribute.-mirrored-strategy.pbtxt index ca2d40eb7f5..b03bfef7bde 100644 --- a/tensorflow/tools/api/golden/v2/tensorflow.distribute.-mirrored-strategy.pbtxt +++ b/tensorflow/tools/api/golden/v2/tensorflow.distribute.-mirrored-strategy.pbtxt @@ -31,6 +31,10 @@ tf_class { name: "experimental_local_results" argspec: "args=[\'self\', \'value\'], varargs=None, keywords=None, defaults=None" } + member_method { + name: "experimental_make_numpy_dataset" + argspec: "args=[\'self\', \'numpy_input\'], varargs=None, keywords=None, defaults=None" + } member_method { name: "experimental_run" argspec: "args=[\'self\', \'fn\', \'input_iterator\'], varargs=None, keywords=None, defaults=[\'None\'], " diff --git a/tensorflow/tools/api/golden/v2/tensorflow.distribute.-one-device-strategy.pbtxt b/tensorflow/tools/api/golden/v2/tensorflow.distribute.-one-device-strategy.pbtxt index b86a87a07ac..5ba73b84e5a 100644 --- a/tensorflow/tools/api/golden/v2/tensorflow.distribute.-one-device-strategy.pbtxt +++ b/tensorflow/tools/api/golden/v2/tensorflow.distribute.-one-device-strategy.pbtxt @@ -31,6 +31,10 @@ tf_class { name: "experimental_local_results" argspec: "args=[\'self\', \'value\'], varargs=None, keywords=None, defaults=None" } + member_method { + name: "experimental_make_numpy_dataset" + argspec: "args=[\'self\', \'numpy_input\'], varargs=None, keywords=None, defaults=None" + } member_method { name: "experimental_run" argspec: "args=[\'self\', \'fn\', \'input_iterator\'], varargs=None, keywords=None, defaults=[\'None\'], " diff --git a/tensorflow/tools/api/golden/v2/tensorflow.distribute.-strategy.pbtxt b/tensorflow/tools/api/golden/v2/tensorflow.distribute.-strategy.pbtxt index 52d8b0d040f..3a9002035da 100644 --- a/tensorflow/tools/api/golden/v2/tensorflow.distribute.-strategy.pbtxt +++ b/tensorflow/tools/api/golden/v2/tensorflow.distribute.-strategy.pbtxt @@ -30,6 +30,10 @@ tf_class { name: "experimental_local_results" argspec: "args=[\'self\', \'value\'], varargs=None, keywords=None, defaults=None" } + member_method { + name: "experimental_make_numpy_dataset" + argspec: "args=[\'self\', \'numpy_input\'], varargs=None, keywords=None, defaults=None" + } member_method { name: "experimental_run" argspec: "args=[\'self\', \'fn\', \'input_iterator\'], varargs=None, keywords=None, defaults=[\'None\'], " diff --git a/tensorflow/tools/api/golden/v2/tensorflow.distribute.experimental.-central-storage-strategy.pbtxt b/tensorflow/tools/api/golden/v2/tensorflow.distribute.experimental.-central-storage-strategy.pbtxt index e1ae51ef1b1..c9ca036bb72 100644 --- a/tensorflow/tools/api/golden/v2/tensorflow.distribute.experimental.-central-storage-strategy.pbtxt +++ b/tensorflow/tools/api/golden/v2/tensorflow.distribute.experimental.-central-storage-strategy.pbtxt @@ -31,6 +31,10 @@ tf_class { name: "experimental_local_results" argspec: "args=[\'self\', \'value\'], varargs=None, keywords=None, defaults=None" } + member_method { + name: "experimental_make_numpy_dataset" + argspec: "args=[\'self\', \'numpy_input\'], varargs=None, keywords=None, defaults=None" + } member_method { name: "experimental_run" argspec: "args=[\'self\', \'fn\', \'input_iterator\'], varargs=None, keywords=None, defaults=[\'None\'], " diff --git a/tensorflow/tools/api/golden/v2/tensorflow.distribute.experimental.-multi-worker-mirrored-strategy.pbtxt b/tensorflow/tools/api/golden/v2/tensorflow.distribute.experimental.-multi-worker-mirrored-strategy.pbtxt index 42c35a8aa0f..6591d751ff0 100644 --- a/tensorflow/tools/api/golden/v2/tensorflow.distribute.experimental.-multi-worker-mirrored-strategy.pbtxt +++ b/tensorflow/tools/api/golden/v2/tensorflow.distribute.experimental.-multi-worker-mirrored-strategy.pbtxt @@ -31,6 +31,10 @@ tf_class { name: "experimental_local_results" argspec: "args=[\'self\', \'value\'], varargs=None, keywords=None, defaults=None" } + member_method { + name: "experimental_make_numpy_dataset" + argspec: "args=[\'self\', \'numpy_input\'], varargs=None, keywords=None, defaults=None" + } member_method { name: "experimental_run" argspec: "args=[\'self\', \'fn\', \'input_iterator\'], varargs=None, keywords=None, defaults=[\'None\'], " diff --git a/tensorflow/tools/api/golden/v2/tensorflow.distribute.experimental.-parameter-server-strategy.pbtxt b/tensorflow/tools/api/golden/v2/tensorflow.distribute.experimental.-parameter-server-strategy.pbtxt index a3049fca55a..f8371d2d63c 100644 --- a/tensorflow/tools/api/golden/v2/tensorflow.distribute.experimental.-parameter-server-strategy.pbtxt +++ b/tensorflow/tools/api/golden/v2/tensorflow.distribute.experimental.-parameter-server-strategy.pbtxt @@ -31,6 +31,10 @@ tf_class { name: "experimental_local_results" argspec: "args=[\'self\', \'value\'], varargs=None, keywords=None, defaults=None" } + member_method { + name: "experimental_make_numpy_dataset" + argspec: "args=[\'self\', \'numpy_input\'], varargs=None, keywords=None, defaults=None" + } member_method { name: "experimental_run" argspec: "args=[\'self\', \'fn\', \'input_iterator\'], varargs=None, keywords=None, defaults=[\'None\'], " diff --git a/tensorflow/tools/api/golden/v2/tensorflow.distribute.experimental.-t-p-u-strategy.pbtxt b/tensorflow/tools/api/golden/v2/tensorflow.distribute.experimental.-t-p-u-strategy.pbtxt index 31031c790af..3d0f6683edf 100644 --- a/tensorflow/tools/api/golden/v2/tensorflow.distribute.experimental.-t-p-u-strategy.pbtxt +++ b/tensorflow/tools/api/golden/v2/tensorflow.distribute.experimental.-t-p-u-strategy.pbtxt @@ -31,6 +31,10 @@ tf_class { name: "experimental_local_results" argspec: "args=[\'self\', \'value\'], varargs=None, keywords=None, defaults=None" } + member_method { + name: "experimental_make_numpy_dataset" + argspec: "args=[\'self\', \'numpy_input\'], varargs=None, keywords=None, defaults=None" + } member_method { name: "experimental_run" argspec: "args=[\'self\', \'fn\', \'input_iterator\'], varargs=None, keywords=None, defaults=[\'None\'], "