Flask API重建机器学习模型后服务器无预警关闭问题求助
问题分析与解决方案:Flask API重建模型后服务器无预警关闭
核心原因分析
从日志看请求已完全处理完成,但服务器直接终止,主要有以下几种可能:
- 内存耗尽被系统强制终止:机器学习模型(尤其是复杂模型/多模型集合)会占用大量内存,当内存使用率超过系统限制时,操作系统会直接终止进程,且无错误输出。
- Flask开发服务器自动重载异常:开启debug模式时,开发服务器会监控项目文件变化,
pickle_tool.save_models保存模型到监控目录时可能触发重载,但部分场景下会直接终止进程而非重启;另外直接修改current_app全局属性可能干扰上下文管理,导致进程崩溃。 - 应用上下文绑定模型导致的清理异常:
current_app是请求上下文代理,请求结束后上下文会销毁,绑定大模型对象可能在清理时触发内存释放异常,导致进程终止。
修复代码与解决方案
方案1:改用独立全局存储存放模型,避免干扰Flask上下文
不要将模型绑定到Flask的current_app,而是在独立模块中维护模型的全局存储:
- 创建
model_store.py模块:
# project_app/modules/model_store.py _models = None _score = None def get_models(): global _models return _models def set_models(models): global _models _models = models def get_score(): global _score return _score def set_score(score): global _score _score = score
- 修改路由代码:
from flask import Blueprint, request from project_app.modules import ml_tool, pickle_tool from project_app.modules.model_store import set_models, set_score adminBp = Blueprint('admin', __name__, url_prefix='/admin') @adminBp.route('/refresh', methods=['POST']) def refresh(): request.get_json() # 若无需使用请求体可保留或删除 df_nonTest, df_test = ml_tool.get_splitted_df() models = ml_tool.create_models(df_nonTest) pickle_tool.save_models(models) print('model is created') set_models(models) score = ml_tool.create_roc_auc_score(df_test, models) pickle_tool.save_score(score) print('score is calculated') set_score(score) return {'message': 'refreshed'}, 200
方案2:关闭开发服务器自动重载(临时调试)
如果是自动重载导致的问题,启动服务器时关闭重载:
flask run --no-reload
或在代码中配置:
if __name__ == '__main__': app.run(debug=True, use_reloader=False)
方案3:优化内存占用
- 检查
create_models是否生成了冗余模型,尝试轻量化模型(如量化、减少参数规模)。 - 手动清理临时变量回收内存:
@adminBp.route('/refresh', methods=['POST']) def refresh(): request.get_json() df_nonTest, df_test = ml_tool.get_splitted_df() models = ml_tool.create_models(df_nonTest) # 清理临时数据释放内存 del df_nonTest import gc gc.collect() pickle_tool.save_models(models) print('model is created') set_models(models) score = ml_tool.create_roc_auc_score(df_test, models) # 清理多余变量 del df_test, models gc.collect() pickle_tool.save_score(score) print('score is calculated') set_score(score) return {'message': 'refreshed'}, 200
方案4:切换到生产级服务器
Flask开发服务器不适合高负载场景,改用Gunicorn等生产服务器:
pip install gunicorn gunicorn --workers=2 --bind=0.0.0.0:5000 your_app_module:app
内容的提问来源于stack exchange,提问作者niddddddfier
相关产品推荐
相关产品推荐

