Почему большие мини-партии занимают больше времени?

Я тренирую автоэнкодер в MNIST и заметил, что увеличение размера пакета после 128 начинает занимать больше времени вычислений при фиксированном размере набора данных.

Я использую tenorflow-GPU и GeForce GTX 1070.

Я попытался провести пару тестов на фиксированном тренировочном наборе из 5000 образцов (784 дим) и пробежал 10 эпох. Пакеты последовательные batch-size фрагменты из 5000 обучающих выборок, поэтому число итераций эффективно зависит от размера партии.

Я отслеживал производительность этих данных (потери), время выполнения и использование памяти графическим процессором процесса python (из вывода nvidia-smi):

5000 datapoints 10 epochs

batch size
512:       loss: 53.7472; execution took 00:00:13,787; 4281MiB
256:       loss: 48.1941; execution took 00:00:04,973; 695MiB
128:       loss: 42.7486; execution took 00:00:03,350; 439MiB
64:        loss: 40.0781; execution took 00:00:04,191; 439MiB
32:        loss: 37.7348; execution took 00:00:06,487; 441MiB
16:        loss: 36.6291; execution took 00:00:12,102; 441MiB
8:         loss: nan;     execution took 00:00:23,115; 441MiB

Когда я пробую минибатчи размером больше 512, я получаю ошибки Out Of Memory.

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

Одно из предположений заключается в том, что графический процессор заполнен и не может правильно распараллеливаться, но я не смог найти таких комментариев в Интернете.

2 ответа

В то время как большие партии означают меньшее общее количество обновлений в каждой эпохе, это также означает, что обработка каждой партии займет больше времени, и хотя увеличение размера пакета уменьшает общее количество пакетов, это также может привести к более медленной конвергенции.
Итак, как вы можете видеть, есть компромисс. Вам нужно будет найти оптимальный размер пакета для вашего набора данных. Для MNIST размеры партии обычно составляют от 50 до 150.
Я не уверен, как вы загружаете пакеты из базы данных, но при правильном использовании преимущество пакетирования заключается в том, что вам не нужно загружать все данные в оперативную память. Поэтому вполне естественно, что большой размер пакета приведет к ошибке нехватки памяти.

  • Когда вы тренируете свою модель с меньшим размером партии, ваша модель обновляется чаще, хотя и стохастически. Это помогает быстрее сходиться в каждую эпоху. Например, если вы тренируетесь на batch_size из 500, вы обновите параметры вашей модели 100 раз за 1 эпоху, но если вы будете тренироваться на batch_size из 50 число обновлений в 1 эпоху составляет 1000.

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

  • Когда вы тренируете свою модель с большим размером пакета, она использует векторизованные вычисления на CPU или GPU, например, с batch_size = 1 мы получаем больше обновлений, но нет преимуществ векторизации. Но когда вы тренируетесь с очень большим размером пакета, который превышает объем памяти, это значит, что памяти недостаточно.

Обычно мы балансируем количество партий и скорость их конвергенции.

Другие вопросы по тегам