Прогнозирование требований к памяти ЦП и ГП для обучения DNN

10

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

В качестве примера рассмотрим (неповторяющуюся) модель с входом измерения 1000, 4 полностью подключенными скрытыми слоями измерения 100 и дополнительным выходным слоем измерения 10. Размер мини-пакета составляет 256 примеров. Как определить приблизительный объем памяти (ОЗУ), занимаемый тренировочным процессом на ЦП и ГП? Если это имеет какое-то значение, давайте предположим, что модель обучена на GPU с TensorFlow (таким образом, используя cuDNN).

Whaa
источник

Ответы:

3

Ответ @ik_vision описывает, как оценить объем памяти, необходимый для хранения весов, но вам также необходимо хранить промежуточные активации, и особенно для сверточных сетей, работающих с трехмерными данными, это основная часть необходимой памяти.

Чтобы проанализировать ваш пример:

  1. На вход нужно 1000 элементов
  2. После слоев 1-4 слоя у вас есть 100 элементов, всего 400
    1. После финального слоя у вас есть 10 элементов

Всего на 1 образец вам нужно 1410 элементов для прямого прохода. За исключением входных данных, вам также понадобится информация о градиенте для каждого из них для обратного прохода, то есть еще 410, всего 1820 элементов на выборку . Умножьте на размер партии, чтобы получить 465 920.

Я сказал «элементы», потому что размер, необходимый для каждого элемента, зависит от используемого типа данных. Для одинарной точности float32это 4B, а общая память, необходимая для хранения больших двоичных объектов данных, будет около 1,8MB.

Ян Кукацка
источник
1

Я вижу два варианта:

  1. Сеть загружается с диска
  2. Сеть создается на лету

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

Полезное правило при загрузке с диска: если DNN занимает X МБ на диске, сеть будет в 2 раза больше в памяти графического процессора для размера пакета 1.

Сеть создается на лету для размера пакета 1: подсчитать параметр и умножить на 4 байта (бит float32): подсчет числа параметров вручную: fc1: 1000x100 (веса) + 100 (смещения) fc2: 100x100 (веса) + 100 (смещения) fc3: 100x100 (веса) + 100 (смещения) fc4: 100x100 (веса) + 100 (смещения) выход: 100x10 (веса) + 10 (смещения)

Подсчет количества параметров с использованием Keras: model.count_params ()

ik_vision
источник
3
Насколько я могу судить, это дает требования к памяти для хранения самих весов , но игнорирует любую память, предназначенную для хранения чего-либо, строго необходимого для обучения , например градиентов. Хранение градиентов требуется, скажем, для реализации импульса. я скучаю?
Ваа
1
@ Вот это правильно, для нормальной тренировки вам нужна память для хранения весов, активаций в прямом проходе и градиентов в проходе обратного распространения (в 3 раза больше памяти, даже без импульса).
Мюль
@mjul мои эксперименты показывают 4,5-кратную оценку ik_vision. Я понимаю обоснование 3x, но я не уверен, почему на практике он использует 4.5x. Должны быть другие накладные расходы Keras / TF ??
Уэс