Ответ 1
Прежде всего, для некоторого исторического контекста "репликация в графе" - это первый подход, который мы пытались использовать в TensorFlow, и он не достиг производительности, который требуется многим пользователям, поэтому более сложный подход "между графиками" является рекомендуемым в настоящее время способом проведения распределенного обучения. Библиотеки более высокого уровня, такие как tf.learn
, используют подход "между графиками" для распределенного обучения.
Чтобы ответить на ваши конкретные вопросы:
-
Означает ли это, что в межгранусном графике имеется несколько
tf.Graph
репликация? Если да, где указаны соответствующие коды в приведенных примерах?Да. Типичная установка репликации между графами будет использовать отдельный процесс TensorFlow для каждой рабочей реплики, и каждый из них будет создавать отдельный
tf.Graph
для модели. Обычно каждый процесс использует глобальный график по умолчанию (доступный черезtf.get_default_graph()
), и он не создается явно.(В принципе, вы можете использовать один процесс TensorFlow с теми же объектами
tf.Graph
и multipletf.Session
, которые используют один и тот же базовый граф, если вы настроили параметрtf.ConfigProto.device_filters
для каждого сеанса по-разному, но это это необычная настройка.) -
Хотя в приведенной выше ссылке уже есть пример репликации между графами, может ли кто-либо предоставить реализацию репликации в графе (псевдокод в порядке) и выделить основные отличия от репликации между графами?
По историческим причинам не так много примеров репликации в графе (Ярославский стиль - одно исключение). Программа, использующая репликацию на основе графа, обычно включает в себя цикл, который создает одну и ту же структуру графика для каждого рабочего (например, цикл на строка 74 из gist) и использовать обмен переменных между работниками.
Единственное место, где сохраняется репликация в графе, заключается в использовании нескольких устройств в одном процессе (например, нескольких графических процессорах). Примером этого шаблона является пример примерной модели CIFAR-10 для нескольких графических процессоров (см. Цикл по устройствам GPU здесь).
(По моему мнению, несоответствие между тем, как несколько работников и несколько устройств у одного работника обрабатываются, является неудачным. Репликация в графе проще понять, чем между репликацией между графами, поскольку она не полагается на неявный обмен между реплики. Библиотеки более высокого уровня, такие как tf.learn
и TF-Slim, скрывают некоторые из этих проблем и дают надежду, что в будущем мы сможем предложить лучшую схему репликации.)
-
Почему мы говорим, что каждый клиент создает похожий график, но не тот же график?
Потому что они не обязательно должны быть идентичными (и нет проверки целостности, которая обеспечивает это). В частности, каждый рабочий может создать график с различными явными присвоениями устройств (
"/job:worker/task:0"
,"/job:worker/task:1"
и т.д.). Главный работник может создавать дополнительные операции, которые не создаются (или используются) не-главными работниками. Однако в большинстве случаев графики логически (то есть по модулю назначений устройств) одинаковы.Разве это не должно быть несколько копий вычислительной части модели, так как у нас есть несколько работников?
Как правило, каждый рабочий имеет отдельный граф, который содержит одну копию вычислительно-интенсивной части модели. График для рабочего я не содержит узлы для рабочего j (предполагая я & ne; j). (Исключением будет случай, когда вы используете ретрансляцию между графами для распределенного обучения и репликацию в графе для использования нескольких графических процессоров для каждого рабочего. В этом случае график для рабочего обычно будет содержать N копий вычисления -интенсивная часть графика, где N - количество графических процессоров в этом рабочем.)
-
Представлен ли пример в Replicated training обучение на нескольких компьютерах, каждый из которых имеет несколько графических процессоров?
Пример кода охватывает только обучение на нескольких машинах и ничего не говорит о том, как тренироваться на нескольких графических процессорах на каждой машине. Однако методы легко составлены. В этой части примера:
# Build model... loss = ...
... вы можете добавить цикл на графические процессоры на локальном компьютере, чтобы получить распределенное обучение нескольких сотрудников, каждый из которых имеет несколько графических процессоров.