工业机器学习:10 条设计原则

工业机器学习:10 条设计原则

如今,每天都有新的服务、应用程序和其他重要程序被创建,使得创造令人难以置信的事物成为可能:从控制 SpaceX 火箭的软件到通过智能手机与隔壁房间的水壶互动。

有时,每个新手程序员,无论他是热情的创业者还是普通的全栈或数据科学家,迟早都会意识到编程和创建软件有一定的规则可以大大简化生活。

在本文中,我将简要描述如何对工业机器学习进行编程的 10 个原则,以便基于 12 因素应用程序方法论将其轻松集成到应用程序/服务中。 由 Heroku 团队建议。 我的倡议是提高人们对这项技术的认识,这可以帮助许多开发人员和数据科学人员。

本文是有关工业机器学习的一系列文章的序言。 在其中,我将进一步讨论如何实际创建模型并将其投入生产、为其创建 API,以及来自各个领域和系统中内置 ML 的公司的示例。

原则 1:同一个代码库

一些处于第一阶段的程序员出于懒惰(或者出于他们自己的某种原因)而忘记了 Git。 他们要么完全忘记这个词,也就是说,他们在驱动器中互相扔文件/只是扔文本/通过鸽子发送,或者他们不考虑他们的工作流程,并将每个文件提交到自己的分支,然后提交到掌握。

该原则规定: 拥有一个代码库和多个部署。

Git 既可用于生产,也可用于研究和开发 (R&D),但在这方面它的使用并不频繁。

例如,在研发阶段,您可以使用不同的数据处理方法和模型进行提交,以便选择最好的方法和模型并轻松地继续进一步使用它。

其次,在生产中,这是一个不可替代的东西 - 您需要不断地查看代码如何变化,并知道哪个模型产生了最好的结果,哪些代码最终有效,以及发生了什么导致它停止工作或开始产生不正确的结果。 这就是提交的目的!

您还可以创建项目的包,例如将其放置在 Gemfury 上,然后简单地从其中导入其他项目的函数,以免重写它们 1000 次,稍后会详细介绍。

原则 2:明确声明并隔离依赖关系

每个项目都有不同的库,您可以从外部导入这些库,以便将它们应用到某个地方。 无论是Python库,还是各种用途的其他语言的库,或者系统工具——你的任务是:

  • 明确声明依赖项,即包含项目中使用的且必须安装的所有库、工具及其版本的文件(例如,在 Python 中,可以使用 Pipfile 或requirements.txt 来完成。易于理解的链接: realpython.com/pipenv-guide)
  • 在开发过程中专门隔离您的程序的依赖关系。 您不想不断更改版本并重新安装,例如 Tensorflow?

这样,将来加入您团队的开发人员将能够快速熟悉项目中使用的库及其版本,并且您还将有机会管理为特定项目安装的版本和库本身项目,这将帮助您避免库或其版本的不兼容。

您的应用程序也不应该依赖于可能安装在特定操作系统上的系统工具。 这些工具还必须在依赖项清单中声明。 为了避免工具版本(及其可用性)与特定操作系统的系统工具不匹配的情况,这是必要的。

因此,即使curl可以在几乎所有计算机上使用,您仍然应该在依赖项中声明它,因为当迁移到另一个平台时它可能不存在或者版本不是您最初需要的版本。

例如,您的requirements.txt可能如下所示:

# Model Building Requirements
numpy>=1.18.1,<1.19.0
pandas>=0.25.3,<0.26.0
scikit-learn>=0.22.1,<0.23.0
joblib>=0.14.1,<0.15.0

# testing requirements
pytest>=5.3.2,<6.0.0

# packaging
setuptools>=41.4.0,<42.0.0
wheel>=0.33.6,<0.34.0

# fetching datasets
kaggle>=1.5.6,<1.6.0

原则 3:配置

许多人都听说过这样的故事:各种开发人员不小心将代码上传到 GitHub,并使用来自 AWS 的密码和其他密钥将代码上传到公共存储库,第二天醒来时发现自己负债 6000 美元,甚至 50000 美元。

工业机器学习:10 条设计原则

当然,这些案例是极端的,但意义重大。 如果您将配置所需的凭据或其他数据存储在代码中,那么您就犯了错误,我认为无需解释原因。

另一种方法是将配置存储在环境变量中。 您可以阅读有关环境变量的更多信息 这里.

通常存储在环境变量中的数据示例:

  • 域名
  • API URL/URI 的
  • 公钥和私钥
  • 联系方式(邮件、电话等)

这样,如果您的配置变量发生变化,您就不必不断更改代码。 这将帮助您节省时间、精力和金钱。

例如,如果您使用Kaggle API进行测试(例如,下载软件并通过它运行模型来测试运行时模型是否运行良好),那么来自Kaggle的私钥,例如KAGGLE_USERNAME和KAGGLE_KEY,应该是存储在环境变量中。

原则 4:第三方服务

这里的想法是以这样的方式创建程序:本地资源和第三方资源在代码方面没有区别。 例如,您可以连接本地MySQL,也可以连接第三方MySQL。 对于各种 API(例如 Google 地图或 Twitter API)也是如此。

为了禁用第三方服务或连接另一个服务,您只需更改环境变量中配置中的键,我在上面的段落中已经讨论过。

因此,例如,与其每次在代码中指定带有数据集的文件的路径,不如使用 pathlib 库并在 config.py 中声明数据集的路径,这样无论您使用什么服务(例如例如,CircleCI),考虑到新服务中新文件系统的结构,程序能够找到数据集的路径。

原则 5. 构建、发布、运行时

许多数据科学领域的人发现提高软件编写技能很有用。 如果我们希望我们的程序尽可能少地崩溃并尽可能长时间地无故障运行,我们需要将发布新版本的过程分为3个阶段:

  1. 阶段 装配。 您将带有单独资源的裸代码转换为包含所有必要代码和数据的所谓包。 这个包称为程序集。
  2. 阶段 发布 - 这里我们将我们的配置连接到程序集,没有它我们将无法发布我们的程序。 现在这是一个完全可以发布的版本。
  3. 接下来就是舞台 实现。 在这里,我们通过运行我们的版本中的必要进程来发布应用程序。

这种用于发布模型或整个管道的新版本的系统允许您区分管理员和开发人员之间的角色,允许您跟踪版本并防止程序意外停止。

对于发布任务,已经创建了许多不同的服务,您可以在其中编写流程以在 .yml 文件中自行运行(例如,在 CircleCI 中,这是支持流程本身的 config.yml)。 Wheely 非常擅长为项目创建包。

您可以使用不同版本的机器学习模型创建包,然后将它们打包并引用必要的包及其版本以使用您从那里编写的函数。 这将帮助您为您的模型创建 API,并且您的包可以托管在 Gemfury 上。

原则 6. 将模型作为一个或多个进程运行

此外,进程不应该共享数据。 也就是说,进程必须单独存在,各种数据也必须单独存在,例如在MySQL或其他第三方服务上,具体取决于您的需要。

也就是说,绝对不值得将数据存储在进程文件系统中,否则可能会导致在下次发布/更改配置或传输程序运行的系统时清除这些数据。

但有一个例外:对于机器学习项目,您可以存储库的缓存,以便在没有其他库或对其版本进行任何更改的情况下,每次启动新版本时都不必重新安装它们。 这样,您将减少在行业中推出模型所需的时间。

要将模型作为多个进程运行,您可以创建一个 .yml 文件,在其中指定必要的进程及其顺序。

原则 7:可回收性

在模型应用程序中运行的进程应该易于启动和停止。 因此,这将允许您快速部署代码更改、配置更改,快速灵活地扩展,并防止工作版本可能出现的故障。

也就是说,您使用模型的过程应该:

  • 最小化启动时间。 理想情况下,启动时间(从发出启动命令到进程开始运行)不应超过几秒。 如上所述,库缓存是一种减少启动时间的技术。
  • 正确结束。 即该服务端口的监听实际上被暂停了,提交到该端口的新请求将不会被处理。 在这里,您要么需要与 DevOps 工程师建立良好的沟通,要么自己了解它是如何工作的(当然最好是后者,但在任何项目中都应该始终保持沟通!)

原则 8:持续部署/集成

许多公司将应用程序开发和部署团队分开(使应用程序可供最终用户使用)。 这会大大减慢软件开发和改进进度。 它还破坏了 DevOps 文化,粗略地说,开发和集成是结合在一起的。

因此,该原则指出您的开发环境应尽可能接近您的生产环境。

这将允许:

  1. 减少发布时间数十倍
  2. 减少由于代码不兼容而导致的错误数量。
  3. 这也减少了员工的工作量,因为开发人员和部署应用程序的人员现在是一个团队。

允许您使用此功能的工具有 CircleCI、Travis CI、GitLab CI 等。

您可以快速添加模型、更新模型并立即启动它,同时在出现故障时可以轻松快速地返回到工作版本,最终用户甚至不会注意到它。 如果您有良好的测试,这可以特别容易和快速地完成。

尽量减少差异!!!

原则 9. 你的日志

日志(或“日志”)是应用程序(事件流)内发生的事件,通常以文本格式记录。 一个简单的例子:“2020-02-02 - 系统级别 - 进程名称。” 它们的设计目的是让开发人员可以清楚地看到程序运行时发生的情况。 他看到流程的进展并了解是否符合开发人员自己的意图。

该原则指出,您不应将日志存储在文件系统中 - 您应该将它们“输出”到屏幕,例如,在系统的标准输出上执行此操作。 这样就可以在开发过程中监控终端的流量。

这是否意味着根本不需要保存日志? 当然不是。 您的应用程序不应该这样做 - 将其留给第三方服务。 您的应用程序只能将日志转发到特定文件或终端进行实时查看,或者将其转发到通用数据存储系统(例如Hadoop)。 您的应用程序本身不应存储日志或与日志交互。

原则 10. 测试!

对于工业机器学习来说,这个阶段非常重要,因为您需要了解模型是否正确工作并产生您想要的结果。

如果您有回归/分类任务,可以使用 pytest 创建测试,并使用小数据集进行测试。

不要忘记为深度学习模型设置相同的种子,这样它们就不会不断地产生不同的结果。

这是对 10 条原则的简要描述,当然,如果不尝试并了解它们是如何工作的,就很难使用它们,因此本文只是一系列有趣文章的序言,在这些文章中我将揭示如何创建工业机器学习模型,如何将它们集成到系统中,以及这些原则如何使我们所有人的生活更轻松。

我还将尝试使用很酷的原则,任何人都可以根据需要在评论中留下这些原则。

来源: habr.com

添加评论