Распределенный тензорный поток: разница между репликацией внутри графика и репликацией между графиками

Я запутался в двух концепциях: In-graph replication и Between-graph replication при чтении реплицированного обучения в официальном How-to.

  • В приведенной выше ссылке сказано, что

    Репликация в графе.. В этом подходе клиент строит один tf.Graph, содержащий один набор параметров (в tf.Variable node прикрепленный к /job: ps);...

    Означает ли это, что существует multiple tf.Graph в подходе Between-graph replication? Если да, то где соответствующие коды в приведенные примеры?

  • Хотя в приведенной выше ссылке уже есть пример Between-graph replication, может ли кто-нибудь предоставить In-graph replication реализация (псевдокод в порядке) и выделить ее основные отличия от Between-graph replication?

    Спасибо заранее!


Edit_1: больше вопросов

Большое спасибо за подробные объяснения и gist-код @mrry @YaroslavBulatov! После просмотра   ваши ответы, у меня есть следующие два вопроса:

  1. В реплицированное обучение:

    Репликация между графами.. В этом подходе есть отдельный клиент для каждой задачи/работы: рабочий, обычно в том же процессе, что и работника. Каждый клиент создает похожий граф, содержащий параметры (привязанные к /job: ps, как и раньше) tf.train.replica_device_setter(), чтобы определить их детерминистически те же задачи); и одиночная копия вычислительно-интенсивной части модель, привязанная к локальной задаче в /job: worker.

    У меня есть два дополнительных вопроса, связанных с вышеприведенными словами, выделенными жирным шрифтом.

    (A) Почему мы говорим, что каждый клиент строит похожий граф, но не тот же граф? Интересно, что граф построен в каждом клиенте в примере Реплицированное обучение должны быть одинаковыми, потому что приведенные ниже схемы построения графика разделяются во всех worker s.:

    # Build model...

    loss = ...

    global_step = tf.Variable(0)

    (B) Не должно быть нескольких копий вычислительно-интенсивной части модель, так как мы имеем несколько workers?

  2. Представлен ли пример в Replicated training обучение на нескольких машинах, каждый из которых имеет несколько графических процессоров? Если нет, можем ли мы используйте одновременно In-graph replication для поддержки обучения по нескольким GPU на каждой машине и Between-graph replication для кросс-машинное обучение? Я задаю этот вопрос, потому что @mrry указал, что In-graph replication по существу тот же путь используется в примерная модель CIFAR-10 для нескольких графических процессоров.

Ответ 1

Прежде всего, для некоторого исторического контекста "репликация в графе" - это первый подход, который мы пытались использовать в TensorFlow, и он не достиг производительности, который требуется многим пользователям, поэтому более сложный подход "между графиками" является рекомендуемым в настоящее время способом проведения распределенного обучения. Библиотеки более высокого уровня, такие как tf.learn, используют подход "между графиками" для распределенного обучения.

Чтобы ответить на ваши конкретные вопросы:

  • Означает ли это, что в межгранусном графике имеется несколько tf.Graphрепликация? Если да, где указаны соответствующие коды в приведенных примерах?

    Да. Типичная установка репликации между графами будет использовать отдельный процесс TensorFlow для каждой рабочей реплики, и каждый из них будет создавать отдельный tf.Graph для модели. Обычно каждый процесс использует глобальный график по умолчанию (доступный через tf.get_default_graph()), и он не создается явно.

    (В принципе, вы можете использовать один процесс TensorFlow с теми же объектами tf.Graph и multiple tf.Session, которые используют один и тот же базовый граф, если вы настроили параметр tf.ConfigProto.device_filters для каждого сеанса по-разному, но это это необычная настройка.)

  • Хотя в приведенной выше ссылке уже есть пример репликации между графами, может ли кто-либо предоставить реализацию репликации в графе (псевдокод в порядке) и выделить основные отличия от репликации между графами?

    По историческим причинам не так много примеров репликации в графе (Ярославский стиль - одно исключение). Программа, использующая репликацию на основе графа, обычно включает в себя цикл, который создает одну и ту же структуру графика для каждого рабочего (например, цикл на строка 74 из gist) и использовать обмен переменных между работниками.

    Единственное место, где сохраняется репликация в графе, заключается в использовании нескольких устройств в одном процессе (например, нескольких графических процессорах). Примером этого шаблона является пример примерной модели CIFAR-10 для нескольких графических процессоров (см. Цикл по устройствам GPU здесь).

(По моему мнению, несоответствие между тем, как несколько работников и несколько устройств у одного работника обрабатываются, является неудачным. Репликация в графе проще понять, чем между репликацией между графами, поскольку она не полагается на неявный обмен между реплики. Библиотеки более высокого уровня, такие как tf.learn и TF-Slim, скрывают некоторые из этих проблем и дают надежду, что в будущем мы сможем предложить лучшую схему репликации.)

  1. Почему мы говорим, что каждый клиент создает похожий график, но не тот же график?

    Потому что они не обязательно должны быть идентичными (и нет проверки целостности, которая обеспечивает это). В частности, каждый рабочий может создать график с различными явными присвоениями устройств ("/job:worker/task:0", "/job:worker/task:1" и т.д.). Главный работник может создавать дополнительные операции, которые не создаются (или используются) не-главными работниками. Однако в большинстве случаев графики логически (то есть по модулю назначений устройств) одинаковы.

    Разве это не должно быть несколько копий вычислительной части модели, так как у нас есть несколько работников?

    Как правило, каждый рабочий имеет отдельный граф, который содержит одну копию вычислительно-интенсивной части модели. График для рабочего я не содержит узлы для рабочего j (предполагая я & ne; j). (Исключением будет случай, когда вы используете ретрансляцию между графами для распределенного обучения и репликацию в графе для использования нескольких графических процессоров для каждого рабочего. В этом случае график для рабочего обычно будет содержать N копий вычисления -интенсивная часть графика, где N - количество графических процессоров в этом рабочем.)

  2. Представлен ли пример в Replicated training обучение на нескольких компьютерах, каждый из которых имеет несколько графических процессоров?

    Пример кода охватывает только обучение на нескольких машинах и ничего не говорит о том, как тренироваться на нескольких графических процессорах на каждой машине. Однако методы легко составлены. В этой части примера:

    # Build model...
    loss = ...
    

    ... вы можете добавить цикл на графические процессоры на локальном компьютере, чтобы получить распределенное обучение нескольких сотрудников, каждый из которых имеет несколько графических процессоров.