tf.compat.v2.distribute.experimental.ParameterServerStrategy
Асинхронная стратегия tf.distribute для серверов параметров с несколькими рабочими узлами.
Наследуется от: Strategy
tf.compat.v2.distribute.experimental.ParameterServerStrategy(
cluster_resolver=None
)
Эта стратегия требует двух задач: рабочих узлов и серверов параметров. Переменные и обновления этих переменных будут назначены серверам параметров, а другие операции — рабочим узлам.
Когда на каждом рабочем узле имеется более одного графического процессора, операции будут дублироваться на всех графических процессорах. Несмотря на то, что операции могут дублироваться, переменные нет, и каждый рабочий узел разделяет общее представление о том, какому серверу параметров назначена переменная.
По умолчанию используется TFConfigClusterResolver для определения конфигураций для многоузлового обучения. Это требует переменной окружения 'TF_CONFIG', и 'TF_CONFIG' должна иметь спецификацию кластера.
Этот класс предполагает, что каждый рабочий узел выполняет одинаковый код независимо, но серверы параметров выполняют стандартный сервер. Это означает, что в то время как каждый рабочий узел синхронно вычисляет одно обновление градиента по всем графическим процессорам, обновления между рабочими узлами происходят асинхронно. Операции, которые выполняются только на первой реплике (например, увеличение глобального шага), будут выполняться на первой реплике каждого рабочего узла.
Ожидается, что вы вызовете call_for_each_replica(fn, ...) для любых операций, которые потенциально могут быть дублированы по репликам (т. е. несколько графических процессоров), даже если есть только процессор или один графический процессор. При определении fn, необходимо соблюдать особую осторожность:
1) В общем случае не рекомендуется открывать область устройства в области действия стратегии. Область действия устройства (т. е. вызов tf.device) будет объединена с областью действия или переопределена для операций, но не изменит устройство для переменных.
2) Также не рекомендуется открывать область кодирования (т. е. вызов tf.compat.v1.colocate_with) в области действия стратегии. Для размещения переменных используйте strategy.extended.colocate_vars_with вместо этого. Кодирование операций может привести к конфликтам в назначении устройств.
Примечание: Эта стратегия работает только с API оценщика. Передайте экземпляр этой стратегии в аргументexperimental_distributeпри созданииRunConfig. Этот экземплярRunConfigзатем должен быть передан в экземплярEstimator, на котором вызываетсяtrain_and_evaluate.
Например:
strategy = tf.distribute.experimental.ParameterServerStrategy()
run_config = tf.estimator.RunConfig(
experimental_distribute.train_distribute=strategy)
estimator = tf.estimator.Estimator(config=run_config)
tf.estimator.train_and_evaluate(estimator,...)
<!-- Tabular view -->
<table class="responsive fixed orange">
<colgroup><col width="214px"><col></colgroup>
<tr><th colspan="2"><h2 class="add-link">Args</h2></th></tr>
<tr>
<td>
`cluster_resolver`
</td>
<td>
Optional
<a href="../../../../../tf/distribute/cluster_resolver/ClusterResolver"><code>tf.distribute.cluster_resolver.ClusterResolver</code></a> object. Defaults to a
<a href="../../../../../tf/distribute/cluster_resolver/TFConfigClusterResolver"><code>tf.distribute.cluster_resolver.TFConfigClusterResolver</code></a>.
</td>
</tr>
</table>
<!-- Tabular view -->
<table class="responsive fixed orange">
<colgroup><col width="214px"><col></colgroup>
<tr><th colspan="2"><h2 class="add-link">Attributes</h2></th></tr>
<tr>
<td>
`extended`
</td>
<td>
<a href="../../../../../tf/distribute/StrategyExtended"><code>tf.distribute.StrategyExtended</code></a> with additional methods.
</td>
</tr><tr>
<td>
`num_replicas_in_sync`
</td>
<td>
Returns number of replicas over which gradients are aggregated.
</td>
</tr>
</table>
## Methods
<h3 id="experimental_distribute_dataset"><code>experimental_distribute_dataset</code></h3>
<a target="_blank" href="https://github.com/tensorflow/tensorflow/blob/v1.15.0/tensorflow/python/distribute/distribute_lib.py#L614-L678">View source</a>
<pre class="devsite-click-to-copy prettyprint lang-py tfo-signature-link">
<code>experimental_distribute_dataset(
dataset
)
</code></pre>
Distributes a tf.data.Dataset instance provided via `dataset`.
The returned distributed dataset can be iterated over similar to how
regular datasets can.
NOTE: Currently, the user cannot add any more transformations to a
distributed dataset.
The following is an example:
```python
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,))
| Аргументы | |
|---|---|
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
)
Создает 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 на каждой реплике с заданными аргументами.
Выполняет операции, заданные fn на каждой реплике. Если args или kwargs имеют значения "по реплике", например, те, которые генерируются "распределённым Dataset", когда fn выполняется на определённой реплике, она будет выполнена с компонентом этих значений "по реплике", которые соответствуют этой реплике.
fn может вызвать tf.distribute.get_replica_context() для доступа к членам, таким как all_reduce.
Все аргументы в args или kwargs должны быть либо вложенными тензорами, либо объектами по репликам, содержащими тензоры или составные тензоры.
| Аргументы | |
|---|---|
fn | Функция для выполнения. Выход должен быть tf.nest объектов Tensor. |
args | (Необязательно) Позиционные аргументы для fn. |
kwargs | (Необязательно) Именованные аргументы для fn. |
| Возвращаемое значение | |
|---|---|
Объединённое возвращаемое значение fn по всем репликам. Структура возвращаемого значения такая же, как у возвращаемого значения fn. Каждый элемент структуры может быть объектом "по реплике" Tensor или Tensor (например, при выполнении на одной реплике). |
reduce
reduce(
reduce_op, value, axis
)
Сведение 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, и войдёт в свой "межрепличный контекст".
| Возвращаемое значение | |
|---|---|
| Контекстный менеджер. |
© 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/experimental/ParameterServerStrategy