Проблема использования памяти при обучении модели ML после каждого определенного интервала - PullRequest
0 голосов
/ 08 ноября 2018

Я пытаюсь запускать учебный сценарий ML через каждые 1 час, но через каждый час использование памяти увеличивается примерно на 20%, а через 3-4 часа использование памяти достигает 90%, а затем этот сценарий выдает Ошибка памяти . Мне интересно, почему память не освобождается, когда заканчивается функция поезда.

Хотя это поведение не отображается, если я запускаю функцию поезда вручную (не используя какой-либо планировщик потоков и вызывая функцию поезда дважды или трижды один за другим).

Любое предложение обучать модель после каждого определенного интервала.

Вот код.

import pickle
import pandas as pd
from pymongo import MongoClient
import datetime
from apscheduler.schedulers.blocking import BlockingScheduler

def train():

    client = MongoClient(databaseURI)
    db = client['mydb']

    movie_data = []
    for index, obj in enumerate(db.movies.find({})):
        movie_obj = {}

        movie_obj['_id'] = obj['_id']
        movie_obj['title'] = obj['title']
        movie_obj['rating'] = obj['rating']
        movie_data.append(movie_obj)


    user_data = []
    for index, obj in enumerate(db.users.find({})):
        user_obj = {}

        user_obj['_id'] = obj['_id']
        user_obj['username'] = obj['username']
        user_obj['movie_id'] = obj['movie_id']
        user_obj['rating'] = obj['rating']
        user_data.append(user_obj)


    movie_data_df = pd.DataFrame(movie_data)
    user_data_df = pd.DataFrame(user_data)

    # some ML training ALGO
    trainedModel = algo.train(user_data_df, movie_data_df)

    trained.to_pickle('files/trained.pkl')


scheduler = BlockingScheduler()
scheduler.add_job(train, 'interval', hours=1, next_run_time=datetime.datetime.now())
scheduler.start()

1 Ответ

0 голосов
/ 08 ноября 2018

Работа магазинов дома запланированных работ. хранилище заданий по умолчанию просто сохраняет задания в памяти , но другие хранят их в различных видах базы данных. Данные задания сериализуются, когда они сохраняются в постоянном хранилище заданий и десериализовано, когда оно загружается обратно из него. Работа магазинов ( кроме значения по умолчанию ) не хранит данные задания в памяти, но выступать в качестве посредников для сохранения, загрузки, обновления и поиска вакансий в бэкэнд.

Я предлагаю попробовать одно из следующих решений:

  1. Измените jobstore из значения по умолчанию (то есть памяти) на какое-то постоянное место ( Пример ).

  2. Или попробуйте установить для параметра replace_existing значение True ( по умолчанию - False).

    scheduler.add_job(train, 'interval', hours=1, 
                      next_run_time=datetime.datetime.now(), replace_existing=True)
    

Побочное примечание:

Я думаю, что мог бы быть другой уродливый способ исправить это (я не пробовал это!), Так что вы добавляете Listener, чтобы прослушать сбои и перезапустить весь процесс! (если вы можете попробовать и исправить это более питонским способом!)

scheduler = BlockingScheduler()
scheduler.add_job(train, 'interval', hours=1, next_run_time=datetime.datetime.now())

def my_listener(event):
    if event.exception:       
        global scheduler
        scheduler.shutdown()
        gc.collect()
        scheduler = BlockingScheduler()
        scheduler.add_job(train, 'interval', hours=1, next_run_time=datetime.datetime.now())
        scheduler.add_listener(my_listener, EVENT_JOB_EXECUTED | EVENT_JOB_ERROR)
        scheduler.start()

scheduler.add_listener(my_listener, EVENT_JOB_EXECUTED | EVENT_JOB_ERROR)
scheduler.start()
...