【问题标题】:How to deploy machine learning algorithm in production environment?如何在生产环境中部署机器学习算法?
【发布时间】:2015-02-07 10:54:02
【问题描述】:

我是机器学习算法的新手。我正在学习基本算法,如回归、分类、聚类、序列建模、在线算法。互联网上的所有文章都展示了如何将这些算法与特定数据一起使用。没有关于在生产环境中部署这些算法的文章。所以我的问题是

1) 如何在生产环境中部署机器学习算法?

2) 机器学习教程中遵循的典型方法是使用一些训练数据构建模型,将其用于测试数据。但是在生产环境中使用这种模型是否可取?传入的数据可能会不断变化,因此模型将无效。 模型刷新周期的持续时间应该是多少以适应此类变化?

【问题讨论】:

  • 您的问题非常笼统,因此很难回答。你能更具体一点吗?根据问题的要求和类型,刷新周期可以从“动态”到每周一次的批处理。

标签: machine-learning


【解决方案1】:

我不确定这是否是一个好问题(因为它太笼统且表述不佳),但我建议您阅读有关偏差 - 方差权衡的信息。长话短说,您可以使用低偏差\高方差机器学习模型,并在测试数据(用于实现模型的数据)上获得 100% 准确的结果,但您可能会导致模型过度拟合训练数据。结果,当您尝试在训练期间未使用的数据上使用它时,将导致性能不佳。另一方面,您可能有高偏差\低方差模型,这将很不适合您的训练数据,并且在新生产数据上的表现也同样糟糕。牢记这一点,一般准则是:

1) 获得一些可用于构建机器学习系统原型的大量数据

2) 将数据拆分为训练集、交叉验证集和测试集

3) 创建一个模型,该模型在您的测试数据上具有相对较低的偏差(准确度较高,实际上 - 良好的 F1 分数)。然后在交叉验证集上尝试这个模型以查看结果。如果结果很糟糕——你有一个高方差问题,你使用了一个过度拟合数据并且不能很好概括的模型。重新编写您的模型,使用模型参数或使用不同的算法。重复直到你在 CV 集上得到一个好的结果

4) 由于我们使用模型是为了在 CV 集上获得良好的结果,因此您想在测试集上测试您的最终模型。如果它很好 - 就是这样,你有一个模型的最终版本,可以在 prod 环境中使用它。

第二个问题没有答案,它基于您的数据和您的应用程序。但可以使用 2 种通用方法:

1) 做我前面提到的一切来构建一个在测试集上表现良好的模型。每隔一段时间用新数据重新训练一次模型(尝试不同的时间段,但一旦发现模型的性能下降,您可以尝试重新训练模型)。

2) 使用在线学习方法。这不适用于许多算法,但在某些情况下可以使用。通常,如果您发现可以使用随机梯度下降学习方法 - 您可以使用在线学习,并让您的模型与最新的生产数据保持同步。

请记住,即使您使用 #2(在线学习方法),您也不能确定您的模型会永远保持良好状态。迟早您获得的数据可能会发生显着变化,您可能希望使用完全不同的模型(例如切换到 ANN 而不是 SWM 或逻辑回归)。

【讨论】:

    【解决方案2】:

    免责声明:我为这家公司工作,Datmo 正在为 ML 构建更好的工作流程。我们一直在寻求帮助从事 ML 工作的其他开发人员,如果您有任何问题,请随时通过 anand@datmo.com 与我联系。

    1) 为了进行部署,您应该首先将代码拆分为预处理、训练和测试。通过这种方式,您可以轻松封装部署所需的组件。通常,您需要将您的预处理、测试以及权重文件(训练过程的输出)放在一个文件夹中。接下来,您将希望在服务器上托管它并围绕它包装一个 API 服务器。我建议使用Flask Restful API,以便您可以使用查询参数作为输入并以标准 JSON blob 形式输出您的响应。

    要将其托管在服务器上,您可以使用this article,其中介绍了如何在 EC2 上部署 Flask API。

    您可以按照code 中给出的 API 加载和建模并将其用作 API。

    2) 如果没有更多细节,我很难回答。它高度依赖于数据类型和模型类型。例如,对于深度学习,没有在线学习之类的东西。

    【讨论】:

      【解决方案3】:

      关于第一个问题,我的服务mlrequest 使将模型部署到生产环境变得简单。您可以从每月提供 50k 模型交易的 free API key 开始。

      此代码将跨 5 个全球数据中心训练和部署或更新您的模型。

      from mlrequest import Classifier
      classifier = Classifier('my-api-key')
      features = {'feature1': 'val1', 'feature2': 45}
      training_data = {'features': features, 'label': 2}
      r = classifier.learn(training_data=training_data, model_name='my-model', class_count=2)
      

      这就是您做出预测的方式,将延迟路由到最近的数据中心以获得最快的响应。

      features = {'feature1': 'val1', 'feature2': 77}
      r = classifier.predict(features=features, model_name='my-model', class_count=2)
      r.predict_result
      

      关于您的第二个问题,这完全取决于您要解决的问题。有些模型需要经常更新,而有些则几乎不需要更新。

      【讨论】:

        【解决方案4】:

        很抱歉,我的 cmets 没有包含太多细节*,因为我也是 ML“部署”的新手。但由于作者也是 ML 的新手,我希望这些基本指导也能有所帮助。 对于“部署”,你应该

        1. 拥有 ML 算法:您可以使用免费工具,或使用 Python、R、Java、.Net 等库开发您自己的工具,或者使用云端系统..)
        2. 使用训练数据集训练这些机器学习模型
        3. 保存那些经过训练的模型(您应该根据您的开发环境搜索此主题。Tensorflow/Keras 提供了一些文件格式,或者像 pickle、ONNX 等格式。我在这里写一个完整的列表,包括他们支持的语言和环境、优点和缺点以及可加载性,但我也试图调查这个话题,作为一个新手)李>

        然后,您可以在生产中部署这些保存的模型。在生产环境中,您应该拥有自己开发的应用程序来运行保存的模型(例如:您使用 Python 开发的应用程序,将经过训练和保存的 .pickle 文件和 TestData 作为输入;并简单地给出“预测测试数据”作为输出),或者您应该有一个运行已保存模型的环境/框架(在云端搜索 ML 环境/框架)。首先,你应该明确你的需求:你需要一个独立的生产程序,还是你会提供一个内部的网络服务,或者通过云等等。

        对于第二个问题;如上答案表明问题是模型的“在线培训能力”。另外请注意;对于“在线学习”,您的生产环境还必须为您的生产工具/系统提供测试数据的真实正确标签。你会有这种能力吗?

        注意:以上只是小的“cmets”,而不是一个明确的答案,但从技术上讲,我还不能写 cmets。感谢您不投票:)

        【讨论】:

          猜你喜欢
          • 2020-05-08
          • 2020-06-24
          • 1970-01-01
          • 1970-01-01
          • 2013-04-29
          • 2020-05-06
          • 2017-12-02
          • 2014-11-09
          • 1970-01-01
          相关资源
          最近更新 更多