Spec-Zone.ru › TensorFlow 1.15

tf.contrib.distribute.ParameterServerStrategy

Стратегия распределения сервера параметров.

Наследуется от: Strategy

tf.contrib.distribute.ParameterServerStrategy(
    num_gpus_per_worker=0
)

*** версия contrib ***

Этот класс стратегии работает как для локального обучения, так и для реплицированного обучения между графиками для нескольких рабочих узлов. Если cluster_spec указано (передано в метод init() или получено из переменной окружения "TF_CONFIG"), переменные и обновления этих переменных назначаются серверам параметров, а другие операции — рабочим узлам. Если cluster_spec не задано, обучение становится локальным, где переменные назначаются локальному процессору или единственной видеокарте. Когда у каждого рабочего узла есть более одной видеокарты, операции будут реплицированы на этих видеокартах. В обоих случаях операции реплицируются, но переменные нет, и эти рабочие узлы совместно используют общее представление, для которого сервер параметров назначен переменной.

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

Ожидается, что вы вызовете call_for_each_replica(fn, ...) для любых операций, которые потенциально могут быть реплицированы по репликам (т. е. по нескольким видеокартам), даже если есть только процессор или одна видеокарта. При определении fn, необходимо проявлять особую осторожность:

1) Всегда используйте tf.compat.v1.get_variable вместо tf.Variable, который не может ссылаться на одну и ту же переменную на разных репликах.

2) В целом не рекомендуется открывать область устройства в области действия стратегии. Область устройства (т. е. вызов tf.device) будет слита или переопределена для операций, но не изменит устройство для переменных.

3) Также не рекомендуется открывать область ко-локации (т. е. вызов tf.compat.v1.colocate_with) в области действия стратегии. Для размещения переменных используйте strategy.extended.colocate_vars_with вместо этого. Ко-локация операций может создать конфликты назначения устройства.

Аргументы
num_gpus_per_worker количество локальных видеокарт или видеокарт на рабочий узел, по умолчанию 0, что означает только процессор.
Исключения
ValueError если cluster_spec задан, но task_type или task_id нет.
Атрибуты
extended tf.distribute.StrategyExtended с дополнительными методами.
num_replicas_in_sync Возвращает количество реплик, по которым агрегируются градиенты.

Методы

experimental_distribute_dataset

Просмотреть исходный код

experimental_distribute_dataset(
    dataset
)

Распределяет экземпляр tf.data.Dataset, предоставленный через dataset.

Возвращённый распределённый набор данных можно перебирать аналогично тому, как можно перебирать обычные наборы данных. ПРИМЕЧАНИЕ: В настоящее время пользователь не может добавить больше преобразований в распределённый набор данных.

Следующий пример:

strategy = tf.distribute.MirroredStrategy()

# Create a dataset
dataset = dataset_ops.Dataset.TFRecordDataset([
  "/a/1.tfr", "/a/2.tfr", "/a/3.tfr", "/a/4.tfr"])

# Distribute that dataset
dist_dataset = strategy.experimental_distribute_dataset(dataset)
# Iterate over the distributed dataset
for x in dist_dataset:
  # process dataset elements
  strategy.experimental_run_v2(train_step, args=(x,))

Мы предположим, что входной набор данных сгруппирован по глобальному размеру пакета. При этом предположении мы будем делать всё возможное, чтобы разделить каждый пакет между всеми репликами (один или несколько рабочих узлов).

В многоузловой среде мы сначала попытаемся распределить набор данных, пытаясь определить, создаётся ли набор данных из ReaderDatasets (например, TFRecordDataset, TextLineDataset и т. д.), и если да, попытаемся разбить входные файлы. Обратите внимание, что должно быть как минимум один входной файл на каждый рабочий узел. Если у вас меньше одного входного файла на каждый рабочий узел, мы рекомендуем отключить распределение набора данных с помощью указанного ниже метода.

Если эта попытка не увенчалась успехом (например, набор данных создан из Dataset.range), мы разделим набор данных равномерно в конце, добавив операцию .shard в конец цепочки обработки. Это заставит всю цепочку предобработки всех данных выполняться на каждом рабочем узле, и каждый рабочий узел будет выполнять избыточную работу. Мы выведем предупреждение, если этот метод фрагментации выбран. В этом случае рассмотрите возможность использования experimental_distribute_datasets_from_function вместо этого.

Вы можете отключить фрагментацию наборов данных по рабочим узлам с помощью параметра auto_shard в tf.data.experimental.DistributeOptions.

Внутри каждого рабочего узла мы также разделим данные между всеми устройствами рабочего узла (если их несколько), и это произойдёт даже если многоузловая фрагментация отключена с помощью указанного выше метода.

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

Аргументы
dataset tf.data.Dataset, который будет разделен по всем репликам в соответствии с правилами, описанными выше.
Возвращает
"распределённый Dataset", который действует как tf.data.Dataset, за исключением того, что он генерирует значения "по реплике".

experimental_distribute_datasets_from_function

Просмотреть исходный код

experimental_distribute_datasets_from_function(
    dataset_fn
)

Распределяет экземпляры tf.data.Dataset, созданные вызовами к dataset_fn.

dataset_fn будет вызываться один раз для каждого рабочего узла в стратегии. Каждая реплика на этом рабочем узле будет извлекать одну партию входов из локального Dataset (т. е. если у рабочего узла две реплики, две партии будут извлекаться из Dataset на каждом шаге).

Этот метод может использоваться для нескольких целей. Например, где experimental_distribute_dataset не может разбить входные файлы, этот метод может использоваться для ручного разделения набора данных (избегая медленной обратной совместимости в experimental_distribute_dataset). В случаях, когда набор данных бесконечен, эта фрагментация может быть выполнена путем создания реплик наборов данных, которые различаются только в их начальном значении псевдослучайной последовательности. experimental_distribute_dataset также иногда может не удаваться разделить пакет между репликами на рабочем узле. В этом случае этот метод можно использовать там, где такого ограничения нет.

dataset_fn должен принимать экземпляр tf.distribute.InputContext, где можно получить информацию о группировании и репликации входов:

def dataset_fn(input_context):
  batch_size = input_context.get_per_replica_batch_size(global_batch_size)
  d = tf.data.Dataset.from_tensors([[1.]]).repeat().batch(batch_size)
  return d.shard(
      input_context.num_input_pipelines, input_context.input_pipeline_id)

inputs = strategy.experimental_distribute_datasets_from_function(dataset_fn)

for batch in inputs:
  replica_results = strategy.experimental_run_v2(replica_fn, args=(batch,))
Ключевой момент: tf.data.Dataset, возвращаемый dataset_fn должен иметь размер пакета по реплике, в отличие от experimental_distribute_dataset, который использует глобальный размер пакета. Это можно вычислить с помощью input_context.get_per_replica_batch_size.
Аргументы
dataset_fn Функция, принимающая экземпляр tf.distribute.InputContext и возвращающая tf.data.Dataset.
Возвращает
"распределённый Dataset", который действует как tf.data.Dataset, за исключением того, что он генерирует значения "по реплике".

experimental_local_results

Просмотреть исходный код

experimental_local_results(
    value
)

Возвращает список всех локальных значений по репликам, содержащихся в value.

Примечание: Это возвращает только значения на рабочем узле, инициированном этим клиентом. При использовании tf.distribute.Strategy, как tf.distribute.experimental.MultiWorkerMirroredStrategy, каждый рабочий узел будет своим клиентом, и эта функция вернёт только вычисленные на этом рабочем узле значения.
Аргументы
value Значение, возвращённое experimental_run(), experimental_run_v2(), extended.call_for_each_replica(), или переменная, созданная в scope.
Возвращает
Кортеж значений, содержащихся в value. Если value представляет одно значение, это возвращает (value,).

experimental_make_numpy_dataset

Просмотреть исходный код

experimental_make_numpy_dataset(
    numpy_input, session=None
)

Создаёт tf.data.Dataset для ввода, предоставленного через массив NumPy.

Это позволяет избежать добавления numpy_input в виде большой константы в график и копирует данные на машину или машины, которые будут обрабатывать ввод.

Обратите внимание, что вам, вероятно, потребуется использовать tf.distribute.Strategy.experimental_distribute_dataset с возвращаемым набором данных, чтобы дополнительно распределить его с помощью стратегии.

Пример:

numpy_input = np.ones([10], dtype=np.float32)
dataset = strategy.experimental_make_numpy_dataset(numpy_input)
dist_dataset = strategy.experimental_distribute_dataset(dataset)
Аргументы
numpy_input Вложенный набор массивов NumPy, которые будут преобразованы в набор данных. Обратите внимание, что списки массивов NumPy складываются, так как это обычное tf.data.Dataset поведение.
session (Только для выполнения графа TensorFlow v1.x) Сессия, используемая для инициализации.
Возвращаемое значение
Объект tf.data.Dataset, представляющий numpy_input.

experimental_run

Просмотреть исходный код

experimental_run(
    fn, input_iterator=None
)

Выполняет операции в fn на каждой реплике с входными данными из input_iterator.

УСТЕРЕЖДАЕТСЯ: Этот метод недоступен в TF 2.x. Пожалуйста, переключитесь на использование experimental_run_v2 вместо этого.

При включенном режиме выполнения Eager, выполняет операции, указанные в fn на каждой реплике. В противном случае создает график для выполнения операций на каждой реплике.

Каждая реплика получит один, отличающийся вход из входов, предоставленных одним вызовом get_next для итератора ввода.

fn может вызвать tf.distribute.get_replica_context(), чтобы получить доступ к элементам, таким как replica_id_in_sync_group.

Ключевая точка: В зависимости от реализации tf.distribute.Strategy, используемой, и от того, включен ли режим Eager Execution, fn может быть вызван один или несколько раз (по одному разу для каждой реплики).
Аргументы
fn Функция для выполнения. Входы в функцию должны соответствовать выходам input_iterator.get_next(). Выход должен быть tf.nest из Tensor.
input_iterator (Необязательно) итератор входных данных, из которого берутся входные данные.
Возвращаемое значение
Объединенное значение возвращаемого значения fn по всем репликам. Структура возвращаемого значения такая же, как у возвращаемого значения от fn. Каждый элемент структуры может быть PerReplica (если значения не синхронизированы), Mirrored (если значения сохраняются синхронизированными) или Tensor (если выполняется на одной реплике).

experimental_run_v2

Просмотреть исходный код

experimental_run_v2(
    fn, args=(), kwargs=None
)

Выполняет fn на каждой реплике с указанными аргументами.

Выполняет операции, указанные в fn на каждой реплике. Если у args или kwargs есть значения «на реплику», такие как те, которые получены от «распределённого Dataset», при выполнении fn на определённой реплике, оно будет выполняться с компонентом этих значений «на реплику», соответствующим этой реплике.

fn может вызвать tf.distribute.get_replica_context(), чтобы получить доступ к элементам, таким как all_reduce.

Все аргументы в args или kwargs должны быть либо вложенным набором тензоров, либо объектами «на реплику», содержащими тензоры или составные тензоры.

Ключевая точка: В зависимости от реализации tf.distribute.Strategy и от того, включен ли режим Eager Execution, fn может быть вызван один или несколько раз (по одному разу для каждой реплики).
Аргументы
fn Функция для выполнения. Выход должен быть tf.nest из Tensor.
args (Необязательно) Позиционные аргументы для fn.
kwargs (Необязательно) Аргументы ключевых слов для fn.
Возвращаемое значение
Объединённое возвращаемое значение fn по всем репликам. Структура возвращаемого значения такая же, как у возвращаемого значения от fn. Каждый элемент структуры может быть объектом «на реплику» Tensor или Tensor (например, если выполняется на одной реплике).

make_dataset_iterator

Просмотреть исходный код

make_dataset_iterator(
    dataset
)

Создаёт итератор для входных данных, предоставленных через dataset.

Примечание: Размер пакета аргумента dataset обрабатывается по-разному для этой версии contrib ParameterServerStrategy.

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

Пользователь также может использовать make_input_fn_iterator , если хочет настроить, какой вход подаётся на какую реплику/рабочий элемент и т.д.

Аргументы
dataset tf.data.Dataset, который будет распределён равномерно по всем репликам.
Возвращаемое значение
Объект tf.distribute.InputIterator , который возвращает входы для каждого шага вычислений. Пользователь должен вызвать initialize для возвращённого итератора.

make_input_fn_iterator

Просмотреть исходный код

make_input_fn_iterator(
    input_fn, replication_mode=tf.distribute.InputReplicationMode.PER_WORKER
)

Возвращает итератор, разделённый между репликами, созданный из функции входных данных.

УСТЕРЕЖДАЕТСЯ: Этот метод недоступен в TF 2.x.

Функция input_fn должна принимать объект tf.distribute.InputContext, где можно получить доступ к информации о пакетной обработке и фрагментации входных данных:

def input_fn(input_context):
  batch_size = input_context.get_per_replica_batch_size(global_batch_size)
  d = tf.data.Dataset.from_tensors([[1.]]).repeat().batch(batch_size)
  return d.shard(input_context.num_input_pipelines,
                 input_context.input_pipeline_id)
with strategy.scope():
  iterator = strategy.make_input_fn_iterator(input_fn)
  replica_results = strategy.experimental_run(replica_fn, iterator)

Возвращаемый tf.data.Dataset функцией input_fn должен иметь размер пакета на реплику, который может быть рассчитан с помощью input_context.get_per_replica_batch_size.

Аргументы
input_fn Функция, принимающая объект tf.distribute.InputContext и возвращающая tf.data.Dataset.
replication_mode значение перечисления tf.distribute.InputReplicationMode. В настоящее время поддерживается только PER_WORKER , что означает, что для каждого рабочего элемента будет один вызов input_fn . Реплики будут извлекать данные из локального tf.data.Dataset на их рабочем элементе.
Возвращаемое значение
Объект итератора, который сначала должен быть вызван с .initialize() . Затем он может быть передан в strategy.experimental_run() , или вы можете вызвать iterator.get_next() для получения следующего значения, которое нужно передать в strategy.extended.call_for_each_replica().

reduce

Просмотреть исходный код

reduce(
    reduce_op, value, axis=None
)

Сводка значений value по всем репликам.

Учитывая значение на реплике, возвращаемое experimental_run_v2 (например, потерю на пример), пакет будет разделен между всеми репликами. Эта функция позволяет вам агрегировать значения по репликам и, необязательно, по элементам пакета. Например, если у вас есть глобальный размер пакета 8 и 2 реплики, значения для примеров [0, 1, 2, 3] будут на реплике 0, а [4, 5, 6, 7] будут на реплике 1. По умолчанию reduce просто агрегирует по репликам, возвращая [0+4, 1+5, 2+6, 3+7]. Это полезно, когда каждая реплика вычисляет скаляр или какое-то другое значение, не имеющее «размерности пакета» (например, градиент). Чаще всего вы захотите агрегировать по глобальному пакету, что можно сделать, указав размерность пакета в качестве axis , обычно axis=0 . В этом случае он вернёт скаляр 0+1+2+3+4+5+6+7.

Если есть последний частичный пакет, вам нужно указать ось, чтобы структура результата была согласованной между репликами. Таким образом, если последний пакет имеет размер 6 и разделён на [0, 1, 2, 3] и [4, 5], вы получите несовпадение размеров, если не укажете axis=0 . Если вы укажете tf.distribute.ReduceOp.MEAN, с использованием axis=0 будет использоваться правильный знаменатель 6. Противопоставьте это вычислению reduce_mean для получения скалярного значения на каждой реплике и этой функции для усреднения этих средних значений, которая будет взвешивать некоторые значения 1/8 и другие 1/4.

Аргументы
reduce_op Значение tf.distribute.ReduceOp, определяющее, как следует комбинировать значения.
value Значение "на реплику", например, возвращаемое experimental_run_v2, которое должно быть объединено в один тензор.
axis Определяет размерность, по которой нужно выполнить сокращение внутри тензора каждой реплики. Обычно следует задавать размерность пакета или None, чтобы выполнить сокращение только по репликам (например, если у тензора нет размерности пакета).
Возвращаемое значение
Tensor.

scope

Просмотреть исходный код

scope()

Возвращает менеджер контекста, выбирающий эту стратегию в качестве текущей.

Внутри блока кода with strategy.scope():, этот поток будет использовать создатель переменных, установленный strategy, и войдёт в свой "межрепличный контекст".

Возвращаемое значение
Менеджер контекста.

update_config_proto

Просмотреть исходный код

update_config_proto(
    config_proto
)

Возвращает копию config_proto, изменённую для использования с этой стратегией.

УСТАРЕВШИЙ МЕТОД: Этот метод недоступен в TF 2.x.

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

Аргументы
config_proto Объект tf.ConfigProto.
Возвращаемое значение
Обновлённую копию config_proto.

© 2020 The TensorFlow Authors. All rights reserved.
Licensed under the Creative Commons Attribution License 3.0.
Code samples licensed under the Apache 2.0 License.
https://www.tensorflow.org/versions/r1.15/api_docs/python/tf/contrib/distribute/ParameterServerStrategy

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API