【问题标题】:Unexpected (random) execution order using tf.control_dependencies (tensorflow v1)使用 tf.control_dependencies (tensorflow v1) 的意外(随机)执行顺序
【发布时间】:2020-10-20 03:47:33
【问题描述】:

当我运行以下代码 (tf v1.12.0) 时,我得到 6.0 (x->mul->ident)、7.0 (x->mul->add->ident 或 9.0 (x->add ->mul->ident)。

有人可以解释为什么操作的执行顺序不受 tf.control_dependencies 控制吗?我认为至少 add_op 会在控制上下文中的任何内容被考虑之前执行。

tf.reset_default_graph()

x=tf.Variable(2.0)
add_op = tf.assign_add(x, 1)
mul_op = tf.assign(x, 3*x)

with tf.control_dependencies([add_op]):
    out_op = tf.identity(mul_op)

init_op = tf.global_variables_initializer()

with tf.Session() as sess:
    sess.run(init_op)
    print(sess.run([out_op]))

谢谢!

【问题讨论】:

    标签: tensorflow graph dependencies execution order-of-execution


    【解决方案1】:

    这是因为mul_op 不依赖于add_op。相反,out_op 依赖于 mul_op(作为显式输入)和 add_op 作为控制依赖项。在 TensorFlow 1.x 中(以及在 tf.Graph 上下文中的 TensorFlow 2.x 中),Python 中的操作顺序不会影响 TensorFlow 运行时中的操作顺序 em>。

    要强制执行上述示例的确定性行为,有几个选项。

    1. 使用add_optf.control_dependencies 上下文中构造mul_op
    add_op = tf.assign_add(x, 1)
    with tf.control_dependencies([add_op]):
      mul_op = tf.assign(x, 3 * x)
    
    1. mul_op 将加法的输出 (add_op) 作为输入。
    add_op = tf.assign_add(x, 1)
    mul_op = tf.assign(x, 3 * add_op)
    
    1. 从身份操作中移除控制依赖,并显式调用 out_opadd_op 上的 sess.run()。
    x=tf.Variable(2.0)
    add_op = tf.assign_add(x, 1)
    mul_op = tf.assign(x, 3*x)
    out_op = tf.identity(mul_op)
    init_op = tf.global_variables_initializer()
    with tf.Session() as sess:
        sess.run(init_op)
        sess.run(add_op)
        print(sess.run(out_op))
    

    这些总是返回9.0

    要深入了解真正并查看图中的依赖关系,您可以尝试:

    tf.get_default_graph().as_graph_def()
    

    查看图中每个节点的input 值是什么。

    【讨论】:

    • 感谢您的回答!澄清一下,这是否意味着 mul_op 和 add_op 之间没有设定的执行顺序(除了它们都必须在 out_op 之前执行)?我知道这将如何解释“7”和“9”输出,但是“6”呢?在这种情况下,似乎 out_op 在 add_op 之前执行
    • 更新了答案以指定更多选项,但是是的:Python 源代码中的操作顺序确实影响 TensorFlow 执行的操作顺序。当变量x 是操作的输入时,它隐式调用x.read_value()。可能为mul_op 读取的变量(因为out_op 直接依赖于它而被执行)发生在之前 add_op 被执行(out_op 依赖于通过控制部门),导致分配2.0 * 3。由于缺乏依赖关系,这可以被认为是读写竞争条件。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-03-05
    • 1970-01-01
    • 2023-03-19
    • 2012-06-27
    • 1970-01-01
    • 2020-09-11
    • 1970-01-01
    相关资源
    最近更新 更多