此页面由 Cloud Translation API 翻译。
Switch to English

tf.distribute.StrategyExtended

TensorFlow 1版 GitHub上查看源代码

对于需要为配送感知算法额外的API。

此页面上的功能的一些常见的用例:

  • 局部性

tf.distribute.DistributedValues可具有相同的局部性作为分布式可变 ,这导致镜像值位于同一设备作为变量上(相对于计算设备)。这样的值可以被传递到一个呼叫tf.distribute.StrategyExtended.update来更新变量的值。您可以使用tf.distribute.StrategyExtended.colocate_vars_with提供可变的同一地点的另一个变量。您可以通过使用转换“PerReplica”值变量的地方tf.distribute.StrategyExtended.reduce_totf.distribute.StrategyExtended.batch_reduce_to

  • 如何更新一个分布式可变

分布式变量是在多个设备上创建的变量。正如所讨论的词汇表 ,镜像变量和SyncOnRead变量是两个例子。更新分布式变量的标准模式是:

  1. 在你的函数传递给tf.distribute.Strategy.run ,计算的(更新变量)对的列表。例如,该更新可能是损失相对于可变的梯度。
  2. 切换到横副本模式下通过调用tf.distribute.get_replica_context().merge_call()与更新和变量作为自变量。
  3. 呼叫tf.distribute.StrategyExtended.reduce_to(VariableAggregation.SUM, t, v)一个变量)或tf.distribute.StrategyExtended.batch_reduce_to (对于变量列表)来总结更新。
  4. 呼叫tf.distribute.StrategyExtended.update(v)每个变量来更新它的值。

步骤2至4会自动类完成tf.keras.optimizers.Optimizer如果你调用它的tf.keras.optimizers.Optimizer.apply_gradients在副本方面的方法。

事实上,一个更高级别的解决方案来更新分布式变量是通过调用assign上,你会做一个普通的变量tf.Variable 。您可以拨打这两个副本背景交叉复制方面的方法。对于镜像变量 ,要求assign副本方面需要你指定aggregation在变量构造类型。在这种情况下,上下文切换和同步在步骤2到4为要处理的说明。如果调用assign上的横复制品上下文 镜像变量 ,就只能分配从另一个镜像变量或镜像的单个值或值分配tf.distribute.DistributedValues 。对于SyncOnRead变量 ,在副本方面 ,你可以简单地调用assign它,并在引擎盖下没有聚集发生。在跨副本背景下 ,你只能分配一个值到SyncOnRead变量。一个示例情况下,从检查点恢复:如果aggregation的变量的类型是tf.VariableAggregation.SUM ,假定加入检查点之前,所以在恢复,该值是由副本的数量划分的时间复制品值然后分配给每个复制品;如果aggregation型是tf.VariableAggregation.MEAN ,该值被分配给每个复制品直接。

experimental_require_static_shapes 返回True如果需要静态形状; False否则。
parameter_devices 返回用于地方变量的所有设备的元组。
worker_devices 返回用于为计算副本执行所有设备的元组。

方法

batch_reduce_to

查看源代码

将多个reduce_to呼叫到一个更快的执行。

ARGS
reduce_op 原型,实例tf.distribute.ReduceOp枚举。
value_destination_pairs 的(值,目的地)对序列。见reduce_to()的描述。
experimental_hints 一个tf.distrbute.experimental.CollectiveHints 。提示进行共同操作。

返回
镜像值,在每对中的一个的列表value_destination_pairs

colocate_vars_with

查看源代码

范围控制哪些设备变量将上创建。

没有操作应该被添加到该范围内的图形,它应该只创建变量时使用(一些实现通过改变变量创建工作,别人用tf.compat.v1.colocate_with()的范围内工作)。

这可以仅用于内部self.scope()

实例:

 with strategy.scope():
  var1 = tf.Variable(...)
  with strategy.extended.colocate_vars_with(var1):
    # var2 and var3 will be created on the same device(s) as var1
    var2 = tf.Variable(...)
    var3 = tf.Variable(...)

  def fn(v1, v2, v3):
    # operates on v1 from var1, v2 from var2, and v3 from var3

  # `fn` runs on every device `var1` is on, `var2` and `var3` will be there
  # too.
  strategy.extended.update(var1, fn, args=(var2, var3))
 

ARGS
colocate_with_variable 在这一战略的创建的变量scope()而在返回的上下文管理器创建的变量将在同一组设备作为colocate_with_variable

返回
上下文管理者。

reduce_to

查看源代码

结合(例如,通过和或均值)跨副本值。

ARGS
reduce_op 原型,实例tf.distribute.ReduceOp枚举。
value 一个以每一复制品值每个副本一个值。
destinations 甲镜像变量,每个复制品张量或设备的字符串。返回值将被复制到所有目的地设备(或全部,其中所述设备destinations值位于)。要执行所有还原,传递valuedestinations
experimental_hints 一个tf.distrbute.experimental.CollectiveHints 。提示进行共同操作。

返回
甲张量或值镜像到destinations

update

查看源代码

运行fn到更新var使用镜像到同一设备的输入。

tf.distribute.StrategyExtended.update需要分布式可变var进行更新,更新函数fn ,和argskwargsfn 。它适用fn到的每个部件可变var和使从对应的值argskwargs 。既不args也不kwargs可以含有每复制品值。如果它们包含镜像值,他们会打电话之前展开的fn 。例如, fnassign_addargs可以是镜像DistributedValues,其中每个组件包含要被添加到该镜像变量的值var 。调用update将调用assign_add上的每个部件变量var与该设备上的对应的张量的值。

实例:

 strategy = tf.distribute.MirroredStrategy(['/gpu:0', '/gpu:1']) # With 2 devices
with strategy.scope():
  v = tf.Variable(5.0, aggregation=tf.VariableAggregation.SUM)
def update_fn(v):
  return v.assign(1.0)
result = strategy.extended.update(v, update_fn)
# result is
# Mirrored:{
#  0: tf.Tensor(1.0, shape=(), dtype=float32),
#  1: tf.Tensor(1.0, shape=(), dtype=float32)
# }
 

如果var被跨多个设备,那么此方法实现逻辑如下镜像:

 results = {}
for device, v in var:
  with tf.device(device):
    # args and kwargs will be unwrapped if they are mirrored.
    results[device] = fn(v, *args, **kwargs)
return merged(results)
 

否则,此方法返回fn(var, *args, **kwargs)与同位var

ARGS
var 变量,可能镜像到多个设备,操作上。
fn 要调用的函数。应变量作为第一个参数。
args 元组或列表。附加的位置参数,以传递给fn()
kwargs 字典与关键字参数传递给fn()
group 布尔。默认设置为True。如果假,返回值将是解开。

返回
默认情况下,合并后的返回值fn所有副本。合并后的结果具有依赖性,以确保如果在所有的评估,副作用(更新)会发生在每个副本。如果指定代替“组=假”时,这个函数将返回列表的巢,其中每个列表具有每个副本的元素,并且呼叫者负责确保被执行的所有元素。

value_container

查看源代码

返回此每个副本容器value属于。

ARGS
value 由返回的值run()或创建的变量scope()

返回
一个容器, value属于。如果值不属于任何容器(包括容器,其具有被破坏的情况下),返回值本身。 value in experimental_local_results(value_container(value))将永远是正确的。

variable_created_in_scope

查看源代码

测试是否v而这一战略范围是积极创建。

战略范围内创建变量“拥有”的吧:

strategy = tf.distribute.MirroredStrategy()
with strategy.scope():
  v = tf.Variable(1.)
strategy.extended.variable_created_in_scope(v)
True

战略不是由它独资之外创建变量:

strategy = tf.distribute.MirroredStrategy()
v = tf.Variable(1.)
strategy.extended.variable_created_in_scope(v)
False

ARGS
v 一个tf.Variable实例。

返回
真要是v是范围内创建的,否则为False。