DJANGO: кэширование метода services.py, чтобы он всегда был доступен
Я пытаюсь использовать эту библиотеку python ML и превратить ее в APIView для моего проекта. Есть одна строка, которая загружает ML модель, что занимает около ~20с, поэтому я отделил эту строку в services.py и украсил @lru_cache, чтобы это не занимало всегда ~20с.
Поскольку lru_cache - это метод кэширования Least Recently Used, кэшированная модель быстро разблокируется и заставляет пользователя рано или поздно ждать еще 20 секунд.
Итак, я ищу способ либо кэшировать метод load_model()
, чтобы он всегда был доступен, либо кэшировать его в течение определенного времени. Я пытался использовать метод cache_page для последнего, но пока безуспешно.
Есть ли лучший метод, который я могу использовать, или просто подстройка maxSize lru_cache будет более элегантным решением? Этот APIView вызывается не очень часто, что заставляет пользователя ждать ~20s каждый раз. Я надеялся просто сделать его всегда доступным, чтобы пользователю не приходилось ждать.
views.py
from .services import load_model, extract_keyword
class ExtractKeyphrase(ApiAuthMixin, APIView):
def post(self, request):
try:
text = request.data["text"]
kp_model = load_model() # the line that takes ~20s
keyphrases = extract_keyword(kp_model, text)
return JsonResponse(keyphrases, status=status.HTTP_200_OK, safe=False)
except requests.exceptions.RequestException:
Response("Request Failed", status=status.HTTP_400_BAD_REQUEST)
services.py
from functools import lru_cache
from keyphrasetransformer import KeyPhraseTransformer
from django.utils.decorators import method_decorator
from django.views.decorators.cache import cache_page
# @method_decorator(cache_page(60 * 60 * 24))
@lru_cache(maxsize=2)
def load_model():
kp_model = KeyPhraseTransformer()
return kp_model
Если kp_model
не меняется, вам не нужно использовать кэш, просто глобальная переменная:
# in another module, e.g kp_model.py
_kp_model = None
def get_kp_model():
global _kp_model
if not _kp_model:
_kp_model = KeyPhraseTransformer()
return _kp_model
Вы можете загрузить его при первом запросе POST API:
class ExtractKeyphrase(ApiAuthMixin, APIView):
def post(self, request):
try:
text = request.data["text"]
keyphrases = extract_keyword(get_kp_model(), text)
return JsonResponse(keyphrases, status=status.HTTP_200_OK, safe=False)
except requests.exceptions.RequestException:
Response("Request Failed", status=status.HTTP_400_BAD_REQUEST)
Или вы можете загрузить его при запуске django, добавив:
class MyAppConfig(AppConfig):
name = 'myapp'
def ready(self):
get_kp_model()