Django:服务器端的机器学习模型?

时间:2017-04-02 14:07:14

标签: django machine-learning redis celery

我有Word2Vec模型(机器学习模型之一)并且可以通过文件名获得这个预先训练的模型:

model = Word2Vec.load(fname)

所以,我可以通过使用这个模型得到一些预测:

预测= model.predict(X)

我尝试做的是从用户那里获取请求(包括查询字)并将此数据查询到我预先训练的模型并获得预测,以便服务器可以使用此预测数据发送响应。每次用户发送查询时都应该进行此过程,因此这个预先训练的模型应始终在内存中。

为了实现这一点,我想我必须使用RedisCelery类似的东西,但据我所知,CeleryDjango网络应用程序异步工作,所以它不适合我想做的事情......

如何在Django应用程序中实现此功能?

感谢。

2 个答案:

答案 0 :(得分:5)

你实际上并不需要Redis或芹菜。

在我使用Django发布解决方案之前,我应该提一下,如果您只需要一个用于ML项目的Web界面,也就是说,您不需要Django的花哨ORM,管理员等,您应该和Flask一起去。它非常适合您的用例。

使用Flask的解决方案:

使用Flask将训练好的模型存储在内存中非常容易:

# ...
# your Flask application code
# ...
# ...

if __name__ == '__main__':
    model = Word2Vec.load(fname)
    app.run()

如果您有兴趣,完整示例为here

使用Django的解决方案:

您可以使用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