You need to enable JavaScript to run this app. 在Django中加载多个Keras模型如何实现仅服务启动时加载一次
优惠活动
大模型
产品
解决方案
定价
更多

在Django中加载多个Keras模型如何实现仅服务启动时加载一次

实现Django启动时单次加载Keras模型的方案

你可以利用Django应用的AppConfig.ready()方法实现模型仅在服务启动时加载一次,这个方法会在Django完成应用初始化后全局仅执行一次,是加载全局静态资源的最佳位置。

具体实现步骤

  1. 修改对应应用的apps.py文件,在自定义的AppConfig类中实现模型加载逻辑
from django.apps import AppConfig
import tensorflow as tf
from django.conf import settings

class YourAppConfig(AppConfig):
    default_auto_field = "django.db.models.BigAutoField"
    name = "your_app_name"
    # 类属性存储预加载的5个Keras模型
    loaded_keras_models = {}

    def ready(self):
        # 避免执行迁移、启动shell等非服务启动场景时重复加载模型
        import os
        if os.environ.get("RUN_MAIN") != "true":
            return

        # 批量加载5个模型,替换为你自己的模型构建、权重路径逻辑
        model_configs = [
            ("model1", self.build_model1_arch, settings.MODEL1_WEIGHT_PATH),
            ("model2", self.build_model2_arch, settings.MODEL2_WEIGHT_PATH),
            ("model3", self.build_model3_arch, settings.MODEL3_WEIGHT_PATH),
            ("model4", self.build_model4_arch, settings.MODEL4_WEIGHT_PATH),
            ("model5", self.build_model5_arch, settings.MODEL5_WEIGHT_PATH),
        ]

        for model_name, build_func, weight_path in model_configs:
            model = build_func()
            model.load_weights(weight_path)
            self.loaded_keras_models[model_name] = model

    # 替换为你自己的各模型架构构建代码
    def build_model1_arch(self):
        model = tf.keras.Sequential([
            # 你的模型层定义
        ])
        return model

    # 同理实现build_model2_arch到build_model5_arch方法
    # ...
  1. 在settings.py中注册应用时指定完整的AppConfig路径
INSTALLED_APPS = [
    # Django默认应用
    "django.contrib.admin",
    "django.contrib.auth",
    # ... 其他应用
    "your_app_name.apps.YourAppConfig", # 替换为你自己的AppConfig路径
]
  1. 在视图中直接调用预加载的模型生成预测结果
from django.http import JsonResponse
from your_app_name.apps import YourAppConfig
import numpy as np

def batch_predict(request):
    # 省略输入参数校验、数据预处理逻辑,替换为你自己的实现
    input_data = np.array(request.POST.getlist("input_data")).reshape(1, -1)
    
    predict_results = {}
    # 直接从AppConfig拿预加载的模型,无需重复构建和加载权重
    for model_name, model in YourAppConfig.loaded_keras_models.items():
        pred = model.predict(input_data, verbose=0)
        # 把numpy格式的预测结果转成可JSON序列化的列表格式
        predict_results[model_name] = pred.flatten().tolist()
    
    return JsonResponse(predict_results)

注意事项

  • 如果你使用多worker的部署模式(比如Gunicorn、uWSGI多进程启动),每个worker进程会独立加载一次模型,这是进程内存隔离的正常现象,如果需要全局仅加载一次,可以单独部署TensorFlow Serving作为模型服务,Django仅负责请求转发。
  • 开发模式下Django默认开启自动重载,会触发两次ready()执行,上述代码中的RUN_MAIN判断已经规避了无效加载。
  • 如果你使用的是Keras 2.x以下的旧版本,预测时需要用with tf.Graph().as_default():包裹预测代码,避免会话冲突。
  • 如果使用ASGI异步部署,建议把模型预测逻辑放到同步线程池执行,避免阻塞事件循环。

内容的提问来源于stack exchange,提问作者Aniket Banyal

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 16:12:01