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

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



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



而且,有时,每个新手程序员,无论是热情的初创公司还是普通的全栈或数据科学家,迟早都会意识到,某些编程和创建软件的规则可以极大地简化生活。



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



本文是有关工业机器学习的一系列文章的序言。在这些文章中,我将继续讨论实际上如何制作模型并在生产中运行它,为其创建API,以及各个领域和公司中已将ML内置到其系统中的示例。



原则1.一个代码库



一些早期的程序员出于懒惰(或出于某种原因)而忽略了Git。他们完全忘记了这个词,也就是说,他们在驱动器中互相扔文件/只扔文本/发送鸽子,或者他们不考虑工作流程,而是各自提交到自己的分支,然后提交给主服务器。



该原则说:有一个代码库和许多部署。



Git可以用于生产和研发(R&D),而在这些场合使用较少。



例如,在研发阶段,您可以将提交保留在不同的数据处理方法和模型中,以便选择最佳的提交方法并轻松地继续进行处理。



其次,在生产中这是不可替代的事情-您将需要不断查看代码的更改方式,并知道哪种模型给出了最佳结果,哪种代码最后工作以及发生了什么,因为它停止了工作或开始发出了什么错误的结果。这就是提交的目的!



另外,您还可以通过将项目放置在例如Gemfury上来创建项目的程序包,然后简单地从中导入其他项目的功能,以免重写1000次,但以后再重写。



原理2.明确声明和隔离依赖项



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





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



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



因此,即使您可以在几乎所有计算机上使用curl,也仍应在依赖项中声明它,因为当迁移到另一个平台时,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。配置



许多人听说过这样的故事:各种开发人员不小心将代码从AWS上载到带有密码和其他密钥的GitHub的开放存储库中,第二天醒来时欠了6,000美元,甚至还欠了50,000美元。







当然,这些情况是极端的,但非常具有启发性。如果将您的凭据或其他配置所需的数据存储在代码中,则表示您犯了一个错误,我认为不值得解释原因。



替代方法是将配置存储在环境变量中。您可以在此处阅读有关环境变量的更多信息



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



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


这样,如果您的配置变量发生更改,则不必一直更改代码。这将节省您的时间,精力和金钱。



例如,如果您使用Kaggle API执行测试(例如,您下载并通过模型运行模型以测试模型在启动时是否运行良好),则来自Kaggle的私钥(例如KAGGLE_USERNAME和KAGGLE_KEY)应存储在环境变量中。



原则4:第三方服务



这里的想法是设计程序,使本地资源和第三方资源在代码方面没有区别。例如,您可以同时连接本地MySQL和第三方。各种API(例如Google Maps或Twitter API)也是如此。



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



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



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



数据科学中的许多人发现学习软件编写技能很有用。如果我们希望程序尽可能避免崩溃并尽可能长时间地平稳运行,则需要将新版本的发布过程分为三个阶段:



  1. . , . .
  2. — config, . .
  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-系统级别-进程名称”。它们的设计使开发人员可以从字面上看到程序运行时发生的情况。他看到了流程的进度,并了解他是否符合开发人员的预期。



该原则表明,您不应将日志存储在文件系统中-您只需要“显示”它们即可,例如,在系统stdout的标准输出中进行记录。这样,可以在开发过程中在终端中监视流程。



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



原则10.测试!



对于工业机器学习,此阶段非常重要,因为您需要了解模型是否正常工作并提供所需的内容。



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



不要忘记为深度学习模型设置相同的种子,以免它们不断产生不同的结果。



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



我还将尝试使用一些很酷的原则,如果有人愿意,可以在评论中留下这些内容。



All Articles