在 python 中,如何在 django 或flask 等休息服务中只加载一次 ML 模型?

Fer*_*tol 3 python django machine-learning scikit-learn django-rest-framework

我有一个保存在 pkl(pickel 文件)中的 ML 模型,加载这个模型并使用它进行预测没有问题,即使我有一个暴露它的休息服务,唯一的问题是我在每个请求中加载模型,像这样:

https://www.analyticsvidhya.com/blog/2017/09/machine-learning-models-as-apis-using-flask/

我真的希望我的模型像全局变量一样加载一次,并且每个请求都使用此变量,而无需每次请求都加载模型

是否可以?

Kau*_*hal 5

您可以在settings.py. 每当服务器启动/重启 django 时,都会全局存储模型变量。它可以像这样访问

from django.conf import settings 
print settings.my_ml_model_variable
Run Code Online (Sandbox Code Playgroud)


Fer*_*tol 5

根据 Kaushal 的评论,我使用 django Rest 框架解决了我的问题,如下所示:

首先我将模型保存为:

> joblib.dump(<your scikit model here> , <"yourfilename.pkl">, compress
> = 1)
Run Code Online (Sandbox Code Playgroud)

使用 pkl 扩展名保存模型后,我需要在 settings.py 文件中创建一个变量(该文件由 django 自动创建)

YOURMODEL = joblib.load(<"yourfilename.pkl">) 
Run Code Online (Sandbox Code Playgroud)

当你启动服务器时,django进程会调用这个文件,所以它只被调用一次

现在我们只需要在任何我们想要的地方调用我们的模型,通常在views.py文件中,因为我们使用的是django和/或django-rest-framework

myModel = getattr(settings, 'YOURMODEL', 'the_default_value')

res = myModel.predict_proba(s).tolist()
Run Code Online (Sandbox Code Playgroud)

休息服务的一个简单示例:

from django.conf import settings 

class myClass(APIView):
    permission_classes = (permissions.AllowAny,)

    '''Httpverb post method'''
    def post(self, request,format=None):

        myModel = getattr(settings, '../mymodel.pkl', 'the_default_value')
        data = preparePostData(request.data)
        res = myModel.predict_proba(data).tolist()
        message = prepareMessage(res)
        return Response(message, status=status.HTTP_200_OK)
Run Code Online (Sandbox Code Playgroud)

这里的preparePostData和prepareMessage只是我开发的函数,用于将对象准备到我的模型和我的响应中

问候