Я пытаюсь обучить сеть в 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 ГБ, она, возможно, не намного больше, чем «старая», как я подозревал (к сожалению, в данный момент кто-то еще использует графический процессор, поэтому я не могупроверь сколько памяти старой настройке нужно ровно)