【问题标题】:What is the best way to build and expose a Machine Learning model REST api?构建和公开机器学习模型 REST api 的最佳方式是什么?
【发布时间】:2017-06-24 03:37:38
【问题描述】:

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

我在网上搜索了一下,找到了以下方法:

  1. 用 Java 编写整个东西 - ML 模型 + REST api
  2. 用 Python 编写全部内容 - ML 模型 + REST api

但是玩机器学习,它的模型和预测在 python 中使用 sklearn 等库而不是 Java 真的更容易和更受支持。我真的很想将 python 用于机器学习部分

我正在考虑并尝试使用 JAVA 编写 REST api,但使用子流程进行 python ML 调用。这行得通吗?

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

提前致谢。

【问题讨论】:

  • Skymind 智能层包括一个带有 REST API 的机器学习模型服务器。 docs.skymind.ai/v1.0.3/reference
  • 如果您不介意使用 Amazon Web Services,我会推荐 Chalice。它是一个用于创建 Lambda 函数的框架。它很容易学习,您不必担心基础设施。如果您已将 ML 模型存储在文件中,则可以将其传输到 Bucket,因此在调用 Lambda 函数时,您可以拉取模型文件并处理请求。 github.com/aws/chalice
  • 如果您正在寻找一种简单的方法来构建自定义机器学习 API 而无需担心后端,您可以查看nyckel.com

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


【解决方案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

【讨论】:

  • 我们也可以通过Sping boot REST API部署Python ML模型吗?
【解决方案2】:

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

可以从 JAVA API 服务器对 python 进行子进程调用,但由于每次启动进程的延迟和成本,它可能会遇到性能问题。 BentoML 有一个用 python asyncio 实现的高性能通用 API 前端,并在这一层进行自适应微批处理。然后将预测请求分成小批量并发送到托管模型的 Python 进程,以进行模型推理。

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

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

【讨论】:

  • 以最自动化的方式将数据从数据库传递到 BentoML(而不是使用 Python 脚本从数据库中获取数据,然后将它们转发到从 BentoML 加载的模型)的最佳方式是什么?方式?
【解决方案3】:

根据我过去所做的,我建议了 2 个选项(也许还有更多,但这是我已经实现的选项)

  1. 如果您有云服务的访问权限和预算,Azure ML 是最佳选择,更好的 ML 框架和环境,创建您的 REST API 您只需单击 2 次即可公开它,然后使用任何语言的 JSON 使用它.
  2. 使用 scikit-learn 并在 python 中编写 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?

【讨论】:

    【解决方案4】:

    这取决于您使用 Python 进行 ML 的情况。 对于随机森林等分类模型,使用您的训练数据集构建树结构并导出为嵌套字典。无论您使用哪种语言,将模型对象转换为一种数据结构,然后您可以在任何地方使用它。

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

    【解决方案5】:

    我使用 Node.js 作为我的休息服务,我只是调用系统与保存存储模型的 python 交互。如果您更愿意用 JAVA 编写服务,您总是可以这样做,只需调用 Runtime exec 或使用 ProcessBuilder 调用 python 脚本并获得回复。

    【讨论】:

    【解决方案6】:

    到目前为止,将您的 sklearn 模型导入 API 的最快方法是 FlashAI.io,该服务是专门为此目的而提供的 - 当我最近面临与训练 Scikit 相同的困境时,我遇到了这个问题 -在我的本地 PC 上使用 Python 学习模型,我想在一个 API 中快速公开它,该 API 可以通过 HTTP POST 请求调用。

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

    【讨论】:

      【解决方案7】:

      我一直在尝试相同的任务,并想添加另一个选项,而不是使用 REST API:Apache Spark 模型的格式在框架的 Python 和 Jave 实现中都是兼容的。因此,您可以在 Python 中训练和构建模型(使用 PySpark),在 Java 端导出和导入以进行服务/预测。这很好用。

      但是,这种方法也有一些缺点:

      • Spark 有两个独立的 ML 包(ML 和 MLLib),用于不同的数据格式(RDD 和数据帧)
      • 每个包中用于训练模型的算法都不相同(无模型奇偶校验)
      • 模型和训练类没有统一的接口。因此,您必须了解预期格式是什么,并且可能必须相应地转换您的数据以进行训练和推理。
      • 训练和推理的预处理必须相同,因此您需要在 Python 端为两个阶段执行此操作,或者以某种方式在 Java 端复制预处理。

      因此,如果您不介意 Rest API 解决方案的缺点(可用性、网络延迟),那么这可能是更可取的解决方案。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-08-20
        • 1970-01-01
        • 2019-11-30
        • 2013-12-03
        • 1970-01-01
        • 2010-09-10
        • 1970-01-01
        相关资源
        最近更新 更多