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/
我真的希望我的模型像全局变量一样加载一次,并且每个请求都使用此变量,而无需每次请求都加载模型
是否可以?
您可以在settings.py. 每当服务器启动/重启 django 时,都会全局存储模型变量。它可以像这样访问
from django.conf import settings
print settings.my_ml_model_variable
Run Code Online (Sandbox Code Playgroud)
根据 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只是我开发的函数,用于将对象准备到我的模型和我的响应中
问候