在机器学习领域,关于研究可复现性的讨论日渐增多,但大多集中在学术界。那么,如何确保生产环境中的机器学习可复现性呢?最近,机器学习服务提供商 MAIot.io 的首席技术官 Benedikt KOLleR 在一篇博客中分享了他根据个人经验总结的 12 个要素,这些要素对于开发可复现的生产级机器学习非常关键。
过去的二十年里,我们对软件开发有了显著的理解提升,其中 DevOps 的概念及其在行业中的广泛应用起到了重要作用。
许多领先的软件公司遵循类似的开发模式:首先快速迭代软件,然后进行持续集成、持续交付和持续部署。每个功能都经过测试,以确保其价值,软件始终保持可用状态,并通过自动化进行部署。
尽管机器学习与传统软件开发不同,但我们可以从中汲取许多实用的经验教训。在过去几年中,我们专注于开发生产型机器学习项目,目标不仅是概念验证,更是与软件开发相同的可复现性。因此,我们建立了一套流程协调器、强大的自动化能力,并制定了一系列工作流程。
为何不直接使用 Jupyter Notebook?从零开始构建包含所有处理步骤的笔记需要多长时间?团队新成员的加入是否方便?你能复现两个月前的结果吗?复现的速度如何?今天的结果能与历史结果进行对比吗?你能追踪到训练过程中数据的来源吗?如果模型过时了,会发生什么?
我们曾遇到过所有这些问题,并总结出成功构建生产型机器学习的 12 个要素,这些要素类似于软件开发中的 12 FAcTor 应用。
1. 版本控制
对于软件工程师而言,版本控制是理所当然的,但这一方法在数据科学家中尚未广泛普及。版本控制可以促进团队之间的协调与共享,帮助管理代码和文件的修改及版本,同时解决合并冲突。
机器学习是一种特殊的开发模式,涉及的变化不仅仅是代码,还有数据。因此,保存数据的版本至关重要,以确保实验和模型训练的可复现性。
总结:你需要对代码和数据进行版本控制。
2. 明确的特征依赖关系
理想情况下,输入数据应始终产生相同的输出,但现实中数据可能会变化。明确的特征依赖关系可以迅速揭示失败案例,并在服务时进行持续训练。
总结:在代码中明确特征依赖关系。
3. 描述性的训练和预处理
优秀的软件应具备清晰的描述和注释,以便他人理解代码功能。机器学习也应遵循这一原则,确保代码可读性,并分离配置与代码。
总结:提升代码可读性,并将代码与配置分开。
4. 训练结果的可复现性
如果无法复现训练结果,那么该结果就不可靠。全团队都应能够复现训练结果,通过设定工作流程,确保每个人都能在任何时间成功重新训练。
总结:使用管道式工作流程和自动化。
5. 测试
测试有多种形式,包括单元测试和集成测试。预处理代码和模型的性能均需要进行测试,以确保在不同输入下的正确性。
总结:测试你的代码与模型。
6. 偏移与持续训练
在生产中,数据可能发生偏移,因此需采取监控和持续训练的措施。通过自动化流程,系统能够基于新数据重复运行,并与历史结果进行对比。
总结:如果数据可能变化,采用持续训练的管道流程。
7. 跟踪结果
使用 Excel 等人工跟踪方法并不可靠。应通过中心化的数据存储方式自动记录训练结果,以便后续比较和分析。
总结:通过自动化方式跟踪结果。
8. 实验模型与生产模型
理解数据集通常需要通过实验,然而实验的目的并不是直接构建生产模型。理解后需进一步开发和适应,才能建立用于生产的训练流程。
总结:笔记不能直接投入生产,需在流程中进行早期实验。
9. 训练和服务之间的方法差异
训练与服务之间往往存在方法差异,数据科学家应理解数据的生成和模型的使用。要确保训练用的数据与服务环境的目标一致。
总结:正确将预处理嵌入服务之中,理解数据的上下游。
10. 可比较性
引入第二个训练脚本后,可比较性变得重要。所有训练模型应具备可比较性,以确保它们在解决同一问题。
总结:构建管道式流程,以便轻松比较训练结果。
11. 监控
机器学习目标是通过学习数据解决问题,监控系统需负责在训练和服务期间分配计算资源。数据科学家应监控他们创建的模型,以确保其性能。
总结:监控你的模型和数据。
12. 持续改进
机器学习是一个不断演进的领域,持续改进流程和模型至关重要。通过反馈机制,团队能够快速适应变化并优化性能。
总结:保持持续改进的态度。
以上 12 个要素为构建可复现的生产级机器学习提供了重要的指导,帮助团队在实践中实现更高的效率与可靠性。
[[[IMG_1]]]
[[[IMG_2]]]
[[[IMG_3]]]
[[[IMG_4]]]
[[[IMG_5]]]
