Django应用中应在何处加载Tensorflow模型以设置全局可用变量
Django 全局加载TensorFlow模型方案说明
当前方案的有效性
你在views.py所有函数外部加载模型的方案是可以正常运行的:Django启动时会导入一次views.py模块,模块顶层的代码仅会在首次导入时执行一次,后续请求调用视图函数不会重复触发模型加载,功能层面没有问题。
更符合Django规范的实现方案
如果需要更优雅、更贴合Django应用生命周期的实现,推荐把模型加载逻辑放到Django应用的ready()钩子中执行,方便统一管理全局初始化资源:
实现步骤
- 重写应用配置的
ready()方法加载模型
在应用的apps.py文件中添加如下代码:
from django.apps import AppConfig import tensorflow as tf class 你的应用名Config(AppConfig): default_auto_field = 'django.db.models.BigAutoField' name = '你的应用名' # 存储预加载的模型 tf_model = None def ready(self): # 避免runserver自动重载机制触发重复加载 import os if os.environ.get('RUN_MAIN') != 'true': return # 替换为你的模型存储路径完成加载 self.tf_model = tf.keras.models.load_model('你的模型文件路径.h5')
- 在视图中调用预加载的模型
在views.py中直接从应用配置获取已加载的模型即可:
from django.apps import apps from django.http import JsonResponse def 你的预测视图(request): # 获取预加载的模型 model = apps.get_app_config('你的应用名').tf_model # 执行预测逻辑 # prediction_result = model.predict(你的输入数据) return JsonResponse({"result": "预测完成"})
注意事项
- 若使用多worker部署(如Gunicorn、uWSGI启动多个工作进程),每个worker进程会独立加载一次模型,属于多进程架构的正常表现,不会影响功能
- 禁止在视图函数内部加载模型,否则每次请求都会触发模型IO操作,会严重降低接口响应速度
- 本地开发环境下
runserver默认会启动重载进程,ready()方法中的RUN_MAIN判断可以避免重载进程重复加载无用的模型
内容的提问来源于stack exchange,提问作者user737163
相关产品推荐
相关产品推荐

