Кафе из памяти, где это используется? - PullRequest
0 голосов
/ 01 марта 2019

Я пытаюсь обучить сеть в Caffe, слегка измененную SegNet-basic модель.

Я понимаю, что ошибка Check failed: error == cudaSuccess (2 vs. 0) out of memory, которую я получаю, связана с моей работойне хватает памяти графического процессора.Однако то, что меня озадачивает, таково:

Мои «старые» попытки тренировки работали нормально.Сеть инициализировалась и работала со следующим:

  • размер пакета 4
  • Memory required for data: 1800929300 (это рассчитывается в размере пакета, поэтому здесь 4x размер выборки здесь)
  • Общее количество параметров: 1418176
  • сеть состоит из 4x (свертка, ReLU, объединение в пул), а затем 4x (повышающая выборка, деконволюция);с 64 фильтрами с размером ядра 7x7 на слой.

Что удивляет меня, что моей «новой» сети не хватает памяти, и я не понимаю, что резервирует дополнительную память, так как яуменьшил размер партии:

  • размер партии 1
  • Memory required for data: 1175184180 (= размер образца)
  • Общее количество параметров: 1618944
  • входной размер удваивается по каждому измерению (ожидаемый выходной размер не изменяется), поэтому причиной увеличения количества параметров является один дополнительный набор (свертка, ReLU, объединение в пул) в начале сети.

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

Предполагая, что для каждого параметра требуется 4байт памяти, что все еще дает data_memory+num_param*4 более высокие требования к памяти для моей старой установки memory_old = 1806602004 = 1.68GB по сравнению с новой memory_new = 1181659956 = 1.10GB.

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


РЕДАКТИРОВАТЬ: Для запроса, здесь приведены размеры слоя для каждой из сетей в сочетании с размером данныхкоторый проходит через него:

«Старая» сеть:

                            Top shape: 4 4 384 512 (3145728)
('conv1', (64, 4, 7, 7))           --> 4 64 384 512 (50331648)
('conv1_bn', (1, 64, 1, 1))        --> 4 64 384 512 (50331648)
('conv2', (64, 64, 7, 7))          --> 4 64 192 256 (12582912)
('conv2_bn', (1, 64, 1, 1))        --> 4 64 192 256 (12582912)
('conv3', (64, 64, 7, 7))          --> 4 64 96 128 (3145728)
('conv3_bn', (1, 64, 1, 1))        --> 4 64 96 128 (3145728)
('conv4', (64, 64, 7, 7))          --> 4 64 48 64 (786432)
('conv4_bn', (1, 64, 1, 1))        --> 4 64 48 64 (786432)
('conv_decode4', (64, 64, 7, 7))   --> 4 64 48 64 (786432)
('conv_decode4_bn', (1, 64, 1, 1)) --> 4 64 48 64 (786432)
('conv_decode3', (64, 64, 7, 7))   --> 4 64 96 128 (3145728)
('conv_decode3_bn', (1, 64, 1, 1)) --> 4 64 96 128 (3145728)
('conv_decode2', (64, 64, 7, 7))   --> 4 64 192 256 (12582912)
('conv_decode2_bn', (1, 64, 1, 1)) --> 4 64 192 256 (12582912)
('conv_decode1', (64, 64, 7, 7))   --> 4 64 384 512 (50331648)
('conv_decode1_bn', (1, 64, 1, 1)) --> 4 64 384 512 (50331648)
('conv_classifier', (3, 64, 1, 1))

Для «Новой» сети несколько верхних слоев различаются, а остальные в точности совпадают, за исключением того, что размер пакета равен1 вместо 4:

                            Top shape: 1 4 769 1025 (3152900)
('conv0', (64, 4, 7, 7))           --> 1 4 769 1025 (3152900) 
('conv0_bn', (1, 64, 1, 1))        --> 1 64 769 1025 (50446400)
('conv1', (64, 4, 7, 7))           --> 1 64 384 512 (12582912)
('conv1_bn', (1, 64, 1, 1))        --> 1 64 384 512 (12582912)
('conv2', (64, 64, 7, 7))          --> 1 64 192 256 (3145728)
('conv2_bn', (1, 64, 1, 1))        --> 1 64 192 256 (3145728)
('conv3', (64, 64, 7, 7))          --> 1 64 96 128 (786432)
('conv3_bn', (1, 64, 1, 1))        --> 1 64 96 128 (786432)
('conv4', (64, 64, 7, 7))          --> 1 64 48 64 (196608)
('conv4_bn', (1, 64, 1, 1))        --> 1 64 48 64 (196608)
('conv_decode4', (64, 64, 7, 7))   --> 1 64 48 64 (196608)
('conv_decode4_bn', (1, 64, 1, 1)) --> 1 64 48 64 (196608)
('conv_decode3', (64, 64, 7, 7))   --> 1 64 96 128 (786432)
('conv_decode3_bn', (1, 64, 1, 1)) --> 1 64 96 128 (786432)
('conv_decode2', (64, 64, 7, 7))   --> 1 64 192 256 (3145728)
('conv_decode2_bn', (1, 64, 1, 1)) --> 1 64 192 256 (3145728)
('conv_decode1', (64, 64, 7, 7))   --> 1 64 384 512 (12582912)
('conv_decode1_bn', (1, 64, 1, 1)) --> 1 64 384 512 (12582912)
('conv_classifier', (3, 64, 1, 1))

При этом пропускаются слои объединения и повышения частоты дискретизации.Вот train.prototxt для «новой» сети.Старая сеть не имеет слоев conv0, conv0_bn и pool0, в то время как остальные слои одинаковы.«Старая» сеть также имеет batch_size, установленную на 4 вместо 1.


EDIT2: По запросу, даже больше информации:

  • Все входные данные имеют одинаковые размеры.Это стек из 4 каналов, каждый из которых имеет размер 769x1025, поэтому всегда 4x769x1025 вход.
  • Журнал тренировок кофеен здесь : как вы можете видеть, я получаю out of memory только после инициализации сети.Ни одна итерация не выполняется.
  • Мой графический процессор имеет 8 ГБ памяти, хотя я только что обнаружил (пробуя на другом компьютере), что для этой новой сети требуется 9,5 ГБ памяти графического процессора.
  • Просто, чтобы повторить, я пытаюсь понять, почему моя «старая» установка помещается в 8 ГБ памяти, а «новая» - нет, а также почему объем памяти, необходимый для дополнительных данных, составляет ~ 8 разбольше памяти, необходимой для хранения ввода.Тем не менее, теперь, когда я подтвердил, что «новая» установка занимает всего 9,5 ГБ, она, возможно, не намного больше, чем «старая», как я подозревал (к сожалению, в данный момент кто-то еще использует графический процессор, поэтому я не могупроверь сколько памяти старой настройке нужно ровно)

1 Ответ

0 голосов
/ 11 марта 2019

Имейте в виду, что caffe фактически выделяет место для двух копий сети: сети "фазы поезда" и сети "фазы тестирования".Поэтому, если данные занимают 1,1 ГБ, вам нужно удвоить это пространство.
Более того, вам нужно выделить место для параметров.Каждый параметр должен хранить свой градиент.Кроме того, решатель отслеживает «импульс» для каждого параметра (иногда даже второй момент, например, в решателе ADAM).Следовательно, увеличение количества параметров даже на небольшую величину может привести к значительному увеличению объема памяти системы обучения.

...