MLOps敏捷的机器学习项目开发方法论

DevOps在软件开发领域取得了巨大的成功。MLOps是尝试在机器学习工程领域复制DevOps的思想,将机器学习项目变成一个快速迭代的工程。

DevOps的几个基本思想

DevOps给软件开发带来了成倍的生产力提高,并且保证了工程质量。这在互联网软件项目开发领域取得了尤其令人瞩目的效果,造成了这套方法论的流行。现在机器学习项目尝试复制这套方法论,这就是MLOps。

MLOps继承了DevOps的几个基本思想。但是机器学习项目又有自己的特点,这需要我们需要做出创新以及新的工具。

版本管理

在传统的软件开发中,一般版本管理只涉及到代码的版本管理。而这往往是使用git之类的软件。在机器学习项目中,代码版本管理是不够的。我们还需要对数据、流水线、模型进行版本管理。

这和机器学习的特点有关。代码决定了项目中使用的模型的结构,但是模型的参数是通过数据训练出来的。同样的代码,不同的数据,会导致非常不一样的模型。

机器学习模型的训练往往用流水线定义。这是因为在训练模型之前,需要对数据进行一些预处理。这些预处理有时会有非常复杂的依赖关系,用流水线来管理比较好维护。对于同样的模型和数据,预处理方式不同,最后训练出来的模型也不一样。

关于模型版本管理,理论上给定数据,预处理和算法代码的版本,可以确定一个模型。当然由于训练过程一些随机算法,两次出来的模型参数不会完全一致,但是模型准确率方面的指标应该类似。但实际中我们还是往往有个模型版本管理,方便部署。

无处不在的测试

在传统软件测试中,开发人员编写自动测试代码。这些自动测试代码会在代码变更前、周期性的、新版本发布前执行。

在MLOps项目中,这样的测试也是必不可少的。机器学习项目的特点是,我们不仅要测试”代码”(模型),我们还要测试数据。

数据测试发生在模型训练之前。数据对于模型效果很重要,如果数据质量不高,用这样的数据训练出来的模型就是Garbage in garbage out了。所以数据测试的时候是多个维度的,一定会涉及到数据分布之类的检测,而且会跟领域、模型有关。数据测试自动化也很重要,尤其对于实行模型自动重训练的团队。

测试模型一般分成上线前测试和线上测试。上线前测试,往往是使用在模型训练中没有出现过的测试数据,进行模型性能的测试。上线后测试,一般是基于A/B测试平台,分出一部分流量给新模型。收集模型的测试结果。

持续部署

DevOps的效果之一就是持续的发布新的软件到线上。每次新的版本,是首先由代码变更,测试,编译打包,上线等一系列的组成流程。

在机器学习项目中,和传统软件开发项目不同的一点是,新版本的发布不仅仅来自代码变更,还会来自新的数据。这是机器学习项目面临的新的挑战。

MLOps解决这一挑战的方法是continous training(CT)。数据科学家和机器学习工程师们不仅仅是发布新的模型。他们更应该关注模型训练过程的维护。这个训练过程包括了数据抽取,数据验证,模型训练,模型测试,模型上线等步骤。在项目中,这一过程往往是以一种自动化流水线或者实验的方式来承载的。

监控

将项目部署上线之后,并不意味的完事大吉。在DevOps中,监控是重要的一环。对于线上项目监控和报警是提供稳定可靠服务的前提条件。更进一步,这些监控组件相关的集成应该在开发阶段就写进去了,上线后只是在一个监控平台上设置监控面板和报警,应该不需要额外的开发工作。

在机器学习项目中,相关的监控代码应该在开发阶段设计好,并跟随流水线部署到生产环境中去。与传统软件开发的区别是,机器学习项目不仅关心系统性能指标,例如预测服务的延时,更应该关心上线服务的质量,例如准确率之类的指标。除了监控模型的性能,数据的质量也应该监控,并且在出现情况时及时报警。

总结

本文介绍了MLOps。通过与这一概念的前驱DevOps,在几个基本思想点上的比较,进行展开。MLOps的基本目的与DevOps类似,就是要提供一个快速迭代、质量可控的基于机器学习服务。由于机器学习项目需要涉及到代码和数据两部分,MLOps比DevOps更复杂一些。最后,MLOps是一套方法论,不涉及到任何具体的工具。遵循MLOps的思想,不同的公司和团队可能使用不同的工具集。