В чем разница между tf.group и tf.control_dependencies?

Помимо tf.control_dependencies, являющегося менеджером контекста (т.е. используемым с Python with), какая разница между tf.group и tf.control_dependencies?

Когда следует использовать?

Неужели tf.group не имеет определенного порядка операций? Я бы предположил, что tf.group([op_1, op_2, op_3]) выполняет ops в порядке списка, но, возможно, это не так? В docstring не указано поведение.

Ответ 1

Если вы посмотрите на graphdef, c=tf.group(a, b) выдает тот же график, что и

with tf.control_dependencies([a, b]):
    c = tf.no_op() 

Нет конкретного порядка, в котором будут выполняться операции ops, TensorFlow пытается выполнить операции как только это возможно (то есть параллельно).

Ответ 2

Просто добавив несколько незначительных моментов в ответ @Ярослав-Булатов.

Как видно из ответа Ярослава:

  • tf.control_depenencies сам по себе не создает никаких операций и добавляет зависимости к любым операциям, которые вы создаете внутри своей области видимости.
  • tf.group создает одну tf.group (типа NoOp), добавляет зависимости к этой операции.

Что еще более важно, если аргументы tf.group принадлежат нескольким устройствам, tf.group вставит промежуточный слой между своими входами и возвращаемым узлом. Этот слой будет содержать один узел на устройство, так что зависимости организуются по устройству. Это может уменьшить поток данных между устройствами.

Поэтому, если ваши зависимости находятся на нескольких устройствах, tf.group добавляет (возможно, критическую) оптимизацию.

С другой стороны, tf.control_dependencies поддерживает вложение: внутренний контекст добавит зависимости в объединение всех операций во внешних контекстах.