在Django中加载多个Keras模型如何实现仅服务启动时加载一次
实现Django启动时单次加载Keras模型的方案
你可以利用Django应用的AppConfig.ready()方法实现模型仅在服务启动时加载一次,这个方法会在Django完成应用初始化后全局仅执行一次,是加载全局静态资源的最佳位置。
具体实现步骤
- 修改对应应用的
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方法 # ...
- 在
settings.py中注册应用时指定完整的AppConfig路径
INSTALLED_APPS = [ # Django默认应用 "django.contrib.admin", "django.contrib.auth", # ... 其他应用 "your_app_name.apps.YourAppConfig", # 替换为你自己的AppConfig路径 ]
- 在视图中直接调用预加载的模型生成预测结果
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
相关产品推荐
相关产品推荐

