Не удалось выделить память процессора в Dynet

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

очки, 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 ответ

Решение

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

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

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

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

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

Другие вопросы по тегам