Обучение с глобальным размером партии на TPU (тензорный поток) - PullRequest
1 голос
/ 09 июля 2020

Недавно я начал проект нейронной сети в Google Colab и обнаружил, что могу использовать TPU. Я исследовал, как его использовать, и обнаружил тензорный поток TPUStrategy (я использую тензорный поток 2.2.0) и смог успешно определить модель и запустить шаг поезда на TPU.

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

Руководство просит вас определить GLOBAL_BATCH_SIZE, а размер пакета, который принимает каждое ядро ​​TPU, определяется как per_replica_batch_size = GLOBAL_BATCH_SIZE / strategy.num_replicas_in_sync, что означает, что размер пакета для каждого TPU меньше, чем размер пакета, с которым вы начинаете. В Colab strategy.num_replicas_in_sync = 8, что означает, что если я начну с GLOBAL_BATCH_SIZE из 64, per_replica_batch_size будет 8.

Теперь я не понимаю, когда я вычисляю шаг поезда , оптимизатор вычисляет 8 различных шагов для пакетов размером per_replica_batch_size, обновляя веса модели 8 раз, или он просто распараллеливает вычисление шага поезда таким образом и в итоге вычисляет только 1 шаг оптимизатора для пакета размера GLOBAL_BATCH_SIZE. Спасибо.

1 Ответ

0 голосов
/ 22 июля 2020

Это хороший вопрос, он больше связан с Distribution Strategy.

После прохождения этого Документация по Tensorflow , Документация по стратегии TPU и это объяснение синхронного и асинхронного обучения ,

Я могу сказать, что

> the optimizer computes 8 different steps on batches of size
> per_replica_batch_size, updating the weights of the model 8 different
> times

Приведенное ниже объяснение из Документация Tensorflow должно пояснить, что :

> So, how should the loss be calculated when using a
> tf.distribute.Strategy?
> 
> For an example, let's say you have 4 GPU's and a batch size of 64. One
> batch of input is distributed across the replicas (4 GPUs), each
> replica getting an input of size 16.
> 
> The model on each replica does a forward pass with its respective
> input and calculates the loss. Now, instead of dividing the loss by
> the number of examples in its respective input (BATCH_SIZE_PER_REPLICA
> = 16), the loss should be divided by the GLOBAL_BATCH_SIZE (64).

Предоставление объяснений по другим ссылкам, а также ниже (на случай, если они не будут работать в будущем):

В документации по стратегии TPU указано:

> In terms of distributed training architecture, `TPUStrategy` is the
> same `MirroredStrategy` - it implements `synchronous` distributed
> training. `TPUs` provide their own implementation of efficient
> `all-reduce` and other collective operations across multiple `TPU`
> cores, which are used in `TPUStrategy`.

Объяснение синхронного и асинхронного обучения показано ниже:

> `Synchronous vs asynchronous training`: These are two common ways of
> `distributing training` with `data parallelism`. In `sync training`, all
> `workers` train over different slices of input data in `sync`, and
> **`aggregating gradients`** at each step. In `async` training, all workers are
> independently training over the input data and updating variables
> `asynchronously`. Typically sync training is supported via all-reduce
> and `async` through parameter server architecture.

Вы также можете go с помощью этого MPI Tutorial чтобы подробно понять концепцию All_Reduce.

На скриншоте ниже показано, как работает All_Reduce:

введите описание изображения здесь

...