Spec-Zone.ru › TensorFlow 1.15

tf.compat.v2.distribute.OneDeviceStrategy

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

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

tf.compat.v2.distribute.OneDeviceStrategy(
    device
)

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

Типичное использование этой стратегии — тестирование вашего кода с помощью API tf.distribute.Strategy перед переключением на другие стратегии, которые фактически распределяют вычисления по нескольким устройствам/машинам.

Например:

strategy = tf.distribute.OneDeviceStrategy(device="/gpu:0")

with strategy.scope():
  v = tf.Variable(1.0)
  print(v.device)  # /job:localhost/replica:0/task:0/device:GPU:0

def step_fn(x):
  return x * 2

result = 0
for i in range(10):
  result += strategy.experimental_run_v2(step_fn, args=(i,))
print(result)  # 90
Аргументы
device Строковый идентификатор устройства, на котором должны быть размещены переменные. См. документацию класса для получения дополнительных подробностей о том, как используется устройство. Примеры: "/cpu:0", "/gpu:0", "/device:CPU:0", "/device:GPU:0"
Атрибуты
extended tf.distribute.StrategyExtended с дополнительными методами.
num_replicas_in_sync Возвращает количество реплик, по которым агрегируются градиенты.

Методы

experimental_distribute_dataset

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

experimental_distribute_dataset(
    dataset
)

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

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

Примечание: В настоящее время пользователь не может добавить дополнительные преобразования к распределенному набору данных.

Пример:

strategy = tf.distribute.OneDeviceStrategy()
dataset = tf.data.Dataset.range(10).batch(2)
dist_dataset = strategy.experimental_distribute_dataset(dataset)
for x in dist_dataset:
  print(x)  # [0, 1], [2, 3],...

Аргументы: dataset: tf.data.Dataset для предварительной загрузки на устройство.

Возвращаемое значение
"Распределенный Dataset", по которому вызывающая сторона может перебирать.

experimental_distribute_datasets_from_function

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

experimental_distribute_datasets_from_function(
    dataset_fn
)

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

dataset_fn будет вызываться один раз для каждого рабочего в стратегии. В этом случае у нас только один рабочий и одно устройство, поэтому dataset_fn вызывается один раз.

Функция 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", по которому вызывающая сторона может перебирать, как обычные наборы данных.

experimental_local_results

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

experimental_local_results(
    value
)

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

В OneDeviceStrategy, value всегда ожидается как единственное значение, поэтому результатом является просто это значение в кортеже.

Аргументы
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
)

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

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

Обратите внимание, что вам, вероятно, потребуется использовать 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.
Возвращаемое значение
tf.data.Dataset, представляющий numpy_input.

experimental_run_v2

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

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

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

В OneDeviceStrategy, fn просто вызывается в области устройства для данного устройства с предоставленными аргументами.

Аргументы
fn Функция для выполнения. Результат должен быть tf.nest из Tensor.
args (Необязательно) Позиционные аргументы для fn.
kwargs (Необязательно) Именованные аргументы для fn.
Возвращаемое значение
Возвращаемое значение выполнения fn.

reduce

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

reduce(
    reduce_op, value, axis
)

Сводит value по репликам.

В OneDeviceStrategy, есть только одна реплика, поэтому если axis=None, возвращается значение. Если axis задан, например, как axis=0, значение сводится вдоль этого осей и возвращается.

Пример:

t = tf.range(10)

result = strategy.reduce(tf.distribute.ReduceOp.SUM, t, axis=None).numpy()
# result: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

result = strategy.reduce(tf.distribute.ReduceOp.SUM, t, axis=0).numpy()
# result: 45
Аргументы
reduce_op Значение tf.distribute.ReduceOp, определяющее, как следует объединять значения.
value "Значение на реплику", например, возвращаемое experimental_run_v2 для объединения в один тензор.
axis Указывает размерность для сведения вдоль внутри тензора каждой реплики. Обычно устанавливается в размерность пакета или None для сведения только по репликам (например, если тензор не имеет размерности пакета).
Возвращаемое значение
Tensor.

scope

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

scope()

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

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

В OneDeviceStrategy, все переменные, созданные внутри strategy.scope(), будут на device, указанном во время создания стратегии. См. пример в документации по этому классу.

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

© 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/compat/v2/distribute/OneDeviceStrategy

Spec-Zone.ru

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