В чем разница между 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
поддерживает вложение: внутренний контекст добавит зависимости в объединение всех операций во внешних контекстах.