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

Flask_restx API加载ML模型时如何实现可访问的健康检查端点?

解决方案:在ML模型加载期间提供Flask健康检查端点

核心问题分析

当前代码在src/app/__init__.py的模块级别直接实例化artefatosML = artefatos(),这会导致Flask应用启动前就开始加载模型,10分钟的加载时间内整个应用完全不可用,ALB健康检查自然无法通过。

解决思路

  1. 延迟模型加载到Flask应用启动之后,用后台线程异步加载,保证应用先启动并暴露健康检查端点
  2. 注册一个独立的健康检查端点,实时反馈应用启动状态和模型加载进度
  3. 确保其他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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 11:41:25