Spec-Zone.ru › TensorFlow 1.15

tf.distribute.experimental.CentralStorageStrategy

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

Стратегия для одной машины, которая размещает все переменные на одном устройстве.

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

Просмотр псевдонимов

Псевдонимы для миграции

См. Руководство по миграции для получения дополнительных сведений.

tf.compat.v1.distribute.experimental.CentralStorageStrategy

tf.distribute.experimental.CentralStorageStrategy(
    compute_devices=None, parameter_device=None
)

Переменные назначаются локальному процессору или единственной видеокарте. Если видеокарт больше одной, вычисления (кроме операций обновления переменных) будут дублированы на всех видеокартах.

Например:

strategy = tf.distribute.experimental.CentralStorageStrategy()
# Create a dataset
ds = tf.data.Dataset.range(5).batch(2)
# Distribute that dataset
dist_dataset = strategy.experimental_distribute_dataset(ds)

with strategy.scope():
  @tf.function
  def train_step(val):
    return val + 1

  # Iterate over the distributed dataset
  for x in dist_dataset:
    # process dataset elements
    strategy.experimental_run_v2(train_step, args=(x,))
Атрибуты
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 исполнение, fn может быть вызвано один или несколько раз (один раз для каждой реплики).
END_OF_DOCUMENT_MARKER
Аргументы
fn Функция для выполнения. Входные данные функции должны соответствовать выходным данным input_iterator.get_next(). Выход должен быть tf.nest из Tensors.
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 и от того, включено ли немедленное выполнение, fn может быть вызван один или несколько раз (один раз для каждой реплики).
Аргументы
fn Функция для выполнения. Выход должен быть tf.nest из Tensors.
args (Необязательно) Позиционные аргументы для fn.
kwargs (Необязательно) Именные аргументы для fn.
Возвращаемое значение
Объединённое возвращаемое значение fn по всем репликам. Структура возвращаемого значения такая же, как и у возвращаемого значения от fn. Каждый элемент структуры может быть объектом "на реплику" Tensor или Tensors (например, при выполнении на одной реплике).

make_dataset_iterator

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

make_dataset_iterator(
    dataset
)

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

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

Данные из заданного набора данных будут распределены равномерно по всем вычислительным репликам. Мы предположим, что входной набор данных сгруппирован по глобальному размеру пакета. С этим предположением мы сделаем всё возможное, чтобы разделить каждый пакет по всем репликам (один или несколько рабочих узлов). Если эта попытка потерпит неудачу, будет выброшено исключение, и пользователю следует вместо этого использовать make_input_fn_iterator, который предоставляет больше контроля пользователю и не пытается разделить пакет между репликами.

Пользователь также может использовать 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/distribute/experimental/CentralStorageStrategy

Spec-Zone.ru

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