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

use*_*632 3 django machine-learning redis celery

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

model = Word2Vec.load(fname)
Run Code Online (Sandbox Code Playgroud)

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

预测= model.predict(X)

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

为了实现这一点,我想我必须使用Redis,Celery有点像,但据我所知,CeleryDjangoWeb应用程序异步工作,所以它不适合我想做的事情......

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

谢谢.

xyr*_*res 9

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

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


解决方案使用Flask:

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

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

if __name__ == '__main__':
    model = Word2Vec.load(fname)
    app.run()
Run Code Online (Sandbox Code Playgroud)

如果您有兴趣,可以在这里找到完整的示例.


使用Django的解决方案:

您可以使用Django的缓存框架来存储您的模型.首先,激活本地内存缓存后端.说明在这里.

现在,您需要将模型存储在缓存中.

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(...)
Run Code Online (Sandbox Code Playgroud)

您可以在视图中保留上述代码,但我宁愿为此创建单独的文件,然后在您的视图中导入此文件.

您可以在此博客上找到完整的示例.