基于Django APIView调用Python ML库:重复加载模型优化问询
优化方案
你的推测完全正确,问题根源就是每次请求都会重新初始化KeyPhraseTransformer实例,而模型加载属于高耗时操作。以下是几种可行的优化方法:
方法一:全局作用域初始化模型
直接将模型实例化放在services.py的全局范围内,Django启动时就会完成模型加载,后续所有请求复用同一个实例:
修改后的services.py
from keyphrasetransformer import KeyPhraseTransformer # 全局初始化模型,仅在Django启动时执行一次 kp_model = KeyPhraseTransformer() def extract_keyword(text): keyphrases = kp_model.get_key_phrases(text) return keyphrases
方法二:使用Django AppConfig加载模型(生产环境推荐)
如果需要更严谨的模型加载时机(避免Django初始化流程未完成时加载模型),可以通过AppConfig控制加载逻辑:
- 在你的应用目录下创建
apps.py(无则新建):
from django.apps import AppConfig class YourAppConfig(AppConfig): default_auto_field = 'django.db.models.BigAutoField' name = 'your_app_name' kp_model = None def ready(self): from keyphrasetransformer import KeyPhraseTransformer # 应用就绪时加载模型 self.kp_model = KeyPhraseTransformer()
- 修改
settings.py中的INSTALLED_APPS,替换原应用名为AppConfig路径:
INSTALLED_APPS = [ # ...其他应用 'your_app_name.apps.YourAppConfig', ]
- 更新
services.py调用模型的方式:
from django.apps import apps def extract_keyword(text): app_config = apps.get_app_config('your_app_name') keyphrases = app_config.kp_model.get_key_phrases(text) return keyphrases
方法三:单例模式封装模型
如果需要更灵活的实例管理逻辑,可以用单例模式确保全局只有一个模型实例:
修改后的services.py
from keyphrasetransformer import KeyPhraseTransformer class SingletonKeyPhraseTransformer: _instance = None @classmethod def get_instance(cls): if cls._instance is None: cls._instance = KeyPhraseTransformer() return cls._instance def extract_keyword(text): kp_model = SingletonKeyPhraseTransformer.get_instance() keyphrases = kp_model.get_key_phrases(text) return keyphrases
注意事项
- 以上方法均能实现模型仅加载一次,后续请求响应时间会降至1-2秒,与HuggingFace的表现一致。
- 生产环境部署时,需确保Django进程(如Gunicorn Worker)启动时模型已完成加载,可通过配置Worker数量和预热机制避免重复加载。
内容的提问来源于stack exchange,提问作者Tyler Kim
相关产品推荐
相关产品推荐

