本文档介绍了一些指南,可帮助您评估、确保和控制构建预测式机器学习 (ML) 解决方案时的质量。它提供了针对流程的每个步骤的建议,从开发机器学习模型到部署训练系统和将系统提供给生产环境都涵盖在内。本文档扩充了 MLOps 从业人员指南中讨论的信息,重点强调和提炼了 MLOps 生命周期每个流程的质量方面。
本文档适用于参与构建、部署和运营机器学习解决方案的所有人。本文档假定您整体上熟悉 MLOps。它并不假定您了解任何特定的机器学习平台。
机器学习解决方案质量概览
在软件工程中,开发了许多标准、流程、工具和做法来确保软件质量。目标是确保软件在生产环境中按预期运行,并且同时满足功能性和非功能性要求。这些做法涵盖软件测试、软件核实和验证,以及软件日志记录和monitoring等主题。在 DevOps 中,这些做法通常在 CI/CD 流程中集成和自动化。
MLOps 是一组标准化流程和功能,用于快速、可靠地构建、部署和操作机器学习系统。与其他软件解决方案一样,机器学习软件解决方案要求您集成这些软件质量做法,并在 MLOps 生命周期中应用这些做法。通过应用这些做法,您可以确保模型的可信度和可预测性,并确保模型符合您的要求。
但是,构建、部署和操作机器学习系统的任务带来了额外的挑战,需要某些可能与其他软件系统无关的质量做法。除了大多数其他软件系统的特征之外,机器学习系统还具有以下特征:
依赖数据的系统。经过训练的模型及其预测的质量取决于用于训练的数据和提交供预测请求使用的数据的有效性。任何软件系统都依赖于有效数据,但机器学习系统会自动推断根据数据做出决策的逻辑,因此特别依赖于数据质量。
双训练-服务系统。机器学习工作负载通常由两个不同但相关的生产系统组成:训练系统和服务系统。持续训练流水线生成新训练的模型,然后部署这些模型用于预测服务每个系统都需要一组不同的质量做法来均衡有效性和效率,从而生成和维护生产环境中的高性能模型。此外,这两个系统之间的不一致会导致错误,并使预测性能不佳。
容易过时。模型在部署到生产环境中后往往会降级,这是因为这些模型无法适应它们代表的环境的变化,例如购买行为的季节性变化。这些模型也无法适应数据的变化,例如新的产品和位置。因此,跟踪模型在生产环境中的有效性是机器学习系统面临的额外挑战。
自动化决策系统。在其他软件系统中,会针对一组要求和业务规则仔细地手动编码操作,而机器学习模型则从数据中学习规则来做出决策。数据中的隐性偏差可能会导致模型产生不公平的结果。
当已部署的机器学习模型生成错误预测时,机器学习质量不佳可能是由于各种问题造成的。其中一些问题可能是由于任何程序中的典型 Bug 造成的。但是,特定于机器学习的问题还可能包括数据倾斜和异常,以及训练过程中缺少适当的模型评估和验证过程。另一个潜在问题是模型的内置接口和服务 API 之间的数据格式不一致。此外,即使没有这些问题,模型性能也会随着时间的推移而下降;如果未正确监控,模型可能会以静默方式失败。因此,您应该在开发期间、部署期间和生产环境中包括对机器学习模型和系统的不同类型的测试和监控。
模型开发质量指南
在实验阶段开发机器学习模型时,您可使用以下两组目标指标来评估模型的性能:
- 模型的优化指标。此指标反映了模型的预测效果。该指标包括分类任务中的准确率和 f-measure、回归和预测任务中的平均绝对百分比误差、排名任务中的折扣累积增益,以及语言模型中的困惑度和 BLEU 得分。该指标的值越好,模型越适合给定任务。在某些使用场景中,为了确保公平性,请务必对不同的数据切片实现类似的预测效果,例如针对不同的客户受众特征。
- 模型的满意指标。此指标反映了模型需要满足的运行限制,例如预测延迟时间。您应将延迟时间阈值设置为特定值,如 200 毫秒。不接受任何不满足阈值限制的模型。满意指标的另外一个示例是模型大小,如果要将模型部署到低功耗硬件(如移动设备和嵌入式设备),这一点很重要。
在实验期间,您可开发、训练、评估和调试模型,来提高其在优化指标方面的效率,而不会违反满意指标阈值。
实验指南
- 具有预定义和固定阈值,用于优化指标和满意指标。
- 实现简化的评估例程,该例程接受模型和数据并生成一组评估指标。实现例程,使其不受模型类型(例如决策树或神经网络)或模型框架(例如 TensorFlow 或 Scikit-learn)的影响。
- 确保您有一个要进行比较的基准模型。此基准可以包含硬编码启发法,也可以是预测平均值或模式目标值的简单模型。使用基准模型检查机器学习模型的性能。如果机器学习模型并不优于基准模型,则机器学习模型存在一个根本问题。
- 跟踪已完成的每个实验来帮助实现可重现性和增量改进。对于每个实验,请存储超参数值、特征选择和随机种子。
数据质量指南
- 选择正确的评估指标,在实验中尽早解决任何不均衡类别。此外,请应用权重上调少数类实例或降采样多数类实例等技术。
- 确保您了解当前的数据源,并执行相关数据预处理和特征工程以准备训练数据集。此类过程需要可重复且可自动化。
- 确保您对模型的最终评估使用单独的测试数据拆分(留出)。测试拆分不应在训练期间可见,请勿使用它进行超参数调节。
- 确保训练、验证和测试拆分平等地代表您的输入数据。此类测试拆分的采样取决于数据的性质和当前机器学习任务的性质。例如,分层拆分与分类任务相关,而时间顺序拆分与时间序列任务相关。
- 确保将验证和测试拆分与训练数据拆分分开进行预处理。如何混合地预处理这些拆分,会导致数据泄露。例如,当您使用统计信息转换数据来进行归一化或对数值特征进行分桶时,请计算训练数据的统计信息,并应用它们来规范化验证和测试拆分。
- 生成一个包含特征的数据类型和一些统计属性的数据集架构。您可以使用此架构在实验和训练期间查找异常或无效的数据。
- 确保您的训练数据正确分批重排,但仍然满足模型训练要求。例如,此任务可以应用于正实例和负实例分布。
- 有单独的验证数据集用于超参数微调和模型选择。您还可使用验证数据集来执行早停法。否则,您可针对完整一组给定的最大迭代次数进行模型训练。但是,仅当模型在验证数据集上的性能相对于先前快照有所提升时,才保存模型的新快照。
模型质量指南
- 请确保您的模型没有任何基本问题会阻止模型学习输入和输出之间的任何关系。您可以使用极少数示例训练模型来实现此目标。如果模型未能针对这些示例实现高精确度,则模型实现或训练例程中可能存在错误。
- 在训练神经网络时,请监控损失中的
NaN
值,以及在整个模型训练中具有零值的权重百分比。这些NaN
值或零值可以表示错误的算术计算,或者梯度消失或爆炸问题。直观呈现权重值分布随时间的变化有助于检测拖慢训练的内部协变量偏移。您可以应用批次归一化来缓解速度降低的情况。 - 将模型在训练数据上的性能与在测试数据上的性能进行比较,以了解您的模型是过拟合还是欠拟合。如果您看到以上任一问题,请执行相关改进。例如,如果存在欠拟合,您可以增加模型的学习能力。如果存在过拟合,您可以应用正则化。
- 分析分类错误的实例,尤其是预测置信度高的实例和多类别混淆矩阵中最易混淆的类别。这些错误可能表示带有错误标签的训练示例。这些错误还可以确定数据预处理(例如移除离群值)的机会,或者创建新的特征来帮助区分这些类的机会。
- 分析特征重要性得分,并清理没有充分提高模型质量的特征。简约模型优于复杂模型。
训练流水线部署质量指南
在实现模型和模型训练流水线时,您需要在 CI/CD 例程中创建一组测试。这些测试会在您推送新代码更改时自动运行,也可以在将训练流水线部署到目标环境之前运行它们。
指南
- 对特征工程功能进行单元测试。
- 对模型的输入编码进行单元测试。
- 对模型的用户实现的(自定义)模块独立进行单元测试,例如对自定义图卷积和池化层或自定义注意力层进行单元测试。
- 对任何自定义损失或评估函数进行单元测试。
- 根据预期输入对模型的输出类型和形状进行单元测试。
- 进行单元测试,确定模型的
fit
函数对一些小批量数据正常运行,而不出现错误。这些测试应确保损失减少并且训练步骤的执行时间符合预期。进行这些检查的原因是,模型代码的更改可能会引入错误,从而导致训练过程变慢。 - 对模型的保存和加载功能进行单元测试。
- 根据原始输入和预期输出对导出的模型-服务接口进行单元测试。
- 使用模拟输入和输出工件测试流水线步骤的组件。
- 将流水线部署到测试环境,并对端到端流水线执行集成测试。对于此过程,请使用一些测试数据来确保工作流全程正确执行并生成预期的工件。
- 将新版本的训练流水线部署到生产环境时使用影子部署。影子部署有助于确保在实时数据上将新部署的流水线版本并行执行到上一个流水线版本。
持续训练质量指南
持续训练过程涉及编排和自动执行训练流水线。典型的训练工作流包括数据注入和拆分、数据转换、模型训练、模型评估以及模型注册等步骤。某些训练流水线由更复杂的工作流组成。其他任务可能包括执行使用未加标签的数据的自监督模型训练,或者构建用于嵌入的近似最邻近索引。任何训练流水线的主要输入都是新的训练数据,主输出是在生产环境中部署的新候选模型。
训练流水线在生产环境中根据时间表(例如每天或每周)或基于触发器(例如在具有标签的新数据可用时)自动运行。因此,您需要向训练工作流添加质量控制步骤,尤其是数据验证步骤和模型验证步骤。这些步骤会验证流水线的输入和输出。
您可以在训练工作流中的数据注入步骤后添加数据验证步骤。数据验证步骤剖析提取到流水线中的新输入训练数据。在剖析期间,流水线使用预定义的数据架构来检测异常;该架构是在机器学习开发过程中创建的。根据使用场景,您可以忽略或仅移除数据集中的一些无效记录。但是,新提取的数据中的其他问题可能会停止训练流水线的执行,因此您必须识别并解决这些问题。
数据验证指南
- 验证提取的训练数据的特征是否完整,以及它们是否与预期的架构匹配 - 也就是说,没有缺失的特征,也没有添加的特征。另外,验证特征是否与预计的卷匹配。
- 验证数据集中提取到训练流水线的数据类型和特征形状。
- 验证特定特征(例如日期、时间、网址、邮政编码和 IP 地址)的格式是否与预期的正则表达式匹配。另外,验证特征是否在有效范围内。
- 验证每个特征的缺失值的最大比例。特定特征中大量缺失值可能会影响模型训练。缺失值通常表示特征来源不可靠。
- 验证输入特征的网域。例如,检查分类特征的词汇表是否发生变化或数值特征的范围是否发生变化,并相应地调整数据预处理。再举一例,如果填充特征的上游系统中的更新使用不同的度量单位,则数值特征的范围可能会更改。例如,上游系统可能会将货币从“美元”更改为“日元”,也可能会将距离从“公里”更改为“米”。
- 验证每个特征的分布是否符合您的预期。例如,您可能会测试得出付款类型特征最常见的值为
cash
,并且此付款类型计入所有值的 50%。但是,如果最常见的付款类型更改为credit_card
,则此测试可能会失败。此类外部更改可能需要更改模型。
您可以在模型注册步骤之前添加模型验证步骤,以确保只有通过验证标准的模型才能注册用于生产部署。
模型验证指南
- 对于最终模型评估,请使用尚未用于模型训练或超参数微调的单独测试拆分。
- 根据测试数据拆分对候选模型评分,计算相关评估指标,并验证候选模型是否超过预定义的质量阈值。
- 确保测试数据拆分代表整个数据,考虑到不同的数据模式。对于时间序列数据,请确保测试拆分包含比训练拆分更新的数据。
- 使用重要数据切片测试模型质量,例如按国家/地区划分的用户或按类型划分的电影。通过对切片数据进行测试,可以避免全局摘要指标遮盖了精细性能问题这一难题。
- 根据测试数据拆分评估当前(倡导)模型,并将其与训练流水线生成的候选(挑战)模型进行比较。
- 根据公平性指标验证模型以检测隐性偏差,例如,训练数据中多样性不够可能会引起隐性偏差。公平性指标可以揭示将模型部署到生产环境之前必须解决的根因问题。
在持续训练期间,您可以根据优化指标和满意指标验证模型。或者,您可以仅根据优化指标验证模型,并将根据满意指标进行验证的操作推迟到模型部署阶段。如果您计划将同一模型的变体部署到不同的服务环境或工作负载,则最好推迟根据满意指标进行验证的操作。不同的服务环境或工作负载(例如云环境与设备上的环境,或者实时环境与批量传送环境)可能需要不同的满意指标阈值。如果您要部署到多个环境,您的持续训练流水线可能会训练两个或更多模型,其中每个模型都针对其目标部署环境进行了优化。如需了解详情并查看示例,请参阅 Vertex AI 上的双重部署。
将更多具有复杂工作流的持续训练流水线部署到生产环境时,您必须跟踪该流水线运行生成的元数据和工件。通过跟踪此信息,您可以跟踪和调试生产环境中可能出现的问题。跟踪信息还有助于重现流水线的输出,以便改善后续机器学习开发迭代中的实现。
有关跟踪机器学习元数据和工件的指南
- 跟踪源代码的沿袭、已部署的流水线、流水线组件、流水线运行、正在使用的数据集和生成的工件。
- 跟踪流水线运行的超参数和配置。
- 跟踪流水线步骤的关键输入和输出工件,例如数据集统计信息、数据集异常情况(如果有)、转换后的数据和架构、模型检查点以及模型评估结果。
- 跟踪条件流水线步骤运行以响应条件,并通过在关键步骤未运行或失败时添加更改机制来确保可观测性。
模型部署质量指南
假设您有一个经过训练的模型,该模型从优化指标的角度进行验证,并且从模型治理角度批准了模型(如后文的模型治理部分所述)。模型存储在模型注册表中,并已准备好部署到生产环境中。此时,您需要实现一组测试来验证模型是否适合在其目标环境中提供服务。您还需要在模型 CI/CD 例程中自动执行这些测试。
指南
- 验证模型工件是否可通过其运行时依赖项成功加载和调用。您可以通过将模型暂存在服务环境的沙盒版本中来执行此验证。此验证有助于确保模型使用的操作和二进制文件存在于环境中。
- 在预演环境中验证模型的满意指标(如果有),例如模型大小和延迟时间。
- 针对原始输入和预期输出,在预演环境中对模型-工件-服务接口进行单元测试。
- 针对预测请求的一组典型和边缘用例,在预演环境中对模型工件进行单元测试。例如,对所有特征都设置为
None
的请求实例进行单元测试。 - 在将模型服务 API 部署到目标环境后对其进行冒烟测试。如需执行此测试,请向模型服务发送单个实例或一批实例,并验证服务响应。
- 使用少量实时传送数据对新部署的模型版本进行 Canary 测试。此测试可确保在向大量用户公开模型之前,新的模型服务不会产生错误。
- 在预演环境中测试您是否可快速、安全地回滚到先前的服务模型版本。
- 执行在线实验,使用一小部分服务填充内容测试新训练的模型。此测试衡量新模型与当前模型相比的性能情况。将新模型的性能与当前模型的性能进行比较后,您可能会决定完全发布新模型来处理所有实时预测请求。在线实验技术包括 A/B 测试和多臂老虎机 (MAB)。
模型服务质量指南
已部署且在生产环境中使用的机器学习模型的预测性能通常会随着时间的推移而下降。导致这种性能下降的原因可能是在提供的特征与模型预期特征之间引入了不一致。这些不一致被称为训练-应用偏差。例如,推荐模型可能需要特征的字母数字输入值(例如最近查看的产品代码)。但是,由于使用模型服务的应用发生了更新,因此在服务期间会传递产品名称(而不是产品代码)。
此外,随着传送数据统计属性随着时间的推移而偏移,模型可能会过时,并且当前部署的模型所学习的模式不再准确。在这两种情况下,模型都无法再提供准确的预测。
为了避免模型的预测性能下降,您必须持续监控模型的效果。通过监控,您可以定期主动地验证模型的性能是否不会降低。
指南
- 记录数据存储区中传送请求-响应载荷的样本来进行常规分析。请求是输入实例,响应是模型为该数据实例生成的预测。
- 实现通过计算描述性统计信息来分析存储的请求-响应数据的自动化流程。定期计算和存储这些传送统计信息。
- 通过将传送数据统计信息与训练数据的基准统计信息进行比较,确定由数据移位和偏移引起的训练-应用偏差。此外,分析传送数据统计信息随时间的变化。
- 通过分析预测的特征归因随时间的变化,确定概念偏移。
- 识别被视为训练数据的离群值的传送数据实例。要找到这些离群值,请使用新颖检测技术,并跟踪传送数据中离群值的百分比随时间的变化情况。
- 设置当模型达到数据集中关键预测特征的偏差得分阈值时的提醒。
- 如果标签可用(即标准答案),请将真实标签与传送实例的预测标签联接起来,以进行持续评估。该方法类似于您在在线实验期间作为 A/B 测试实现的评估系统。持续评估不仅可以识别模型在生产环境中的预测能力,还可确定模型使用哪种类型的请求时表现良好,使用哪种类型的请求时表现不佳。
- 设置对您来说重要的系统指标的目标,并根据这些目标衡量模型的性能。
- 监控服务效率以确保您的模型能够在生产环境中大规模提供服务。此监控还可帮助您预测和管理容量规划,并帮助您估算服务基础架构的费用。监控效率指标,包括 CPU 利用率、GPU 利用率、内存利用率、服务延迟时间、吞吐量和错误率。
模型治理
模型治理是公司的核心功能,可提供指导和流程来帮助员工实现公司的 AI 原则。这些原则可能包括避免使用创建或强制执行偏差的模型,以及能够证明 AI 决策的合理性。模型治理函数确保人机协同 (human-in-the-loop)。进行人工审核是对于敏感性和高影响工作负载(通常是面向用户的工作负载)来说尤为重要。此类工作负载可能包括对信用风险进行评分、对职位候选人进行排名、批准保险政策,以及在社交媒体中传播信息。
指南
- 按任务为每个模型创建责任分配矩阵。此矩阵应考虑整个组织层次结构中的跨职能团队(业务线、数据工程、数据科学、机器学习工程、风险和合规性等)。
- 在与模型版本关联的模型注册表中维护模型文档和报告(例如,使用模型卡片)。此类元数据包含用于训练模型的数据、模型性能和任何已知限制的相关信息。
- 在批准模型部署到生产环境之前,先实施该模型的审核流程。在此类流程中,您可以保留模型核对清单的版本、补充文档以及利益相关方可能要求的任何其他信息。
- 根据基准数据集(也称为黄金数据集)评估模型,其中涵盖标准用例和边缘用例。此外,根据公平性指标验证模型,以帮助检测隐性偏差。
- 向模型用户说明模型的整体预测行为以及针对特定样本输入实例的预测行为。提供此信息有助于您了解模型的重要特征和可能的不良行为。
- 使用假设性分析工具分析模型的预测行为,以了解不同数据特征的重要性。此分析还有助于直观呈现多个模型和输入数据子集中的模型行为。
- 针对恶意攻击测试模型,来帮助确保模型可在生产环境中可靠使用。
- 跟踪有关模型在生产环境中、出现数据集位移和出现偏移时的预测性能的提醒。配置提醒以通知模型利益相关方。
- 管理模型的在线实验、发布和回滚。
后续步骤
- 阅读来自 Google 研究团队的机器学习测试得分:有关机器学习生产就绪性和技术债务减少的评分准则。
- 阅读 O'Reilly 撰写的有关在生产环境中运行机器学习系统的简要说明。
- 阅读机器学习规则。
- 尝试参加机器学习中的测试和调试培训。
- 阅读机器学习中的数据验证一文。
- 请参阅 Google Cloud 上的 E2E MLOps 代码库。
- 如需简要了解 Google Cloud 中专门针对 AI 和机器学习工作负载的原则和建议,请参阅架构框架中的AI 和机器学习视角。
- 如需查看更多参考架构、图表和最佳做法,请浏览云架构中心。
贡献者
作者:Mike Styer | 生成式 AI 解决方案架构师
其他贡献者:Amanda Brinhosa | 客户工程师