在特定间隔后训练ML模型时出现内存使用问题

我尝试每小时运行一次ML训练脚本,但每次小时后内存使用量大约增加20%,在3-4小时后,内存使用量达到90%,然后脚本会抛出内存错误。我想知道为什么在训练函数完成后内存没有被释放。

尽管如果我手动运行训练函数(不使用任何线程调度器,并且连续调用训练函数两次或三次),这种行为不会出现。

有什么建议可以在每个特定间隔后训练模型吗?

这是代码。

import pickleimport pandas as pdfrom pymongo import MongoClientimport datetimefrom apscheduler.schedulers.blocking import BlockingSchedulerdef 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)    # 一些ML训练算法    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. jobstore从默认(即内存)更改为某个持久位置(示例)。

  2. 或者尝试将参数replace_existing设置为True因为默认值是False)。

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

附注:

我认为可能还有另一种丑陋的解决方法(我没有尝试过!),就是你可以添加一个Listener来监听崩溃并重启整个进程!(如果你可以尝试并以更符合Python风格的方式修改它!)

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()

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注