"Введение"При обучении чрезвычайно сложных моделей и использовании для обучения крупномасштабных данных часто ограничивается памятью и вычислительной мощностью одного узла, и модель не может быть оптимизирована эффективно и быстро. Распределенное обучение является решением вышеуказанных проблем. Он может в полной мере использовать память и вычислительные ресурсы каждого узла в кластере, чтобы ускорить процесс обучения и настройки модели.
Распределенный режим обучения
В соответствии с различными проблемами, с которыми сталкивается модель при обучении одного узла, ее распределенное обучение можно разделить на параллелизм модели (Model Parallelism
) и параллелизм данных (Data Parallelism
) в двух режимах.
модельный параллелизм
модельный параллелизм是指将模型切分为多个部分并将各个部分放置到不同的节点进行训练的分布式模式
. Потому что, когда модель очень сложная и много параметров, один узел не может загрузить и обучить всю модель из-за ограничений памяти, поэтому необходимо разрезать модель на более мелкие части и запускать каждую часть на разных узлах для завершения обучения. .
Преимущество параллелизма модели заключается в том, что он может снизить стоимость связи между каждым узлом, поскольку каждый узел отвечает только за обновление своей собственной переменной и не нуждается в обмене данными с другими узлами.
Его недостатки также очевидны.Из-за взаимозависимой связи между различными частями разделенной модели, в процессе прямого распространения и обратного распространения каждому узлу необходимо дождаться завершения расчета его зависимых узлов, прежде чем начать расчет. Обучение не полностью распараллелено, поэтому общая вычислительная эффективность невысока.
Поэтому, если модель не очень велика или ее части могут выполняться параллельно, обычно не рекомендуется использовать режим распределенного обучения параллелизма модели. существуетTensorFlow
Модельный параллелизм также известен как репликация внутри графа (In-graph Replication
).
параллелизм данных
параллелизм данных是指将输入数据进行切分并使用不同节点的模型副本进行训练的分布式模式
. Потому что, когда объем данных велик, выполнение одного узла занимает много времени.1
раунд обучения, что невыносимо для десятков или десятков раундов обучения, поэтому данные могут быть разделены и распределены по нескольким узлам, каждый узел обрабатывает свою небольшую часть данных, тем самым ускоряя общую скорость обучения. существуетTensorFlow
Параллелизм данных также известен как репликация между графами (Between-graph Replication
).
В режиме параллельных данных, поскольку каждый узел содержит копию модели, каждый узел должен взаимодействовать друг с другом для обновления общих переменных в процессе обучения, чтобы значения переменных всех узлов поддерживались в актуальном состоянии. Дата. В соответствии с различными методами обновления параллелизм данных можно разделить на синхронное обучение (Synchronous Training
) и асинхронное обучение (Asynchronous Training
) двумя способами.
-
Синхронное обучение означает, что все узлы в кластере завершили
1
Кусокbatch
После обучения значения градиента переменных модели, рассчитанные всеми узлами, сначала агрегируются, а затем накапливаются или усредняются, а затем это значение используется в качестве конечного градиента для обновления переменных модели каждого узла. Синхронное обучение требует, чтобы вычислительная мощность каждого узла и пропускная способность сети были сбалансированы, иначе определенный узел замедлит общую скорость обучения, поэтому, условно говоря, скорость обучения синхронного обучения немного ниже. -
Асинхронное обучение означает, что каждый узел
1
Кусокbatch
После обучения вам не нужно ждать, пока другие узлы обновят значение переменных модели напрямую. Скорость обучения асинхронного обучения выше, но у него есть серьезная проблема отказа градиента (Stale Gradients
), потому что узел, который завершит обучение позже, обнаружит, что значение переменной модели было обновлено другими узлами, и градиент, рассчитанный этим узлом, истечет. Из-за проблемы отказа градиента модель может в конечном итоге попасть в неоптимальное решение (Sub-Optimal Training
).
TensorFlow
В настоящее время поддерживается только режим параллелизма данных, режим параллелизма модели может поддерживаться в будущем.
Распределенная архитектура обучения
Представленная здесь архитектура распределенного обучения в основном относится к数据并行
Распределенная архитектура в режиме. В настоящее время в основном используются два типа распределенных обучающих архитектур, а именно:Parameter Server
архитектура иAllReduce
Архитектура.
Архитектура PS
Parameter Server(PS)
Схема относится к серверу с параметрами (ps
) распределенная кластерная архитектура. В этой архитектуре некоторые узлы в кластере действуют как серверы параметров для хранения и обновления значений переменных модели, в то время как другие узлы используются для вычисления градиентов переменных модели и взаимодействия с сервером параметров.
Parameter Server
Архитектура может быть либо синхронным режимом обучения, либо асинхронным режимом обучения.
В режиме синхронного обученияps
узел будет ждать всехworker
один из узловbatch
обучение заканчивается, затем объединяем этиworker
Градиенты переменных модели для узлов и обновленияps
Значение переменной модели в , и, наконец, транслировать обновленное значение всемworker
узлы для обновления своих переменных модели.
В асинхронном режиме обучения всеworker
Узлы обновляются индивидуальноps
Переменная в узле, а затем получить последнее значение переменной, чтобы продолжить обучение.
Однако, будь то синхронный или асинхронный режим обучения, в этой архитектуреps
Пропускная способность узлов может стать узким местом для обучения модели, потому что когдаworker
Когда число узлов увеличивается,ps
Давление пропускной способности на узле будет увеличиваться экспоненциально. Хотя можно настроитьps
Количество узлов для уменьшения нагрузки на полосу пропускания, ноps
Стоимость связи между узлами.
Архитектура AllReduce
AllReduce
Архитектура относится к архитектуре распределенного кластера без серверов параметров. В этой архитектуре все узлы в кластере действуют какworker
для выполнения вычислительных операций архитектура будетbatch
Использовать после тренировкиAllReduce
алгоритм во всемworker
Синхронное обновление переменных модели между узлами.
В настоящее время используется в глубоком обученииAllReduce
Существуют различные алгоритмы, такие какRing AllReduce
а такжеNCCL
д., они подходят для различных сценариев использования и могут быть выбраны в соответствии с реальной тренировочной ситуацией.
использоватьAllReduce
архитектура для распределенного обучения, которая может в полной мере использовать преимущества каждогоworker
Ресурсы пропускной способности узла, но когда количество параметров модели относительно велико, пропускная способность узла может стать узким местом обучения модели, и обычно используемая сетевая карта Gigabit может не преодолеть это ограничение. вопрос.
TensorFlow
серединаParameter Server
В настоящее время архитектура поддерживает только асинхронный режим обучения,AllReuce
Архитектура использует режим синхронного обучения.
Стратегия распределенного обучения TF
TensorFlow
изtf.distribute
Модуль содержит серию распределенных стратегий обучения, основанных на数据并行
режим реализован. Некоторые стратегии до сих порexperimental
Под модулем имеется в виду, что они являются экспериментальными стратегиями и могут измениться в будущем, но в основном их функции относительно зрелые и законченные, и вы можете попробовать их использовать. учитываяTPUStrategy
а такжеOneDeviceStrategy
Особые сценарии использования , здесь подробно описываться не будут.
Mirrored
MirroredStrategy
Это одномашинная синхронная распределенная стратегия обучения. Он поддерживает несколькоGPU
Распределенное обучение междуGPU
создает копию модели на модели с каждой переменной в модели (Variables
) будет зеркально отображен и помещен в соответствующийGPU
, эти переменные называются зеркальными переменными (MirroredVariable
).
MirroredStrategy
стратегия принятаAllReduce
Алгоритм делает все зеркальные переменные в каждомGPU
продолжайте синхронизировать обновления междуAllReduce
По умолчанию используется алгоритм NVIDIA.NcclAllReduce
, также черезcross_device_ops
Измените параметр на другойAllReduce
алгоритмы, такие какHierarchicalCopyAllReduce
.
MirroredStrategy
Политика автоматически использует все доступныеTensorFlow
нашелGPU
проводить распределенное обучение, если вы хотите использовать только частьGPU
тогда вы можете пройтиdevices
параметры указать.MirroredStrategy
Код создания экземпляра выглядит следующим образом:
mirrored_strategy = tf.distribute.MirroredStrategy(
devices=["/gpu:0", "/gpu:1"],
cross_device_ops=tf.distribute.HierarchicalCopyAllReduce(),
)
еслиTensorFlow
не найденGPU
По умолчанию он вырождается в использованиеCPU
тренировать.MirroredStrategy
Типичный сценарий использования — одна машина с несколькимиGPU
.
CentralStorage
CentralStorageStrategy
Это также стратегия синхронного распределенного обучения на одной машине. но сMirroredStrategy
Стратегия отличается тем, что сохраняет все переменные модели вCPU
в памяти, а не путем зеркального копирования в каждомGPU
, все вычислительные операции будут выполняться на каждомGPU
выполняется так же, как указано выше.
Если машина имеет только одинGPU
, то все переменные и вычисления будут размещены в этомGPU
начальство. справаCPU
Перед обновлением переменных вGPU
Переменные градиенты на репликах агрегируются, а затем применяются кCPU
Переменные обновляются.CentralStorageStrategy
Код создания экземпляра выглядит следующим образом:
central_storage_strategy = tf.distribute.experimental.CentralStorageStrategy()
CentralStorageStrategy
стратегия вCPU
иGPU
Стоимость связи намного ниже, чемGPU
иGPU
Это более применимо, когда стоимость связи между ними.
MultiWorkerMirrored
MultiWorkerMirroredStrategy
стратегия иMirroredStrategy
Стратегии очень похожи и могут быть поняты какMirroredStrategy
стратегический多机的
Синхронизированная версия распределенного обучения, которая также создает копии всех переменных на каждой машине.
MultiWorkerMirroredStrategy
Каждый узел, работающий в политике, называетсяworker
,Долженworker
Узел может содержать ноль или болееGPU
. несколькоworker
использовать между узламиAllReduce
алгоритм для синхронного обновления переменных модели,TensorFlow
Эта операция называетсяCollectiveOps
.CollectiveOps
Будет вTensorFlow
Когда модель запускается, она автоматически выбирает подходящую на основе оборудования, топологии сети и размера тензора.AllReduce
Алгоритмы для связи по сети для завершения обновления переменных.
MultiWorkerMirroredStrategy
Стратегия также реализует некоторые дополнительные оптимизации производительности, такие как объединение нескольких небольших тензоров.AllReductions
Преобразовано в большой тензорAllReductions
,Уменьшитьworker
Время связи между узлами.
MultiWorkerMirroredStrategy
На данный момент есть две стратегии на выборCollectiveOps
. дляCollectiveCommunication.RING
, который используетgRPC
В качестве коммуникационного слоя, реализованного на основе环
изAllReduce
работать. ДругойCollectiveCommunication.NCCL
, который использует NvidiaNCCL
библиотека для реализацииAllReduce
работать. При фактическом использовании вы можете выбрать подходящий вариант в зависимости от вашей операционной среды.CollectiveOps
или используйтеCollectiveCommunication.AUTO
сдаватьTensorFlow
Выбирайте во время выполнения.MultiWorkerMirroredStrategy
Код создания экземпляра выглядит следующим образом:
multiworker_strategy = tf.distribute.experimental.MultiWorkerMirroredStrategy(
tf.distribute.experimental.CollectiveCommunication.RING)
MultiWorkerMirroredStrategy
стратегии, потому что она включает несколькоworker
коммуникационное взаимодействие между узлами, поэтому каждыйworker
Узлы должны заранее знать информацию о конфигурации каждого узла в кластере, чтобы их можно было использовать при обновлении переменных.
TensorFlow
Стандартный способ определить информацию о конфигурации кластера — использоватьTF_CONFIG
Он реализуется переменными среды, которые определяют информацию о конфигурации всех узлов в кластере, включая всеworker
Сетевой адрес узла, в настоящее времяworker
индекс узла (index
) и текущийworker
Роль узла (type
).
я упалworker
узел не содержитGPU
, стратегия сводится к использованиюCPU
в несколькихworker
Распределенное обучение среди узлов. если кластерworker
Если число узлов равно одному, стратегия вырождается вMirroredStrategy
Стратегия.
ParameterServer
ParameterServerStrategy
Это многомашинная асинхронная распределенная стратегия обучения. Так что это тоже нужно уточнять заранееTF_CONFIG
информация о переменной среды иMultiWorkerMirroredStrategy
Разница в стратегии заключается в том, что не все узлы в кластереworker
, некоторые узлы будут обозначены какps
Используется для хранения переменной информации. Каждая переменная модели хранится вps
На узле все вычислительные операции будут выполняться на всехworker
Узлы выполняются таким же образом.ParameterServerStrategy
Код создания экземпляра выглядит следующим образом:
ps_strategy = tf.distribute.experimental.ParameterServerStrategy()
распределенный кластер TF
определение кластера
установлен несколькимиTensorFlow
узлы могут образовыватьTensorFlow
Распределенный кластер. Информация об узле кластера основана наTF_CONFIG
Переменные среды настроены, узел здесьip:port
Он определяется в форме , поэтому он не относится только к одному физическому узлу, то есть несколько узлов кластера могут существовать на одном и том же физическом узле одновременно, поэтомуTensorFlow
Распределенное обучение фактически ослабляет концепцию кластеров.
Однако в реальной учебной среде из-за ограниченной вычислительной мощности одной машины мы обычно используем комбинацию нескольких машин для распределенного обучения, таким образом образуя так называемый распределенный кластер в общем смысле. существуетTensorFlow
Выполнение распределенных обучающих задач на кластереHadoop
Выполнить в кластереMapReduce
Задания относительно схожи.
типичныйTF_CONFIG
Значения переменных окружения следующие:
{
"cluster": {
"chief": ["host1:port"],
"worker": ["host2:port", "host3:port"],
"ps": ["host4:port"],
"evaluator": ["host5:port"]
},
"task": {
"type": "worker",
"index": 0
}
}
этоjson
нить.cluster
Информация указывает на то, что кластер1
Кусокchief
узел,2
Кусокworker
узел,1
Кусокps
узел и1
Кусокevaluator
узел,task
Информация указывает на то, что текущий узел является первым1
Кусокworker
узел.
chief
Роль узлов иworker
Node примерно такой же, но он выполняет дополнительную работу, например, сохраняет файлы контрольных точек (checkpoints
) и дляTensorboard
файл журнала и т. д., если не указаноcheif
узел, по умолчанию будетworker
первый узел в списке какchief
узел;worker
Узлы используются для выполнения обучающих операций;ps
Узлы используются для хранения переменных, только при использованииParameterServerStrategy
Его нужно указать только при обучении стратегии;evaluator
Используется для выполнения операций перекрестной проверки, обычно также используетсяParameterServerStrategy
указана политика.
Обратите внимание, что все узлыTF_CONFIG
в переменной окруженияcluster
Информация та же, разница в том, чтоtask
часть, и все роли(task type
) изindex
должно быть из0
начать, потому чтоTensorFlow
будет основываться наindex
отcluster
Прочитайте информацию об узле из списка под соответствующей ролью.
TF_CONFIG
Переменная среды может быть записана в переменную среды системы, но предполагается, что только один экземпляр узла кластера будет запущен на физическом узле одновременно, но на практике мы можем запустить несколько экземпляров узла на одном и том же физическом узле. узел, использующий разные порты.TF_CONFIG
значение потеряет гибкость. Поэтому в большинстве случаев мы будемpython
через программуos.environ["TF_CONFIG"]
указать информацию о кластере для создания по запросу,TensorFlow
Среда выполнения автоматически анализирует информацию и запускает задачу обучения.
описано выше4
Среди распределенных стратегий обучения в Китае для многомашинного обучения можно использовать только кластер.MultiWorkerMirroredStrategy
иParameterServerStrategy
Стратегия.
Распределенное обучение кластера TF
TensorFlow
Базовый процесс кластерного распределенного обучения выглядит следующим образом:
-
Разные узлы используют разные
TF_CONFIG
Переменная среды запускает задачу обучения для этого узла.TensorFlow
будет автоматически проанализированTF_CONFIG
значение переменной среды, затем используйтеip:port
запустить текущий узелgRPC
обслуживание и прослушивание других узловgRPC
Служить. -
когда все узлы
gRPC
После того, как услуги готовы, каждыйworker
Узлы начинают обучение со своими собственными данными, и начинается глобальное обучение. -
Каждый
batch
По окончании обучения,TensorFlow
Все будет обновляться в соответствии с различными распределенными стратегиями.worker
Переменная узла, после завершения обновления перейти к следующемуbatch
обучение. -
После выполнения всех операций обучения и оценки обучение заканчивается, и
gRPC
После этого служба отключается.
Из приведенного выше процесса выполнения мы обнаружили, что сложность кластерного распределенного обучения заключается вTF_CONFIG
Построение переменных среды, потому что мы не можем указывать их вручную каждый раз, когда тренируемся.ip
и порт (также необходимо определить, занят ли порт), можно допустить один или два узла, но если вы запускаете несколько обучающих задач одновременно, и каждое задание будет использовать десятки узлов кластера, то вручную строить работы этой переменной окружения Сумма огромна.
Итак, нам нужно найти автоматическую сборкуTF_CONFIG
Метод переменных окружения, некоторые распределенные обучающие фреймворки могут решить наши проблемы. Например360
РелизXLearning
платформа, используяYarn
Для управления и распределения ресурсов кластера каждый раз, когда запускается задача обучения, она автоматически выделяет указанное количество ресурсов и определяет сборку.TF_CONFIG
Информация, требуемая переменными среды, нам нужно только проанализировать информацию, чтобы начать обучение, что может значительно снизить рабочую нагрузку на ранней стадии обучения, чтобы мы могли сосредоточиться на конкретном процессе обучения.
XLearning
это всего лишь одна из многих распределенных обучающих сред, и некоторые из них похожи наGoogle
изKubeflow
Платформы и тому подобное также могут реализовывать аналогичные функции. и их роль не ограничиваетсяTF_CONFIG
Построение переменных среды также может быть выполненоCPU
Такие операции, как выделение ядра, выделение памяти и разделение данных. Использование этих фреймворков позволяет нам использоватьTensorFlow
Более удобно при распределенном обучении.
Реализация распределенного обучения TF
TensorFlow
Поддерживает использование более высокого порядкаAPI
Распределенное обучение может быть реализовано в виде распределенного обучения, а распределенное обучение также может быть реализовано с использованием пользовательского процесса обучения.
Keras API
Keras
даTensorFlow
Построить более высокий порядок моделиAPI
, который был объединен сTensorFlow
Стратегия распределенного обучения легко интегрируется, и это также официально рекомендуемый предпочтительный способ достижения распределенного обучения.
описано выше4
В распределенной стратегии использованиеKeras API
Стратегии распределенного обучения:MirroredStrategy
,CentralStorageStrategy
а такжеMultiWorkerMirroredStrategy
, иParameterServerStrategy
Ожидается, что политики будут поддерживаться в последующих выпусках. Итак, в настоящее время используетсяKeras
При выполнении распределенного обучения на нескольких машинах можно использовать толькоMultiWorkerMirroredStrategy
распределенная стратегия.
использоватьKeras
Обучающий код построенной локальной модели можно легко преобразовать в соответствующий распределенный обучающий код. Просто нужно построить и скомпилировать модель (compile
) операции размещаются в экземпляре распределенной политикиscope
Он может поддерживать все типыKeras
модели, в том числеSequential
,Functional
а такжеSubclassed
. использоватьKeras
Пример фрагмента кода для распределенного обучения показан ниже:
import tensorflow as tf
import numpy as np
strategy = tf.distribute.MirroredStrategy()
with strategy.scope():
model = tf.keras.Sequential([tf.keras.layers.Dense(1, input_shape=(1, ))])
model.compile(loss='mse', optimizer='sgd')
inputs, targets = np.ones((100, 1)), np.ones((100, 1))
model.fit(inputs, targets, epochs=2, batch_size=10)
вstrategy
может быть поддержанKeras
Любой экземпляр политики для распределенного обучения.strategy.scope()
Указывает блок кода, который будет выполняться распределенно, обратите вниманиеfit
Методы не могут быть включены.fit
Операции могут быть согласованы с местным обучением без дополнительных модификаций.
использоватьKeras
При выполнении распределенного обучения распределенная стратегия обучения и оценки является последовательной, то есть операции оценки модели также болееworker
Узлы совместно участвуют в выполнении. заKeras
входные данные в модель,TensorFlow
Будут использоваться различные стратегии для автоматического разделения данных в соответствии с источником данных (текстовый файл или числовое значение), чтобы каждыйworker
Часть общих данных обучения ноды, конечно, тоже можно пропустить черезtf.data.Options
Контролировать, чтобы входные данные не были разделены.
Estimator API
Estimator
даTensorFlow
Другой более высокий порядок построения моделейAPI
, который изначально поддерживает асинхронныйParameter Server
Распределенная стратегия обучения. иKeras
аналогично, это такжеTensorFlow
Распределенные стратегии обучения интегрированы, но с ограниченной поддержкой. использоватьEstimator
Построенный код можно обучать как локально, так и распространять без дополнительных модификаций. При распределенном обучении используется распределенная стратегия по умолчанию.ParameterServerStrategy
.
иKeras
используется вstrategy.scope
Распределенное обучение отличается,Estimator
поставивstrategy
экземпляр переданRunConfig
использовать различные распределенные стратегии обучения.Estimator
Модуль содержит некоторые предопределенные модели, которые можно использовать напрямую, такие как модели линейной регрессии и т. д. Если вы хотите настроить модель, вам необходимо сначала определить конструктор модели.model_fn
.
Здесь предопределеноEstimator
МодельLinearRegressor
Например, чтобы представить его с помощьюMirroredStrategy
Метод реализации стратегии распределенного обучения, код примера выглядит следующим образом:
import tensorflow as tf
strategy = tf.distribute.MirroredStrategy()
config = tf.estimator.RunConfig(
train_distribute=strategy,
eval_distribute=strategy,
)
regressor = tf.estimator.LinearRegressor(
feature_columns=[tf.feature_column.numeric_column('feats')],
optimizer='SGD',
config=config,
)
def input_fn():
dataset = tf.data.Dataset.from_tensors(({"feats": [1.]}, [1.]))
return dataset.repeat(1000).batch(10)
tf.estimator.train_and_evaluate(
regressor,
train_spec=tf.estimator.TrainSpec(input_fn=input_fn),
eval_spec=tf.estimator.EvalSpec(input_fn=input_fn),
)
Примечание сKeras
разные,Estimator
в состоянии пройтиRunConfig
методtrain_distribute
иeval_distribute
Параметры определяют распределенную стратегию обучения и оценки отдельно, что является более гибким.
и используяEstimator
При выполнении распределенного обучения входные данные модели не будут автоматически разделяться, и она полностью независима и управляема.Можно настроить метод обработки входных данных.Например, мы можем использоватьdataset.shard
метод разделения или для данных, считанных из файла, вы можете заранее разделить файл и назначить его различнымworker
узел.
Следует отметить, что если всеworker
Все узлы обучаются на одних и тех же данных, рекомендуются разные семена (seed
) для входных данныхdataset
провестиshuffle
, чтобы избежать градиентного спуска всех узлов в одном направлении, что приводит к увеличению времени сходимости и ухудшению конечных результатов обучения.
В настоящее времяTensorFlow 2.x
Распределенная стратегия обучения дляEstimator
Поддержка относительно ограничена, базовое обучение и оценка могут выполняться в обычном режиме, но некоторые расширенные функции, такие какscaffold
и т. д. не поддерживаются, а также могут содержать некоторые потенциальныеbug
. В краткосрочной перспективе официальная команда не планирует тратить слишком много усилий на улучшениеEstimator
распределенное обучение, они больше сосредоточатся наKeras
А индивидуальный распределенный метод обучения обеспечивает техническую поддержку, поэтому здесь не рекомендуетсяEstimator
для распределенного обучения.
Индивидуальное распределенное обучение
В большинстве случаев используйте более высокий порядокAPI
(Keras
иEstimator
) для простой реализации распределенного обучения моделей с помощью лишь нескольких локальных изменений кода. Тем не менее, бывают ситуации, когда вы можете захотеть иметь детальный контроль над процессом обучения для большей гибкости, и в этом случае вам нужно воспользоватьсяtf.distribute.Strategy
Настройте распределенный процесс обучения. Например, при обучении модели обучения с подкреплениемTensorFlow
более высокого порядкаAPI
может не применяться.
можно использоватьtf.distribute.Strategy
Ряд основных методов класса для поддержки пользовательского распределенного процесса обучения. сначала сKeras
Распределенное обучение похоже наstrategy.scope()
Создайте модель и оптимизатор под (optimizers
); затем создайте входные данные и используйтеtf.distribute.Strategy.experimental_distribute_dataset
метод для размещения данных; затем используйтеtf.GradientTape()
Определяет поток обучения; наконец, перебирает входные данные и начинает обучение. Пример кода выглядит следующим образом:
import tensorflow as tf
strategy = tf.distribute.MirroredStrategy()
global_batch_size = 128
with strategy.scope():
model = tf.keras.Sequential([tf.keras.layers.Dense(1, input_shape=(1, ))])
optimizer = tf.keras.optimizers.SGD()
dataset = tf.data.Dataset.from_tensors(
([1.], [1.])).repeat(1000).batch(global_batch_size)
dist_dataset = strategy.experimental_distribute_dataset(dataset)
@tf.function
def train_step(dist_inputs):
def step_fn(inputs):
features, labels = inputs
with tf.GradientTape() as tape:
logits = model(features, training=True)
cross_entropy = tf.nn.softmax_cross_entropy_with_logits(
logits=logits,
labels=labels,
)
loss = tf.reduce_sum(cross_entropy) * (1.0 / global_batch_size)
grads = tape.gradient(loss, model.trainable_variables)
optimizer.apply_gradients(list(zip(grads, model.trainable_variables)))
return cross_entropy
per_example_losses = strategy.run(step_fn, args=(dist_inputs, ))
mean_loss = strategy.reduce(
tf.distribute.ReduceOp.MEAN,
per_example_losses,
axis=0,
)
return mean_loss
with strategy.scope():
for inputs in dist_dataset:
print(train_step(inputs))
Обратите внимание, что код используетstrategy.run
выполнитьbatch
обучение, использованиеstrategy.reduce
для агрегирования результатов обучения каждого узла. когда будетapply_gradients
метод помещается вstrategy.scope()
Когда в следующий раз его поведение при обновлении немного изменится по сравнению с локальным обучением, он сначала агрегирует всеworker
Градиенты узлов суммируются, а затем это значение используется для обновления переменных модели каждого узла.