Не удалось выделить память процессора в Dynet - PullRequest
0 голосов
/ 29 мая 2018

Я не уверен, почему у меня заканчивается память.Возьмите синтаксический анализатор Гольдберга, все, что я делаю, это изменю эту строку:

оценки, exprs = self .__ оценивать (conll_sentence, True)

и добавьте цикл for вокруг него, чтобы повторить его K раз:

for k in xrange(K):
    scores, exprs = self.__evaluate(conll_sentence, True)
    # do something

Затем в getExpr я делаю следующее:

samples_out = np.random.normal(0,0.001, (1, self.hidden_units))
samples_FOH = np.random.normal(0,0.001,(self.hidden_units, self.ldims * 2))
samples_FOM = np.random.normal(0,0.001,(self.hidden_units, self.ldims * 2))
samples_Bias = np.random.normal(0,0.001, (self.hidden_units))

XoutLayer = self.outLayer.expr()+inputTensor(samples_out)
XhidLayerFOH = self.hidLayerFOH.expr()+inputTensor(samples_FOH)
XhidLayerFOM = self.hidLayerFOM.expr()+inputTensor(samples_FOM)
XhidBias = self.hidBias.expr()+inputTensor(samples_Bias)

if sentence[i].headfov is None:
    sentence[i].headfov = XhidLayerFOH * concatenate([sentence[i].lstms[0], sentence[i].lstms[1]])
if sentence[j].modfov is None:
    sentence[j].modfov  = XhidLayerFOM * concatenate([sentence[j].lstms[0], sentence[j].lstms[1]])

output = XoutLayer * self.activation(sentence[i].headfov + sentence[j].modfov + XhidBias)
return output

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

1 Ответ

0 голосов
/ 29 мая 2018

Выражения Dynet остаются в памяти до следующего вызова renew_cg().

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

Примечание: при выполнении простого добавления, такого как:

XoutLayer = self.outLayer.expr()+inputTensor(samples_out)

, добавление фактически не выполняется.Вы просто создаете новое выражение и указываете, как его оценивать по другим выражениям.Фактическое вычисление выполняется, когда есть вызов .forward() (или .value() и т. Д.) Для XoutLayer или для выражения, вычисление которого зависит от XoutLayer.Таким образом, dynet необходимо выделить память для всех выражений в текущем графе вычислений.

...