Как найти источник MemoryError в Python?

Я запускаю оптимизацию гиперпараметров, используя Hyperopt для нейронной сети. При этом после некоторых итераций я получаю исключение MemoryError

До сих пор я пытался очистить все переменные после того, как они были использованы (назначив им None или пустые списки, есть ли лучший способ для этого?) и распечатать все locals(), dirs() и globals() с их размерами, но эти количества никогда не увеличиваются, а размеры довольно малы.

Структура выглядит следующим образом:

def create_model(params):
    ## load data from temp files
    ## pre-process data accordingly
    ## Train NN with crossvalidation clearing Keras' session every time
    ## save stats and clean all variables (assigning None or empty lists to them)

def Optimize():
    for model in models: #I have multiple models
        ## load data
        ## save data to temp files
        trials = Trials()
        best_run = fmin(create_model,
                        space,
                        algo=tpe.suggest,
                        max_evals=100,
                        trials=trials)

После X итераций (иногда он завершает первые 100 и переходит на вторую модель) выдает ошибку памяти. Я предполагаю, что некоторые переменные остаются в памяти, и я не очищаю их, но я не смог их обнаружить.

Обновлено:

Traceback (most recent call last):
  File "Main.py", line 32, in <module>
    optimal = Optimize(training_sets)
  File "/home/User1/Optimizer/optimization2.py", line 394, in Optimize
    trials=trials)
  File "/usr/local/lib/python3.5/dist-packages/hyperopt/fmin.py", line 307, in fmin
    return_argmin=return_argmin,
  File "/usr/local/lib/python3.5/dist-packages/hyperopt/base.py", line 635, in fmin
    return_argmin=return_argmin)
  File "/usr/local/lib/python3.5/dist-packages/hyperopt/fmin.py", line 320, in fmin
    rval.exhaust()
  File "/usr/local/lib/python3.5/dist-packages/hyperopt/fmin.py", line 199, in exhaust
    self.run(self.max_evals - n_done, block_until_done=self.async)
  File "/usr/local/lib/python3.5/dist-packages/hyperopt/fmin.py", line 173, in run
    self.serial_evaluate()
  File "/usr/local/lib/python3.5/dist-packages/hyperopt/fmin.py", line 92, in serial_evaluate
    result = self.domain.evaluate(spec, ctrl)
  File "/usr/local/lib/python3.5/dist-packages/hyperopt/base.py", line 840, in evaluate
    rval = self.fn(pyll_rval)
  File "/home/User1/Optimizer/optimization2.py", line 184, in create_model
    x_train, x_test = x[train_indices], x[val_indices]
MemoryError

Не могли бы вы добавить эту ошибку с полной трассировкой стека в свой вопрос?

gbajson 14.04.2019 20:24

Позвольте мне перезапустить его, и я извлеку это.

bleand 14.04.2019 20:28
stackoverflow.com/questions/110259/…
Alex Jadczak 15.04.2019 02:36

@AlexJadczak, это было полезно. Я использовал memory_profiler, и 90% памяти генерируется в строке, которая вызывает fmin

bleand 15.04.2019 21:53
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
4
227
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Мне потребовалось пару дней, чтобы понять это, поэтому я отвечу на свой вопрос, чтобы сэкономить время тому, кто столкнется с этой проблемой.

Обычно при использовании Hyperopt для Keras предлагаемая функция return функции create_model выглядит примерно так:

return {'loss': -acc, 'status': STATUS_OK, 'model': model}

Но в больших моделях, с множеством оценок, возвращаться и сохранять в памяти каждую модель не хочется, нужен только набор Гиперпараметров, который дал наименьшую loss

Просто удалив модель из возвращенного dict, проблема увеличения памяти с каждой оценкой решена.

return {'loss': -acc, 'status': STATUS_OK}

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