Решение проблемы размера пакета и доступной памяти графического процессора в обучающих нейронных сетях

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

Проблема: размер пакета ограничен доступной памятью графического процессора

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

Диапазон возможных значений размера пакета сегодня ограничен доступной памятью графического процессора. По мере того, как нейронная сеть становится больше, максимальный размер пакета, который может быть запущен на одном графическом процессоре, становится меньше. Сегодня, когда мы запускаем более крупные модели, чем когда-либо прежде, возможные значения размера партии становятся меньше и могут быть далеки от оптимальных значений.

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

Что такое размер партии?

Размер пакета - это количество образцов (например, изображений), используемых для обучения модели перед обновлением ее обучаемых переменных модели - весов и смещений. То есть на каждом шаге обучения пакет выборок распространяется по модели, а затем распространяется в обратном направлении, чтобы вычислить градиенты для каждой выборки. Затем градиенты всех выборок будут усреднены или суммированы, и это значение будет использоваться в качестве входных данных для формулы (в зависимости от выбранного оптимизатора), которая вычисляет обновления для обучаемых переменных модели. Только после обновления параметров следующая партия образцов пройдет тот же процесс.

Определение оптимального размера партии

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

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

  • Обобщение: большие размеры пакета могут привести к неправильному обобщению (или даже застреванию в локальном минимуме). Обобщение означает, что нейронная сеть будет достаточно хорошо работать на выборках за пределами обучающей выборки. Итак, плохое обобщение, которое в значительной степени переобучено, означает, что нейронная сеть будет плохо работать с образцами за пределами обучающего набора.
  • Скорость сходимости. Небольшие размеры пакетов могут привести к медленной сходимости алгоритма обучения. Обновления переменных, применяемые на каждом шаге, которые были рассчитаны с использованием пакета образцов, определят отправную точку для следующего пакета образцов. Обучающие выборки случайным образом берутся из обучающего набора на каждом шаге, и поэтому результирующие градиенты являются зашумленными оценками, основанными на частичных данных. Чем меньше образцов мы используем в одном пакете, тем более шумными и менее точными будут оценки градиента. То есть, чем меньше размер пакета, тем большее влияние один образец оказывает на обновления применяемых переменных. Другими словами, меньшие размеры пакетов могут сделать процесс обучения более шумным и нестабильным, существенно увеличивая время, необходимое алгоритму для сходимости.

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

Влияние размера пакета на требуемую память графического процессора

В то время как традиционные компьютеры имеют доступ к большому количеству оперативной памяти, графические процессоры имеют гораздо меньше, и хотя объем памяти графического процессора растет и будет расти в будущем, иногда этого недостаточно. Размер обучающего пакета оказывает огромное влияние на требуемую память графического процессора для обучения нейронной сети. Чтобы лучше понять это, давайте сначала рассмотрим, что хранится в памяти графического процессора во время обучения:

  1. Параметры - веса и смещения сети.
  2. Переменные оптимизатора - промежуточные переменные алгоритма (например, импульсы).
  3. Промежуточные вычисления - значения прямого прохода, которые временно хранятся в памяти графического процессора, а затем используются при обратном проходе. (например, выходы активации каждого слоя используются при обратном проходе для вычисления градиентов)
  4. Рабочая область - временная память для локальных переменных реализаций ядра.

ПРИМЕЧАНИЕ. Хотя (1) и (4) требуются всегда, (2) и (3) требуются только в режиме обучения.

Таким образом, чем больше размер пакета, тем больше выборок передается через нейронную сеть в прямом проходе. Это приводит к большим промежуточным вычислениям (например, выходным данным активации слоя), которые необходимо сохранять в памяти графического процессора. С технической точки зрения, размер активаций линейно зависит от размера партии.

Теперь ясно видно, что увеличение размера пакета напрямую приведет к увеличению требуемой памяти графического процессора. Во многих случаях нехватка памяти графического процессора не позволяет нам увеличить размер пакета. Давайте теперь посмотрим, как мы можем нарушить границы памяти графического процессора и по-прежнему использовать пакеты большего размера.

Использование больших партий

Один из способов преодолеть ограничения памяти графического процессора и запустить большие пакеты - разделить пакет образцов на более мелкие мини-пакеты, где каждый мини-пакет требует достаточного количества памяти графического процессора, которое может быть удовлетворено. Эти мини-пакеты могут выполняться независимо, и их градиенты должны быть усреднены или суммированы перед вычислением обновлений переменных модели. Есть два основных способа реализовать это:

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

Накопление градиента - запускайте мини-пакеты последовательно, накапливая градиенты. Накопленные результаты используются для обновления переменных модели в конце последнего мини-пакета.

Сходства между параллелизмом данных и накоплением градиента

Накопление градиента параллелизма данных имеет много общих характеристик и ограничений:

  • Ни один из них не позволяет запускать модели, которым требуется больше памяти графического процессора, чем доступно (даже с одним образцом).
  • Нормализация пакета выполняется отдельно для каждого мини-пакета, а не для глобального пакета, что приводит к тому, что они не полностью эквивалентны запуску той же модели с использованием глобального размера пакета. (ПРИМЕЧАНИЕ. Хотя пакетная нормализация для глобального пакета может быть реализована в DP, обычно это не так и выполняется отдельно.)
  • Оба они позволяют нам увеличивать глобальный размер пакета, но при этом ограничены памятью графического процессора.

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

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

Мы провели несколько экспериментов в этом направлении и называем это эластичностью. В Run: AI product эта функция используется для увеличения использования кластеров графических процессоров и повышения продуктивности команд по анализу данных. Мы поделимся некоторыми подробностями об этих концепциях в будущих публикациях.

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

Заключение

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

Хотя специалисты по данным стремятся найти оптимальный размер пакета для конкретной нейронной сети и набора данных, определение правильного размера пакета с последующим ограничением памяти графического процессора является обычным явлением, и мы пытались его преодолеть.

Следующие шаги

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

Инструмент для накопления градиентов с открытым исходным кодом, а также примеры использования и другие ресурсы доступны на GitHub.