ML 可观测性:随时间推移监控模型行为¶
模型行为可能因输入漂移、训练假设过时、数据管道问题以及底层硬件和软件变更、流量波动等常见因素而随时间发生变化。ML 可观察性允许您通过 Snowflake Model Registry,从性能、漂移和数量等多个维度跟踪已部署生产模型的质量。此外,您可以使用字符串分类列监控不同数据段的模型性能。
目前,模型监控支持回归和二元分类模型。
备注
To dive in and start using ML Observability, see the quickstart (https://quickstarts.snowflake.com/guide/getting-started-with-ml-observability-in-snowflake/).
ML 可观测性工作流程¶
当您使用已在 Snowflake Model Registry 中记录的模型进行推理时,您将收到 Snowpark 或 Pandas DataFrame 形式的结果,具体取决于传递给推理方法的输入 DataFrame 的类型。这些数据通常来源于 Snowflake。即使在 Snowflake 之外运行推理,也常会将结果存储在 Snowflake 中。ML 可观测性允许您通过处理存储的推理数据来监控模型在这两种情境下的性能。典型的工作流程如下所示。
监控日志存储推理数据和预测,以便 ML 可观测性功能可以观察预测随时间的变化情况。监控日志存储在包含 ID、时间戳、特征、预测和真相标签的表中,指明给定行是预测数据还是观察到的数据。基本结构如下所示。
您必须为要监控的每个模型版本显式创建模型监控对象。每个模型版本可以有一个监控器,每个监控器可以监控一个模型版本;它们不能共享。监控对象通过查询源数据自动刷新监控日志,并根据日志更新监控报告。
每个监控器封装以下信息:
要监控的模型版本。
存储监控日志的表。
数据存储的最小时间粒度(聚合窗口),当前最少为 1 天。
用于比较性指标操作(如漂移)的可选基线表。
先决条件¶
在开始之前,请确保您满足以下条件:
Snowflake 账户。
snowflake-ml-pythonPython 包的版本 1.7.1 或更高版本。
创建模型监控器¶
使用 CREATE MODEL MONITOR 命令创建模型监控器。必须在受监控的模型版本所在的架构中创建模型监控器。您必须对在其中创建监控器的架构拥有 CREATE MODEL MONITOR 权限。最多可以为每个账户创建 250 个模型监控器。
有关 CREATE MODEL MONITOR 命令的更多详细信息,请参阅 CREATE MODEL MONITOR。
小技巧
有关可与模型监控器配合使用的其他 SQL 命令的详细信息,请参阅 模型监控命令。
暂时停止和恢复监控¶
您可以使用以下命令暂停(暂时停止)模型监控器:ALTER MODEL MONITOR ...SUSPEND。要恢复监控,请发出 ALTER MODEL MONITOR ... RESUME。
刷新失败时自动暂停¶
模型监控器在遇到与源表相关的连续五次刷新失败后会自动暂停刷新。您可以使用 DESCRIBE MODEL MONITOR 命令查看刷新暂停的状态和原因。输出包含以下列:
aggregation_status:此列中的值是 JSON 对象。如果模型监控器暂停,则此对象中的一个或多个值将为 SUSPENDED。aggregation_last_error:此列中的值是一个 JSON 对象,其中包含导致暂停的特定 SQL 错误。
解决刷新失败的根本原因后,您可以通过发出 ALTER MODEL MONITOR ...RESUME 来恢复监控器。
将分段添加到模型监控器¶
模型监控器支持分段,这使您除了监控整个数据集外,还可以监控特定数据子集随时间的模型质量。分段用于将数据分组为逻辑单元,例如不同的区域或不同的用户组。
创建带分段的监视器¶
创建模型监控器时,可以使用 SEGMENT_COLUMNS 参数指定分段列。分段列必须是源数据中的字符串列。
重要
要在数值列上创建分段,请在创建监控器之前将它们划分到有效类别中。例如,您可以将数值型 TEMPERATURE 列转换为分类值,例如“COLD”(< 32°F), 'MODERATE' (32-80°F), and 'HOT' (> 80°F),再将其用作分段列。
CREATE [OR REPLACE] MODEL MONITOR [IF NOT EXISTS] <NAME> WITH
--- all other existing parameters of CREATE MODEL MONITOR
SEGMENT_COLUMNS = (<segment_column_name_array>)
有关完整的语法和参数详细信息,请参阅 CREATE MODEL MONITOR。
向现有或新监控器添加分段¶
您可以使用 ALTER MODEL MONITOR 命令将分段列添加到现有监控器:
ALTER MODEL MONITOR <NAME> ADD SEGMENT_COLUMN = <segment_column_name>
您还可以从现有监控器中移除分段列:
ALTER MODEL MONITOR <NAME> DROP SEGMENT_COLUMN = <segment_column_name>
有关完整的语法和选项,请参阅 ALTER MODEL MONITOR。
在 UI 的监控分段中定义分段¶
您可以通过 UI 中的监控分段设置来配置和管理分段:
分段设置界面允许您定义和配置要为模型监控的分段。
在模型监控器仪表板的分段选择器中选择分段¶
在模型监控器仪表板中,您可以使用分段选择器来查看特定数据分段的指标:
分段的性能注意事项¶
性能取决于许多因素,例如特征数量、分段列数、每个分段列的唯一值、仓库大小、仓库类型、聚合窗口、总行数和每个聚合窗口的行数。
CREATE 与 SEGMENT_COLUMNS 的性能影响与请求中的分段列数量成正比
若使用多个分段列时 CREATE 性能缓慢,可考虑通过 ALTER 命令逐次添加分段列
每个段列和值组合都是独立查询的,并且根据计划和其他因素,上次更新数据的时间可能存在时间差异。但我们会尽量同时更新所有数据。
查看监控报告¶
To view monitor reports, visit the ML Monitoring dashboard in Snowsight. In the navigation menu, select AI & ML » Models. The resulting list contains all the models in the Snowflake Model Registry in all the databases and schemas that your current role has access to.
通过选择 Models 列表中的相应行打开模型的详细信息页面。详细信息页面显示关键模型信息,包括模型的描述、标签、版本和监控器。
详细信息页面中的 Monitors 列表显示模型监控器列表、监控器附加到的模型版本及其状态和创建时间。
通过选择“Monitors”列表中的相应行打开模型监控器仪表板页面。仪表板中填充了图表,展示了模型随时间变化的关键指标。显示的实际图表取决于监控器基于的模型类型(即二进制分类还是回归)。
在仪表板中,您可以执行以下操作:
通过点击时间范围选择器更改图表的范围。
点击 Settings 按钮更改显示的图表。(将鼠标悬停在指标名称上可查看有关该指标的详细信息。)
点击 Compare 模型选择器下拉列表来比较模型监控器。
选择 Display monitor details 显示有关模型监控器的更多信息。
查询监控结果¶
您创建的每个模型监控器都有以下指标:
偏移指标:分布变更或数据偏移
性能指标:分布变更或数据偏移
统计指标:计数或空值
要查询监控器计算的指标,请使用 监控器指标函数。指标函数会从模型监控器对象获取指标。您可以使用指标函数的结果在 Streamlit 或其他集中式监控工具中创建自定义仪表板。
重要
您必须具有以下权限才能使用模型监控器对象:
命令 |
所需权限 |
|---|---|
CREATE MODEL MONITOR |
|
SHOW MODEL MONITORS |
模型监控器的任意权限 |
DESCRIBE MODEL MONITOR |
模型监控器的任意权限 |
ALTER MODEL MONITOR |
模型监控器的 MODIFY 权限 |
DROP MODEL MONITOR |
模型监控器的 OWNERSHIP 权限 |
使用以下 SQL 模板从模型监控器获取偏移指标。
SELECT *
FROM TABLE(MODEL_MONITOR_DRIFT_METRIC (
<model_monitor_name>,
<drift_metric_name>,
<column_name>,
<granularity>,
<start_time>,
<end_time>,
<extra_args>
)
)
使用以下 SQL 模板从模型监控器获取性能指标。
SELECT *
FROM TABLE(MODEL_MONITOR_PERFORMANCE_METRIC (
<model_monitor_name>,
<metric_name>,
<granularity>,
<start_time>,
<end_time>,
<extra_args>
)
)
使用以下 SQL 模板从模型监控器获取统计指标。
SELECT *
FROM TABLE(MODEL_MONITOR_STAT_METRIC (
<model_monitor_name>,
<metric_name>,
<granularity>,
<start_time>,
<end_time>,
<extra_args>
)
)
查询特定于分段的指标¶
要查询特定分段的指标,可使用 <extra_args> parameter with a JSON format that specifies the segment column and value. The <extra_args> 参数(可选),若未提供该参数,查询将返回所有数据的指标(非分段查询)。
备注
目前,分段查询仅支持每个查询 1 个分段列值对。您不能在单个函数调用中同时查询多个分段。
对于分段查询,请使用 <extra_args> 参数的此格式:
'{"SEGMENTS": [{"column": "<segment_column_name>", "value": "<segment_value>"}]}'
例如,要仅获取高级客户的漂移指标,请执行以下操作:
SELECT *
FROM TABLE(MODEL_MONITOR_DRIFT_METRIC (
'my_customer_monitor',
'PSI',
'FEATURE_1',
'DAY',
'2024-01-01'::TIMESTAMP_NTZ,
'2024-01-31'::TIMESTAMP_NTZ,
'{"SEGMENTS": [{"column": "CUSTOMER_TIER", "value": "PREMIUM"}]}'
)
)
分段查询的结果表包括两个附加列:
SEGMENT_COLUMN:选择使用 时默认使用的角色和仓库。计算指标的分段列的名称(或对于非分段查询为 NULL)SEGMENT_VALUE:选择使用 时默认使用的角色和仓库。为其计算指标的分段值(或对于非分段查询为 NULL)
有关分段的更多信息,请参阅 将分段添加到模型监控器。
您可以为监控指标设置警报和通知。有关更多信息,请参阅 警报和通知。
已知限制¶
以下限制适用于模型监控器:
监控器必须与模型版本位于同一个数据库和架构中。
仅支持单输出回归和二元分类模型。
至少需要一个预测列(类别或分数);实际列是可选的,但准确性指标是必需的。
偏移计算需要基准数据;如果没有基准数据,要添加基准数据,必须删除监控器并重新创建。
每列在监控器中只能使用一次。例如,不能使用与该列和预测 ID 列相同的列。
数据不得包含无效值(空值、NaNs、+/-Inf、0-1 以外的概率分数、非二进制类别或 PREDICTION_CLASS_COLUMNS 列中超过两个类别),以避免监控器出现故障和暂停。
时间戳列的类型必须为
TIMESTAMP_NTZ;预测列和实际列必须为NUMBER。必须以天为单位指定聚合窗口。
最多可以监控 500 个功能。
最多可以创建 250 个监控器。
分段列只能是字符串分类列。
每个模型监控器最多 5 个分段列(硬限制)。
每个分段列的唯一值应少于 25 个(建议限制)。
分段值区分大小写,分段查询不支持特殊字符。
分段查询不支持 NULL 筛选功能。
成本注意事项¶
虚拟仓库计算:
模型监控器会使用虚拟仓库,在创建和每次刷新期间都会产生成本。
加载 Snowsight 仪表板还会使用虚拟仓库,从而产生额外费用。
存储:
模型监控器将源数据物化为存储在账户中的表。
分段列会添加存储在账户中的其他物化表。
云服务计算:
当底层基础对象发生更改时,模型监控器使用云服务计算来触发刷新。只有当账户的每日云服务计算费用超过每日仓库费用的 10% 时,才会收取云服务计算费用。