构建和公开机器学习模型REST api的最佳方法是什么?

时间:2017-02-07 02:19:11

标签: java python rest machine-learning scikit-learn

我一直在使用springframework设计REST api并将它们部署在Tomcat等Web服务器上。我还致力于构建机器学习模型,并使用该模型在Python中使用sklearn进行预测。 现在我有一个用例,其中 我想公开构建机器学习模型的REST API,以及另一个进行预测的REST api 。什么架构应该帮助我实现同样的目标。 (相同的例子可能是亚马逊机器学习。他们已经公开了REST api来生成模型并进行预测)

我在互联网上搜索并找到了以下方法:

  1. 用Java编写全部内容 - ML模型+ REST api
  2. 用Python编写全部内容 - ML模型+ REST api
  3. 但是玩机器学习,它的模型和预测在使用sklearn等库而不是Java的python中更容易和更受支持。我非常想 将python用于机器学习部分

    我正在考虑和使用JAVA编写REST api但使用子进程进行python ML调用。那会有用吗?

    有人可以帮助我解决我可以采取的 可能的架构方法 。另请提出最可行的解决方案。

    提前致谢。

7 个答案:

答案 0 :(得分:1)

从过去的情况来看,我建议2个选项(也许还有更多,但这是我已实施的选项)

  1. 如果您拥有云服务的访问权限和预算,那么Azure ML是一个极好的选择,可以创建ML框架和环境,并创建您需要的其他API,只需2次点击即可公开它,然后使用任何语言的JSON来使用它
  2. 在python中使用scikit-learn和编写REST API代码,但可以从任何语言中使用,这个选项不像Azure ML那样容易和用户友好,因为你必须手动编写所有代码并使用模型持久性scikit的功能,但一旦暴露,你可以在java(或其他任何东西)中使用它。我用它作为参考:https://loads.pickle.me.uk/2016/04/04/deploying-a-scikit-learn-classifier-to-production/
  3. Spark MLlib:我没有尝试过这个选项,但我在堆栈溢出中问自己一个问题并得到了一些有趣的答案:How to serve a Spark MLlib model?

答案 1 :(得分:1)

正如其他人所说,

  1. 使用AzureML是将ML模型部署为Web服务/休息服务的简单解决方案。但是,您需要使用图形界面(拖放,配置)在Azure平台中构建模型。如果他们使用python -sklearn代码构建模型,人们可能不喜欢这种方法。虽然,AzureML可以选择包含R和python脚本,但我并不喜欢它。

  2. 另一种选择是将python ML模型存储为.pkl文件并使用Flask / DJango rest框架,部署模型。客户端应用程序可以使用其余服务。这是关于youtube的优秀教程。 https://www.youtube.com/watch?v=s-i6nzXQF3g

答案 2 :(得分:1)

BentoML是专门为此设计的开源框架。构建REST API服务器以为应用程序公开您的机器学习模型非常容易。

可以从JAVA API服务器对python进行子过程调用,但是由于等待时间和每次启动过程的成本,它可能会遇到性能问题。 BentoML具有通过python asynio实现的高性能通用API前端,并在此层中进行了自适应微批处理。然后,将预测请求分批进行分组,然后发送到托管模型的Python进程以进行模型推断。

一个先前的建议建议以标准格式序列化模型,然后从其他语言中使用它。有一些采用这种方法的框架,例如PMML格式,用于深度学习模型的ONNX格式以及可以从scikit-learn模型转换的Apple Core ML的mlmodel格式。这种方法有两个缺点:1.在将模型转换为在不同的运行时中运行时,经常会引入不一致之处;并且2.您将需要一个单独的工作流来生产预处理和后处理代码,通常是用Python编写的。而且,当您处理大量模型或更新频率很高的模型时,额外的工作流程通常容易出错,并且很难维护。像BentoML这样的框架使数据科学家可以在Python中编写预处理/后处理逻辑,并将它们与模型捆绑在一起以用于生产。

免责声明:我是BentoML项目的作者

答案 3 :(得分:0)

这取决于您使用python进行ML的情况。 对于像randomforest这样的分类模型,使用您的火车数据集来构建树结构并导出为嵌套的dict。无论您使用何种语言,都可以将模型对象转换为一种数据结构,然后您就可以在任何地方使用它。

但是,如果你的情况是一个大规模的,实时的,分布式的日期集,据我所知,也许最好的方法是在服务器上部署整个ML流程。

答案 4 :(得分:0)

我使用Node.js作为我的休息服务,我只是呼唤系统与我的python进行交互,该python包含存储的模型。如果您更愿意在JAVA中编写服务,只需调用Runtime exec或使用ProcessBuilder调用python脚本并获得回复,您可以随时执行此操作。

答案 5 :(得分:0)

到目前为止,将您的 sklearn 模型导入 API 的最快方法是 FlashAI.io ,该服务是专门为此目的而设计的 – 当我最近面临与训练使用 Python 在本地 PC 上使用 Scikit-learn 模型,我想在可以通过 HTTP POST 请求调用的 API 中快速公开它。

还提到了其他选项,所有这些选项都需要一些学习曲线、时间和精力来简单地公开您的模型。 FlashAI 可让您在几分钟内公开您的模型。只需保存您的 .pkl 文件并上传即可。您的模型被分配了一个唯一的模型 ID,您只需使用它来无任何限制地发出 API 请求。大功告成:)

答案 6 :(得分:-2)

有一个即将推出的机器学习API用于预测https://www.stemapi.com。超级简单,不是很多功能,但是有一个小型数据集的免费版本,而且对于较大的数据集而言并不昂贵。我用它做预测,它适用于我正在做的事情。