Tengo un modelo de Word2Vec (uno de los modelos de aprendizaje automático) y podría obtener este modelo preentrenado por nombre de archivo:
model = Word2Vec.load(fname)Entonces, puedo obtener alguna predicción usando este modelo:
predicción = modelo.predecir(X)
Lo que estoy tratando de hacer es obtener una solicitud (incluida la palabra de consulta) del usuario y consultar estos datos en mi modelo previamente entrenado y obtener una predicción para que el servidor pueda enviar una respuesta con estos datos de predicción. Este proceso debe ocurrir cada vez que el usuario envía consultas, por lo que este modelo previamente entrenado siempre debe estar en la memoria.
Para implementar esto, creo que tengo que usar Redis , Celery algo así, pero que yo sepa, Celery funciona de forma asíncrona con la aplicación web Django , por lo que no sería adecuado para lo que quiero hacer...
¿Cómo puedo implementar esta función en mi aplicación Django ?
Gracias.
En realidad, no necesitas Redis o apio para esto.
Antes de publicar la solución usando Django, debo mencionar que si solo necesita una interfaz web para su proyecto de ML, es decir, no necesita el elegante ORM, administrador, etc. de Django, debe optar por Flask. Es perfecto para su caso de uso.
Es muy fácil almacenar su modelo entrenado en la memoria usando Flask:
# ... # your Flask application code # ... # ... if __name__ == '__main__': model = Word2Vec.load(fname) app.run()Si te interesa, el ejemplo completo está aquí .
Puede utilizar el marco de caché de Django para almacenar su modelo. Primero, active el backend de caché de memoria local. Las instrucciones están aquí .
Ahora, deberá almacenar su modelo en el caché.
from django.core.cache import cache model_cache_key = 'model_cache' # this key is used to `set` and `get` # your trained model from the cache model = cache.get(model_cache_key) # get model from cache if model is None: # your model isn't in the cache # so `set` it model = Word2Vec.load(fname) # load model cache.set(model_cache_key, model, None) # save in the cache # in above line, None is the timeout parameter. It means cache forever # now predict prediction = model.predict(...)Puede mantener el código anterior en sus vistas, pero prefiero que cree un archivo separado para eso y luego importe este archivo en sus vistas.
Puede encontrar el ejemplo completo en este blog .
Secundo que no necesitas un Redis y apio para esto. La solución más simple se describe en esta pregunta de Daniel Roseman.
Este enfoque también es práctico si tiene un objeto que no se puede serializar/decapar (como es necesario para aprovechar el caché de django).
Todo lo que necesita hacer es instanciar el objeto del model antes de sus vistas en views.py , de esa manera se llama al model una vez (cuando se importa views.py) y las vistas basadas en clase/función podrán acceder al model .
Esto se vería así en tu pregunta:
# views.py model = Word2Vec.load(fname) class WordView(View): def post(self, request, *args, **kwargs): # make a prediction based on request prediction = model.predict(self.request.something) return prediction