将您的预测模型部署到生产环境

运营机器学习的5个最佳实践。

并非所有的预测模型都达到了谷歌的规模。

有时,您会开发一个想要放入软件中的小型预测模型。

我最近收到了这个读者问题

实际上,我对机器学习的知识中缺少一部分。所有的教程都会告诉你直到你建立机器学习模型的步骤。那么你该如何使用这个模型呢?

在这篇文章中,我们将探讨一些最佳实践,以简化您的模型向生产环境的过渡,并确保您能从中获得最大收益。

How To Deploy Your Predictive Model To Production

如何将您的预测模型部署到生产环境
照片由 reynermedia 拍摄,保留部分权利。

我有一个模型。现在该怎么办?

所以,您已经通过一个系统化的过程,创建了一个可靠且准确的模型,可以为您的问题做出预测。

您想以某种方式使用这个模型。

  • 也许您想创建一个可以进行即席预测的独立程序。
  • 也许您想将该模型整合到您现有的软件中。

让我们假设您的软件规模不大。您不是在寻求谷歌规模的部署。也许只是为了您自己,也许只是为了一个客户,或者只是为了几台工作站。

到目前为止一切顺利吗?

现在我们需要了解一些最佳实践,将您准确可靠的模型投入运营。

5个模型部署最佳实践

为什么不直接把模型塞进您的软件然后发布呢?

您可以这样做。但通过增加几个额外的步骤,您可以建立信心,确保您部署的模型是可维护的,并且能够长期保持准确性。

您是否曾将模型投入生产环境?
请留言分享您的经验。

以下是您在将预测模型部署到生产环境时可以采取的五个最佳实践步骤。

1. 指定性能要求

您需要清楚地说明什么是好的性能和坏的性能。

这可能是准确率、假阳性率或任何对业务重要的指标。

详细说明,并使用您当前开发的模型作为基准数据。

随着您改进系统,这些数据可能会随时间增加。

性能要求很重要。没有它们,您将无法设置所需的测试来确定系统是否按预期运行。

在您就最低、平均或性能范围预期达成一致之前,不要继续进行。

2. 将预测算法与模型系数分离

您可能使用了某个库来创建您的预测模型。例如,R、scikit-learn 或 Weka。

您可以选择使用该库部署您的模型,或者在您的软件中重新实现模型的预测部分。您甚至可能想将您的模型设置为 Web 服务

无论如何,将进行预测的算法与模型内部结构(即从训练数据中学到的特定系数或结构)分离开来是一个好的做法。

2a. 选择或实现预测算法

机器学习算法的复杂性通常在于模型训练,而不在于进行预测。

例如,使用回归算法进行预测非常直接,并且很容易在您选择的语言中实现。这是一个明显的例子,应该重新实现算法,而不是依赖于模型训练时使用的库。

如果您决定使用库来进行预测,请熟悉其 API 和依赖关系。

用于进行预测的软件就像您应用程序中的所有其他软件一样。

像对待软件一样对待它。

良好地实现它,编写单元测试,使其健壮。

2b. 序列化您的模型系数

让我们将模型学到的数字或结构称为:系数

这些数据不是您应用程序的配置。

像对待软件配置一样对待它。

将其存储在软件项目的外部文件中。进行版本控制。像对待代码一样对待配置,因为它同样容易破坏您的项目。

当您改进模型时,很可能将来需要更新此配置。

3. 为您的模型开发自动化测试

您需要自动化测试来证明您的模型按预期工作。

在软件领域,我们称这些为回归测试。它们确保软件在未来我们对系统不同部分进行更改时,其行为不会出现退化。

为您的模型编写回归测试。

  • 收集或贡献一小部分数据样本用于进行预测。
  • 使用生产环境的算法代码和配置进行预测。
  • 在测试中确认结果符合预期。

这些测试是您的早期预警。如果它们失败,您的模型就坏了,您不能发布使用该模型的软件或功能。

让测试严格执行模型的最低性能要求。

我强烈建议,除了您想要包含的任何领域原始数据集外,还要设计一些您非常理解的测试用例。

我还强烈建议随着时间的推移,从运营中收集那些产生意外结果(或破坏系统)的异常和有趣案例。这些案例应该被理解并添加到回归测试套件中。

在每次代码更改后和每次发布前运行回归测试。每晚运行它们。

4. 开发回测和现时测试基础设施

模型会改变,软件和用于预测的数据也会改变。

您希望自动化评估具有指定配置的生产模型在大量数据上的表现。

这将使您能够有效地在历史数据上回测模型的更改,并确定您是否真正取得了改进。

这不是您可能用于超参数调优的小数据集,而是可用的全套数据,可能按月、年或其他重要标志进行分区。

  • 运行当前的运营模型以确定基线性能。
  • 运行新模型,竞争进入运营的机会。

设置好后,每晚或每周运行一次,并让它自动生成报告。

接下来,添加一个现时测试(Now-Test)。

这是对生产模型在最新数据上的测试。

也许是今天、本周或本月的数据。其目的是及早预警生产模型可能正在失效。

这可能是由内容漂移引起的,即您的模型所利用的数据中的关系随着时间的推移而微妙地变化。

这个现时测试也可以生成报告,并在性能低于最低性能要求时(通过电子邮件)发出警报。

5. 挑战然后试用模型更新

您将需要更新模型。

也许您设计了一种全新的算法,需要新的代码和新的配置。重新审视以上所有要点。

一个更小且更易于管理的更改是模型系数。例如,也许您设置了一个网格搜索或随机搜索模型超参数,每晚运行并产生新的候选模型。

您应该这样做。

测试模型并持高度批判态度。给新模型每一个出错的机会。

使用上面第4点中的回测和现时测试基础设施评估新模型的性能。仔细审查结果。

使用回归测试评估更改,作为最后的自动化检查。

测试使用该模型的软件功能。

为了降低风险,也许可以将更改推广到某些地区或在测试版中发布以获取反馈。

一旦您满意新模型满足最低性能要求并优于先前结果,就接受它。

就像一个棘轮,随着模型性能的提高,考虑逐步提高性能要求。

总结

将一个小模型添加到运营软件中是非常可行的。

在这篇文章中,您发现了5个步骤,以确保您覆盖了所有基础并遵循了良好的工程实践。

总而言之,这些步骤是

  1. 指定性能要求。
  2. 将预测算法与模型系数分离。
  3. 为您的模型开发回归测试。
  4. 开发回测和现时测试基础设施。
  5. 挑战然后试用模型更新。

如果您对运营机器学习模型的更多信息感兴趣,请查看这篇文章

这更多是关于谷歌规模的机器学习模型部署。观看提到的视频,并查阅有关 AirBnB 和 Etsy 生产流水线的精彩链接。

您对这篇文章或将模型投入生产环境有任何疑问吗?
在评论中提出您的问题,我会尽力回答。

关于 将您的预测模型部署到生产环境 的71条回复

  1. SalemAmeen 2016年10月1日 12:19 pm #

    非常感谢

    • Jason Brownlee 2016年10月1日 12:31 pm #

      我很高兴您觉得它有用。

      • vishnu prasad 2017年6月23日 1:51 pm #

        Jason – 我想构建一个基于电商流式数据的推荐系统。我考虑的关键实体是点击流事件,如网站日志以捕捉产品的页面点击。实时产品特性和类别信息,以及实时订单。

        除此之外,我还为业务添加了一些助推器,在排名之前进行提升。

        我在概念上不清楚,当我对大量数据进行流式实时处理时,这些机器学习算法是否能够扩展,还是我应该采用 Lambda 架构,它以离线批量方式处理而不是实时处理。

        另外,如果我必须添加像聚类算法/PCA 这样的降维方法,在如此高交易量的实时处理中,它能扩展吗?因为每个模型执行都需要时间。

        • Jason Brownlee 2017年6月24日 7:58 am #

          抱歉,我没有处理流式数据的直接经验,无法在不进行研究的情况下给您专家建议。

  2. Gabe 2016年10月3日 1:48 am #

    写得很好。我认为这个主题的文档记录严重不足。谢谢!

  3. mirsci 2016年10月20日 3:51 am #

    嗨 Jason,感谢您所有关于机器学习的深刻而具体的帖子,它们总是非常有帮助!

    以可靠的方式为机器学习系统创建测试用例,以揭示机器学习算法中的故障和缺陷,最好的方法是什么?

    这篇论文 https://www.cs.upc.edu/~marias/papers/seke07.pdf 介绍了很好的方法,我想知道您是否可以分享一些新技术。

    谢谢!

    • Jason Brownlee 2016年10月20日 8:39 am #

      一旦出现故障,这些案例就成为极好的候选对象。

      通常,让一个系统测试人员参与进来,他能想出各种刁钻的案例,这是个好主意。

  4. Pallavi 2017年1月13日 11:24 am #

    嗨,Jason,
    感谢这篇好文章。我想知道,如果我的模型由一个黑盒模型或一个黑盒模型的集成组成。在这种情况下,我没有一个简单的方程来拟合模型。在这种情况下,生产环境中的模型实现是如何处理的?
    谢谢,
    Pallavi

    • Jason Brownlee 2017年1月15日 5:14 am #

      嗨 Pallavi,没有一个简单的数学方法来描述模型,是否会妨碍您在生产环境中使用它来增加价值?

      如果是风险问题,这个风险能否被缓解?

  5. Jorgen 2017年6月1日 4:20 am #

    嗨,Jason,

    您能推荐一些关于这个主题的文献(书籍、文章)或部署系统吗?

    诚挚的问候,

    Jørgen

    • Jason Brownlee 2017年6月2日 12:52 pm #

      不,抱歉。信息非常具体,取决于您的问题/业务。

  6. TomK 2017年6月20日 5:39 am #

    你好,

    为了在生产环境中部署预测模型,您可以尝试使用评分引擎——试试 http://scoring.one

    许多提到的功能都已实现——可以从各种环境部署模型。

    • Jason Brownlee 2017年6月20日 6:42 am #

      感谢您的建议。您试用过吗,还是您在那里工作?

  7. Brandon Hill 2017年10月6日 7:52 am #

    确实出现了一个新兴的市场,提供解决方案来缓解一些部署的痛苦。TomK 提到了一个。http://opendatagroup.com 是另一个。目前,该领域的解决方案倾向于专注于模型语言无关性(R、Python、Matlab、Java、C、SaS 等)。它们将您的模型打包成易于部署、可扩展的微服务。然后,您可以为您的模型服务设置输入和输出源以进行读写。下一个方面是提供工具来监控模型的性能指标,并在开发新模型时管理模型的升级。由于许多公司仍在制定其数据科学策略和基础设施,我认为关键点是灵活性。寻找那些具有灵活性、能够随着 IT 部门基础设施的不断演变而继续连接不同数据和消息源的解决方案。

  8. Hemanth 2017年10月15日 4:49 am #

    嗨,Jason,

    为了部署代码,脚本应该是什么样的?

    整个代码是否应该在一个函数中,以便每次我们都可以用所需的参数运行函数?
    或者
    有没有一种方法可以为这类机器学习问题编写代码,因为很多人为数据处理、建模、评估等编写代码块。

    但是什么能让创建的预测对象在新数据上工作呢?

    • Jason Brownlee 2017年10月15日 5:22 am #

      这些问题特定于您的项目,我无法给出一般性答案。

  9. Dinesh 2017年11月23日 11:51 pm #

    一个这样的用例

    “redBus 如何使用 Scikit-Learn ML 模型对客户投诉进行分类?” https://medium.com/redbus-in/how-to-deploy-scikit-learn-ml-models-d390b4b8ce7a

    • Jason Brownlee 2017年11月24日 9:45 am #

      感谢分享。

    • Narsinha 2020年2月13日 6:44 pm #

      非常好的文章,谢谢分享!!

  10. Orges Leka 2017年12月1日 5:05 pm #

    也许您想看看 https://github.com/orgesleka/webscikit。这是一个用 Python 编写的 Web 服务器,可以在不同的 URL 上托管多个模型。可以在服务器在线时稍后部署模型。它仍在开发中,但我很乐意听听您对此的看法。

    诚挚的问候
    Orges Leka

  11. srishti 2018年2月7日 2:45 am #

    感谢这篇帖子。我需要为我的模型创建一个 API,您能帮我一下该怎么做吗?

    谢谢

  12. Aboubakar 2018年4月10日 2:25 am #

    感谢这个主题

    我目前使用 weka (GUI) 创建神经网络预测模型。我不使用 Java API,也不再写代码。我的问题是,如何用 weka 的 GUI 部署模型?

    备注:我可以用几种编程语言编程(java、python 等),但我使用的是 Weka Explorer(图形用户界面)

    谢谢。

    • Jason Brownlee 2018年4月10日 6:23 am #

      我猜想部署一个 Weka 模型需要您使用 Java API。

  13. Nirosha 2018年4月12日 6:35 am #

    很棒的文章!非常感谢。

  14. Mohammed Abdul Raoof 2018年4月27日 10:47 pm #

    嗨 Jason,你提供模型代码吗?

    • Jason Brownlee 2018年4月28日 5:30 am #

      博客里充满了模型代码的例子。您可以使用搜索功能找到它。

  15. Johnny 2018年5月15日 2:04 am #

    在 Python 中使用 Keras 进行训练,自然会导向使用 Python API 服务器作为用户进行预测的合理选择。我尝试了 Flask 和 Gunicorn。

    然而,要让服务器性能良好/能处理多个并发请求是很棘手的。

    用 Keras 模型进行多进程处理很困难,默认情况下它们是不可序列化(unpicklable)的。如果你破解它们使其可序列化,它们仍然很大,以至于序列化这些复杂对象的开销使得多进程处理非常慢。

    因此,你必须改用多线程。
    即使在这里,你也必须做一些看起来很奇怪、随意的代码行才能让 TensorFlow 正常工作

    self.graph = tf.get_default_graph()
    在主线程加载模型后,
    然后
    self.graph.as_default()

    在子线程中使用时?

    可能不得不在主线程中调用 model._make_predict_function() 之后再生成工作线程。

    我老实说不知道多线程 Keras 模型为什么会出问题,所以谁知道为什么上述一个或两个方法能让它工作 \_0_o_/

    关于这个问题有多个不同的 GitHub issues,似乎有一些不同的随机变通方法对人们的特定情况有效。

    你还需要注意的是,使用多线程时,你仍然受到 GIL(全局解释器锁)的限制。如果你有任何 CPU 密集型的工作(例如,可能是一些输入预处理),即使你的服务器现在可以同时处理多个请求,GIL 仍然会阻塞/限制在一个 CPU 核心上。
    为了避免这种情况,我尝试将所有输入预处理都在 API 服务器外部完成,这样 API 所要做的就只是调用 predict 并返回结果。

    (我不确定不同线程/请求中的同时预测是否会被 GIL 阻塞。显然一些 numpy 的东西会被阻塞,一些则不会……不确定这对 TensorFlow 预测意味着什么)

    • Jason Brownlee 2018年5月15日 7:58 am #

      当权重固定时,模型是只读的,假设您没有使用 RNN。

      在这种情况下,您可以并行使用模型。如果 TF/Keras 出现问题且模型较小,您可以使用权重直接用 numpy 计算前向传播和输出。

  16. Kim Miller 2018年7月13日 11:36 am #

    一个快速的实际问题:您的缩放器(Scaler)是从训练中保存下来的,并且基本上可以无限期地向前使用吗?例如:
    >>> from sklearn.externals import joblib
    >>> joblib.dump(clf, ‘filename.pkl’)
    >>> clf = joblib.load(‘filename.pkl’)

    如果以后从保存的权重进行“增量”训练,该怎么办?这种增量训练应该使用旧的缩放器,还是当有大量新的训练数据用于更新权重时,应该创建一个新的缩放器?

    • Jason Brownlee 2018年7月14日 6:11 am #

      可能使用旧的缩放器。

      如果拟合模型很快,从头重新拟合可能更容易。

      • Kim Miller 2018年7月18日 7:29 am #

        所以每当有大量训练数据用于进一步训练时,都可以创建一个新的缩放器。明白了。但我想,在每日数据更新的“在线”学习中可能不会这样做。

        • Jason Brownlee 2018年7月18日 2:45 pm #

          听起来不错。

          和所有事情一样,我建议您将策略编码并进行测试。结果比计划更有价值。

  17. KK 2018年9月6日 2:20 pm #

    你好 Jason,

    在部署参数模型的情况下,我们做了很多数据预处理技术来获得最准确的模型,当将这些模型部署到生产环境时,如果我们只部署系数或近似函数,我们如何处理数据预处理步骤?

    • Jason Brownlee 2018年9月7日 8:02 am #

      任何输入到模型中的数据都必须以相同的方式进行准备。

  18. meenal deshpande 2018年10月15日 4:00 pm #

    感谢分享。
    值得一读的好文章。
    你解释概念的方式帮助我理解了。
    请继续发帖..

  19. Rudra 2020年1月8日 3:03 am #

    非常感谢。我正在做我在这个领域的第一个项目,是一个用于图像分类的深度学习模型。我正在使用 python 库做用户界面。现在我想将它们连接起来并部署在 AWS 上。任何帮助或建议都会有很大帮助。另外我没有任何构建软件的经验。

  20. Felix Lin 2020年3月14日 2:21 am #

    你好!我想做一个无监督模型用于多传感器预测故障辨别,帮助我判断机器何时停止工作,我该如何学习?

  21. Felix Lin 2020年3月16日 4:25 am #

    是的,非常感谢。这是一个时间序列数据融合问题。关于数据交互有什么相关资源吗?

  22. jose carrasquel 2020年4月12日 8:14 am #

    我正在使用 LSTM 方法进行时间序列预测,我训练了一个模型,并且可以预测未来几天的天然气消耗量,结果很好,但是当考虑部署时,我发现每次有新数据时都需要重新训练模型。这种方法需要持续的维护工作,是否有其他解决方案或方法用于时间序列预测?预先感谢

  23. Aamir Iqbal 2020年4月14日 1:41 am #

    你好,

    这个信息非常有帮助,我有一点困惑。就是“将预测算法与模型系数分离”。能否请您详细解释一下,或者推荐其他有用的资源来详细了解它。

    谢谢

    • Jason Brownlee 2020年4月14日 6:23 am #

      是的,有模型的数据,比如系数,还有使用模型数据和输入数据来进行预测的算法,即“预测算法”。

      这有帮助吗?哪个部分让您困惑?

  24. Haftom 2020年5月2日 8:05 pm #

    我需要一些关于如何使用 pycharm 部署神经网络模型的信息

  25. Dina 2020年5月5日 1:37 pm #

    嗨 Jason,假设我想将机器学习模型部署到生产环境,那么拟合模型的运行时间怎么办?比如说终端用户想使用这个系统。每次打开系统前都需要重新拟合模型吗?我对这个问题很困惑。

  26. Ben 2020年7月23日 5:28 pm #

    大家好。

    在生产发布一个模型的过程中,我遇到了两件事,上一个项目是 gensim 包里的一个 FastText 模型。

    正如评论中提到的,一个 Web 服务器,我用了 Flask,很有用,因为软件是封装的,只用于我的不同模型。然后我在 pickle 我的模型时遇到了一些问题,我最终使用了 dill (https://pypi.ac.cn/project/dill/)。但我是这个领域的新手,所以关于生产部署这个话题对我来说还是实验性的 🙂

  27. John 2021年2月8日 10:41 pm #

    感谢这篇好文章,它提出了关于部署到生产环境的很好问题!

    我看到有几条评论提到了 Pickle。在我看来,无论是出于安全还是互操作性的原因,它都不是最好的解决方案。理想情况下,最好开发一个快速的 API 并通过这个 API 来提供模型服务。
    在 Python 中,最常见的机器学习 API 选择是 Django + Django Rest Framework、Flask,或者更新的 FastAPI。

    也许还值得一提的是,现在出现了新的云服务,它们可以为您提供模型服务。例如,您可以使用 Hugging Face (https://hugging-face.cn/) 在生产环境中提供 TensorFlow 模型服务,或者使用 NLP Cloud (https://nlpcloud.io) 提供 spaCy NLP 模型服务。

    开发 API 只是工作的一小部分。在生产环境中进行机器学习最困难的事情是内存使用、托管成本、通过可扩展性确保高可用性……如果人们想确保他们的项目成功,就应该意识到这一点。

  28. Colm 2021年5月17日 7:46 pm #

    顺便说一下,“In software land, we all these regression test” 有个拼写错误
    这个网站太棒了。

  29. DWin 2022年6月24日 5:55 am #

    嗨 Jason

    感谢您的优质内容——我是您的忠实粉丝。我正在将一个 LSTM 分类器部署到生产环境。在建模期间,我将数据分成了三部分——训练集(约 50%);验证集(17%)和测试集(为确保一致性和可靠性,约 33%)。这样我就得到了验证集和测试集的预测——其中我只会看测试集的预测性能,以消除数据泄漏的风险。

    在超参数调优并找到“正确”的系数后,我需要部署模型。那么我是否应该放弃测试集(因为我已经确认没有过拟合),然后重新划分数据,包括最新的数据点,只分成训练集和验证集?我希望每天都有预测,那么我是否应该每天重新训练,并从验证集中取出最新的预测?那么合适的训练验证集划分比例是什么——比如 99:1 还是类似的 70:30?

    非常感谢

    • James Carmichael 2022年6月24日 8:34 am #

      嗨 DWin... 虽然我不能直接评论您的项目,但一种方法可以是选择 99:1,然后根据需要随时间调整。希望您能在一个风险最小的“测试”阶段收集数据。

  30. DWin 2022年6月24日 8:28 pm #

    嗨 James,谢谢你的帮助。

    那么一个问题是——这不会使您的建模无效吗?背景是它是一个金融时间序列预测器。对于一个训练-验证-划分集,被发现最适合(中间)验证期(17%)的权重,与被发现最适合新的 1%(末尾)验证期的权重相比,预计会发生巨大变化。注意,我在部署中放弃了测试集。

    另一个问题是如何处理由于结构性变化(就像我们最近在 Covid 中看到的那样),在不同的训练-验证-测试集中统计上差异很大的时间序列。是否有更好的划分方法来确保每个集合彼此相似而没有数据泄漏?

    抱歉问题有点长

  31. Nate Fastar 2022年12月11日 5:53 am #

    我目前正在为我工作的公司将一个预测模型部署到生产环境,我发现这篇文章对这个过程很有启发。因为我以前从未做过这样的事情,这篇文章在帮助我理解我以前认为理所当然的概念,以及揭示我的程序中可能在未来导致可维护性问题的缺陷方面,都提供了巨大的帮助。

    我特别欣赏第1和第2节中提出的技巧。由于我是我组织中唯一的数据科学家,明确定义预期的基准和基线不仅能帮助我确保模型行为正常,还能帮助我以更易于理解的方式向公司中数据科学经验较少的部分解释模型的性能。其次,将算法与其产生的模型分离开来是我没有想到的,这可能有助于减少我们部署的程序的总体大小和复杂性,并防止训练数据泄露或被可能接触到算法的人窃取的可能性。

    • James Carmichael 2022年12月11日 9:36 am #

      感谢您的反馈,Nate!如果我们在内容方面有任何问题可以帮助您,请告诉我们!

发表回复

Machine Learning Mastery 是 Guiding Tech Media 的一部分,Guiding Tech Media 是一家领先的数字媒体出版商,专注于帮助人们了解技术。访问我们的公司网站以了解更多关于我们的使命和团队的信息。