我有一个保存在pkl (pickel文件)中的ML模型,加载这个模型并使用它进行预测是没有问题的,即使我有一个rest服务来公开它,唯一的问题是我在每个请求中加载模型,类似于:
https://www.analyticsvidhya.com/blog/2017/09/machine-learning-models-as-apis-using-flask/
我真的希望我的模型只加载一次,就像一个全局变量,每个请求都使用这个变量,而不需要每次请求都加载模型
有可能吗?
发布于 2018-07-20 05:34:27
可以在settings.py
中指定模型变量。每当服务器启动/重新启动时,django都会全局存储模型变量。可以像这样访问它
from django.conf import settings
print settings.my_ml_model_variable
发布于 2018-08-02 06:34:37
基于Kaushal的评论,我使用django rest框架解决了我的问题,如下所示:
首先,我将模型另存为:
> joblib.dump(<your scikit model here> , <"yourfilename.pkl">, compress
> = 1)
一旦我用pkl扩展名保存了我的模型,我需要在settings.py文件中创建一个变量(这个文件是由django自动创建的)
YOURMODEL = joblib.load(<"yourfilename.pkl">)
django进程在您启动服务器时调用此文件,因此它只被调用一次
现在我们只需要在任何我们想要的地方调用我们的模型,通常是在一个views.py文件中,因为我们使用的是django和/或django-rest-framework
myModel = getattr(settings, 'YOURMODEL', 'the_default_value')
res = myModel.predict_proba(s).tolist()
rest服务的一个简单示例:
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)
这里,preparePostData和prepareMessage是我开发函数,用于为我的模型和响应准备对象
问候
https://stackoverflow.com/questions/51430094
复制相似问题