Se usó la API de Cloud Translation para traducir esta página.
Switch to English

tf.CriticalSection

TensorFlow 1 versión Ver código fuente en GitHub

Sección crítica.

A CriticalSection objeto es un recurso en el gráfico que se ejecuta subgraphs en orden serial. Un ejemplo común de un subgrafo uno puede desear para funcionar exclusivamente es la dada por la siguiente función:

 v = resource_variable_ops.ResourceVariable(0.0, name="v")

def count():
  value = v.read_value()
  with tf.control_dependencies([value]):
    with tf.control_dependencies([v.assign_add(1)]):
      return tf.identity(value)
 

Aquí, una instantánea de v es capturado en value ; y luego v se actualiza. se devuelve el valor de instantáneas.

Si varios trabajadores o hilos se ejecutan todas count en paralelo, no hay garantía de que el acceso a la variable v es atómica en cualquier punto dentro de los cálculos de cualquier tema de count . De hecho, incluso la implementación de un contador atómica que garantiza que el usuario verá cada valor de 0, 1, ..., es imposible en la actualidad.

La solución es para asegurar que cualquier acceso al recurso subyacente v solamente se procesa a través de una sección crítica:

 cs = CriticalSection()
f1 = cs.execute(count)
f2 = cs.execute(count)
output = f1 + f2
session.run(output)
 

Las funciones f1 y f2 se ejecutarán en serie, y cambios a v serán atómica.

NOTAS

Todos los objetos de recursos, incluyendo la sección crítica y cualquier variable capturados de funciones ejecutadas en esa sección crítica, serán colocated al mismo dispositivo (host y cpu / GPU).

Cuando se utilizan varias secciones críticas de los mismos recursos, no hay ninguna garantía de acceso exclusivo a esos recursos. Este comportamiento está desactivado por defecto (pero ver la kwarg exclusive_resource_access ).

Por ejemplo, se ejecuta la misma función en dos secciones críticas separadas no se asegurará de ejecución en serie:

 v = tf.compat.v1.get_variable("v", initializer=0.0, use_resource=True)
def accumulate(up):
  x = v.read_value()
  with tf.control_dependencies([x]):
    with tf.control_dependencies([v.assign_add(up)]):
      return tf.identity(x)
ex1 = CriticalSection().execute(
  accumulate, 1.0, exclusive_resource_access=False)
ex2 = CriticalSection().execute(
  accumulate, 1.0, exclusive_resource_access=False)
bad_sum = ex1 + ex2
sess.run(v.initializer)
sess.run(bad_sum)  # May return 0.0
 

name

Métodos

execute

Ver fuente

Ejecutar la función fn() dentro de la sección crítica.

fn no debe aceptar ningún argumento. Para añadir argumentos adicionales a cuando se llama a fn en la sección crítica, crear una lambda:

 critical_section.execute(lambda: fn(*my_args, **my_kwargs))
 

args
fn La función a ejecutar. Debe devolver al menos un tensor.
exclusive_resource_access Si los recursos requeridos por fn deben ser exclusivos de esta CriticalSection . Por defecto: True . Es posible que desee establecer esto en False si va a acceder a un recurso en modo de sólo lectura en dos CriticalSections diferentes.
name El nombre que se utilizará al crear la operación de ejecutar.

Devoluciones
Los tensores de regresar de fn() .

aumentos
ValueError Si fn intentos para bloquear esta CriticalSection en cualquier forma anidada o perezoso que pueden causar un callejón sin salida.
ValueError Si exclusive_resource_access == True y otra CriticalSection tiene una ejecución solicitando los mismos recursos que fn . Note, even if exclusive_resource_access is verdadera , if another execution in another Sección Crítica was created without exclusive_resource_access = True , a será levantado ValueError`.