2015-12-22 4 views
1

Я пытаюсь запрограммировать большую глубокую нейронную сеть в Theano (несколько больших сверточных слоев для распознавания изображений). Вся сеть не вписывается в графический процессор, поэтому мне нужно каким-то образом разделить сеть. Мой вопрос:Как поместить очень большую сверточную нейронную сеть в GPU с помощью Theano

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

Это не тривиальная проблема, уменьшая количество изображений во время обучения или уменьшая количество или размер слоев, не является решением.

Буду признателен за идею создания сети или управления графическим процессором.

спасибо.

+0

Собственные сетевые параметры вписываются в память GPU? –

+0

Нет, они этого не делают. В этом и проблема, в сети их много. –

+0

Насколько я знаю, разделение сетей на несколько gpus не поддерживается в anano. Есть некоторые разговоры об этом, но это не прямо и, вероятно, не скоро произойдет, проверьте список рассылки anano. В бета-версии есть PR, в котором можно использовать float16, который может сэкономить вам некоторое пространство: https://github.com/Theano/Theano/issues/2908 В противном случае, если вам абсолютно нужна сеть больше, чем аппаратное обеспечение (Titan Xs составляет 12 Гб. .) Проверьте пакет nn и dp torch7, covnets, которые слишком не слишком экзотичны, должны быть легко конфигурированы и, я полагаю, можно настроить для обработки нескольких gpu. – user2805751

ответ

1

Хотя это ухудшает производительность, но вы можете использовать theano.tensor._shared вместо theano.shared. theano.tensor._shared заставляет данные храниться в ОЗУ ЦП. Однако сначала вы должны вычислить объем памяти, необходимый сети, следующим образом, а затем соответствующим образом отделить сетевые параметры в GPU и CPU RAM.

import numpy as np 
import theano.tensor as T 
T.config.floatX = 'float32' 
dataPoints = np.random.random((5000, 65536)).astype(T.config.floatX) 
#float32 data type requires 4 bytes 
sizeinGBs = 5000 * 65546 * 4/1024/1024/1024 + (some small over-head constant which we can ignore safely) 
Смежные вопросы