You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flask API重建机器学习模型后服务器无预警关闭问题求助

问题分析与解决方案:Flask API重建模型后服务器无预警关闭

核心原因分析

从日志看请求已完全处理完成,但服务器直接终止,主要有以下几种可能:

  • 内存耗尽被系统强制终止:机器学习模型(尤其是复杂模型/多模型集合)会占用大量内存,当内存使用率超过系统限制时,操作系统会直接终止进程,且无错误输出。
  • Flask开发服务器自动重载异常:开启debug模式时,开发服务器会监控项目文件变化,pickle_tool.save_models保存模型到监控目录时可能触发重载,但部分场景下会直接终止进程而非重启;另外直接修改current_app全局属性可能干扰上下文管理,导致进程崩溃。
  • 应用上下文绑定模型导致的清理异常:current_app是请求上下文代理,请求结束后上下文会销毁,绑定大模型对象可能在清理时触发内存释放异常,导致进程终止。

修复代码与解决方案

方案1:改用独立全局存储存放模型,避免干扰Flask上下文

不要将模型绑定到Flask的current_app,而是在独立模块中维护模型的全局存储:

  1. 创建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
  1. 修改路由代码:
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 03:05:41