机器学习和深度学习在过去的几年迅速火热起来,
但网上的一些资料和课堂中的教学大部分都是以构建模型和调节模型为主。
然而在实际的生产中,
机器学习工程师的职责不仅仅是构建模型和维护模型,更需要掌握一些软件工程的技能。
大多数的公司在过去的几年中才开始使用机器学习技术,或者开发相关系统。
而在规模化开发和运行机器学习系统的公司更是不多。
而在运行系统中,常常会遇到一些挑战,这篇文章是想深入讨论一下运行机器学习系统的几个挑战。
机器学习的开发是一个迭代过程。
需要对数据、学习算法和模型参数的多种组合进行试验,
并跟踪这些变化对预测性能的影响。
随着时间的推移,这种迭代实验可能会产生数千次模型训练运行和模型版本。
这使得跟踪性能最佳的模型及其再输入最佳模型的配置变得很难。
与传统的软件工程一样,很少有人会随着时间的推移开发模型。
团队人员更替、目标变化以及新的数据集和功能的改变是很常见的。
因此,我们应该期望在首次构建模型后,对搭建模型的实验过程将持续很长时间。
将当前实验结果与过去的实验结果进行比较,以识别进一步改进的机会将变得越来越困难,
这需要一个系统来跟踪实验元数据以及不同参数对预测性能的影响。
当在 Jupyter 笔记本等交互式编程环境中训练模型时,调试模型训练作业是一件简单的事情。
手动运行代码,如果发生训练错误,Jupyter 笔记本将显示异常和堆栈跟踪。
如果训练成功,还可以展示可视化学习曲线和其他指标。
进一步诊断模型是否发生过拟合或梯度消失等问题。
但当模型在一个固定的时间内,自动化批量处理,调节模型将变得很难。
虽然调度程序会重新运行失败的训练过程,但除非编写自定义解决方案,否则它们无法轻松检查过度拟合和梯度消失等问题。
而且数据科学团队的目标是部署越来越多的模型,当越来越多的模型出现在这个过程中,这个问题只会逐渐恶化。
机器学习模型只有在满足它的用户使用时,才能开始为公司增加价值。
采用经过训练的 ML 模型并将其预测提供给用户或其他系统的过程称为「部署」。
部署与特征工程、模型选择或者模型评估等常规机器学习任务完全不同。
因此,缺乏软件工程或 DevOps 背景的数据科学家和 ML 工程师对这种部署了解可能不多。
在决定如何部署机器学习模型时,需要考虑多个因素:
如果已将模型部署到端点,它们可以开始为用户提供价值。
但模型端点可能会在不久的将来面临更高的工作负载。
例如,如果公司开始为更多用户提供服务,这些增加的需求可能会降低您的机器学习服务的质量。
作为 API 端点托管的 ML 模型往往需要响应这种需求变化。
当请求增加时,为模型服务的计算实例的数量应增加,当工作负载减少时,应删除计算实例,这样就不必为不使用的实例付费。
这个阶段才是真正的开始。
当模型完成平台部署,还有很重要的一件事就是监控模型的预测和异常。
这个阶段必须持续监控模型,检测和消除模型质量的偏差,例如数据漂移。
及早主动检测这些偏差,能够采取纠正措施,例如重新训练模型、审核上游系统或修复数据质量问题,而无需手动监控模型或构建额外的工具。
写在最后:
有时避免构建自己的机器学习基础设施是一个好的选择。
利用广泛的开源工具和平台,构建提供差异化价值的模型。