监视部署到生产环境的模型的性能(预览版)

适用范围:Azure CLI ml 扩展 v2(最新版)Python SDK azure-ai-ml v2(最新版)

了解如何使用 Azure 机器学习的模型监控来持续跟踪机器学习模型在生产环境中的性能。 模型监控为你提供监视信号的大致视图,并提醒你注意潜在的问题。 监视模型在生产环境中的信号和性能指标时,你可以批判性地评估与这些指标相关的固有风险,并识别可能对业务产生不利影响的盲点。

本文介绍如何执行以下任务:

  • 对部署到 Azure 机器学习联机终结点的模型执行现成的高级监视
  • 监视生产环境中模型的性能指标
  • 监视部署在 Azure 机器学习外部或部署到 Azure 机器学习批处理终结点的模型
  • 使用自定义信号和指标设置模型监视
  • 解释监视结果
  • 将 Azure 机器学习模型监控与 Azure 事件网格相集成

先决条件

在按照本文中的步骤操作之前,请确保满足以下先决条件:

  • Azure 基于角色的访问控制 (Azure RBAC) 用于授予对 Azure 机器学习中的操作的访问权限。 若要执行本文中的步骤,必须为用户帐户分配 Azure 机器学习工作区的所有者参与者角色,或者分配一个允许 Microsoft.MachineLearningServices/workspaces/onlineEndpoints/* 的自定义角色。 有关详细信息,请参阅管理对 Azure 机器学习工作区的访问

  • 若要监视部署到 Azure 机器学习联机终结点(托管联机终结点或 Kubernetes 联机终结点)的模型,请确保:

  • 若要监视部署到 Azure 机器学习批处理终结点或部署在 Azure 机器学习外部的模型,请确保:

    • 有方法来收集生产数据并将其注册为 Azure 机器学习数据资产。
    • 持续更新已注册的数据资产来进行模型监视。
    • (推荐)在 Azure 机器学习工作区中注册模型来进行世系跟踪。

重要

根据计划,模型监视作业在支持以下 VM 实例类型的无服务器 Spark 计算池上运行:Standard_E4s_v3Standard_E8s_v3Standard_E16s_v3Standard_E32s_v3Standard_E64s_v3。 可以在 YAML 配置中选择具有 create_monitor.compute.instance_type 属性的 VM 实例类型,也可以从 Azure 机器学习工作室的下拉列表中进行选择。

设置现成的模型监视

假设将模型部署到 Azure 机器学习联机终结点中的生产环境,并在部署时启用数据收集。 在此方案中,Azure 机器学习收集生产推理数据,并自动将其存储在 Azure Blob 存储中。 然后,可以使用 Azure 机器学习模型监控来持续监视此生产推理数据。

可以使用 Azure CLI、Python SDK 或工作室进行现成的模型监视设置。 现成的模型监视配置提供以下监视功能:

  • Azure 机器学习会自动检测与 Azure 机器学习联机部署关联的生产推理数据集,并使用该数据集进行模型监视。
  • 比较参考数据集设置为最近的历史生产推理数据集。
  • 监视设置自动包含并跟踪内置监视信号:数据偏移预测偏移数据质量。 对于每个监视信号,Azure 机器学习使用:
    • 最近的历史生产推理数据集用作比较参考数据集。
    • 指标和阈值的智能默认值。
  • 监视作业计划于每天凌晨 3:15 运行(在此示例中),从而获取监视信号并根据其相应的阈值评估每个指标结果。 默认情况下,超出任何阈值时,Azure 机器学习会向设置监视的用户发送警报电子邮件。

Azure 机器学习模型监控使用 az ml schedule 安排监视作业。 可使用以下 CLI 命令和 YAML 定义创建现成的模型监视器:

az ml schedule create -f ./out-of-box-monitoring.yaml

以下 YAML 包含现成模型监视的定义。

# out-of-box-monitoring.yaml
$schema:  http://azureml/sdk-2-0/Schedule.json
name: credit_default_model_monitoring
display_name: Credit default model monitoring
description: Credit default model monitoring setup with minimal configurations

trigger:
  # perform model monitoring activity daily at 3:15am
  type: recurrence
  frequency: day #can be minute, hour, day, week, month
  interval: 1 # #every day
  schedule: 
    hours: 3 # at 3am
    minutes: 15 # at 15 mins after 3am

create_monitor:

  compute: # specify a spark compute for monitoring job
    instance_type: standard_e4s_v3
    runtime_version: "3.3"

  monitoring_target: 
    ml_task: classification # model task type: [classification, regression, question_answering]
    endpoint_deployment_id: azureml:credit-default:main # azureml endpoint deployment id

  alert_notification: # emails to get alerts
    emails:
      - abc@example.com
      - def@example.com

设置高级模型监视

Azure 机器学习为持续模型监视提供了许多功能。 有关这些功能的完整列表,请参阅模型监控功能。 在许多情况下,需要设置具有高级监视功能的模型监视。 在以下部分,你将使用这些功能设置模型监视:

  • 使用多个监视信号获得广泛视图。
  • 将历史模型训练数据或验证数据用作比较参考数据集。
  • 监视前 N 个最重要的特征和单个特征。

配置特征重要性

特征重要性表示每个输入特征对模型输出的相对重要性。 例如,与 elevation 相比,temperature 对模型的预测可能更重要。 启用特征重要性后,你可了解你不希望哪些特征偏移或在生产环境中存在数据质量问题。

若要使用任何信号(例如数据偏移或数据质量)启用特征重要性,你需要提供:

  • 训练数据集,用作 reference_data 数据集。
  • reference_data.data_column_names.target_column 属性,它是模型的输出/预测列的名称。

启用特征重要性后,你将在 Azure 机器学习模型监控工作室 UI 中看到要监视的每个特征的特征重要性。

可以使用 Azure CLI、Python SDK 或工作室进行高级模型监视设置。

使用以下 CLI 命令和 YAML 定义创建高级模型监视设置:

az ml schedule create -f ./advanced-model-monitoring.yaml

以下 YAML 包含高级模型监视的定义。

# advanced-model-monitoring.yaml
$schema:  http://azureml/sdk-2-0/Schedule.json
name: fraud_detection_model_monitoring
display_name: Fraud detection model monitoring
description: Fraud detection model monitoring with advanced configurations

trigger:
  # perform model monitoring activity daily at 3:15am
  type: recurrence
  frequency: day #can be minute, hour, day, week, month
  interval: 1 # #every day
  schedule: 
    hours: 3 # at 3am
    minutes: 15 # at 15 mins after 3am

create_monitor:

  compute: 
    instance_type: standard_e4s_v3
    runtime_version: "3.3"

  monitoring_target:
    ml_task: classification
    endpoint_deployment_id: azureml:credit-default:main
  
  monitoring_signals:
    advanced_data_drift: # monitoring signal name, any user defined name works
      type: data_drift
      # reference_dataset is optional. By default referece_dataset is the production inference data associated with Azure Machine Learning online endpoint
      reference_data:
        input_data:
          path: azureml:credit-reference:1 # use training data as comparison reference dataset
          type: mltable
        data_context: training
        data_column_names:
          target_column: DEFAULT_NEXT_MONTH
      features: 
        top_n_feature_importance: 10 # monitor drift for top 10 features
      metric_thresholds:
        numerical:
          jensen_shannon_distance: 0.01
        categorical:
          pearsons_chi_squared_test: 0.02
    advanced_data_quality:
      type: data_quality
      # reference_dataset is optional. By default reference_dataset is the production inference data associated with Azure Machine Learning online endpoint
      reference_data:
        input_data:
          path: azureml:credit-reference:1
          type: mltable
        data_context: training
      features: # monitor data quality for 3 individual features only
        - SEX
        - EDUCATION
      metric_thresholds:
        numerical:
          null_value_rate: 0.05
        categorical:
          out_of_bounds_rate: 0.03

    feature_attribution_drift_signal:
      type: feature_attribution_drift
      # production_data: is not required input here
      # Please ensure Azure Machine Learning online endpoint is enabled to collected both model_inputs and model_outputs data
      # Azure Machine Learning model monitoring will automatically join both model_inputs and model_outputs data and used it for computation
      reference_data:
        input_data:
          path: azureml:credit-reference:1
          type: mltable
        data_context: training
        data_column_names:
          target_column: DEFAULT_NEXT_MONTH
      metric_thresholds:
        normalized_discounted_cumulative_gain: 0.9
  
  alert_notification:
    emails:
      - abc@example.com
      - def@example.com

设置模型性能监视

使用 Azure 机器学习模型监控,可以通过计算模型的性能指标来跟踪模型在生产环境中的性能。 目前支持以下模型性能指标:

对于分类模型:

  • Precision
  • 准确性
  • Recall

对于回归模型:

  • 平均绝对误差 (MAE)
  • 均方误差 (MSE)
  • 均方根误差 (RMSE)

有关模型性能监视的更多先决条件

必须满足以下先决条件才能配置模型性能信号:

  • 对生产模型具有输出数据(模型的预测结果),每一行有唯一 ID。 如果使用 Azure 机器学习数据收集器来收集生产数据,会为每个推理请求提供 correlation_id。 使用数据收集器,还可以选择从应用程序记录自己的唯一 ID。

    注意

    对于 Azure 机器学习模型性能监视,建议使用 Azure 机器学习数据收集器将唯一 ID 记录在其自己的列中。

  • 具有真实数据(实际值),每一行具有唯一 ID。 给定行的唯一 ID 应与该特定推理请求的模型输出的唯一 ID 匹配。 此唯一 ID 用于将真实数据集与模型输出联接。

    如果没有真实数据,无法执行模型性能监视。 由于在应用程序级别遇到真实数据,因此在数据可用时,需要负责收集这些数据。 还应在 Azure 机器学习中维护包含此真实数据的数据资产。

  • (可选)具有预先联接的表格数据集,其中的模型输出和真实数据也已联接在一起。

使用数据收集器时监视模型性能要求

如果使用 Azure 机器学习数据收集器来收集生产推理数据,而不为每个行提供自己的唯一 ID 作为单独的列,则会自动生成 correlationid 并将其包含在记录的 JSON 对象中。 但是,数据收集器将批处理彼此发送时间间隔较短的行。 批处理的行将位于同一 JSON 对象中,因此具有相同的 correlationid

为了区分同一 JSON 对象中的行,Azure 机器学习模型性能监视使用索引来确定 JSON 对象中行的顺序。 例如,如果同时批处理 3 个行,并且 correlationidtest,那么第一行的 ID 为 test_0,第二行的 ID 为 test_1,第三行的 ID 为 test_2。 若要确保真实数据集包含与收集的生产推理模型输出匹配的唯一 ID,请确保适当地索引每个 correlationid。 如果记录的 JSON 对象只有一行,则 correlationidcorrelationid_0

为了避免使用此索引,建议在 pandas DataFrame 中其自己的列中记录唯一 ID,该列使用 Azure 机器学习数据收集器进行日志记录。 然后,在模型监控配置中,指定此列的名称,以将模型输出数据与真实数据联接。 只要这两个数据集中的每个行的 ID 相同,Azure 机器学习模型监控就可以执行模型性能监视。

监视模型性能的示例工作流

若要了解与模型性能监视关联的概念,请考虑此示例工作流。 假设你要部署一个模型来预测信用卡交易是否存在欺诈,可按照以下步骤监视模型的性能:

  1. 将部署配置为使用数据收集器收集模型的生产推理数据(输入和输出数据)。 假设输出数据存储在列 is_fraud 中。
  2. 对于收集的推理数据的每一行,请记录唯一 ID。 唯一 ID 可以来自应用程序,你也可使用 Azure 机器学习为每个记录的 JSON 对象唯一生成的 correlationid
  3. 稍后,当真实(或实际)is_fraud 数据变得可用时,该数据也会被记录并映射到与模型输出记录的相同唯一 ID。
  4. 此真实 is_fraud 数据也会作为数据资产收集、维护和注册到 Azure 机器学习。
  5. 创建模型性能监视信号,该信号使用唯一 ID 列将模型的生产推理和真实数据资产联接来一起。
  6. 最后,计算模型性能指标。

满足模型性能监视的先决条件后,可以使用以下 CLI 命令和 YAML 定义设置模型监控:

az ml schedule create -f ./model-performance-monitoring.yaml

以下 YAML 包含使用收集的生产推理数据进行模型监视的定义。

$schema:  http://azureml/sdk-2-0/Schedule.json
name: model_performance_monitoring
display_name: Credit card fraud model performance
description: Credit card fraud model performance

trigger:
  type: recurrence
  frequency: day
  interval: 7 
  schedule: 
    hours: 10
    minutes: 15
  
create_monitor:
  compute: 
    instance_type: standard_e8s_v3
    runtime_version: "3.3"
  monitoring_target:
    ml_task: classification
    endpoint_deployment_id: azureml:loan-approval-endpoint:loan-approval-deployment

  monitoring_signals:
    fraud_detection_model_performance: 
      type: model_performance 
      production_data:
        data_column_names:
          prediction: is_fraud
          correlation_id: correlation_id
      reference_data:
        input_data:
          path: azureml:my_model_ground_truth_data:1
          type: mltable
        data_column_names:
          actual: is_fraud
          correlation_id: correlation_id
        data_context: actuals
      alert_enabled: true
      metric_thresholds: 
        tabular_classification:
          accuracy: 0.95
          precision: 0.8
  alert_notification: 
      emails: 
        - abc@example.com

通过将生产数据引入 Azure 机器学习来设置模型监控

还可以为部署到 Azure 机器学习批处理终结点或部署在 Azure 机器学习外部的模型设置模型监视。 如果没有部署,但有生产数据,可使用这些数据来执行持续的模型监视。 若要监视这些模型,你必须能够:

  • 从生产环境中部署的模型收集生产推理数据。
  • 将生产推理数据注册为 Azure 机器学习数据资产,并确保数据持续更新。
  • 提供自定义数据预处理组件,并将其注册为 Azure 机器学习组件。

如果未使用数据收集器收集数据,则必须提供自定义数据预处理组件。 如果没有此自定义数据预处理组件,Azure 机器学习模型监控系统将不知道如何将数据处理成支持时间窗口的表格形式。

自定义预处理组件必须具有以下输入和输出签名:

输入/输出 签名名称 类型 描述 示例值
input data_window_start 文本,字符串 数据窗口开始时间(ISO8601 格式)。 2023-05-01T04:31:57.012Z
input data_window_end 文本,字符串 数据窗口结束时间(ISO8601 格式)。 2023-05-01T04:31:57.012Z
input input_data uri_folder 收集的生产推理数据,注册为 Azure 机器学习数据资产。 azureml:myproduction_inference_data:1
output preprocessed_data mltable 表格数据集,与参考数据架构的子集匹配。

有关自定义数据预处理组件的示例,请参阅 azuremml-examples GitHub 存储库中的 custom_preprocessing

满足上述要求后,可以使用以下 CLI 命令和 YAML 定义设置模型监视:

az ml schedule create -f ./model-monitoring-with-collected-data.yaml

以下 YAML 包含使用收集的生产推理数据进行模型监视的定义。

# model-monitoring-with-collected-data.yaml
$schema:  http://azureml/sdk-2-0/Schedule.json
name: fraud_detection_model_monitoring
display_name: Fraud detection model monitoring
description: Fraud detection model monitoring with your own production data

trigger:
  # perform model monitoring activity daily at 3:15am
  type: recurrence
  frequency: day #can be minute, hour, day, week, month
  interval: 1 # #every day
  schedule: 
    hours: 3 # at 3am
    minutes: 15 # at 15 mins after 3am

create_monitor:
  compute: 
    instance_type: standard_e4s_v3
    runtime_version: "3.3"
  monitoring_target:
    ml_task: classification
    endpoint_deployment_id: azureml:fraud-detection-endpoint:fraud-detection-deployment
  
  monitoring_signals:

    advanced_data_drift: # monitoring signal name, any user defined name works
      type: data_drift
      # define production dataset with your collected data
      production_data:
        input_data:
          path: azureml:my_production_inference_data_model_inputs:1  # your collected data is registered as Azure Machine Learning asset
          type: uri_folder
        data_context: model_inputs
        pre_processing_component: azureml:production_data_preprocessing:1
      reference_data:
        input_data:
          path: azureml:my_model_training_data:1 # use training data as comparison baseline
          type: mltable
        data_context: training
        data_column_names:
          target_column: is_fraud
      features: 
        top_n_feature_importance: 20 # monitor drift for top 20 features
      metric_thresholds:
        numberical:
          jensen_shannon_distance: 0.01
        categorical:
          pearsons_chi_squared_test: 0.02

    advanced_prediction_drift: # monitoring signal name, any user defined name works
      type: prediction_drift
      # define production dataset with your collected data
      production_data:
        input_data:
          path: azureml:my_production_inference_data_model_outputs:1  # your collected data is registered as Azure Machine Learning asset
          type: uri_folder
        data_context: model_outputs
        pre_processing_component: azureml:production_data_preprocessing:1
      reference_data:
        input_data:
          path: azureml:my_model_validation_data:1 # use training data as comparison reference dataset
          type: mltable
        data_context: validation
      metric_thresholds:
        categorical:
          pearsons_chi_squared_test: 0.02
  
  alert_notification:
    emails:
      - abc@example.com
      - def@example.com

使用自定义信号和指标设置模型监视

借助 Azure 机器学习模型监控,可定义自定义信号,并实现所选的任何指标来监视模型。 可以将此自定义信号注册为 Azure 机器学习组件。 当 Azure 机器学习模型监控作业按指定的时间安排运行时,该作业会计算你在自定义信号中定义的指标,就像对待预生成的信号(数据偏移、预测偏移和数据质量)那样。

若要设置用于模型监视的自定义信号,必须先定义自定义信号,并将其注册为 Azure 机器学习组件。 Azure 机器学习组件必须具有以下输入和输出签名:

组件输入签名

组件输入数据帧应包含以下项:

  • mltable,其中包含预处理组件中已处理的数据
  • 任何数量的文本,每个文本表示作为自定义信号组件的一部分实现的指标。 例如,如果已实现指标 std_deviation,则需要 std_deviation_threshold 的输入。 通常,每个指标应有一个名称为 <metric_name>_threshold 的输入。
签名名称 类型 描述 示例值
production_data mltable 表格数据集,与参考数据架构的子集匹配。
std_deviation_threshold 文本,字符串 所实现指标的相应阈值。 2

组件输出签名

组件输出端口应具有以下签名。

签名名称 类型 描述
signal_metrics mltable 包含计算指标的 mltable。 架构是在名为“signal_metrics 架构”的下一部分中定义的。

signal_metrics 架构

组件输出数据帧应包含 4 列:groupmetric_namemetric_valuethreshold_value

签名名称 类型 描述 示例值
group 文本,字符串 要应用于此自定义指标的顶级逻辑分组。 TRANSACTIONAMOUNT
metric_name 文本,字符串 自定义指标的名称。 std_deviation
metric_value 数值 自定义指标的值。 44,896.082
threshold_value 数值 自定义指标的阈值。 2

下表显示了计算 std_deviation 指标的自定义信号组件的示例输出:

' group ' metric_value metric_name threshold_value
TRANSACTIONAMOUNT 44,896.082 std_deviation 2
LOCALHOUR 3.983 std_deviation 2
TRANSACTIONAMOUNTUSD 54,004.902 std_deviation 2
DIGITALITEMCOUNT 7.238 std_deviation 2
PHYSICALITEMCOUNT 5.509 std_deviation 2

若要查看自定义信号组件定义和指标计算代码示例,请参阅 azureml-examples 存储库中的 custom_signal

满足使用自定义信号和指标的要求后,可使用以下 CLI 命令和 YAML 定义设置模型监视:

az ml schedule create -f ./custom-monitoring.yaml

以下 YAML 包含使用自定义信号进行的模型监视的定义。 有关代码的一些注意事项:

  • 假设你已创建具有自定义信号定义的组件并将其注册到 Azure 机器学习。
  • 已注册的自定义信号组件的 component_idazureml:my_custom_signal:1.0.0
  • 如果已使用数据收集器收集数据,可以省略 pre_processing_component 属性。 如果要使用预处理组件来预处理数据收集器未收集的生产数据,可以指定它。
# custom-monitoring.yaml
$schema:  http://azureml/sdk-2-0/Schedule.json
name: my-custom-signal
trigger:
  type: recurrence
  frequency: day # can be minute, hour, day, week, month
  interval: 7 # #every day
create_monitor:
  compute:
    instance_type: "standard_e4s_v3"
    runtime_version: "3.3"
  monitoring_signals:
    customSignal:
      type: custom
      component_id: azureml:my_custom_signal:1.0.0
      input_data:
        production_data:
          input_data:
            type: uri_folder
            path: azureml:my_production_data:1
          data_context: test
          data_window:
            lookback_window_size: P30D
            lookback_window_offset: P7D
          pre_processing_component: azureml:custom_preprocessor:1.0.0
      metric_thresholds:
        - metric_name: std_deviation
          threshold: 2
  alert_notification:
    emails:
      - abc@example.com

解释监视结果

配置模型监视器并完成第一次运行后,可以导航回 Azure 机器学习工作室中的“监视”选项卡来查看结果。

  • 在主“监视”视图中,选择模型监视器的名称以查看“监视概述”页。 此页面显示了相应的模型、终结点和部署,以及所配置的信号的详细信息。 下图显示了一个监视仪表板,其中包括数据偏移和数据质量信号。 根据配置的监视信号,仪表板看起来可能有所不同。

    显示监视仪表板的屏幕截图。

  • 访问仪表板的“通知”部分,查看对于每个信号,哪些特征违反了为其各自指标配置的阈值:

  • 选择“data_drift”以转到数据偏移详细信息页。 在详细信息页上,可以看到监视配置中包含的每个数值和分类特征的数据偏移指标值。 当监视器有多个运行时,你将看到每个特征的趋势线。

    显示数据偏移信号的详细信息页的屏幕截图。

  • 若要详细查看单个特征,请选择特征的名称来查看与参考分布相比的生产分布。 通过此视图,还可跟踪该特定特征随时间变化的偏移情况。

    显示单个特征的数据偏移详细信息的屏幕截图。

  • 返回到监视仪表板,然后选择“data_quality”来查看数据质量信号页。 在此页面上,可以看到要监视的每个特征的空值率、超出边界率和数据类型错误率。

    显示数据质量信号的详细信息页的屏幕截图。

模型监视是一个持续的过程。 使用 Azure 机器学习模型监控,可配置多个监视信号来大致了解模型在生产环境中的性能。

将 Azure 机器学习模型监控与 Azure 事件网格相集成

可以使用 Azure 机器学习模型监控功能生成的事件,通过 Azure 事件网格设置事件驱动的应用程序、流程或 CI/CD 工作流。 可通过各种事件处理程序(例如 Azure 事件中心、Azure Functions 和逻辑应用)来使用事件。 根据监视器检测到的偏移,你可以编程方式执行操作,例如设置机器学习管道来重新训练模型并重新部署模型。

若要开始将 Azure 机器学习模型监控与事件网格相集成,请执行以下操作:

  1. 按照在 Azure 门户中设置的步骤操作。 为事件订阅提供一个名称(例如 MonitoringEvent),然后只在“事件类型”下选择“运行状态已更改”框。

    警告

    请务必为事件类型选择“运行状态已更改”。 不要选择“检测到数据集偏移”,因为它适用于数据偏移 v1,而不是 Azure 机器学习模型监控。

  2. 按照筛选和订阅事件中的步骤,为你的方案设置事件筛选。 导航到“筛选器”选项卡,在“高级筛选器”下添加以下键、运算符和值:

    • 键:data.RunTags.azureml_modelmonitor_threshold_breached
    • :失败,原因是一个或多个特征违反指标阈值
    • 运算符:字符串 contains

    借助此筛选器,当 Azure 机器学习工作区中的任何监视器的运行状态更改(从“已完成”变为“失败”或从“失败”变为“已完成”)时,会生成事件。

  3. 若要筛选监视级别,请在“高级筛选器”下使用以下键、运算符和值:

    • 键:data.RunTags.azureml_modelmonitor_threshold_breached
    • your_monitor_name_signal_name
    • 运算符:字符串 contains

    确保 your_monitor_name_signal_name 是要为其筛选事件的特定监视器中的信号的名称。 例如 credit_card_fraud_monitor_data_drift。 要使此筛选器正常工作,此字符串必须与监视信号的名称匹配。 对于这种情况,应使用监视器名称和信号名称来为信号命名。

  4. 完成“事件订阅”配置后,请选择用作事件处理程序的所需终结点,例如 Azure 事件中心。

  5. 捕获事件后,可以从终结点页查看它们:

    显示从终结点页查看的事件的屏幕截图。

还可以在 Azure Monitor 的“指标”选项卡中查看事件:

显示从 Azure Monitor 指标页查看的事件的屏幕截图。