我有Word2Vec
模型(机器学习模型之一)并且可以通过文件名获得这个预先训练的模型:
model = Word2Vec.load(fname)
所以,我可以通过使用这个模型得到一些预测:
预测= model.predict(X)
我尝试做的是从用户那里获取请求(包括查询字)并将此数据查询到我预先训练的模型并获得预测,以便服务器可以使用此预测数据发送响应。每次用户发送查询时都应该进行此过程,因此这个预先训练的模型应始终在内存中。
为了实现这一点,我想我必须使用Redis
,Celery
类似的东西,但据我所知,Celery
与Django
网络应用程序异步工作,所以它不适合我想做的事情......
如何在Django
应用程序中实现此功能?
感谢。
答案 0 :(得分:5)
你实际上并不需要Redis或芹菜。
在我使用Django发布解决方案之前,我应该提一下,如果您只需要一个用于ML项目的Web界面,也就是说,您不需要Django的花哨ORM,管理员等,您应该和Flask一起去。它非常适合您的用例。
使用Flask将训练好的模型存储在内存中非常容易:
# ...
# your Flask application code
# ...
# ...
if __name__ == '__main__':
model = Word2Vec.load(fname)
app.run()
如果您有兴趣,完整示例为here。
您可以使用Django的缓存框架来存储您的模型。首先,激活本地内存缓存后端。 Instructions are here
现在,您需要将模型存储在缓存中。
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(...)
您可以在视图中保留上述代码,但我要为您创建一个单独的文件,然后在您的视图中导入此文件。
您可以找到完整示例on this blog。
答案 1 :(得分:0)
其次,您不需要Redis和芹菜。 Daniel Roseman在this question中概述了最简单的解决方案。
如果您有一个无法序列化/腌制的对象(这是利用django缓存的必要条件),这种方法也很实用。
您需要做的就是在model
中的视图之前实例化views.py
对象,这样一来model
被调用一次(导入views.py时),并且类/基于功能的视图将能够访问model
。
这看起来像是您的问题:
# 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