Drop experimental and v2 qualifiers from Strategy experimental_run_v2 method.
- experimental_run_v2 -> run PiperOrigin-RevId: 300574367 Change-Id: I5d82ea5450a4d32aea6d05ed3db4f02b8edb2eea
This commit is contained in:
parent
fbbb83b995
commit
0b8f0a5b84
|
@ -92,7 +92,7 @@ class DistributedDumpingCallbackTest(
|
|||
|
||||
caught_error = None
|
||||
try:
|
||||
distribution.experimental_run_v2(train_step)
|
||||
distribution.run(train_step)
|
||||
except errors.InvalidArgumentError as error:
|
||||
caught_error = error
|
||||
self.assertTrue(caught_error)
|
||||
|
@ -128,7 +128,7 @@ class DistributedDumpingCallbackTest(
|
|||
grads_and_vars = zip(grads, mini_model.weights)
|
||||
optimizer.apply_gradients(grads_and_vars)
|
||||
|
||||
distribution.experimental_run_v2(train_step)
|
||||
distribution.run(train_step)
|
||||
|
||||
updated_var_values = self.evaluate(mini_model.variables)
|
||||
num_devices = len(distribution.extended.worker_devices)
|
||||
|
|
|
@ -67,7 +67,7 @@ def train_step(iterator):
|
|||
grads = tape.gradient(loss, model.variables)
|
||||
return grads
|
||||
|
||||
return tpu_strategy.experimental_run_v2(
|
||||
return tpu_strategy.run(
|
||||
step_fn, args=(next(iterator),))
|
||||
|
||||
# Run the loop body once on at dataset.
|
||||
|
|
|
@ -48,7 +48,7 @@ class CentralStorageStrategy(distribute_lib.Strategy):
|
|||
# Iterate over the distributed dataset
|
||||
for x in dist_dataset:
|
||||
# process dataset elements
|
||||
strategy.experimental_run_v2(train_step, args=(x,))
|
||||
strategy.run(train_step, args=(x,))
|
||||
```
|
||||
"""
|
||||
|
||||
|
@ -125,7 +125,7 @@ class CentralStorageStrategy(distribute_lib.Strategy):
|
|||
inputs = strategy.experimental_distribute_datasets_from_function(dataset_fn)
|
||||
|
||||
for batch in inputs:
|
||||
replica_results = strategy.experimental_run_v2(replica_fn, args=(batch,))
|
||||
replica_results = strategy.run(replica_fn, args=(batch,))
|
||||
```
|
||||
|
||||
IMPORTANT: The `tf.data.Dataset` returned by `dataset_fn` should have a
|
||||
|
@ -152,8 +152,8 @@ class CentralStorageStrategy(distribute_lib.Strategy):
|
|||
will be all the values on that worker.
|
||||
|
||||
Args:
|
||||
value: A value returned by `experimental_run()`, `experimental_run_v2()`,
|
||||
`extended.call_for_each_replica()`, or a variable created in `scope`.
|
||||
value: A value returned by `run()`, `extended.call_for_each_replica()`,
|
||||
or a variable created in `scope`.
|
||||
|
||||
Returns:
|
||||
A tuple of values contained in `value`. If `value` represents a single
|
||||
|
@ -161,7 +161,7 @@ class CentralStorageStrategy(distribute_lib.Strategy):
|
|||
"""
|
||||
return super(CentralStorageStrategy, self).experimental_local_results(value)
|
||||
|
||||
def experimental_run_v2(self, fn, args=(), kwargs=None, options=None): # pylint: disable=useless-super-delegation
|
||||
def run(self, fn, args=(), kwargs=None, options=None): # pylint: disable=useless-super-delegation
|
||||
"""Run `fn` on each replica, with the given arguments.
|
||||
|
||||
In `CentralStorageStrategy`, `fn` is called on each of the compute
|
||||
|
@ -177,13 +177,12 @@ class CentralStorageStrategy(distribute_lib.Strategy):
|
|||
Returns:
|
||||
Return value from running `fn`.
|
||||
"""
|
||||
return super(CentralStorageStrategy,
|
||||
self).experimental_run_v2(fn, args, kwargs, options)
|
||||
return super(CentralStorageStrategy, self).run(fn, args, kwargs, options)
|
||||
|
||||
def reduce(self, reduce_op, value, axis): # pylint: disable=useless-super-delegation
|
||||
"""Reduce `value` across replicas.
|
||||
|
||||
Given a per-replica value returned by `experimental_run_v2`, say a
|
||||
Given a per-replica value returned by `run`, say a
|
||||
per-example loss, the batch will be divided across all the replicas. This
|
||||
function allows you to aggregate across replicas and optionally also across
|
||||
batch elements. For example, if you have a global batch size of 8 and 2
|
||||
|
@ -221,7 +220,7 @@ class CentralStorageStrategy(distribute_lib.Strategy):
|
|||
|
||||
# Iterate over the distributed dataset
|
||||
for x in dist_dataset:
|
||||
result = strategy.experimental_run_v2(train_step, args=(x,))
|
||||
result = strategy.run(train_step, args=(x,))
|
||||
|
||||
result = strategy.reduce(tf.distribute.ReduceOp.SUM, result,
|
||||
axis=None).numpy()
|
||||
|
@ -234,7 +233,7 @@ class CentralStorageStrategy(distribute_lib.Strategy):
|
|||
Args:
|
||||
reduce_op: A `tf.distribute.ReduceOp` value specifying how values should
|
||||
be combined.
|
||||
value: A "per replica" value, e.g. returned by `experimental_run_v2` to
|
||||
value: A "per replica" value, e.g. returned by `run` to
|
||||
be combined into a single tensor.
|
||||
axis: Specifies the dimension to reduce along within each
|
||||
replica's tensor. Should typically be set to the batch dimension, or
|
||||
|
|
|
@ -118,7 +118,8 @@ class TrainingCheckpointTests(test.TestCase, parameterized.TestCase):
|
|||
loss = v + v
|
||||
gradients = tape.gradient(loss, [v])
|
||||
opt.apply_gradients(zip(gradients, [v]))
|
||||
distribution.experimental_run_v2(f)
|
||||
|
||||
distribution.run(f)
|
||||
|
||||
return v, opt, step
|
||||
|
||||
|
|
|
@ -125,8 +125,7 @@ def iteration_inside_func(initial_weights, dataset, optimizer_fn,
|
|||
if iteration_type == 'dataset':
|
||||
for x in dist_input:
|
||||
if strategy:
|
||||
per_replica_losses = strategy.experimental_run_v2(step_fn,
|
||||
args=(x,))
|
||||
per_replica_losses = strategy.run(step_fn, args=(x,))
|
||||
total_loss += strategy.reduce(reduce_util.ReduceOp.SUM,
|
||||
per_replica_losses,
|
||||
axis=None)
|
||||
|
@ -137,8 +136,7 @@ def iteration_inside_func(initial_weights, dataset, optimizer_fn,
|
|||
iterator = iter(dist_input)
|
||||
for _ in range(_STEPS_PER_EPOCH):
|
||||
if strategy:
|
||||
per_replica_losses = strategy.experimental_run_v2(
|
||||
step_fn, args=(next(iterator),))
|
||||
per_replica_losses = strategy.run(step_fn, args=(next(iterator),))
|
||||
total_loss += strategy.reduce(reduce_util.ReduceOp.SUM,
|
||||
per_replica_losses,
|
||||
axis=None)
|
||||
|
@ -184,8 +182,7 @@ def iteration_outside_func(initial_weights, dataset, optimizer_fn,
|
|||
return loss
|
||||
|
||||
if strategy:
|
||||
per_replica_losses = strategy.experimental_run_v2(
|
||||
step_fn, args=(dist_inputs,))
|
||||
per_replica_losses = strategy.run(step_fn, args=(dist_inputs,))
|
||||
return strategy.reduce(reduce_util.ReduceOp.SUM,
|
||||
per_replica_losses,
|
||||
axis=None)
|
||||
|
|
|
@ -87,7 +87,7 @@ class GradientTapeTest(test.TestCase, parameterized.TestCase,
|
|||
results = []
|
||||
for x in dist_dataset:
|
||||
output = distribution.experimental_local_results(
|
||||
distribution.experimental_run_v2(train_step, args=(x,)))
|
||||
distribution.run(train_step, args=(x,)))
|
||||
results.append(output)
|
||||
self.assert_equal_flattened([[10., 12.], [14., 16.]], results)
|
||||
|
||||
|
@ -110,7 +110,7 @@ class GradientTapeTest(test.TestCase, parameterized.TestCase,
|
|||
grads = tape.gradient(y, x)
|
||||
return grads
|
||||
return distribution.experimental_local_results(
|
||||
distribution.experimental_run_v2(train_step, args=(x,)))
|
||||
distribution.run(train_step, args=(x,)))
|
||||
|
||||
dist_dataset = distribution.experimental_distribute_dataset(dataset)
|
||||
results = []
|
||||
|
@ -141,7 +141,7 @@ class GradientTapeTest(test.TestCase, parameterized.TestCase,
|
|||
with backprop.GradientTape() as tape:
|
||||
y = model(x)
|
||||
return tape.gradient(y, x)
|
||||
return distribution.experimental_run_v2(replica_step)
|
||||
return distribution.run(replica_step)
|
||||
|
||||
grads = distribution.experimental_local_results(train_step())
|
||||
self.assertLen(grads, distribution.num_replicas_in_sync)
|
||||
|
|
|
@ -87,7 +87,7 @@ class InputIterationTest(test.TestCase, parameterized.TestCase,
|
|||
return math_ops.square(x)
|
||||
|
||||
outputs = distribution.experimental_local_results(
|
||||
distribution.experimental_run_v2(computation, args=(x,)))
|
||||
distribution.run(computation, args=(x,)))
|
||||
return outputs
|
||||
|
||||
self.assertAllEqual(
|
||||
|
@ -110,7 +110,7 @@ class InputIterationTest(test.TestCase, parameterized.TestCase,
|
|||
def assign_add():
|
||||
v.assign_add(1.0)
|
||||
|
||||
distribution.experimental_run_v2(assign_add)
|
||||
distribution.run(assign_add)
|
||||
return array_ops.zeros([])
|
||||
|
||||
train_step()
|
||||
|
@ -130,7 +130,7 @@ class InputIterationTest(test.TestCase, parameterized.TestCase,
|
|||
results = []
|
||||
for x in dist_dataset:
|
||||
output = distribution.experimental_local_results(
|
||||
distribution.experimental_run_v2(train_step, args=(x,)))
|
||||
distribution.run(train_step, args=(x,)))
|
||||
results.append(output)
|
||||
self.assert_equal_flattened([[25., 36.], [49., 64.]], results)
|
||||
|
||||
|
@ -148,7 +148,7 @@ class InputIterationTest(test.TestCase, parameterized.TestCase,
|
|||
|
||||
with self.assertRaisesRegexp(NotImplementedError,
|
||||
"does not support pure eager execution"):
|
||||
distribution.experimental_run_v2(train_step, args=(next(input_iterator),))
|
||||
distribution.run(train_step, args=(next(input_iterator),))
|
||||
|
||||
@combinations.generate(
|
||||
combinations.combine(
|
||||
|
@ -166,7 +166,7 @@ class InputIterationTest(test.TestCase, parameterized.TestCase,
|
|||
results = []
|
||||
for x in dist_dataset:
|
||||
output = distribution.experimental_local_results(
|
||||
distribution.experimental_run_v2(train_step, args=(x,)))
|
||||
distribution.run(train_step, args=(x,)))
|
||||
results.append(output)
|
||||
self.assert_equal_flattened([[25., 36.], [49., 64.]], results)
|
||||
|
||||
|
@ -184,7 +184,7 @@ class InputIterationTest(test.TestCase, parameterized.TestCase,
|
|||
@def_function.function
|
||||
def f_train_step(input_data):
|
||||
return distribution.experimental_local_results(
|
||||
distribution.experimental_run_v2(train_step, args=(input_data,)))
|
||||
distribution.run(train_step, args=(input_data,)))
|
||||
|
||||
dist_dataset = distribution.experimental_distribute_dataset(dataset)
|
||||
results = []
|
||||
|
@ -214,7 +214,7 @@ class InputIterationTest(test.TestCase, parameterized.TestCase,
|
|||
}]
|
||||
|
||||
inputs = next(iterator)
|
||||
outputs = distribution.experimental_run_v2(computation, args=(inputs,))
|
||||
outputs = distribution.run(computation, args=(inputs,))
|
||||
return nest.map_structure(distribution.experimental_local_results,
|
||||
outputs)
|
||||
|
||||
|
@ -238,7 +238,7 @@ class InputIterationTest(test.TestCase, parameterized.TestCase,
|
|||
@def_function.function
|
||||
def f_train_step(input_data):
|
||||
return distribution.experimental_local_results(
|
||||
distribution.experimental_run_v2(train_step, args=(input_data,)))
|
||||
distribution.run(train_step, args=(input_data,)))
|
||||
|
||||
dist_dataset = distribution.experimental_distribute_dataset(dataset)
|
||||
results = []
|
||||
|
@ -270,7 +270,7 @@ class InputIterationTest(test.TestCase, parameterized.TestCase,
|
|||
distribution.reduce("MEAN", x, axis=0), product_of_means.dtype)
|
||||
|
||||
for y in dist_dataset: # loop with no intermediate state
|
||||
distribution.experimental_run_v2(train_step, args=(y,))
|
||||
distribution.run(train_step, args=(y,))
|
||||
|
||||
return number_of_steps, product_of_means
|
||||
|
||||
|
@ -308,7 +308,7 @@ class InputIterationTest(test.TestCase, parameterized.TestCase,
|
|||
for _ in range(2):
|
||||
elem = next(iterator)
|
||||
output = distribution.experimental_local_results(
|
||||
distribution.experimental_run_v2(step_fn, args=(elem,)))
|
||||
distribution.run(step_fn, args=(elem,)))
|
||||
results.append(output)
|
||||
return results
|
||||
|
||||
|
@ -454,7 +454,7 @@ class InputIterationTest(test.TestCase, parameterized.TestCase,
|
|||
return math_ops.reduce_mean(x)
|
||||
inputs = next(iterator)
|
||||
outputs = distribution.experimental_local_results(
|
||||
distribution.experimental_run_v2(computation, args=(inputs,)))
|
||||
distribution.run(computation, args=(inputs,)))
|
||||
return outputs
|
||||
|
||||
# This assumes that there are exactly 2 replicas
|
||||
|
@ -478,7 +478,7 @@ class InputIterationTest(test.TestCase, parameterized.TestCase,
|
|||
|
||||
inputs = next(iterator)
|
||||
outputs = distribution.experimental_local_results(
|
||||
distribution.experimental_run_v2(
|
||||
distribution.run(
|
||||
computation, args=(inputs,), options=options))
|
||||
return outputs
|
||||
|
||||
|
@ -499,7 +499,7 @@ class InputIterationTest(test.TestCase, parameterized.TestCase,
|
|||
def computation(x):
|
||||
return math_ops.reduce_mean(x)
|
||||
outputs = distribution.experimental_local_results(
|
||||
distribution.experimental_run_v2(computation, args=(inputs,)))
|
||||
distribution.run(computation, args=(inputs,)))
|
||||
return outputs
|
||||
|
||||
# This assumes that there are exactly 2 replicas
|
||||
|
@ -552,7 +552,7 @@ class InputIterationTest(test.TestCase, parameterized.TestCase,
|
|||
def computation(x):
|
||||
return array_ops.size_v2(x)
|
||||
outputs = distribution.experimental_local_results(
|
||||
distribution.experimental_run_v2(computation, args=(inputs,)))
|
||||
distribution.run(computation, args=(inputs,)))
|
||||
return outputs
|
||||
|
||||
# This assumes that there are exactly 2 replicas
|
||||
|
@ -580,7 +580,7 @@ class InputIterationTest(test.TestCase, parameterized.TestCase,
|
|||
def computation(x):
|
||||
return math_ops.reduce_mean(x)
|
||||
outputs = distribution.experimental_local_results(
|
||||
distribution.experimental_run_v2(computation, args=(inputs,)))
|
||||
distribution.run(computation, args=(inputs,)))
|
||||
return outputs
|
||||
|
||||
# This assumes that there are exactly 2 replicas
|
||||
|
@ -669,7 +669,7 @@ class InputIterationTest(test.TestCase, parameterized.TestCase,
|
|||
# Fixed size output with a dynamic sized output.
|
||||
return array_ops.zeros([3]), math_ops.square(x)
|
||||
|
||||
return distribution.experimental_run_v2(
|
||||
return distribution.run(
|
||||
computation, args=(next(iterator),))
|
||||
|
||||
results = run(input_iterator)
|
||||
|
@ -707,7 +707,7 @@ class InputIterationTest(test.TestCase, parameterized.TestCase,
|
|||
for _ in range(2):
|
||||
elem = next(iterator)
|
||||
output = distribution.experimental_local_results(
|
||||
distribution.experimental_run_v2(step_fn, args=(elem,)))
|
||||
distribution.run(step_fn, args=(elem,)))
|
||||
results.append(output)
|
||||
return results
|
||||
|
||||
|
@ -729,7 +729,7 @@ class InputIterationTest(test.TestCase, parameterized.TestCase,
|
|||
@def_function.function
|
||||
def f_train_step(input_data):
|
||||
return distribution.experimental_local_results(
|
||||
distribution.experimental_run_v2(train_step, args=(input_data,)))
|
||||
distribution.run(train_step, args=(input_data,)))
|
||||
|
||||
dataset = get_dataset_from_tensor_slices([5., 6., 7., 8.]).batch(2)
|
||||
dist_dataset = distribution.experimental_distribute_dataset(dataset)
|
||||
|
@ -761,12 +761,12 @@ class InputIterationTest(test.TestCase, parameterized.TestCase,
|
|||
def func(inputs):
|
||||
return math_ops.square(inputs) + var
|
||||
|
||||
per_replica_outputs = distribution.experimental_run_v2(
|
||||
per_replica_outputs = distribution.run(
|
||||
func, (next(input_iterator),))
|
||||
mean = distribution.reduce(
|
||||
reduce_util.ReduceOp.MEAN, per_replica_outputs, axis=None)
|
||||
for _ in dataset_ops.Dataset.range(1):
|
||||
per_replica_outputs = distribution.experimental_run_v2(
|
||||
per_replica_outputs = distribution.run(
|
||||
func, (next(input_iterator),))
|
||||
mean = distribution.reduce(
|
||||
reduce_util.ReduceOp.MEAN, per_replica_outputs, axis=None)
|
||||
|
@ -793,7 +793,7 @@ class InputIterationTest(test.TestCase, parameterized.TestCase,
|
|||
|
||||
@def_function.function
|
||||
def f_train_step(iterator):
|
||||
distribution.experimental_run_v2(train_step, args=(next(iterator),))
|
||||
distribution.run(train_step, args=(next(iterator),))
|
||||
return a
|
||||
|
||||
dataset = get_dataset_from_tensor_slices([5., 6., 7., 8.]).batch(2)
|
||||
|
|
|
@ -49,7 +49,7 @@ class KerasMetricsTest(test.TestCase, parameterized.TestCase):
|
|||
loss_metric.update_state(loss)
|
||||
loss_metric_2.update_state(loss)
|
||||
|
||||
distribution.experimental_run_v2(step_fn)
|
||||
distribution.run(step_fn)
|
||||
|
||||
train_step()
|
||||
self.assertEqual(loss_metric.result().numpy(),
|
||||
|
@ -73,7 +73,7 @@ class KerasMetricsTest(test.TestCase, parameterized.TestCase):
|
|||
metric.update_state(i)
|
||||
|
||||
for i in dataset:
|
||||
distribution.experimental_run_v2(step_fn, args=(i,))
|
||||
distribution.run(step_fn, args=(i,))
|
||||
|
||||
# This should be the mean of integers 0-9 which has a sum of 45 and a count
|
||||
# of 10 resulting in mean of 4.5.
|
||||
|
|
|
@ -75,7 +75,7 @@ class KerasModelsTest(test.TestCase, parameterized.TestCase):
|
|||
grads = tape.gradient(loss, model.variables)
|
||||
return grads
|
||||
|
||||
outputs = distribution.experimental_run_v2(
|
||||
outputs = distribution.run(
|
||||
step_fn, args=(next(iterator),))
|
||||
return nest.map_structure(distribution.experimental_local_results,
|
||||
outputs)
|
||||
|
@ -104,7 +104,7 @@ class KerasModelsTest(test.TestCase, parameterized.TestCase):
|
|||
grads = tape.gradient(loss, model.variables)
|
||||
return grads
|
||||
|
||||
outputs = distribution.experimental_run_v2(
|
||||
outputs = distribution.run(
|
||||
step_fn, args=(next(iterator),))
|
||||
return nest.map_structure(distribution.experimental_local_results,
|
||||
outputs)
|
||||
|
@ -135,7 +135,7 @@ class KerasModelsTest(test.TestCase, parameterized.TestCase):
|
|||
optimizer.apply_gradients(zip(grads, model.variables))
|
||||
return loss
|
||||
|
||||
outputs = distribution.experimental_run_v2(
|
||||
outputs = distribution.run(
|
||||
step_fn, args=(next(iterator),))
|
||||
return nest.map_structure(distribution.experimental_local_results,
|
||||
outputs)
|
||||
|
@ -178,7 +178,7 @@ class KerasModelsTest(test.TestCase, parameterized.TestCase):
|
|||
optimizer.apply_gradients(zip(grads, model.variables))
|
||||
return loss
|
||||
|
||||
outputs = distribution.experimental_run_v2(
|
||||
outputs = distribution.run(
|
||||
step_fn, args=(next(iterator),))
|
||||
return nest.map_structure(distribution.experimental_local_results,
|
||||
outputs)
|
||||
|
@ -210,7 +210,7 @@ class KerasModelsTest(test.TestCase, parameterized.TestCase):
|
|||
return loss
|
||||
|
||||
for _ in range(5):
|
||||
distribution.experimental_run_v2(step_fn, args=(next(iterator),))
|
||||
distribution.run(step_fn, args=(next(iterator),))
|
||||
|
||||
train_step(input_iterator)
|
||||
|
||||
|
@ -261,7 +261,7 @@ class KerasModelsTest(test.TestCase, parameterized.TestCase):
|
|||
optimizer.apply_gradients(zip(grads, model.variables))
|
||||
return loss
|
||||
|
||||
outputs = distribution.experimental_run_v2(
|
||||
outputs = distribution.run(
|
||||
step_fn, args=(next(input_iterator),))
|
||||
return distribution.experimental_local_results(outputs)
|
||||
|
||||
|
@ -314,7 +314,7 @@ class KerasModelsTest(test.TestCase, parameterized.TestCase):
|
|||
grads = tape.gradient(loss, model.variables)
|
||||
optimizer.apply_gradients(zip(grads, model.variables))
|
||||
|
||||
distribution.experimental_run_v2(step_fn, args=(inputs,))
|
||||
distribution.run(step_fn, args=(inputs,))
|
||||
|
||||
@def_function.function
|
||||
def compute_loss2(images, targets):
|
||||
|
@ -331,7 +331,7 @@ class KerasModelsTest(test.TestCase, parameterized.TestCase):
|
|||
grads = tape.gradient(loss, model2.variables)
|
||||
optimizer.apply_gradients(zip(grads, model2.variables))
|
||||
|
||||
distribution.experimental_run_v2(step_fn, args=(inputs,))
|
||||
distribution.run(step_fn, args=(inputs,))
|
||||
|
||||
inputs = next(input_iterator)
|
||||
|
||||
|
@ -365,7 +365,7 @@ class KerasModelsTest(test.TestCase, parameterized.TestCase):
|
|||
grads = tape.gradient(loss, model.variables)
|
||||
return grads
|
||||
|
||||
outputs = distribution.experimental_run_v2(
|
||||
outputs = distribution.run(
|
||||
step_fn, args=(next(iterator),))
|
||||
return nest.map_structure(distribution.experimental_local_results,
|
||||
outputs)
|
||||
|
@ -408,7 +408,7 @@ class KerasModelsTest(test.TestCase, parameterized.TestCase):
|
|||
grads = tape.gradient(loss, model.variables)
|
||||
return grads
|
||||
|
||||
outputs = distribution.experimental_run_v2(
|
||||
outputs = distribution.run(
|
||||
step_fn, args=(next(iterator),))
|
||||
return nest.map_structure(distribution.experimental_local_results,
|
||||
outputs)
|
||||
|
|
|
@ -66,7 +66,7 @@ class OptimizerTest(test.TestCase, parameterized.TestCase):
|
|||
return v.read_value()
|
||||
|
||||
return distribution.experimental_local_results(
|
||||
distribution.experimental_run_v2(step_fn, args=(grads,)))
|
||||
distribution.run(step_fn, args=(grads,)))
|
||||
|
||||
self.assertAllClose(optimize(), expected)
|
||||
|
||||
|
@ -92,7 +92,7 @@ class OptimizerTest(test.TestCase, parameterized.TestCase):
|
|||
return v.read_value()
|
||||
|
||||
return distribution.experimental_local_results(
|
||||
distribution.experimental_run_v2(step_fn, args=(grads,)))
|
||||
distribution.run(step_fn, args=(grads,)))
|
||||
|
||||
self.assertAllClose(optimize(), [[-0.1, -0.1]])
|
||||
|
||||
|
|
|
@ -12,12 +12,11 @@
|
|||
# See the License for the specific language governing permissions and
|
||||
# limitations under the License.
|
||||
# ==============================================================================
|
||||
# pylint: disable=line-too-long
|
||||
"""Library for running a computation across multiple devices.
|
||||
|
||||
See the guide for overview and examples:
|
||||
[TensorFlow v2.x](https://www.tensorflow.org/guide/distributed_training),
|
||||
[TensorFlow v1.x](https://github.com/tensorflow/docs/blob/master/site/en/r1/guide/distribute_strategy.ipynb).
|
||||
[TensorFlow v1.x](https://github.com/tensorflow/docs/blob/master/site/en/r1/guide/distribute_strategy.ipynb). # pylint: disable=line-too-long
|
||||
|
||||
The intent of this library is that you can write an algorithm in a stylized way
|
||||
and it will be usable with a variety of different `tf.distribute.Strategy`
|
||||
|
@ -130,6 +129,7 @@ from tensorflow.python.ops.losses import loss_reduction
|
|||
from tensorflow.python.ops.losses import losses_impl
|
||||
from tensorflow.python.platform import tf_logging
|
||||
from tensorflow.python.training.tracking import base as trackable
|
||||
from tensorflow.python.util import deprecation
|
||||
from tensorflow.python.util import nest
|
||||
from tensorflow.python.util import tf_contextlib
|
||||
from tensorflow.python.util.deprecation import deprecated
|
||||
|
@ -485,7 +485,7 @@ class RunOptions(
|
|||
"experimental_enable_dynamic_batch_size",
|
||||
"experimental_bucketizing_dynamic_shape",
|
||||
])):
|
||||
"""Run options for `strategy.experimental_run_v2`.
|
||||
"""Run options for `strategy.run`.
|
||||
|
||||
This can be used to hold some strategy specific configs.
|
||||
|
||||
|
@ -496,7 +496,7 @@ class RunOptions(
|
|||
shape inputs are allowed.
|
||||
experimental_bucketizing_dynamic_shape: Boolean. Only applies to
|
||||
TPUStrategy. Default to False. If True, TPUStrategy will automatic
|
||||
bucketize inputs passed into `experimental_run_v2` if the input shape is
|
||||
bucketize inputs passed into `run` if the input shape is
|
||||
dynamic. This is a performance optimization to reduce XLA recompilation,
|
||||
which should not have impact on correctness.
|
||||
"""
|
||||
|
@ -548,7 +548,7 @@ class StrategyBase(object):
|
|||
across replicas, use
|
||||
`tf.distribute.Strategy.experimental_distribute_datasets_from_function`
|
||||
instead.
|
||||
* Use `tf.distribute.Strategy.experimental_run_v2` to run a function
|
||||
* Use `tf.distribute.Strategy.run` to run a function
|
||||
once per replica, taking values that may be "per-replica" (e.g.
|
||||
from a distributed dataset) and returning "per-replica" values.
|
||||
This function is executed in "replica context", which means each
|
||||
|
@ -568,8 +568,7 @@ class StrategyBase(object):
|
|||
|
||||
total_result = 0
|
||||
for x in dataset:
|
||||
per_replica_result = my_strategy.experimental_run_v2(replica_fn,
|
||||
args=(x,))
|
||||
per_replica_result = my_strategy.run(replica_fn, args=(x,))
|
||||
total_result += my_strategy.reduce(tf.distribute.ReduceOp.SUM,
|
||||
per_replica_result, axis=None)
|
||||
return total_result
|
||||
|
@ -711,7 +710,7 @@ class StrategyBase(object):
|
|||
"""DEPRECATED TF 1.x ONLY."""
|
||||
with self.scope():
|
||||
args = (input_iterator.get_next(),) if input_iterator is not None else ()
|
||||
return self.experimental_run_v2(fn, args=args)
|
||||
return self.run(fn, args=args)
|
||||
|
||||
def experimental_distribute_dataset(self, dataset):
|
||||
"""Distributes a tf.data.Dataset instance provided via `dataset`.
|
||||
|
@ -736,7 +735,7 @@ class StrategyBase(object):
|
|||
# Iterate over the distributed dataset
|
||||
for x in dist_dataset:
|
||||
# process dataset elements
|
||||
strategy.experimental_run_v2(train_step, args=(x,))
|
||||
strategy.run(train_step, args=(x,))
|
||||
```
|
||||
|
||||
We will assume that the input dataset is batched by the
|
||||
|
@ -792,7 +791,7 @@ class StrategyBase(object):
|
|||
# Iterate over the distributed dataset
|
||||
for x in dist_dataset:
|
||||
# process dataset elements
|
||||
strategy.experimental_run_v2(train_step, args=(x,))
|
||||
strategy.run(train_step, args=(x,))
|
||||
```
|
||||
|
||||
Args:
|
||||
|
@ -836,7 +835,7 @@ class StrategyBase(object):
|
|||
inputs = strategy.experimental_distribute_datasets_from_function(dataset_fn)
|
||||
|
||||
for batch in inputs:
|
||||
replica_results = strategy.experimental_run_v2(replica_fn, args=(batch,))
|
||||
replica_results = strategy.run(replica_fn, args=(batch,))
|
||||
```
|
||||
|
||||
IMPORTANT: The `tf.data.Dataset` returned by `dataset_fn` should have a
|
||||
|
@ -860,7 +859,7 @@ class StrategyBase(object):
|
|||
return
|
||||
|
||||
for _ in range(steps):
|
||||
strategy.experimental_run_v2(replica_fn_with_signature,
|
||||
strategy.run(replica_fn_with_signature,
|
||||
args=(next(iterator),))
|
||||
```
|
||||
|
||||
|
@ -875,24 +874,56 @@ class StrategyBase(object):
|
|||
return self._extended._experimental_distribute_datasets_from_function( # pylint: disable=protected-access
|
||||
dataset_fn)
|
||||
|
||||
def experimental_run_v2(self, fn, args=(), kwargs=None, options=None):
|
||||
def run(self, fn, args=(), kwargs=None, options=None):
|
||||
"""Run `fn` on each replica, with the given arguments.
|
||||
|
||||
Executes ops specified by `fn` on each replica. If `args` or `kwargs` have
|
||||
"per-replica" values, such as those produced by a "distributed `Dataset`",
|
||||
`tf.distribute.DistributedValues`, such as those produced by a
|
||||
"distributed `Dataset`" or `experimental_distribute_values_from_function`
|
||||
when `fn` is executed on a particular replica, it will be executed with the
|
||||
component of those "per-replica" values that correspond to that replica.
|
||||
component of `tf.distribute.DistributedValues` that correspond to that
|
||||
replica.
|
||||
|
||||
`fn` may call `tf.distribute.get_replica_context()` to access members such
|
||||
as `all_reduce`.
|
||||
|
||||
All arguments in `args` or `kwargs` should either be nest of tensors or
|
||||
per-replica objects containing tensors or composite tensors.
|
||||
`tf.distribute.DistributedValues` containing tensors or composite tensors.
|
||||
|
||||
IMPORTANT: Depending on the implementation of `tf.distribute.Strategy` and
|
||||
whether eager execution is enabled, `fn` may be called one or more times (
|
||||
once for each replica).
|
||||
|
||||
Example usage:
|
||||
|
||||
1. Constant tensor input.
|
||||
|
||||
>>> strategy = tf.distribute.MirroredStrategy()
|
||||
>>> tensor_input = tf.constant(3.0)
|
||||
>>> @tf.function
|
||||
... def replica_fn(input):
|
||||
... return input*2.0
|
||||
>>> result = strategy.run(replica_fn, args=(tensor_input,))
|
||||
>>> result
|
||||
<tf.Tensor: shape=(), dtype=float32, numpy=6.0>
|
||||
|
||||
2. DistributedValues input.
|
||||
|
||||
>>> strategy = tf.distribute.MirroredStrategy()
|
||||
>>> @tf.function
|
||||
... def run():
|
||||
... def value_fn(value_context):
|
||||
... return value_context.num_replicas_in_sync
|
||||
... distributed_values = (
|
||||
... strategy.experimental_distribute_values_from_function(
|
||||
... value_fn))
|
||||
... def replica_fn2(input):
|
||||
... return input*2
|
||||
... return strategy.run(replica_fn2, args=(distributed_values,))
|
||||
>>> result = run()
|
||||
>>> result
|
||||
<tf.Tensor: shape=(), dtype=int32, numpy=2>
|
||||
|
||||
Args:
|
||||
fn: The function to run. The output must be a `tf.nest` of `Tensor`s.
|
||||
args: (Optional) Positional arguments to `fn`.
|
||||
|
@ -903,8 +934,8 @@ class StrategyBase(object):
|
|||
Returns:
|
||||
Merged return value of `fn` across replicas. The structure of the return
|
||||
value is the same as the return value from `fn`. Each element in the
|
||||
structure can either be "per-replica" `Tensor` objects or `Tensor`s
|
||||
(for example, if running on a single replica).
|
||||
structure can either be `tf.distribute.DistributedValues`, `Tensor`
|
||||
objects, or `Tensor`s (for example, if running on a single replica).
|
||||
"""
|
||||
del options
|
||||
|
||||
|
@ -919,10 +950,16 @@ class StrategyBase(object):
|
|||
fn, autograph_ctx.control_status_ctx(), convert_by_default=False)
|
||||
return self._extended.call_for_each_replica(fn, args=args, kwargs=kwargs)
|
||||
|
||||
# TODO(b/151224785): Remove deprecated alias.
|
||||
@doc_controls.do_not_doc_inheritable # DEPRECATED
|
||||
@deprecation.deprecated(None, "renamed to `run`")
|
||||
def experimental_run_v2(self, fn, args=(), kwargs=None, options=None):
|
||||
return self.run(fn, args=args, kwargs=kwargs, options=options)
|
||||
|
||||
def reduce(self, reduce_op, value, axis):
|
||||
"""Reduce `value` across replicas.
|
||||
|
||||
Given a per-replica value returned by `experimental_run_v2`, say a
|
||||
Given a per-replica value returned by `run`, say a
|
||||
per-example loss, the batch will be divided across all the replicas. This
|
||||
function allows you to aggregate across replicas and optionally also across
|
||||
batch elements. For example, if you have a global batch size of 8 and 2
|
||||
|
@ -947,7 +984,7 @@ class StrategyBase(object):
|
|||
Args:
|
||||
reduce_op: A `tf.distribute.ReduceOp` value specifying how values should
|
||||
be combined.
|
||||
value: A "per replica" value, e.g. returned by `experimental_run_v2` to
|
||||
value: A "per replica" value, e.g. returned by `run` to
|
||||
be combined into a single tensor.
|
||||
axis: Specifies the dimension to reduce along within each
|
||||
replica's tensor. Should typically be set to the batch dimension, or
|
||||
|
@ -964,7 +1001,7 @@ class StrategyBase(object):
|
|||
if axis is None:
|
||||
return self._extended._reduce(reduce_op, value) # pylint: disable=protected-access
|
||||
if reduce_op == reduce_util.ReduceOp.SUM:
|
||||
value = self.experimental_run_v2(
|
||||
value = self.run(
|
||||
lambda v: math_ops.reduce_sum(v, axis=axis), args=(value,))
|
||||
return self._extended._reduce(reduce_op, value) # pylint: disable=protected-access
|
||||
if reduce_op != reduce_util.ReduceOp.MEAN:
|
||||
|
@ -1011,7 +1048,7 @@ class StrategyBase(object):
|
|||
# reduce is complete?
|
||||
return numer, denom
|
||||
|
||||
numer, denom = self.experimental_run_v2(mean_reduce_helper, args=(value,))
|
||||
numer, denom = self.run(mean_reduce_helper, args=(value,))
|
||||
# TODO(josh11b): Should batch reduce here instead of doing two.
|
||||
numer = self._extended._reduce(reduce_util.ReduceOp.SUM, numer) # pylint: disable=protected-access
|
||||
denom = self._extended._reduce(reduce_util.ReduceOp.SUM, denom) # pylint: disable=protected-access
|
||||
|
@ -1050,7 +1087,7 @@ class StrategyBase(object):
|
|||
computed on that worker.
|
||||
|
||||
Args:
|
||||
value: A value returned by `experimental_run()`, `experimental_run_v2()`,
|
||||
value: A value returned by `experimental_run()`, `run()`,
|
||||
`extended.call_for_each_replica()`, or a variable created in `scope`.
|
||||
|
||||
Returns:
|
||||
|
@ -1146,7 +1183,7 @@ class Strategy(StrategyBase):
|
|||
output = strategy.experimental_assign_to_logical_device(output, 0)
|
||||
return output
|
||||
|
||||
strategy.experimental_run_v2(step_fn, args=(next(iterator),))
|
||||
strategy.run(step_fn, args=(next(iterator),))
|
||||
```
|
||||
|
||||
Args:
|
||||
|
@ -1204,7 +1241,7 @@ class Strategy(StrategyBase):
|
|||
output = model(inputs)
|
||||
return output
|
||||
|
||||
strategy.experimental_run_v2(step_fn, args=(next(iterator),))
|
||||
strategy.run(step_fn, args=(next(iterator),))
|
||||
```
|
||||
Args:
|
||||
tensor: Input tensor to annotate.
|
||||
|
@ -1266,7 +1303,7 @@ class Strategy(StrategyBase):
|
|||
|
||||
return loss
|
||||
|
||||
strategy.experimental_run_v2(step_fn, args=(next(iterator),))
|
||||
strategy.run(step_fn, args=(next(iterator),))
|
||||
```
|
||||
Args:
|
||||
tensor: Input tensor to annotate.
|
||||
|
@ -1280,7 +1317,7 @@ class Strategy(StrategyBase):
|
|||
"""Generates `tf.distribute.DistributedValues` from `value_fn`.
|
||||
|
||||
This function is to generate `tf.distribute.DistributedValues` to pass
|
||||
into `experimental_run_v2`, `reduce`, or other methods that take
|
||||
into `run`, `reduce`, or other methods that take
|
||||
distributed values when not using datasets.
|
||||
|
||||
Args:
|
||||
|
@ -1468,7 +1505,7 @@ class StrategyV1(StrategyBase):
|
|||
"""Runs ops in `fn` on each replica, with inputs from `input_iterator`.
|
||||
|
||||
DEPRECATED: This method is not available in TF 2.x. Please switch
|
||||
to using `experimental_run_v2` instead.
|
||||
to using `run` instead.
|
||||
|
||||
When eager execution is enabled, executes ops specified by `fn` on each
|
||||
replica. Otherwise, builds a graph to execute the ops on each replica.
|
||||
|
@ -1540,10 +1577,10 @@ class StrategyExtendedV2(object):
|
|||
from replica id to values. "PerReplica" is used when the value may be
|
||||
different across replicas, and "Mirrored" when the value are the same.
|
||||
* Unwrapping and merging: Consider calling a function `fn` on multiple
|
||||
replicas, like `experimental_run_v2(fn, args=[w])` with an
|
||||
replicas, like `run(fn, args=[w])` with an
|
||||
argument `w` that is a wrapped value. This means `w` will have a map taking
|
||||
replica id `0` to `w0`, replica id `11` to `w1`, etc.
|
||||
`experimental_run_v2()` unwraps `w` before calling `fn`, so
|
||||
`run()` unwraps `w` before calling `fn`, so
|
||||
it calls `fn(w0)` on `d0`, `fn(w1)` on `d1`, etc. It then merges the return
|
||||
values from `fn()`, which can possibly result in wrapped values. For
|
||||
example, let's say `fn()` returns a tuple with three components: `(x, a,
|
||||
|
@ -1573,7 +1610,7 @@ class StrategyExtendedV2(object):
|
|||
|
||||
* `tf.distribute.Strategy.scope`: enters cross-replica context when
|
||||
no other strategy is in scope.
|
||||
* `tf.distribute.Strategy.experimental_run_v2`: calls a function in
|
||||
* `tf.distribute.Strategy.run`: calls a function in
|
||||
replica context.
|
||||
* `tf.distribute.ReplicaContext.merge_call`: transitions from replica
|
||||
context to cross-replica context.
|
||||
|
@ -1615,7 +1652,7 @@ class StrategyExtendedV2(object):
|
|||
returned by `tf.distribute.Strategy.experimental_distribute_dataset` and
|
||||
`tf.distribute.Strategy.experimental_distribute_datasets_from_function`. They
|
||||
are also the typical result returned by
|
||||
`tf.distribute.Strategy.experimental_run_v2`. You typically can't use a
|
||||
`tf.distribute.Strategy.run`. You typically can't use a
|
||||
per-replica value directly in a cross-replica context, without first resolving
|
||||
how to aggregate the values across replicas, for instance by using
|
||||
`tf.distribute.Strategy.reduce`.
|
||||
|
@ -1653,7 +1690,7 @@ class StrategyExtendedV2(object):
|
|||
|
||||
The standard pattern for updating variables is to:
|
||||
|
||||
1. In your function passed to `tf.distribute.Strategy.experimental_run_v2`,
|
||||
1. In your function passed to `tf.distribute.Strategy.run`,
|
||||
compute a list of (update, variable) pairs. For example, the update might
|
||||
be a the gradient of the loss with respect to the variable.
|
||||
2. Switch to cross-replica mode by calling
|
||||
|
@ -2011,8 +2048,7 @@ class StrategyExtendedV2(object):
|
|||
"""Returns the container that this per-replica `value` belongs to.
|
||||
|
||||
Args:
|
||||
value: A value returned by `experimental_run_v2()` or a variable
|
||||
created in `scope()`.
|
||||
value: A value returned by `run()` or a variable created in `scope()`.
|
||||
|
||||
Returns:
|
||||
A container that `value` belongs to.
|
||||
|
@ -2157,7 +2193,7 @@ class StrategyExtendedV1(StrategyExtendedV2):
|
|||
iterator,
|
||||
iterations=1,
|
||||
initial_loop_values=None):
|
||||
"""DEPRECATED: please use `experimental_run_v2` instead.
|
||||
"""DEPRECATED: please use `run` instead.
|
||||
|
||||
Run `fn` with input from `iterator` for `iterations` times.
|
||||
|
||||
|
@ -2233,7 +2269,7 @@ class StrategyExtendedV1(StrategyExtendedV2):
|
|||
with distribution.scope():
|
||||
# in "cross-replica" context
|
||||
...
|
||||
merged_results = distribution.experimental_run_v2(fn, args=[3])
|
||||
merged_results = distribution.run(fn, args=[3])
|
||||
# merged_results has the values from every replica execution of `fn`.
|
||||
# This statement prints a list:
|
||||
print(distribution.experimental_local_results(merged_results))
|
||||
|
@ -2300,7 +2336,7 @@ class StrategyExtendedV1(StrategyExtendedV2):
|
|||
# `ReplicaContext` (defined here) and `_CurrentDistributionContext`
|
||||
# (defined above) used by `tf.distribute.Strategy.scope()`:
|
||||
#
|
||||
# * a ReplicaContext is only present during a `experimental_run_v2()`
|
||||
# * a ReplicaContext is only present during a `run()`
|
||||
# call (except during a `merge_run` call) and in such a scope it
|
||||
# will be returned by calls to `get_replica_context()`. Implementers of new
|
||||
# Strategy descendants will frequently also need to
|
||||
|
@ -2321,7 +2357,7 @@ class ReplicaContext(object):
|
|||
|
||||
You can use `tf.distribute.get_replica_context` to get an instance of
|
||||
`ReplicaContext`. This should be inside your replicated step function, such
|
||||
as in a `tf.distribute.Strategy.experimental_run_v2` call.
|
||||
as in a `tf.distribute.Strategy.run` call.
|
||||
"""
|
||||
|
||||
def __init__(self, strategy, replica_id_in_sync_group):
|
||||
|
@ -2353,11 +2389,9 @@ class ReplicaContext(object):
|
|||
"""Merge args across replicas and run `merge_fn` in a cross-replica context.
|
||||
|
||||
This allows communication and coordination when there are multiple calls
|
||||
to the step_fn triggered by a call to
|
||||
`strategy.experimental_run_v2(step_fn, ...)`.
|
||||
to the step_fn triggered by a call to `strategy.run(step_fn, ...)`.
|
||||
|
||||
See `tf.distribute.Strategy.experimental_run_v2` for an
|
||||
explanation.
|
||||
See `tf.distribute.Strategy.run` for an explanation.
|
||||
|
||||
If not inside a distributed scope, this is equivalent to:
|
||||
|
||||
|
|
|
@ -510,7 +510,7 @@ class DefaultDistributionStrategyTest(test.TestCase, parameterized.TestCase):
|
|||
return input_data
|
||||
|
||||
for _ in range(2):
|
||||
default_strategy.experimental_run_v2(train_step, args=(next_val,))
|
||||
default_strategy.run(train_step, args=(next_val,))
|
||||
|
||||
@combinations.generate(combinations.combine(mode=["graph", "eager"]))
|
||||
def testDistributedDatasets(self):
|
||||
|
|
|
@ -99,8 +99,7 @@ def get_replica_context():
|
|||
will return the default `ReplicaContext` object);
|
||||
2. switches to cross-replica context (in which case this will return
|
||||
`None`) when entering a `with tf.distribute.Strategy.scope():` block;
|
||||
3. switches to a (non-default) replica context inside
|
||||
`strategy.experimental_run_v2(fn, ...)`;
|
||||
3. switches to a (non-default) replica context inside `strategy.run(fn, ...)`;
|
||||
4. if `fn` calls `get_replica_context().merge_call(merge_fn, ...)`, then
|
||||
inside `merge_fn` you are back in the cross-replica context (and again
|
||||
this function will return `None`).
|
||||
|
@ -121,7 +120,7 @@ def get_replica_context():
|
|||
tf.print("Replica id: ", replica_context.replica_id_in_sync_group,
|
||||
" of ", replica_context.num_replicas_in_sync)
|
||||
|
||||
strategy.experimental_run_v2(f)
|
||||
strategy.run(f)
|
||||
```
|
||||
|
||||
Returns:
|
||||
|
@ -166,7 +165,7 @@ def in_cross_replica_context():
|
|||
def f():
|
||||
assert not tf.distribute.in_cross_replica_context()
|
||||
|
||||
strategy.experimental_run_v2(f)
|
||||
strategy.run(f)
|
||||
```
|
||||
|
||||
Returns:
|
||||
|
|
|
@ -585,7 +585,7 @@ class DistributedIteratorTensorTypeTest(DistributedIteratorTestBase,
|
|||
"""Sums the `PerReplica` values in the `per_replica_features` map."""
|
||||
|
||||
def map_fn(per_replica_values):
|
||||
per_replica_sums = distribution.experimental_run_v2(
|
||||
per_replica_sums = distribution.run(
|
||||
(lambda x: math_ops.reduce_sum(x.values)) if all(
|
||||
map(sparse_tensor.is_sparse, per_replica_values.values)) else
|
||||
math_ops.reduce_sum, (per_replica_values,))
|
||||
|
@ -1048,7 +1048,7 @@ class InputTypeSpecTest(test.TestCase, parameterized.TestCase):
|
|||
|
||||
@def_function.function(input_signature=[type_spec])
|
||||
def process_inputs(inputs):
|
||||
distribution.experimental_run_v2(lambda inputs: inputs, args=(inputs,))
|
||||
distribution.run(lambda inputs: inputs, args=(inputs,))
|
||||
|
||||
for x in ds:
|
||||
process_inputs(x)
|
||||
|
@ -1073,7 +1073,7 @@ class InputTypeSpecTest(test.TestCase, parameterized.TestCase):
|
|||
|
||||
@def_function.function(input_signature=[dist_dataset.element_spec])
|
||||
def process_inputs(inputs):
|
||||
distribution.experimental_run_v2(lambda inputs: inputs, args=(inputs,))
|
||||
distribution.run(lambda inputs: inputs, args=(inputs,))
|
||||
|
||||
for x in dist_dataset:
|
||||
process_inputs(x)
|
||||
|
|
|
@ -97,8 +97,7 @@ class KerasMetricsTest(test.TestCase, parameterized.TestCase):
|
|||
|
||||
iterator = distribution.make_input_fn_iterator(lambda _: dataset_fn())
|
||||
updates = distribution.experimental_local_results(
|
||||
distribution.experimental_run_v2(
|
||||
metric, args=(iterator.get_next(),)))
|
||||
distribution.run(metric, args=(iterator.get_next(),)))
|
||||
batches_per_update = distribution.num_replicas_in_sync
|
||||
|
||||
self.evaluate(iterator.initializer)
|
||||
|
|
|
@ -543,7 +543,7 @@ class MinimizeLossStepTest(test.TestCase, parameterized.TestCase):
|
|||
opt.minimize(lambda: constant_op.constant(1.), [])
|
||||
opt.apply_gradients([])
|
||||
|
||||
distribution.experimental_run_v2(run_fn)
|
||||
distribution.run(run_fn)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
|
|
|
@ -52,7 +52,7 @@ class MirroredFunctionStrategyTest(test.TestCase):
|
|||
|
||||
one = constant_op.constant(1)
|
||||
self.assertLen(f_traces, 0)
|
||||
result1 = self._strategy.experimental_run_v2(f, args=(one,))
|
||||
result1 = self._strategy.run(f, args=(one,))
|
||||
self.assertLen(f_traces, 1) # Function traced once, not for each replica.
|
||||
# Returns a per-replica value.
|
||||
self.assertIsInstance(result1, values.PerReplica)
|
||||
|
@ -60,7 +60,7 @@ class MirroredFunctionStrategyTest(test.TestCase):
|
|||
self._strategy.experimental_local_results(result1))
|
||||
|
||||
# Try passing a per-replica value as an argument.
|
||||
result2 = self._strategy.experimental_run_v2(f, args=(result1,))
|
||||
result2 = self._strategy.run(f, args=(result1,))
|
||||
self.assertLen(f_traces, 1)
|
||||
self.assertIsInstance(result2, values.PerReplica)
|
||||
self.assertAllEqual([1, 3],
|
||||
|
@ -88,7 +88,7 @@ class MirroredFunctionStrategyTest(test.TestCase):
|
|||
one = constant_op.constant(1)
|
||||
self.assertLen(f_traces, 0)
|
||||
self.assertLen(g_traces, 0)
|
||||
result = self._strategy.experimental_run_v2(f, args=(one,))
|
||||
result = self._strategy.run(f, args=(one,))
|
||||
# Functions traced once, not for each replica.
|
||||
self.assertLen(f_traces, 1)
|
||||
self.assertLen(g_traces, 1)
|
||||
|
|
|
@ -403,8 +403,7 @@ class MirroredStrategy(distribute_lib.Strategy):
|
|||
|
||||
total_result = 0
|
||||
for x in dataset:
|
||||
per_replica_result = my_strategy.experimental_run_v2(replica_fn,
|
||||
args=(x,))
|
||||
per_replica_result = my_strategy.run(replica_fn, args=(x,))
|
||||
total_result += my_strategy.reduce(tf.distribute.ReduceOp.SUM,
|
||||
per_replica_result, axis=None)
|
||||
return total_result
|
||||
|
@ -752,13 +751,13 @@ class MirroredExtended(distribute_lib.StrategyExtendedV1):
|
|||
return wrapped(args, kwargs)
|
||||
|
||||
if context.executing_eagerly():
|
||||
logging.log_first_n(logging.WARN, "Using %s eagerly has significant "
|
||||
"overhead currently. We will be working on improving "
|
||||
"this in the future, but for now please wrap "
|
||||
"`call_for_each_replica` or `experimental_run` or "
|
||||
"`experimental_run_v2` inside a tf.function to get "
|
||||
"the best performance." %
|
||||
self._container_strategy().__class__.__name__, 5)
|
||||
logging.log_first_n(
|
||||
logging.WARN, "Using %s eagerly has significant "
|
||||
"overhead currently. We will be working on improving "
|
||||
"this in the future, but for now please wrap "
|
||||
"`call_for_each_replica` or `experimental_run` or "
|
||||
"`run` inside a tf.function to get the best performance." %
|
||||
self._container_strategy().__class__.__name__, 5)
|
||||
else:
|
||||
# When a tf.function is wrapped to trigger _call_for_each_replica (see
|
||||
# the other branch above), AutoGraph stops conversion at
|
||||
|
|
|
@ -1368,7 +1368,7 @@ class FunctionTest(test.TestCase, parameterized.TestCase):
|
|||
return t.gradient(loss, [w, b])
|
||||
|
||||
def step_fn():
|
||||
return distribution.experimental_run_v2(replica_fn)
|
||||
return distribution.run(replica_fn)
|
||||
|
||||
context.enable_run_metadata()
|
||||
g1, g2 = step_fn()
|
||||
|
@ -1399,7 +1399,7 @@ class FunctionTest(test.TestCase, parameterized.TestCase):
|
|||
def replica_fn():
|
||||
return f()
|
||||
|
||||
distribution.experimental_run_v2(replica_fn)
|
||||
distribution.run(replica_fn)
|
||||
|
||||
|
||||
def _replica_id():
|
||||
|
|
|
@ -192,7 +192,7 @@ class ExponentialMovingAverageTest(test.TestCase, parameterized.TestCase):
|
|||
ema.apply([w])
|
||||
return ema.average(w)
|
||||
|
||||
return distribution.experimental_run_v2(_ema_replica_fn_eager)
|
||||
return distribution.run(_ema_replica_fn_eager)
|
||||
|
||||
if use_function:
|
||||
fn = def_function.function(fn)
|
||||
|
@ -238,7 +238,7 @@ class ExponentialMovingAverageTest(test.TestCase, parameterized.TestCase):
|
|||
self.skipTest("b/139550827: Cannot do variable.assign in replica context "
|
||||
"of TPUStrategy")
|
||||
with distribution.scope():
|
||||
w_assign, w_apply, ema_w = distribution.experimental_run_v2(
|
||||
w_assign, w_apply, ema_w = distribution.run(
|
||||
self._ema_replica_fn_graph)
|
||||
self.assertEqual(ema_w.name, "w/ExponentialMovingAverage:0")
|
||||
with self.cached_session():
|
||||
|
|
|
@ -44,7 +44,7 @@ class OneDeviceStrategy(distribute_lib.Strategy):
|
|||
Using this strategy will place any variables created in its scope on the
|
||||
specified device. Input distributed through this strategy will be
|
||||
prefetched to the specified device. Moreover, any functions called via
|
||||
`strategy.experimental_run_v2` will also be placed on the specified device
|
||||
`strategy.run` will also be placed on the specified device
|
||||
as well.
|
||||
|
||||
Typical usage of this strategy could be testing your code with the
|
||||
|
@ -64,7 +64,7 @@ class OneDeviceStrategy(distribute_lib.Strategy):
|
|||
|
||||
result = 0
|
||||
for i in range(10):
|
||||
result += strategy.experimental_run_v2(step_fn, args=(i,))
|
||||
result += strategy.run(step_fn, args=(i,))
|
||||
print(result) # 90
|
||||
```
|
||||
"""
|
||||
|
@ -127,7 +127,7 @@ class OneDeviceStrategy(distribute_lib.Strategy):
|
|||
inputs = strategy.experimental_distribute_datasets_from_function(dataset_fn)
|
||||
|
||||
for batch in inputs:
|
||||
replica_results = strategy.experimental_run_v2(replica_fn, args=(batch,))
|
||||
replica_results = strategy.run(replica_fn, args=(batch,))
|
||||
```
|
||||
|
||||
IMPORTANT: The `tf.data.Dataset` returned by `dataset_fn` should have a
|
||||
|
@ -154,7 +154,7 @@ class OneDeviceStrategy(distribute_lib.Strategy):
|
|||
value, so the result is just the value in a tuple.
|
||||
|
||||
Args:
|
||||
value: A value returned by `experimental_run()`, `experimental_run_v2()`,
|
||||
value: A value returned by `experimental_run()`, `run()`,
|
||||
`extended.call_for_each_replica()`, or a variable created in `scope`.
|
||||
|
||||
Returns:
|
||||
|
@ -163,7 +163,7 @@ class OneDeviceStrategy(distribute_lib.Strategy):
|
|||
"""
|
||||
return super(OneDeviceStrategy, self).experimental_local_results(value)
|
||||
|
||||
def experimental_run_v2(self, fn, args=(), kwargs=None, options=None): # pylint: disable=useless-super-delegation
|
||||
def run(self, fn, args=(), kwargs=None, options=None): # pylint: disable=useless-super-delegation
|
||||
"""Run `fn` on each replica, with the given arguments.
|
||||
|
||||
In `OneDeviceStrategy`, `fn` is simply called within a device scope for the
|
||||
|
@ -179,8 +179,7 @@ class OneDeviceStrategy(distribute_lib.Strategy):
|
|||
Returns:
|
||||
Return value from running `fn`.
|
||||
"""
|
||||
return super(OneDeviceStrategy,
|
||||
self).experimental_run_v2(fn, args, kwargs, options)
|
||||
return super(OneDeviceStrategy, self).run(fn, args, kwargs, options)
|
||||
|
||||
def reduce(self, reduce_op, value, axis): # pylint: disable=useless-super-delegation
|
||||
"""Reduce `value` across replicas.
|
||||
|
@ -203,7 +202,7 @@ class OneDeviceStrategy(distribute_lib.Strategy):
|
|||
Args:
|
||||
reduce_op: A `tf.distribute.ReduceOp` value specifying how values should
|
||||
be combined.
|
||||
value: A "per replica" value, e.g. returned by `experimental_run_v2` to
|
||||
value: A "per replica" value, e.g. returned by `run` to
|
||||
be combined into a single tensor.
|
||||
axis: Specifies the dimension to reduce along within each
|
||||
replica's tensor. Should typically be set to the batch dimension, or
|
||||
|
@ -309,7 +308,7 @@ class OneDeviceExtended(distribute_lib.StrategyExtendedV1):
|
|||
|
||||
def _experimental_distribute_values_from_function(self, value_fn):
|
||||
# TODO(b/137795644): This should return a PerReplica value but other
|
||||
# methods like experimental_run_v2 in OneDeviceStrategy need to be modified
|
||||
# methods like run in OneDeviceStrategy need to be modified
|
||||
# to do the same.
|
||||
return value_fn(distribute_lib.ValueContext())
|
||||
|
||||
|
|
|
@ -85,8 +85,7 @@ class SavedModelTFModuleTest(test_base.TestSavedModelBase):
|
|||
dist_predict_dataset = distribution.experimental_distribute_dataset(
|
||||
predict_dataset)
|
||||
per_replica_predict_data = next(iter(dist_predict_dataset))
|
||||
result = distribution.experimental_run_v2(
|
||||
model, args=(per_replica_predict_data,))
|
||||
result = distribution.run(model, args=(per_replica_predict_data,))
|
||||
# Convert the per_replica value to a list, then concatenate them
|
||||
reduced = distribution.experimental_local_results(result)
|
||||
concat = array_ops.concat(reduced, 0)
|
||||
|
|
|
@ -112,7 +112,7 @@ def load_and_run_with_saved_model_api(distribution, saved_dir, predict_dataset,
|
|||
dist_predict_dataset = distribution.experimental_distribute_dataset(
|
||||
predict_dataset)
|
||||
per_replica_predict_data = next(iter(dist_predict_dataset))
|
||||
result = distribution.experimental_run_v2(
|
||||
result = distribution.run(
|
||||
func.signatures[_DEFAULT_FUNCTION_KEY],
|
||||
args=(per_replica_predict_data,))
|
||||
result = result[output_name]
|
||||
|
|
|
@ -56,8 +56,7 @@ class StrategyCombinationsTest(test.TestCase, parameterized.TestCase):
|
|||
mode=["graph", "eager"]))
|
||||
def testMirrored2CPUs(self, distribution):
|
||||
with distribution.scope():
|
||||
one_per_replica = distribution.experimental_run_v2(
|
||||
lambda: constant_op.constant(1))
|
||||
one_per_replica = distribution.run(lambda: constant_op.constant(1))
|
||||
num_replicas = distribution.reduce(
|
||||
reduce_util.ReduceOp.SUM, one_per_replica, axis=None)
|
||||
self.assertEqual(2, self.evaluate(num_replicas))
|
||||
|
|
|
@ -453,16 +453,15 @@ class OneDeviceDistributionTestBase(test.TestCase):
|
|||
"""Some tests that should work with any one-device DistributionStrategy."""
|
||||
|
||||
def _test_run(self, strategy):
|
||||
out1 = strategy.experimental_run_v2(lambda: constant_op.constant(4.))
|
||||
out1 = strategy.run(lambda: constant_op.constant(4.))
|
||||
self.assertAllEqual([4.], self.evaluate(strategy.unwrap(out1)))
|
||||
|
||||
out2 = strategy.experimental_run_v2(
|
||||
lambda x: {"a": x * 2, "b": x * x}, args=(out1,))
|
||||
out2 = strategy.run(lambda x: {"a": x * 2, "b": x * x}, args=(out1,))
|
||||
out2_vals = self.evaluate(nest.map_structure(strategy.unwrap, out2))
|
||||
self.assertAllEqual([8.], out2_vals["a"])
|
||||
self.assertAllEqual([16.], out2_vals["b"])
|
||||
|
||||
out3 = strategy.experimental_run_v2(lambda b, a: a + 2 * b + 2, kwargs=out2)
|
||||
out3 = strategy.run(lambda b, a: a + 2 * b + 2, kwargs=out2)
|
||||
self.assertAllEqual([42.], self.evaluate(strategy.unwrap(out3)))
|
||||
|
||||
def _test_all_reduce_sum(self, strategy):
|
||||
|
@ -575,17 +574,16 @@ class TwoDeviceDistributionTestBase(test.TestCase):
|
|||
"""Some tests that should work with any two-device DistributionStrategy."""
|
||||
|
||||
def _test_run(self, strategy):
|
||||
out1 = strategy.experimental_run_v2(
|
||||
out1 = strategy.run(
|
||||
lambda: ds_context.get_replica_context().replica_id_in_sync_group + 1)
|
||||
self.assertAllEqual([1, 2], self.evaluate(strategy.unwrap(out1)))
|
||||
|
||||
out2 = strategy.experimental_run_v2(
|
||||
lambda x: {"a": x * 2, "b": x * x}, args=(out1,))
|
||||
out2 = strategy.run(lambda x: {"a": x * 2, "b": x * x}, args=(out1,))
|
||||
out2_vals = self.evaluate(nest.map_structure(strategy.unwrap, out2))
|
||||
self.assertAllEqual([2, 4], out2_vals["a"])
|
||||
self.assertAllEqual([1, 4], out2_vals["b"])
|
||||
|
||||
out3 = strategy.experimental_run_v2(lambda b, a: a + 2 * b + 2, kwargs=out2)
|
||||
out3 = strategy.run(lambda b, a: a + 2 * b + 2, kwargs=out2)
|
||||
self.assertAllEqual([6, 14], self.evaluate(strategy.unwrap(out3)))
|
||||
|
||||
def _test_all_reduce_sum(self, strategy):
|
||||
|
|
|
@ -85,28 +85,28 @@ def maybe_init_scope():
|
|||
yield
|
||||
|
||||
|
||||
def validate_experimental_run_function(fn):
|
||||
"""Validate the function passed into strategy.experimental_run_v2."""
|
||||
def validate_run_function(fn):
|
||||
"""Validate the function passed into strategy.run."""
|
||||
|
||||
# We allow three types of functions/objects passed into TPUStrategy
|
||||
# experimental_run_v2 in eager mode:
|
||||
# run in eager mode:
|
||||
# 1. a user annotated tf.function
|
||||
# 2. a ConcreteFunction, this is mostly what you get from loading a saved
|
||||
# model.
|
||||
# 3. a callable object and the `__call__` method itself is a tf.function.
|
||||
#
|
||||
# Otherwise we return an error, because we don't support eagerly running
|
||||
# experimental_run_v2 in TPUStrategy.
|
||||
# run in TPUStrategy.
|
||||
|
||||
if context.executing_eagerly() and not isinstance(
|
||||
fn, def_function.Function) and not isinstance(
|
||||
fn, function.ConcreteFunction) and not (callable(fn) and isinstance(
|
||||
fn.__call__, def_function.Function)):
|
||||
if context.executing_eagerly() \
|
||||
and not isinstance(fn, def_function.Function) \
|
||||
and not isinstance(fn, function.ConcreteFunction) \
|
||||
and not (callable(fn) and isinstance(fn.__call__, def_function.Function)):
|
||||
raise NotImplementedError(
|
||||
"TPUStrategy.experimental_run_v2(fn, ...) does not support pure eager "
|
||||
"TPUStrategy.run(fn, ...) does not support pure eager "
|
||||
"execution. please make sure the function passed into "
|
||||
"`strategy.experimental_run_v2` is a `tf.function` or "
|
||||
"`strategy.experimental_run_v2` is called inside a `tf.function` if "
|
||||
"`strategy.run` is a `tf.function` or "
|
||||
"`strategy.run` is called inside a `tf.function` if "
|
||||
"eager behavior is enabled.")
|
||||
|
||||
|
||||
|
@ -135,10 +135,10 @@ class TPUStrategy(distribute_lib.Strategy):
|
|||
|
||||
To run TF2 programs on TPUs, you can either use `.compile` and
|
||||
`.fit` APIs in `tf.keras` with TPUStrategy, or write your own customized
|
||||
training loop by calling `strategy.experimental_run_v2` directly. Note that
|
||||
training loop by calling `strategy.run` directly. Note that
|
||||
TPUStrategy doesn't support pure eager execution, so please make sure the
|
||||
function passed into `strategy.experimental_run_v2` is a `tf.function` or
|
||||
`strategy.experimental_run_v2` is called inside a `tf.function` if eager
|
||||
function passed into `strategy.run` is a `tf.function` or
|
||||
`strategy.run` is called inside a `tf.function` if eager
|
||||
behavior is enabled.
|
||||
|
||||
Args:
|
||||
|
@ -159,9 +159,9 @@ class TPUStrategy(distribute_lib.Strategy):
|
|||
# TODO(cjfj): Modify `_call_for_each_replica` in `TPUExtended` such that this
|
||||
# can use the default implementation.
|
||||
# This implementation runs a single step. It does not use infeed or outfeed.
|
||||
def experimental_run_v2(self, fn, args=(), kwargs=None, options=None):
|
||||
def run(self, fn, args=(), kwargs=None, options=None):
|
||||
"""See base class."""
|
||||
validate_experimental_run_function(fn)
|
||||
validate_run_function(fn)
|
||||
|
||||
# Note: the target function is converted to graph even when in Eager mode,
|
||||
# so autograph is on by default here.
|
||||
|
@ -208,7 +208,7 @@ class TPUStrategyV1(distribute_lib.StrategyV1):
|
|||
# TODO(cjfj): Modify `_call_for_each_replica` in `TPUExtended` such that this
|
||||
# can use the default implementation.
|
||||
# This implementation runs a single step. It does not use infeed or outfeed.
|
||||
def experimental_run_v2(self, fn, args=(), kwargs=None, options=None):
|
||||
def run(self, fn, args=(), kwargs=None, options=None):
|
||||
"""Run `fn` on each replica, with the given arguments.
|
||||
|
||||
Executes ops specified by `fn` on each replica. If `args` or `kwargs` have
|
||||
|
@ -223,7 +223,7 @@ class TPUStrategyV1(distribute_lib.StrategyV1):
|
|||
per-replica objects containing tensors or composite tensors.
|
||||
|
||||
Users can pass strategy specific options to `options` argument. An example
|
||||
to enable bucketizing dynamic shapes in `TPUStrategy.experimental_run_v2`
|
||||
to enable bucketizing dynamic shapes in `TPUStrategy.run`
|
||||
is:
|
||||
```python
|
||||
|
||||
|
@ -242,7 +242,7 @@ class TPUStrategyV1(distribute_lib.StrategyV1):
|
|||
output = tf.reduce_sum(inputs)
|
||||
return output
|
||||
|
||||
strategy.experimental_run_v2(step_fn, args=(next(iterator),),
|
||||
strategy.run(step_fn, args=(next(iterator),),
|
||||
options=options)
|
||||
```
|
||||
|
||||
|
@ -259,7 +259,7 @@ class TPUStrategyV1(distribute_lib.StrategyV1):
|
|||
structure can either be "per-replica" `Tensor` objects or `Tensor`s
|
||||
(for example, if running on a single replica).
|
||||
"""
|
||||
validate_experimental_run_function(fn)
|
||||
validate_run_function(fn)
|
||||
|
||||
fn = autograph.tf_convert(fn, autograph_ctx.control_status_ctx())
|
||||
options = options or distribute_lib.RunOptions()
|
||||
|
|
|
@ -90,8 +90,8 @@ class TPUStrategyTest(test.TestCase):
|
|||
@def_function.function
|
||||
def train_step():
|
||||
outputs = strategy.experimental_local_results(
|
||||
strategy.experimental_run_v2(computation, args=([2., 2.],)))
|
||||
outputs2 = strategy2.experimental_run_v2(
|
||||
strategy.run(computation, args=([2., 2.],)))
|
||||
outputs2 = strategy2.run(
|
||||
computation, args=([outputs[0]],))
|
||||
return outputs2
|
||||
|
||||
|
@ -181,9 +181,9 @@ class TPUStrategyTest(test.TestCase):
|
|||
def step_fn():
|
||||
return v + 1.0
|
||||
|
||||
all_core_strategy.experimental_run_v2(step_fn)
|
||||
r1 = first_core_strategy.experimental_run_v2(step_fn)
|
||||
r2 = second_core_strategy.experimental_run_v2(step_fn)
|
||||
all_core_strategy.run(step_fn)
|
||||
r1 = first_core_strategy.run(step_fn)
|
||||
r2 = second_core_strategy.run(step_fn)
|
||||
return r1 + r2
|
||||
|
||||
train_step()
|
||||
|
|
|
@ -61,13 +61,13 @@ class DistributedValues(object):
|
|||
|
||||
A subclass instance of DistributedValues is created when creating variables
|
||||
within a distribution strategy, iterating a `tf.Dataset` or through
|
||||
`strategy.experimental_run_v2`. This base class should never be instantiated
|
||||
`strategy.run`. This base class should never be instantiated
|
||||
directly. DistributedValues contains a value per replica. Depending on
|
||||
the subclass, the values could either be synced on update, synced on demand,
|
||||
or never synced.
|
||||
|
||||
DistributedValues can be reduced to obtain single value across replicas,
|
||||
as input into `experimental_run_v2` or the per replica values inspected
|
||||
as input into `run` or the per replica values inspected
|
||||
using `experimental_local_results`.
|
||||
|
||||
Example usage:
|
||||
|
@ -79,16 +79,16 @@ class DistributedValues(object):
|
|||
>>> dataset_iterator = iter(strategy.experimental_distribute_dataset(dataset))
|
||||
>>> distributed_values = next(dataset_iterator)
|
||||
|
||||
2. Returned by `experimental_run_v2`:
|
||||
2. Returned by `run`:
|
||||
|
||||
>>> strategy = tf.distribute.MirroredStrategy()
|
||||
>>> @tf.function
|
||||
... def run():
|
||||
... ctx = tf.distribute.get_replica_context()
|
||||
... return ctx.replica_id_in_sync_group
|
||||
>>> distributed_values = strategy.experimental_run_v2(run)
|
||||
>>> distributed_values = strategy.run(run)
|
||||
|
||||
3. As input into `experimental_run_v2`:
|
||||
3. As input into `run`:
|
||||
>>> strategy = tf.distribute.MirroredStrategy()
|
||||
>>> dataset = tf.data.Dataset.from_tensor_slices([5., 6., 7., 8.]).batch(2)
|
||||
>>> dataset_iterator = iter(strategy.experimental_distribute_dataset(dataset))
|
||||
|
@ -96,7 +96,7 @@ class DistributedValues(object):
|
|||
>>> @tf.function
|
||||
... def run(input):
|
||||
... return input + 1.0
|
||||
>>> updated_value = strategy.experimental_run_v2(run,
|
||||
>>> updated_value = strategy.run(run,
|
||||
... args=(distributed_values,))
|
||||
|
||||
4. Reduce value
|
||||
|
|
|
@ -215,8 +215,8 @@ class DistributedValuesTest(test.TestCase, parameterized.TestCase):
|
|||
return math_ops.square(x)
|
||||
|
||||
outputs = distribution.experimental_local_results(
|
||||
distribution.experimental_run_v2(computation,
|
||||
args=(distributed_values,)))
|
||||
distribution.run(computation,
|
||||
args=(distributed_values,)))
|
||||
return outputs
|
||||
|
||||
local_results = run()
|
||||
|
@ -740,7 +740,7 @@ class MirroredVariableTest(test.TestCase, parameterized.TestCase):
|
|||
|
||||
results = self.evaluate(
|
||||
distribution.experimental_local_results(
|
||||
distribution.experimental_run_v2(f)))
|
||||
distribution.run(f)))
|
||||
for value in results:
|
||||
self.assertEqual(2., value)
|
||||
|
||||
|
@ -798,7 +798,7 @@ class MirroredVariableTest(test.TestCase, parameterized.TestCase):
|
|||
"Cannot update non-float variables"):
|
||||
self.evaluate(
|
||||
distribution.experimental_local_results(
|
||||
distribution.experimental_run_v2(assign)))
|
||||
distribution.run(assign)))
|
||||
|
||||
# allow assign() with same value in replica context.
|
||||
@def_function.function
|
||||
|
@ -807,7 +807,7 @@ class MirroredVariableTest(test.TestCase, parameterized.TestCase):
|
|||
|
||||
self.evaluate(
|
||||
distribution.experimental_local_results(
|
||||
distribution.experimental_run_v2(assign_same)))
|
||||
distribution.run(assign_same)))
|
||||
self.assertEqual(self.evaluate(v.read_value()), 2)
|
||||
|
||||
# allow assign() with mirrored variable in replica context.
|
||||
|
@ -824,7 +824,7 @@ class MirroredVariableTest(test.TestCase, parameterized.TestCase):
|
|||
|
||||
self.evaluate(
|
||||
distribution.experimental_local_results(
|
||||
distribution.experimental_run_v2(assign_mirrored)))
|
||||
distribution.run(assign_mirrored)))
|
||||
self.assertEqual(self.evaluate(v.read_value()), 3)
|
||||
|
||||
# allow assign() in cross replica context.
|
||||
|
@ -912,7 +912,8 @@ class MirroredVariableTest(test.TestCase, parameterized.TestCase):
|
|||
def f():
|
||||
if v[0] is None:
|
||||
v[0] = variables_lib.Variable(random_ops.random_normal([]))
|
||||
distribution.experimental_run_v2(f)
|
||||
|
||||
distribution.run(f)
|
||||
|
||||
context.set_global_seed(None)
|
||||
step()
|
||||
|
@ -953,7 +954,7 @@ class MirroredVariableTest(test.TestCase, parameterized.TestCase):
|
|||
|
||||
@def_function.function
|
||||
def foo():
|
||||
distribution.experimental_run_v2(replica_fn)
|
||||
distribution.run(replica_fn)
|
||||
|
||||
foo()
|
||||
|
||||
|
@ -980,7 +981,7 @@ class MirroredVariableTest(test.TestCase, parameterized.TestCase):
|
|||
replica_id = ctx.replica_id_in_sync_group
|
||||
return v.assign(math_ops.cast(replica_id, dtypes.float32))
|
||||
per_replica_results = self.evaluate(distribution.experimental_local_results(
|
||||
distribution.experimental_run_v2(assign)))
|
||||
distribution.run(assign)))
|
||||
# The per-replica values should always match the first replicas value.
|
||||
self.assertAllEqual(
|
||||
array_ops.zeros(distribution.num_replicas_in_sync, dtypes.float32),
|
||||
|
@ -1006,7 +1007,7 @@ class MirroredVariableTest(test.TestCase, parameterized.TestCase):
|
|||
|
||||
per_replica_results = self.evaluate(
|
||||
distribution.experimental_local_results(
|
||||
distribution.experimental_run_v2(assign)))
|
||||
distribution.run(assign)))
|
||||
# The per-replica values should always match the first replicas value.
|
||||
self.assertAllEqual([3, 3], per_replica_results)
|
||||
|
||||
|
@ -1037,7 +1038,7 @@ class MirroredVariableTest(test.TestCase, parameterized.TestCase):
|
|||
|
||||
per_replica_results = self.evaluate(
|
||||
distribution.experimental_local_results(
|
||||
distribution.experimental_run_v2(scatter_sub)))
|
||||
distribution.run(scatter_sub)))
|
||||
self.assertAllEqual([[0., -1., -1.], [0., -1., -1.]], per_replica_results)
|
||||
|
||||
@combinations.generate(
|
||||
|
@ -1064,7 +1065,7 @@ class MirroredVariableTest(test.TestCase, parameterized.TestCase):
|
|||
|
||||
per_replica_results = self.evaluate(
|
||||
distribution.experimental_local_results(
|
||||
distribution.experimental_run_v2(scatter_add)))
|
||||
distribution.run(scatter_add)))
|
||||
self.assertAllEqual([[0, 2, 2], [0, 2, 2]], per_replica_results)
|
||||
|
||||
@combinations.generate(
|
||||
|
@ -1091,7 +1092,7 @@ class MirroredVariableTest(test.TestCase, parameterized.TestCase):
|
|||
|
||||
per_replica_results = self.evaluate(
|
||||
distribution.experimental_local_results(
|
||||
distribution.experimental_run_v2(scatter_div)))
|
||||
distribution.run(scatter_div)))
|
||||
self.assertAllEqual([[0, 2, 1], [0, 2, 1]], per_replica_results)
|
||||
|
||||
@combinations.generate(
|
||||
|
@ -1119,7 +1120,7 @@ class MirroredVariableTest(test.TestCase, parameterized.TestCase):
|
|||
|
||||
per_replica_results = self.evaluate(
|
||||
distribution.experimental_local_results(
|
||||
distribution.experimental_run_v2(scatter_mul)))
|
||||
distribution.run(scatter_mul)))
|
||||
self.assertAllClose([[2., 1.5, 1.], [2., 1.5, 1.]], per_replica_results)
|
||||
|
||||
@combinations.generate(
|
||||
|
@ -1148,11 +1149,11 @@ class MirroredVariableTest(test.TestCase, parameterized.TestCase):
|
|||
with self.assertRaisesRegex(NotImplementedError, "scatter_min.*"):
|
||||
self.evaluate(
|
||||
distribution.experimental_local_results(
|
||||
distribution.experimental_run_v2(scatter_min, args=(v1,))))
|
||||
distribution.run(scatter_min, args=(v1,))))
|
||||
|
||||
per_replica_results = self.evaluate(
|
||||
distribution.experimental_local_results(
|
||||
distribution.experimental_run_v2(scatter_min, args=(v2,))))
|
||||
distribution.run(scatter_min, args=(v2,))))
|
||||
self.assertAllClose([[0, 1, 0], [0, 1, 0]], per_replica_results)
|
||||
|
||||
@combinations.generate(
|
||||
|
@ -1181,11 +1182,11 @@ class MirroredVariableTest(test.TestCase, parameterized.TestCase):
|
|||
with self.assertRaisesRegex(NotImplementedError, "scatter_max.*"):
|
||||
self.evaluate(
|
||||
distribution.experimental_local_results(
|
||||
distribution.experimental_run_v2(scatter_max, args=(v1,))))
|
||||
distribution.run(scatter_max, args=(v1,))))
|
||||
|
||||
per_replica_results = self.evaluate(
|
||||
distribution.experimental_local_results(
|
||||
distribution.experimental_run_v2(scatter_max, args=(v2,))))
|
||||
distribution.run(scatter_max, args=(v2,))))
|
||||
self.assertAllClose([[1, 0, 0], [1, 0, 0]], per_replica_results)
|
||||
|
||||
@combinations.generate(
|
||||
|
@ -1214,11 +1215,11 @@ class MirroredVariableTest(test.TestCase, parameterized.TestCase):
|
|||
with self.assertRaisesRegex(NotImplementedError, "scatter_update.*"):
|
||||
self.evaluate(
|
||||
distribution.experimental_local_results(
|
||||
distribution.experimental_run_v2(scatter_update, args=(v1,))))
|
||||
distribution.run(scatter_update, args=(v1,))))
|
||||
|
||||
per_replica_results = self.evaluate(
|
||||
distribution.experimental_local_results(
|
||||
distribution.experimental_run_v2(scatter_update, args=(v2,))))
|
||||
distribution.run(scatter_update, args=(v2,))))
|
||||
self.assertAllClose([[0, 3, 0], [0, 3, 0]], per_replica_results)
|
||||
|
||||
@combinations.generate(
|
||||
|
@ -1314,7 +1315,7 @@ def mirrored_and_tpu_strategy_combinations():
|
|||
# tests.
|
||||
def strategy_and_run_tf_function_combinations():
|
||||
# Test the combination of different strategies and whether a tf.function
|
||||
# is passed into strategy.experimental_run_v2."""
|
||||
# is passed into strategy.run."""
|
||||
return combinations.combine(
|
||||
distribution=[
|
||||
strategy_combinations.mirrored_strategy_with_gpu_and_cpu,
|
||||
|
@ -1538,7 +1539,8 @@ class SyncOnReadVariableTest(test.TestCase, parameterized.TestCase):
|
|||
if experimental_run_tf_function:
|
||||
update_fn = def_function.function(update_fn)
|
||||
return distribution.experimental_local_results(
|
||||
distribution.experimental_run_v2(update_fn))
|
||||
distribution.run(update_fn))
|
||||
|
||||
updates = [("assign", 1.), ("assign_add", 1.), ("assign_sub", -1.)]
|
||||
aggregations = [
|
||||
variables_lib.VariableAggregation.NONE,
|
||||
|
@ -1574,7 +1576,8 @@ class SyncOnReadVariableTest(test.TestCase, parameterized.TestCase):
|
|||
if experimental_run_tf_function:
|
||||
update_fn = def_function.function(update_fn)
|
||||
return distribution.experimental_local_results(
|
||||
distribution.experimental_run_v2(update_fn))
|
||||
distribution.run(update_fn))
|
||||
|
||||
updates = [("assign", 1), ("assign_add", 1), ("assign_sub", -1)]
|
||||
aggregations = [
|
||||
variables_lib.VariableAggregation.NONE,
|
||||
|
@ -1648,7 +1651,7 @@ class SyncOnReadVariableTest(test.TestCase, parameterized.TestCase):
|
|||
read_var_fn = v.read_value
|
||||
results = self.evaluate(
|
||||
distribution.experimental_local_results(
|
||||
distribution.experimental_run_v2(read_var_fn)))
|
||||
distribution.run(read_var_fn)))
|
||||
for component, value in zip(v._values, results):
|
||||
self.assertAllEqual(self.evaluate(component.read_value()), value)
|
||||
|
||||
|
@ -1679,8 +1682,8 @@ class SyncOnReadVariableTest(test.TestCase, parameterized.TestCase):
|
|||
if experimental_run_tf_function:
|
||||
assign = def_function.function(assign)
|
||||
|
||||
self.evaluate(distribution.experimental_local_results(
|
||||
distribution.experimental_run_v2(assign)))
|
||||
self.evaluate(
|
||||
distribution.experimental_local_results(distribution.run(assign)))
|
||||
num_replicas = distribution.num_replicas_in_sync
|
||||
sum_of_replica_values = num_replicas * (num_replicas - 1) / 2.
|
||||
if aggregation == variables_lib.VariableAggregation.SUM:
|
||||
|
@ -1717,8 +1720,7 @@ class SyncOnReadVariableTest(test.TestCase, parameterized.TestCase):
|
|||
all_reduce = def_function.function(all_reduce)
|
||||
|
||||
per_replica_results = self.evaluate(
|
||||
distribution.experimental_local_results(
|
||||
distribution.experimental_run_v2(all_reduce)))
|
||||
distribution.experimental_local_results(distribution.run(all_reduce)))
|
||||
expected_result = []
|
||||
for i in range(distribution.num_replicas_in_sync):
|
||||
expected_result.append(2.0 * distribution.num_replicas_in_sync +
|
||||
|
@ -1750,8 +1752,7 @@ class SyncOnReadVariableTest(test.TestCase, parameterized.TestCase):
|
|||
assign = def_function.function(assign)
|
||||
|
||||
per_replica_results = self.evaluate(
|
||||
distribution.experimental_local_results(
|
||||
distribution.experimental_run_v2(assign)))
|
||||
distribution.experimental_local_results(distribution.run(assign)))
|
||||
expected_result = []
|
||||
for i in range(distribution.num_replicas_in_sync):
|
||||
expected_result.append(1.0 * i)
|
||||
|
@ -1781,7 +1782,8 @@ class SyncOnReadVariableTest(test.TestCase, parameterized.TestCase):
|
|||
v[0] = variables_lib.Variable(
|
||||
random_ops.random_normal([]),
|
||||
synchronization=variables_lib.VariableSynchronization.ON_READ)
|
||||
distribution.experimental_run_v2(f)
|
||||
|
||||
distribution.run(f)
|
||||
|
||||
context.set_global_seed(None)
|
||||
step()
|
||||
|
|
|
@ -134,8 +134,7 @@ class NormalizationTest(test.TestCase, parameterized.TestCase):
|
|||
optimizer.apply_gradients(zip(grads, bn.variables))
|
||||
return loss
|
||||
|
||||
return distribution.experimental_run_v2(
|
||||
step_fn, args=(inputs, targets))
|
||||
return distribution.run(step_fn, args=(inputs, targets))
|
||||
|
||||
for _ in range(100):
|
||||
np_output = train_step().numpy()
|
||||
|
@ -153,8 +152,7 @@ class NormalizationTest(test.TestCase, parameterized.TestCase):
|
|||
outputs = bn.apply(inputs, training=False)
|
||||
return outputs
|
||||
|
||||
return distribution.experimental_run_v2(
|
||||
step_fn, args=(inputs,))
|
||||
return distribution.run(step_fn, args=(inputs,))
|
||||
|
||||
# Test inference.
|
||||
self.assertAllEqual(np.zeros(shape=(0, 4, 4, 3), dtype=np.float32),
|
||||
|
|
|
@ -958,8 +958,7 @@ class ForwardpropTest(test.TestCase, parameterized.TestCase):
|
|||
strategy = mirrored_strategy.MirroredStrategy()
|
||||
with strategy.scope():
|
||||
v = variables.Variable([1., 2., 3.])
|
||||
strategy.experimental_run_v2(
|
||||
_replicated, args=(constant_op.constant([.1, -.2, .3]),))
|
||||
strategy.run(_replicated, args=(constant_op.constant([.1, -.2, .3]),))
|
||||
|
||||
# TODO(b/141025187): Add a no_new_pyobjects decorator.
|
||||
def testArgumentUnused(self):
|
||||
|
|
|
@ -533,7 +533,8 @@ class TestDistributionStrategyWithNumpyArrays(test.TestCase,
|
|||
return grad_v1, grad_v2
|
||||
if context.executing_eagerly():
|
||||
run_fn = def_function.function(run_fn)
|
||||
grad_v1, grad_v2 = distribution.experimental_run_v2(run_fn)
|
||||
|
||||
grad_v1, grad_v2 = distribution.run(run_fn)
|
||||
self.assertIsNotNone(grad_v1)
|
||||
self.assertIsNotNone(grad_v2)
|
||||
|
||||
|
@ -2057,8 +2058,7 @@ class TestDistributionStrategyWithKerasModels(test.TestCase,
|
|||
optimizer.apply_gradients(zip(grads, model.trainable_variables))
|
||||
return loss
|
||||
|
||||
per_replica_losses = distribution.experimental_run_v2(
|
||||
step_fn, args=(dist_inputs,))
|
||||
per_replica_losses = distribution.run(step_fn, args=(dist_inputs,))
|
||||
return distribution.reduce(
|
||||
reduce_util.ReduceOp.SUM, per_replica_losses, axis=None)
|
||||
|
||||
|
|
|
@ -863,8 +863,7 @@ def _make_execution_function_without_cloning(model, mode):
|
|||
# PerReplicas as arguments. On every replica inside this call, each
|
||||
# PerReplica object will return the value for that replica. The outputs
|
||||
# are PerReplicas too.
|
||||
outputs = strategy.experimental_run_v2(
|
||||
per_replica_function, args=(x, y, sample_weights))
|
||||
outputs = strategy.run(per_replica_function, args=(x, y, sample_weights))
|
||||
# Out of PerReplica outputs reduce or pick values to return.
|
||||
all_outputs = unwrap_outputs(
|
||||
strategy, outputs, with_loss_tensor=(mode != ModeKeys.PREDICT))
|
||||
|
|
|
@ -792,7 +792,7 @@ class GeneratorDataAdapter(DataAdapter):
|
|||
# Need to build the Model on concrete input shapes.
|
||||
if model is not None and not model.built:
|
||||
concrete_x, _, _ = unpack_x_y_sample_weight(peek)
|
||||
model.distribute_strategy.experimental_run_v2(
|
||||
model.distribute_strategy.run(
|
||||
lambda x: model(x, training=False), args=(concrete_x,))
|
||||
|
||||
self._first_batch_size = int(nest.flatten(peek)[0].shape[0])
|
||||
|
|
|
@ -500,7 +500,7 @@ class Model(network.Network, version_utils.ModelVersionSelector):
|
|||
|
||||
def train_function(iterator):
|
||||
data = next(iterator)
|
||||
outputs = self.distribute_strategy.experimental_run_v2(
|
||||
outputs = self.distribute_strategy.run(
|
||||
self.train_step, args=(data,))
|
||||
outputs = reduce_per_replica(
|
||||
outputs, self.distribute_strategy, reduction='first')
|
||||
|
@ -873,7 +873,7 @@ class Model(network.Network, version_utils.ModelVersionSelector):
|
|||
|
||||
def test_function(iterator):
|
||||
data = next(iterator)
|
||||
outputs = self.distribute_strategy.experimental_run_v2(
|
||||
outputs = self.distribute_strategy.run(
|
||||
self.test_step, args=(data,))
|
||||
outputs = reduce_per_replica(
|
||||
outputs, self.distribute_strategy, reduction='first')
|
||||
|
@ -1079,7 +1079,7 @@ class Model(network.Network, version_utils.ModelVersionSelector):
|
|||
|
||||
def predict_function(iterator):
|
||||
data = next(iterator)
|
||||
outputs = self.distribute_strategy.experimental_run_v2(
|
||||
outputs = self.distribute_strategy.run(
|
||||
self.predict_step, args=(data,))
|
||||
outputs = reduce_per_replica(
|
||||
outputs, self.distribute_strategy, reduction='concat')
|
||||
|
|
|
@ -338,7 +338,7 @@ def experimental_tpu_test_loop(model,
|
|||
return [array_ops.identity(out) for out in outputs]
|
||||
|
||||
test_input_data = iterator.get_next()
|
||||
per_replica_outputs = current_strategy.experimental_run_v2(
|
||||
per_replica_outputs = current_strategy.run(
|
||||
_test_step_fn, args=(test_input_data,))
|
||||
output_tensors = {}
|
||||
for label, output in zip(out_labels, per_replica_outputs):
|
||||
|
@ -488,7 +488,7 @@ def experimental_tpu_predict_loop(model,
|
|||
# use numpy arrays directly to avoid cumulating unnecessary input pipeline
|
||||
# ops.
|
||||
predict_input_data = iterator.get_next()
|
||||
per_replica_outputs = current_strategy.experimental_run_v2(
|
||||
per_replica_outputs = current_strategy.run(
|
||||
_predict_step_fn, args=(predict_input_data,))
|
||||
output_tensors = dist_utils.flatten_per_replica_values(
|
||||
current_strategy, per_replica_outputs)
|
||||
|
|
|
@ -46,7 +46,7 @@ class TemplateMirroredStrategyTest(test.TestCase):
|
|||
|
||||
strategy = mirrored_strategy.MirroredStrategy(["/cpu:0", "/gpu:0"])
|
||||
out = strategy.experimental_local_results(
|
||||
strategy.experimental_run_v2(temp))
|
||||
strategy.run(temp))
|
||||
|
||||
self.evaluate(variables.global_variables_initializer())
|
||||
self.assertAllEqual([42., 42.], self.evaluate(out))
|
||||
|
|
|
@ -57,7 +57,7 @@ class LossUtilitiesTest(test_lib.TestCase, parameterized.TestCase):
|
|||
|
||||
# With strategy - num replicas = 2
|
||||
with distribution.scope():
|
||||
per_replica_losses = distribution.experimental_run_v2(
|
||||
per_replica_losses = distribution.run(
|
||||
nn_impl.compute_average_loss, args=(per_example_loss,))
|
||||
loss = distribution.reduce("SUM", per_replica_losses, axis=None)
|
||||
self.assertAllClose(self.evaluate(loss), (2.5 + 6.2 + 5.) / 3)
|
||||
|
@ -71,7 +71,7 @@ class LossUtilitiesTest(test_lib.TestCase, parameterized.TestCase):
|
|||
def testComputeAverageLossSampleWeights(self, distribution):
|
||||
with distribution.scope():
|
||||
# Scalar sample weight
|
||||
per_replica_losses = distribution.experimental_run_v2(
|
||||
per_replica_losses = distribution.run(
|
||||
nn_impl.compute_average_loss,
|
||||
args=([2., 4., 6.],),
|
||||
kwargs={"sample_weight": 2})
|
||||
|
@ -79,7 +79,7 @@ class LossUtilitiesTest(test_lib.TestCase, parameterized.TestCase):
|
|||
self.assertAllClose(self.evaluate(loss), (2. + 4. + 6.) * 2. / 3)
|
||||
|
||||
# Per example sample weight
|
||||
per_replica_losses = distribution.experimental_run_v2(
|
||||
per_replica_losses = distribution.run(
|
||||
nn_impl.compute_average_loss,
|
||||
args=([2., 4., 6.],),
|
||||
kwargs={"sample_weight": [0.3, 0.5, 0.2]})
|
||||
|
@ -88,7 +88,7 @@ class LossUtilitiesTest(test_lib.TestCase, parameterized.TestCase):
|
|||
self.evaluate(loss), (2. * 0.3 + 4. * 0.5 + 6. * 0.2) / 3)
|
||||
|
||||
# Time-step sample weight
|
||||
per_replica_losses = distribution.experimental_run_v2(
|
||||
per_replica_losses = distribution.run(
|
||||
nn_impl.compute_average_loss,
|
||||
args=([[2., 0.5], [4., 1.]],),
|
||||
kwargs={"sample_weight": [[0.3, 0.7], [0.2, 0.8]]})
|
||||
|
@ -114,7 +114,7 @@ class LossUtilitiesTest(test_lib.TestCase, parameterized.TestCase):
|
|||
with distribution.scope():
|
||||
per_example_loss = constant_op.constant([2., 4., 6.],
|
||||
dtype=dtypes.float64)
|
||||
per_replica_losses = distribution.experimental_run_v2(
|
||||
per_replica_losses = distribution.run(
|
||||
nn_impl.compute_average_loss,
|
||||
args=(per_example_loss,),
|
||||
kwargs={"sample_weight": 2})
|
||||
|
@ -169,7 +169,7 @@ class LossUtilitiesTest(test_lib.TestCase, parameterized.TestCase):
|
|||
|
||||
# With strategy - num replicas = 2
|
||||
with distribution.scope():
|
||||
per_replica_losses = distribution.experimental_run_v2(
|
||||
per_replica_losses = distribution.run(
|
||||
nn_impl.scale_regularization_loss, args=(reg_losses,))
|
||||
loss = distribution.reduce("SUM", per_replica_losses, axis=None)
|
||||
self.assertAllClose(self.evaluate(loss), (2.5 + 6.2 + 5.))
|
||||
|
|
|
@ -687,7 +687,7 @@ def outside_compilation(computation, *args, **kwargs):
|
|||
`tf.tpu.outside_compilation()` should be called inside a function that is
|
||||
passed to `tpu.split_compile_and_replicate()` -- this is implied when
|
||||
outside compilation is invoked inside a function passed to TPUStrategy
|
||||
`experimental_run_v2()`. If invoked outside of TPUReplicateContext,
|
||||
`run()`. If invoked outside of TPUReplicateContext,
|
||||
then this simply returns the result of `computation`, and therefore,
|
||||
would be a no-op. Note that outside compilation is different from
|
||||
`tf.distribute.experimental.TPUStrategy.merge_call()` as logic in
|
||||
|
|
|
@ -302,10 +302,11 @@ def _compute_gradients_until_finite(
|
|||
return grads
|
||||
|
||||
# Switch to a replica-context to compute gradients once per replica.
|
||||
grads = distribution.experimental_run_v2(
|
||||
replica_fn, args=(loss_scale_gradient_tapes, target, flattened_sources,
|
||||
output_gradients, initial_grads))
|
||||
# Check for non-finite gradients possibly resulting from scaling.
|
||||
grads = distribution.run(
|
||||
replica_fn,
|
||||
args=(loss_scale_gradient_tapes, target, flattened_sources,
|
||||
output_gradients, initial_grads))
|
||||
# Check for non-finite gradients possibly resulting from scaling
|
||||
_, ready_to_update = loss_scale.update(grads)
|
||||
is_first_iteration = False
|
||||
return grads, ready_to_update, is_first_iteration
|
||||
|
|
|
@ -54,7 +54,7 @@ class LossScaleGradientTapeTest(test.TestCase, parameterized.TestCase):
|
|||
def _run_with_strategy(self, run_fn, strategy, use_tf_function=False):
|
||||
"""Runs `run_fn` under the DistributionStrategy `strategy`.
|
||||
|
||||
Runs `run_fn` with `strategy.experimental_run_v2`. Returns a list of the
|
||||
Runs `run_fn` with `strategy.run`. Returns a list of the
|
||||
return values of `run_fn`, one per replica.
|
||||
|
||||
Args:
|
||||
|
@ -67,7 +67,7 @@ class LossScaleGradientTapeTest(test.TestCase, parameterized.TestCase):
|
|||
replica. If a nested structure is returned from `run_fn`, returns a
|
||||
nested structure, where each element is a list of tensors.
|
||||
"""
|
||||
strategy_fn = lambda: strategy.experimental_run_v2(run_fn)
|
||||
strategy_fn = lambda: strategy.run(run_fn)
|
||||
if use_tf_function:
|
||||
strategy_fn = def_function.function(strategy_fn)
|
||||
|
||||
|
|
|
@ -64,6 +64,10 @@ tf_class {
|
|||
name: "reduce"
|
||||
argspec: "args=[\'self\', \'reduce_op\', \'value\', \'axis\'], varargs=None, keywords=None, defaults=[\'None\'], "
|
||||
}
|
||||
member_method {
|
||||
name: "run"
|
||||
argspec: "args=[\'self\', \'fn\', \'args\', \'kwargs\', \'options\'], varargs=None, keywords=None, defaults=[\'()\', \'None\', \'None\'], "
|
||||
}
|
||||
member_method {
|
||||
name: "scope"
|
||||
argspec: "args=[\'self\'], varargs=None, keywords=None, defaults=None"
|
||||
|
|
|
@ -64,6 +64,10 @@ tf_class {
|
|||
name: "reduce"
|
||||
argspec: "args=[\'self\', \'reduce_op\', \'value\', \'axis\'], varargs=None, keywords=None, defaults=[\'None\'], "
|
||||
}
|
||||
member_method {
|
||||
name: "run"
|
||||
argspec: "args=[\'self\', \'fn\', \'args\', \'kwargs\', \'options\'], varargs=None, keywords=None, defaults=[\'()\', \'None\', \'None\'], "
|
||||
}
|
||||
member_method {
|
||||
name: "scope"
|
||||
argspec: "args=[\'self\'], varargs=None, keywords=None, defaults=None"
|
||||
|
|
|
@ -63,6 +63,10 @@ tf_class {
|
|||
name: "reduce"
|
||||
argspec: "args=[\'self\', \'reduce_op\', \'value\', \'axis\'], varargs=None, keywords=None, defaults=[\'None\'], "
|
||||
}
|
||||
member_method {
|
||||
name: "run"
|
||||
argspec: "args=[\'self\', \'fn\', \'args\', \'kwargs\', \'options\'], varargs=None, keywords=None, defaults=[\'()\', \'None\', \'None\'], "
|
||||
}
|
||||
member_method {
|
||||
name: "scope"
|
||||
argspec: "args=[\'self\'], varargs=None, keywords=None, defaults=None"
|
||||
|
|
|
@ -64,6 +64,10 @@ tf_class {
|
|||
name: "reduce"
|
||||
argspec: "args=[\'self\', \'reduce_op\', \'value\', \'axis\'], varargs=None, keywords=None, defaults=[\'None\'], "
|
||||
}
|
||||
member_method {
|
||||
name: "run"
|
||||
argspec: "args=[\'self\', \'fn\', \'args\', \'kwargs\', \'options\'], varargs=None, keywords=None, defaults=[\'()\', \'None\', \'None\'], "
|
||||
}
|
||||
member_method {
|
||||
name: "scope"
|
||||
argspec: "args=[\'self\'], varargs=None, keywords=None, defaults=None"
|
||||
|
|
|
@ -64,6 +64,10 @@ tf_class {
|
|||
name: "reduce"
|
||||
argspec: "args=[\'self\', \'reduce_op\', \'value\', \'axis\'], varargs=None, keywords=None, defaults=[\'None\'], "
|
||||
}
|
||||
member_method {
|
||||
name: "run"
|
||||
argspec: "args=[\'self\', \'fn\', \'args\', \'kwargs\', \'options\'], varargs=None, keywords=None, defaults=[\'()\', \'None\', \'None\'], "
|
||||
}
|
||||
member_method {
|
||||
name: "scope"
|
||||
argspec: "args=[\'self\'], varargs=None, keywords=None, defaults=None"
|
||||
|
|
|
@ -64,6 +64,10 @@ tf_class {
|
|||
name: "reduce"
|
||||
argspec: "args=[\'self\', \'reduce_op\', \'value\', \'axis\'], varargs=None, keywords=None, defaults=[\'None\'], "
|
||||
}
|
||||
member_method {
|
||||
name: "run"
|
||||
argspec: "args=[\'self\', \'fn\', \'args\', \'kwargs\', \'options\'], varargs=None, keywords=None, defaults=[\'()\', \'None\', \'None\'], "
|
||||
}
|
||||
member_method {
|
||||
name: "scope"
|
||||
argspec: "args=[\'self\'], varargs=None, keywords=None, defaults=None"
|
||||
|
|
|
@ -68,6 +68,10 @@ tf_class {
|
|||
name: "reduce"
|
||||
argspec: "args=[\'self\', \'reduce_op\', \'value\', \'axis\'], varargs=None, keywords=None, defaults=[\'None\'], "
|
||||
}
|
||||
member_method {
|
||||
name: "run"
|
||||
argspec: "args=[\'self\', \'fn\', \'args\', \'kwargs\', \'options\'], varargs=None, keywords=None, defaults=[\'()\', \'None\', \'None\'], "
|
||||
}
|
||||
member_method {
|
||||
name: "scope"
|
||||
argspec: "args=[\'self\'], varargs=None, keywords=None, defaults=None"
|
||||
|
|
|
@ -80,6 +80,10 @@ tf_class {
|
|||
name: "reduce"
|
||||
argspec: "args=[\'self\', \'reduce_op\', \'value\', \'axis\'], varargs=None, keywords=None, defaults=None"
|
||||
}
|
||||
member_method {
|
||||
name: "run"
|
||||
argspec: "args=[\'self\', \'fn\', \'args\', \'kwargs\', \'options\'], varargs=None, keywords=None, defaults=[\'()\', \'None\', \'None\'], "
|
||||
}
|
||||
member_method {
|
||||
name: "scope"
|
||||
argspec: "args=[\'self\'], varargs=None, keywords=None, defaults=None"
|
||||
|
|
|
@ -80,6 +80,10 @@ tf_class {
|
|||
name: "reduce"
|
||||
argspec: "args=[\'self\', \'reduce_op\', \'value\', \'axis\'], varargs=None, keywords=None, defaults=None"
|
||||
}
|
||||
member_method {
|
||||
name: "run"
|
||||
argspec: "args=[\'self\', \'fn\', \'args\', \'kwargs\', \'options\'], varargs=None, keywords=None, defaults=[\'()\', \'None\', \'None\'], "
|
||||
}
|
||||
member_method {
|
||||
name: "scope"
|
||||
argspec: "args=[\'self\'], varargs=None, keywords=None, defaults=None"
|
||||
|
|
|
@ -79,6 +79,10 @@ tf_class {
|
|||
name: "reduce"
|
||||
argspec: "args=[\'self\', \'reduce_op\', \'value\', \'axis\'], varargs=None, keywords=None, defaults=None"
|
||||
}
|
||||
member_method {
|
||||
name: "run"
|
||||
argspec: "args=[\'self\', \'fn\', \'args\', \'kwargs\', \'options\'], varargs=None, keywords=None, defaults=[\'()\', \'None\', \'None\'], "
|
||||
}
|
||||
member_method {
|
||||
name: "scope"
|
||||
argspec: "args=[\'self\'], varargs=None, keywords=None, defaults=None"
|
||||
|
|
|
@ -80,6 +80,10 @@ tf_class {
|
|||
name: "reduce"
|
||||
argspec: "args=[\'self\', \'reduce_op\', \'value\', \'axis\'], varargs=None, keywords=None, defaults=None"
|
||||
}
|
||||
member_method {
|
||||
name: "run"
|
||||
argspec: "args=[\'self\', \'fn\', \'args\', \'kwargs\', \'options\'], varargs=None, keywords=None, defaults=[\'()\', \'None\', \'None\'], "
|
||||
}
|
||||
member_method {
|
||||
name: "scope"
|
||||
argspec: "args=[\'self\'], varargs=None, keywords=None, defaults=None"
|
||||
|
|
|
@ -80,6 +80,10 @@ tf_class {
|
|||
name: "reduce"
|
||||
argspec: "args=[\'self\', \'reduce_op\', \'value\', \'axis\'], varargs=None, keywords=None, defaults=None"
|
||||
}
|
||||
member_method {
|
||||
name: "run"
|
||||
argspec: "args=[\'self\', \'fn\', \'args\', \'kwargs\', \'options\'], varargs=None, keywords=None, defaults=[\'()\', \'None\', \'None\'], "
|
||||
}
|
||||
member_method {
|
||||
name: "scope"
|
||||
argspec: "args=[\'self\'], varargs=None, keywords=None, defaults=None"
|
||||
|
|
|
@ -80,6 +80,10 @@ tf_class {
|
|||
name: "reduce"
|
||||
argspec: "args=[\'self\', \'reduce_op\', \'value\', \'axis\'], varargs=None, keywords=None, defaults=None"
|
||||
}
|
||||
member_method {
|
||||
name: "run"
|
||||
argspec: "args=[\'self\', \'fn\', \'args\', \'kwargs\', \'options\'], varargs=None, keywords=None, defaults=[\'()\', \'None\', \'None\'], "
|
||||
}
|
||||
member_method {
|
||||
name: "scope"
|
||||
argspec: "args=[\'self\'], varargs=None, keywords=None, defaults=None"
|
||||
|
|
|
@ -80,6 +80,10 @@ tf_class {
|
|||
name: "reduce"
|
||||
argspec: "args=[\'self\', \'reduce_op\', \'value\', \'axis\'], varargs=None, keywords=None, defaults=None"
|
||||
}
|
||||
member_method {
|
||||
name: "run"
|
||||
argspec: "args=[\'self\', \'fn\', \'args\', \'kwargs\', \'options\'], varargs=None, keywords=None, defaults=[\'()\', \'None\', \'None\'], "
|
||||
}
|
||||
member_method {
|
||||
name: "scope"
|
||||
argspec: "args=[\'self\'], varargs=None, keywords=None, defaults=None"
|
||||
|
|
|
@ -829,7 +829,7 @@ class TFAPIChangeSpec(ast_edits.NoUpdateSpec):
|
|||
"custom training loop, note the following changes in methods: "
|
||||
"make_dataset_iterator->experimental_distribute_dataset, "
|
||||
"experimental_make_numpy_iterator->experimental_make_numpy_dataset, "
|
||||
"extended.call_for_each_replica->experimental_run_v2, "
|
||||
"extended.call_for_each_replica->run, "
|
||||
"reduce requires an axis argument, "
|
||||
"unwrap->experimental_local_results "
|
||||
"experimental_initialize and experimental_finalize no longer needed ")
|
||||
|
|
Loading…
Reference in New Issue