02.16 全新“机器学习”生命周期管理(2020)

我大概从2009年开始做机器学习的项目,到目前为止已经做过好几个项目,一直想做一个小总结,今天正好利用周末这个机会。如果大家喜欢,请留言评论。

机器学习,尤其是深度学习已经成为一种解决复杂问题的技术,例如了解自动驾驶汽车或识别新冠肺炎病毒等等。 研究员和机器学习工程师都非常关注学习模型的体系结构和概念。 随着机器学习模型被用于更多的应用程序和软件工具中,机器学习也需要像软件行业在过去十年中经历的流程标准化一样进行标准化。我们从一开始自己研发所有的生命周期管理的工具,后来转到开始大规模使用开源的项目,下面简单说一下我们全新的生命周期管理,也就是俗称机器学习流水线。

什么是机器学习流水线(machine learning pipeline)?

在过去的几年中,机器学习领域的发展令人惊讶。(我记得09年时候,基本上都是自研算法框架等等) 随着图形处理单元(GPU)的广泛可用性以及诸如Transformers(例如Bert)或Generative Adversarial Networks(例如DCGAN)等新的深度学习概念的发展,人工智能项目的数量猛增。 人工智能初创公司的数量众多,企业正在将最新的机器学习概念应用于具体的业务问题。 在急于寻求性能最高的机器学习解决方案的过程中,我们观察到数据科学家和机器学习工程师缺少用于加速,重用,管理和部署其开发的概念和工具的良好信息资源。 需要的是机器学习流程的标准化。

机器学习流水线是加速,重用,管理和部署机器学习模型的过程。大约十年前,随着持续集成(CI)和持续部署(CD)的推出,软件工程经历了相同的变化。过去,测试和部署Web应用程序是一个漫长的过程。如今,通过一些工具和理念已大大简化了这些过程。虽然Web应用程序的部署需要DevOps工程师与软件开发人员之间的协作,但如今,可以在几分钟内可靠地测试和部署Web应用程序。在工作流方面,数据科学家和机器学习工程师可以从软件工程学到很多东西。根据我的个人经验,大多数机器学习项目都没有一个庞大的团队来承担这些任务,包括部署模型。这使得很难从头开始构建整个一个流水线系统。随着时间的推移性能会下降,当基础数据发生更改时,数据工程师会花费大量时间来修复错误和部署升级等等。

机器学习流水线从收集新的训练数据开始,在收到有关您的新训练模型的反馈时结束。 此反馈可以是生产性能指标,也可以是产品用户的反馈。 该管道包括多个步骤,包括数据预处理,模型训练和模型分析以及模型的部署。 您可以想象手动完成这些步骤很麻烦并且很容易出错。


全新“机器学习”生命周期管理(2020)

机器学习流水线


从上图中可以看到,流水线实际上是一个循环。 可以连续收集数据,因此可以持续的更新机器学习模型。 更多数据通常意味着模型的不停的改进,自动化才是关键。 在实际的应用中,我们希望经常重新训练模型。 如果这是手动的过程,则需要手动验证新的训练数据或分析更新的模型,那么数据科学家或机器学习工程师将没有时间为其他的业务问题开发新模型。

通常模型生命周期包括:

数据版本控制

数据版本控制是模型生命周期的开始。 当一个新的周期开始时,例如,当有新的训练数据可用时,该数据的快照将受到版本控制,然后开始一个新的周期。 此步骤与软件工程中的版本控制类似,只不过我们不commit软件代码,而是commit模型训练和数据。

数据验证

在训练新的模型版本之前,我们需要验证新数据。数据验证的重点是检查新数据的统计信息,并在发现任何异常时提醒数据科学家。例如,如果您正在训练一个二元分类模型,那么您的训练数据可能包含50%的A类样本和50%的B类样本。如果这些类别之间的划分发生变化,则数据验证工具会发出警报,其中新收集的数据可能会在两个类别之间以70/30的比率进行划分。如果使用这样的偏差训练集来训练模型,而数据科学家没有调整模型的损失函数,或者样本A或B样本过高/不足,则模型将偏向主导类别。通用数据验证工具将还可以比较不同的数据集。假设您有一个带有显性标签的数据集,并将该数据集拆分为训练和验证集,则需要确保两个数据集之间的标签拆分大致相同。数据验证工具可让您比较数据集并突出显示异常。如果验证之后显示出不寻常的内容,则可以在此处停止整个流水线并向数据科学家发出警报。如果检测到数据偏移,则数据科学家或机器学习工程师可以更改单个标签样本的采样(例如,仅选择相同数量的标签样本),或者更改模型的损失函数并启动新模型建立管道并重新启动生命周期。

数据预处理

您极有可能无法使用新收集的数据来直接训练您的机器学习模型。在几乎所有情况下,您都需要预处理数据然后将其用于训练运行。标签通常需要转换为one-hot或multi-hot向量。模型输入也是如此。如果从文本数据训练模型,则要将文本的字符转换为索引,或者将文本标记转换为单词向量。由于仅在模型训练之前才需要进行预处理,而不是在每个训练时期都需要进行预处理,因此在训练模型之前在其自身的生命周期步骤中进行预处理是最有意义的。已经开发了多种工具来有效地处理数据并快速。可能的解决方案列表是无止境的,范围从简单的Python脚本到详尽的图形模型。尽管大多数数据科学家都将重点放在首选工具的处理能力上,但也可以将预处理步骤的修改链接到处理后的数据上,反之亦然,这一点也很重要。这意味着,如果有人修改了处理步骤(例如,在one-hot向量转换中允许添加其他标签),则先前的训练数据将变为无效并强制更新整个流水线。

模型训练与调优

模型训练步骤是机器学习流程的核心。在这一步中,我们训练模型以获取输入并预测可能的最低误差的输出。对于较大的模型,尤其是对于大型训练集,此步骤可能很快变得难以管理。由于内存通常是我们计算的有限资源,因此模型训练的有效分配至关重要。

最近,模型调优引起了很多关注,因为它可以显著提高性能并提高竞争优势。在模型训练的较早步骤中,我们假设我们将进行一次训练。但是,如何仅一次运行就可以找到最佳的模型架构或超参数呢?不可能!这就是需要模型调优的地方。借助当今的DevOps工具,我们可以轻松地复制机器模型及其训练设置。这使我们有机会并行或按顺序测试大量模型(取决于优化方法),并且能根据不同的配置测试模型。

在模型调优步骤中,训练具有不同超参数(例如, 该模型的学习率或网络层数可以自动化。 调整工具将从参数建议列表中选择一组参数。 参数值的选择可以基于网格搜索(在网格搜索中我们可以扫过所有参数的组合),也可以基于更多概率的方法(可以尝试估计最佳的下一组参数来训练模型)。 调整工具将设置模型训练运行,类似于我们在前面的训练步骤中执行的训练运行。 该工具将使我们能够进行更大范围且完全自动化的机器学习。


模型分析

一旦确定了最合适的模型参数集(可提供最高的准确性或最低的损失),就需要在将模型部署到我们的生产环境之前分析其性能。验证用于偏差的生产模型至关重要。在这些步骤中,我们将根据看不见的分析数据集来验证模型,该数据集不应该是先前使用的训练和验证集的子集。在模型分析过程中,我们将模型暴露给分析数据集的小变化,并评估模型的预测对小变化的敏感程度。同时,分析工具会测量模型是否主要预测数据集子集部分的一个标签。支持适当的模型分析的一个关键原因是,在训练模型时,可能会对验证过程中丢失的数据部分造成偏见。在训练过程中,针对验证集的模型准确性通常被计算为整个数据集的平均值,这将很难发现偏差。

模型验证和版本控制

模型版本控制和验证步骤的目的是跟踪已选择哪个模型,超参数集和数据集作为该模型的下一个版本。

模型部署

训练,调整和分析模型后,就可以开始准备了。不幸的是,一次性部署了太多的模型,使得更新模型变得很困难。一些模型服务器在最近几年已经开源,可以有效地进行部署。现代模型服务器使您无需编写Web应用程序代码即可部署模型。通常,它们为您提供多个API接口,例如REST或远程过程调用(RPC)协议,并允许您同时托管同一模型的多个版本。同时托管多个版本将允许您在模型上运行A / B测试,并提供有关模型改进的有价值的反馈。模型服务器还允许您在不重新部署应用程序的情况下更新模型版本,从而减少了应用程序的停机时间和减少应用程序开发和机器学习团队之间的沟通。

模型反馈

机器学习生命周期的最后一步通常被遗忘,但这对数据科学项目的成功至关重要。 我们需要闭环并评估新部署的模型的有效性和性能。在此步骤中,我们可以捕获有关模型性能的有价值的信息,并捕获新的训练数据以增加我们的数据集以更新模型并创建新版本模型。通过捕获数据,我们可以完善整个机器学习生命周期。


机器学习流水线与AI 需求层次

全新“机器学习”生命周期管理(2020)

AI 需求层次

几年前,前Jawbone数据副总裁及LinkedIn数据科学家Monica Rogati对此提出了各个组织应用AI的需求层次论,如上图。整个机器学习的流水线包含了在AI需求层次中。但是在实际的机器学习项目,尤其的早期的项目,我们都会把大部分的精力都放在上面三层,下面三层很少涉及到。下面简化一下机器学习的流程(如下图所示),用Airflow实现简单的流程,

全新“机器学习”生命周期管理(2020)

简化之后的机器学习的流程


用Apache Airflow 机器学习流水线

Apache Airflow是一个流行的平台,可以使用Python创建,安排和监视机器学习流水线。 它在Github上的星标超过15K(https://github.com/apache/airflow),并且被Yahoo,Twitter,Airbnb和Spotify等公司的工程师使用。


全新“机器学习”生命周期管理(2020)

airflow UI


常见有两种方式运行Airflow的 worker nodes,

  1. Celery Executor

Celery Executor需要设置Redis或RabbitMQ才能将消息分发给worker nodes。 然后,Airflow将任务分配给可以在一台或多台计算机上运行的Celery workers。如下图所示,

全新“机器学习”生命周期管理(2020)

Celery Executor

2.Airflow 和K8s

这个想法是利用K8s node pools,每个池将提供一种机器类型(高内存,高CPU,GPU…)和一组启用了弹性的作用域。 然后,我们可以使用KubernetesPodOperator在airflow的不同node pool中提交ML作业,如下图所示。


全新“机器学习”生命周期管理(2020)

KubernetesPodOperator 和airflow

使用node pool在Kubernetes中运行我们的ML任务具有以下优点:

  • 无需手动管理实例的创建和销毁:如果池上没有运行的Pod,它将自动降级为零,并且如果需要更多的资源,则会创建更多的节点。
  • 可以共享计算资源。 例如,我们可以在一个节点上运行一个Pod以完成训练任务。 如果节点有足够的资源,则可以在其上安排另一个pod(很可能是轻量级作业),从而避免了创建另一个实例的额外成本(时间和金钱)。
  • 可以在集群中的所有Pod之间共享服务。 例如,我们可以设置一个Datadog代理服务来收集我们不同ML作业的各类基础数据。

机器学习流水线的业务场景

自动化机器学习流水线的实现将给数据科学团队带来两个影响:

  • 加快新模型的开发,节省时间,
  • 更新现有模型的过程更加简单,方便,

这两个方面都将大大降低机器学习项目的成本。此外,自动化机器学习流水线将有助于检测数据集或训练模型中的潜在偏差。发现偏差可以防止伤害与模型互动的人,例如,亚马逊的机器学习型简历筛选器被发现对女性有偏见,如果出现关于通用数据保护条例(GDPR)合规性的问题,可以追踪到模型发布管理创建的记录。模型更新的自动化将给数据科学家节省大量时间,提高他们的工作满意度。


分享到:


相關文章: