Flask_restx API加载ML模型时如何实现可访问的健康检查端点?
解决方案:在ML模型加载期间提供Flask健康检查端点
核心问题分析
当前代码在src/app/__init__.py的模块级别直接实例化artefatosML = artefatos(),这会导致Flask应用启动前就开始加载模型,10分钟的加载时间内整个应用完全不可用,ALB健康检查自然无法通过。
解决思路
- 延迟模型加载到Flask应用启动之后,用后台线程异步加载,保证应用先启动并暴露健康检查端点
- 注册一个独立的健康检查端点,实时反馈应用启动状态和模型加载进度
- 确保其他API路由能感知模型加载状态,避免加载期间处理请求报错
具体代码修改
1. 修改src/app/__init__.py
移除模块级的模型实例化,改用后台线程在应用启动后加载:
from flask import Flask from flask_bcrypt import Bcrypt from flask_cors import CORS from flask_sqlalchemy import SQLAlchemy from threading import Thread # 新增导入 from app.config import get_config from app.azureml.artefatos import artefatos from datetime import datetime API_NAME = "MyApp" cors = CORS() bcrypt = Bcrypt() db = SQLAlchemy() # 移除这一行:artefatosML = artefatos() def create_app(config_name): app = Flask(API_NAME) app.config.from_object(get_config(config_name)) # 第一步:先注册健康检查端点,确保启动后立刻可访问 @app.route('/health') def health_check(): if hasattr(app, 'model_loaded') and app.model_loaded: return {"status": "healthy", "model_status": "loaded"}, 200 return {"status": "starting", "model_status": "loading"}, 200 # 注册API蓝图 from app.api import api_bp app.register_blueprint(api_bp) # 初始化扩展 cors.init_app(app) db.init_app(app) bcrypt.init_app(app) # 第二步:后台线程异步加载模型 def load_ml_models(): # 执行慢加载操作 app.artefatosML = artefatos() # 标记模型加载完成 app.model_loaded = True # 启动后台线程,daemon=True保证线程随应用退出而终止 Thread(target=load_ml_models, daemon=True).start() return app
2. 修改API路由中的模型调用逻辑
所有需要使用artefatosML的API路由,需要从current_app获取实例,并检查模型加载状态:
from flask import current_app, abort from flask_restx import Namespace, Resource api = Namespace('predict', description='Prediction operations') @api.route('/') class PredictionResource(Resource): def post(self): # 检查模型是否加载完成 if not hasattr(current_app, 'model_loaded') or not current_app.model_loaded: abort(503, description="Model is still loading, please retry later.") # 正常调用模型处理请求 data = api.payload result = current_app.artefatosML.predict(data) return result, 200
3. 验证兼容性
你的现有启动方式flask run完全兼容修改后的代码:
run.py无需改动,依然通过create_app创建实例- Flask会自动检测到
run.py中的app实例并启动服务 - 启动后
/health端点立刻可用,ALB健康检查会收到响应,等待模型加载完成
可选优化
- 可以给ALB健康检查配置更精细的规则:比如初始接受
200和202状态码,模型加载完成后只接受200 - 添加模型加载日志,方便排查加载时长和问题
- 用
threading.Lock或concurrent.futures更优雅地处理异步加载逻辑
内容的提问来源于stack exchange,提问作者Felipe Ferreira de Carvalho
相关产品推荐
相关产品推荐

