介绍
每当我们训练和部署机器学习模型时,我们都希望确保该模型在生产中表现良好。
模型需要监控,因为现实世界中发生了我们在训练期间无法解释的事情。最明显的例子是当现实世界的数据偏离训练数据时,或者当我们遇到异常值时。我们使用监控来做出决策,例如:何时重新训练或何时获取新数据。
有一些具体的事情需要监控
- 数据漂移:现实世界中的数据开始与训练数据不同,表明需要用新数据重新训练。
- 异常值(Outliers):超出我们预期范围的输入。结果,该模型可能会产生无意义的输出。
- 偏见(Bias):模型以我们在训练期间没有意识到的方式偏向某些预测。我们可能需要用更好的数据重新训练。
在高层次上,有两种模型监控:
- 离线分析:从生产模型中收集输入和输出的快照并执行一次性分析。这是一个手动过程,但如果我们需要回答关于模型的一次性问题(例如:它是否表现出特定的偏见),它可能会很有用。
- 实时监控:我们有一个监控服务,可以从模型中收集实时数据,实时进行分析,并在出现特定模型性能问题时提醒我们。
在这篇博文中,我们将主要关注实时监控,比较 Evidently 和 Seldon 的 Alibi Detect 两种工具所采用的方法。
比较标准
我们使用一些东西来评估和比较这些工具:
- 兼容性:哪些模型服务工具,以及它将与哪些 ML 框架一起使用?
- 集成:它可以集成到现有的应用程序监控基础设施中吗?
- 能力:模型监控的哪些方面可以很好地处理?支持哪些数据类型,哪些统计检验可用(在这里,统计测试是指用于评估模型监控系统中的漂移或偏差等事物的算法。有很多这样的算法,但在本文中,我们不会深入研究他们的详细信息)。
Evidently
Evidently是一个在 Apache 2.0 许可下可用的 Python 库。这是一个致力于简化模型监控的工具。Evidently与平台无关,因此它适用于任何模型服务设置和任何机器学习框架。
开箱即用,Evidently 带有一些基本仪表板,告诉我们:
- 输入数据漂移,
- 模型输出(又名目标漂移),
- 模型和数据质量。
这些仪表板使您可以轻松地立即开始使用 Evidently,但对于强大的生产监控,我们可以利用另一个功能,即与 Prometheus 和 Grafana 的集成。 Prometheus 和 Grafana 的结合已经是一种广泛采用的应用程序监控和仪表板解决方案,通过将模型指标与应用程序指标相结合,您可以构建仪表板,实时了解整个软件堆栈。
离线分析
使用 Evidently 的最简单方法。 您将需要一些参考数据,这是用于训练模型的数据样本,以及您从生产模型中收集的一些当前数据。 例如,我们可以在 Jupyter Notebook 中执行数据漂移分析:
from evidently.dashboard import Dashboard from evidently.dashboard.tabs import DataDriftTab drift_dashboard = Dashboard(tabs=[DataDriftTab(verbose_level=1)]) drift_dashboard.calculate(reference_data, current_data, column_mapping=None) drift_dashboard.show() 复制代码
这会生成一个如下所示的仪表板:
数据漂移仪表板:
- 显示参考数据和真实数据的分布,
- 告诉我们参考数据和真实世界数据之间的相似性,
- 通知我们是否检测到漂移。
为了确定数据是否存在偏差,Evidently 使用统计测试比较了参考分布和实际分布。 许多数据科学家可能熟悉这些测试:为了检测漂移,一种名为 Kolmogorov-Smirnov 的测试用于数值特征,而卡方测试用于分类特征。 值得注意的是,这些测试适用于表格数据,但不适用于其他类型的数据,如图像。
尽管启动和运行它很容易,但离线分析对于生产监控并不是很有用。 为此,我们需要实时。
实时监控
Evidently 已经为 Github 上的实时监控提供了一个示例设置。本质上,它的工作方式是你有一个监控服务,它位于你部署的模型旁边。监控服务收集模型的输入和输出,并计算漂移等指标(使用可用于离线分析的相同统计测试)。
提供的示例包括:
- 用作监控服务的 Flask 应用程序。
- 监控配置文件,用于定义要执行的监控类型以及感兴趣的特征。
- Prometheus 和 Grafana 的配置。
- 将所有这些联系在一起的 docker-compose 配置。
通常,您需要为每个模型部署一个监控服务。使用提供的示例,我们能够为 Data Drift 创建一个简单的监控服务,只需要对代码和配置进行少量修改。
最后,提供的示例演示了如何将 Evidently 与 Prometheus 和 Grafana 一起使用。正如我们之前提到的,这是一个非常强大的功能,因为它意味着您可以将模型指标与软件堆栈中其他组件的应用程序指标结合起来,并构建统一的仪表板。
下面显示了一个简单的例子:
Alibi Detect
Alibi Detect 是由 Seldon 开发的 Python 库,可在 Apache 2.0 许可下使用。该库旨在成为“Python 中异常值、对抗性和漂移检测的首选库”。
Alibi 是围绕称为检测器(detectors)的东西构建的。检测器解决了一种特定类型的模型监控用例。这些类似于 Evidently 的监控服务理念。 Alibi 包括许多预制检测器:
- 异常值检测器,
- 漂移探测器,
- 对抗检测器。
这些都适用于各种数据类型:
- 表格(具有数字和分类特征),
- 图片,
- 时间序列,
- 文本,
- 图表。
与 Evidently 相比,Alibi 提供了更丰富的数据类型和统计测试。但是,重要的是要知道它与平台无关。 Alibi 旨在与 Seldon Core 一起使用。相比之下,Evidently 的目标是在任何地方工作。
离线分析
与 Evidently 类似,Alibi 可以直接用于 Python 脚本或 notebook 中进行离线分析。用法和功能看起来与 Evidently 的非常相似,因此我们没有在此处包含代码示例。
接下来开始实时监控!
实时监控
实时监控是 Alibi Detect 真正大放异彩的地方。实施成熟且相对容易设置。但是,由于它与 Seldon Core 紧密相关,因此只有在您还使用 Seldon 进行模型服务时才使用 Alibi。
如果您不熟悉它,请快速解释一下 Seldon Core:它是一个构建在 Kubernetes 之上的模型服务框架。 Seldon 使部署模型变得非常容易; Alibi 增加的是在模型旁边部署检测器的能力。检测器就像 Evidently 的监控服务一样,它观察模型输入和输出,并计算与模型性能相关的指标。
与 Evidently 不同的是,Alibi 带有一组预训练的检测器,涵盖常见的监控任务。您可以使用这些,也可以自己构建,具体取决于您的需要。
结论
这两种工具都在开发中,我们希望在未来看到很多新功能。
的确,Alibi 在功能方面比 Evidently 更进一步。但 Evidently 旨在提供一种可在任何平台上运行的可靠监控方法,这是一个更雄心勃勃的目标。我们认为 Evidently 会在功能方面迅速赶上。
根据任务,我们可以就哪种工具更合适提供一些建议。
对于离线分析:
- 如果您还没有将 Seldon 用于其他事情,那么 Alibi 的基础设施开销很难证明离线分析是合理的。
- 如果您想要仅包含几行代码的特征丰富的报告,并且您使用数字或分类表格数据,那么Evidently可以满足您的需求。
- 如果您的数据不是表格的,或者您需要使用更广泛的统计测试,还有其他选择,但您可以考虑在 Evidently 中实现您需要的内容并成为贡献者。
对于实时监控:
- Alibi Detect 与 Seldon Core 结合使用效果最佳。如果您已经使用 Seldon Core,这将是一个不错的选择。否则,它会带来大量的基础架构开销。
- 如果您有非表格数据、需要异常值检测或某些 Evidently 中不可用的统计测试,Alibi Detect 也是一个更好的选择。我们预计 Evidently 会在这些方面迅速赶上。
- Evidently,这是一个灵活的通用解决方案,适用于任何地方,使其成为 Seldon 生态系统之外的全面选择。