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