使用 Snowflake Model Registry 管理模型

Snowflake Model Registry 简化了将机器学习模型从开发环境转入生产环境的过程。一个组织良好的模型注册表用作所有模型及其指标和元数据的中央枢纽和单一来源。在注册表中登记您的模型是 Snowflake ML Ops 旅程中第一步,也是最重要的一步,这将使您的机器学习在 Snowflake 知道的控制、安全性和治理下运作。

Snowflake Model Registry 足够灵活,可以满足广泛的 ML 模型管理用例和场景。本主题提供的指导说明了如何充分利用注册表以在从开发到生产的过程中无缝管理模型,其中包括:

  • 如何控制对模型的访问权限,以便正确的用户或角色组可以执行各种操作。

  • 如何查询所有模型的指标和其他元数据。

  • 如何管理模型从开发到生产的生命周期。

  • 如何在不更改生产代码的情况下推出模型的新版本。

治理

因为 机器学习模型 是 Snowflake 中的一级对象,您可以将所有标准的 Snowflake 治理功能用于它们,包括基于角色的访问控制和信息架构。

基于角色的访问控制

模型对象有三个权限:OWNERSHIP、USAGE 和 READ。

权限

描述

OWNERSHIP

模型的全面控制,包括管理模型版本、访问工件和更新模型元数据。只有一个角色可以拥有该模型,但您可以 授予角色 给多个用户或其他角色。

USAGE

对模型的只读访问权限,允许仓库推理(预测)和使用 SHOW MODELS 和 SHOW VERSIONS IN MODEL 命令。只有 USAGE 的角色无法访问模型代码、权重或其他工件。

READ

对模型的只读访问权限,允许 SPCS 推理(预测)、模型文件、元数据以及使用 SHOW MODELS 和 SHOW VERSIONS IN MODEL 命令。

模型的所有者可以按如下方式为任何角色授予访问权限:

GRANT USAGE ON MODEL my_model TO ROLE prod_role;
-- OR
GRANT READ ON MODEL my_model TO ROLE prod_role;
Copy

信息架构查询

与所有 Snowflake 对象一样,模型在 Snowflake Information Schema 中以视图的形式表示。模型及其版本的视图是 INFORMATION_SCHEMA.MODEL_VERSIONS。模型版本信息是模型信息的超集,因此没有单独的 MODEL 视图。

通过这个视图,您可以查询注册表本身。例如,假设您维护一个准确性指标,使用 SQL 将其添加到每个模型版本中,如下所示。

ALTER MODEL my_model MODIFY VERSION v1
    SET METADATA = '{"metric": {"accuracy": 0.769}}';
Copy

备注

还可以 使用注册表的 Python API 设置指标

mv = reg.get_model("my_model").version("v1").set_metric("accuracy", 0.769)
Copy

将此指标添加到所有版本的模型后,可以使用类似于此处的查询来检索有关所有模型对象的信息,并按从高到低的准确性顺序列出它们。

SELECT
    catalog_name,
    schema_name,
    model_name,
    model_version_name,
    metadata:metric:accuracy AS accuracy,
    comment,
    owner,
    functions,
    created_on,
    last_altered_on
FROM my_database.INFORMATION_SCHEMA.MODEL_VERSIONS
ORDER BY accuracy DESC;
Copy

可以创建更复杂的查询,这些查询可以联接到其他信息架构视图或其他表,以进行更详细的分析。

模型生命周期管理

为了满足大中小企业的多样化需求,Snowflake Model Registry 提供了四种简单而强大的架构,用于管理模型从开发到生产的生命周期。根据您偏好的治理结构,选择最适合您的选项。

使用默认版本

模型是有版本控制的,并且其中一个版本被指定为默认版本。您可以根据惯例将模型的默认版本视为生产版本;生产代码仅调用模型的默认版本。

在这种情况下,您可以通过将模型版本设置为默认版本来将其提升到生产状态,也许是在它满足您的模型评分或性能评估工作流程要求之后。这是控制在生产中使用哪个模型版本的最简单方法。

在以下情况下使用此方法:

  • 模型的所有者有权决定在生产中使用哪个版本。

  • 您不需要跟踪除开发/生产之外的任何生命周期阶段。

初始设置

模型所有者授予生产角色对模型的使用权。

GRANT USAGE ON MODEL my_model TO ROLE prod_role;
Copy

最初登记模型时,它的唯一版本是默认版本,并且该版本已准备好使用。

重要

模型必须始终具有默认版本。那么在此架构下,不能将模型指定为尚未拥有生产版本。如果需要防止模型在准备好之前投入使用,可以登记会立即抛出错误的初始版本。此版本将保持为默认版本,直到其他版本准备好使用。

将模型提升到生产状态

当下面的 SQL 中名为 new_version 的新版本通过质量标准时,将其指定为默认版本,以将它标记为生产版本。

ALTER MODEL my_model SET DEFAULT_VERSION = new_version;
Copy

在生产环境中使用模型

在生产环境中,直接调用模型以使用默认版本。

SELECT my_model!predict(...) ... ;
Copy

开发和测试

要使用预发布版本,请按名称调用所需的模型版本:

WITH my_version AS MODEL my_model VERSION new_version
    SELECT my_version!predict(...) ...;
Copy

使用别名

许多组织使用多个阶段来管理模型生命周期,例如开发、金丝雀、预发布、生产和弃用。模型版本可以有 别名、用户定义的标签或标签,可以专门将其附加到模型的任何版本上。可以使用别名来表示贵组织使用的生命周期阶段。

在以下情况下使用此方法:

  • 模型所有者有权做出模型生命周期阶段的决策。

  • 您想跟踪多个生命周期阶段,而不仅仅是开发/生产。

下面的示例使用了两个预生产阶段(alphabeta)和一个生产阶段 (production)。

初始设置

模型所有者授予生产角色对模型的使用权。

GRANT USAGE ON MODEL my_model TO ROLE prod_role;
Copy

提升模型的初始版本

登记模型时,将 production 别名设置为指向第一个版本,这里命名为 v1

ALTER MODEL my_model VERSION v1 SET ALIAS = production;
Copy

管理预生产版本

最初,模型没有指定的 alphabeta 版本。添加新版本时,最初将其指定为 alpha

ALTER MODEL my_model VERSION v2 SET ALIAS = alpha;
Copy

稍后,将新版本提升为 beta

ALTER MODEL my_model VERSION v2 UNSET ALIAS;
ALTER MODEL my_model VERSION v2 SET ALIAS = beta;
Copy

提升模型的后续版本

当一个新版本的模型通过审核后,从当前生产版本(在这里为 v1)中移除 production 别名,并将其应用于新版本(在这里为 v2)。

ALTER MODEL my_model VERSION v1 UNSET ALIAS;
ALTER MODEL my_model VERSION v2 UNSET ALIAS;
ALTER MODEL my_model VERSION v2 SET ALIAS = production;
Copy

在生产环境中使用模型

通过 production 别名调用模型的生产版本。

WITH my_version AS MODEL my_model VERSION production
    SELECT my_version!predict(...) ...;
Copy

开发和测试

要使用预发布版本,请通过 alphabeta 别名调用模型。例如,要测试 Alpha 版本:

WITH my_version AS MODEL my_model VERSION alpha
    SELECT my_version!predict(...) ...;
Copy

使用标签

描述 默认版本别名 生命周期管理架构时,假设模型所有者可以管理模型生命周期。在许多组织中,此责任通常由一个单独的生产工程角色承担,而数据科学家没有权限将模型版本提升到生产状态。因为模型是一级 Snowflake 对象,可以出于此目的将 标签 应用于它们。标签可以通过基于角色的访问控制进行保护,并且适合这种责任分离。

在以下情况下使用此方法:

  • 一个非模型拥有者的角色决定何时将模型版本从一个生命周期阶段提升到下一个阶段。

初始设置

模型所有者授予生产角色对模型的使用权。

GRANT USAGE ON MODEL my_model TO ROLE prod_role;
Copy

The production role also needs the ability to see the tags on a model and to read the tag values. Here, the former is achieved by granting the broad APPLY TAG privilege on the account to the role. The latter is achieved by granting the USAGE privilege on the schema.

USE ROLE ACCOUNTADMIN;
GRANT APPLY TAG ON ACCOUNT TO ROLE prod_role;
GRANT USAGE ON SCHEMA model_database.model_schema TO ROLE prod_role;
Copy

To create tags, a role needs the CREATE TAG privilege on the schema.

prod_role 拥有的架构中创建一个名为 live_version 的标签,以保存模型当前生产版本的名称。

USE ROLE prod_role;
USE SCHEMA prod_db.prod_schema;

CREATE TAG live_version;
Copy

备注

在这里,标签是在生产架构中创建的,因为它由生产角色管理。在其他架构中使用时,请使用其完全限定名称。

提升模型的初始版本

要使模型在生产环境中可用,请将 live_version 标签应用于模型,并将初始生产版本指定为标签的值。

USE ROLE prod_role;
USE SCHEMA prod_db.prod_schema;

ALTER MODEL model_database.model_schema.my_model
    SET TAG live_version = 'V1';
Copy

提升模型的后续版本

当模型的新版本准备好使用时,请用该版本的名称更新 live_version 标签。

USE ROLE prod_role;

ALTER MODEL model_database.model_schema.my_model
    SET TAG prod_db.prod_schema.live_version = 'V2';
Copy

在生产环境中使用模型

要调用模型的生产版本,请使用 SYSTEM$GET_TAG 从模型中检索 live_version 标签的值,然后调用具有该名称的模型版本。下面的 SQL 展示了这个两步过程。

备注

模型的 SQL 域(供与 SYSTEM$GET_TAG 搭配使用)是 MODULE。

-- get production model version from live_version tag
SET live_version = (SELECT
    SYSTEM$GET_TAG('prod_db.prod_schema.live_version', 'my_model', 'MODULE'));

-- call that version
WITH my_version AS MODEL my_model VERSION IDENTIFIER($live_version)
    SELECT my_version!predict(...) ... ;
Copy

开发和测试

对于预发布版本,可以使用相同的方法但添加额外的标签(例如 alpha_versionbeta_version)。然而,在许多组织中,只有提升到生产状态是由工程管理的,而使用更简单的 别名 方法来管理发布前阶段是合理的。

使用多个架构

您可以使用多个架构来管理生命周期阶段。通过这种方法,代码仅在指定的生产架构中调用模型,该架构仅包含在生产中使用的模型。其他阶段的模型存储在其他地方。当模型版本准备好投入生产时,它会被复制到生产架构。由于生产模型是具有自己访问控制的独立对象,因此您可以保护它们免受意外修改,同时模型开发人员可以自由地处理处于开发阶段的模型。

在以下情况下使用此方法:

  • 一个非模型所有者的角色将模型提升到生产状态。

  • 您希望开发环境和生产环境之间有严格的隔离。

请注意,将模型提升到生产状态的角色应该拥有源模型的 OWNERSHIP 或 READ 权限。

初始设置

创建一个可以访问开发和生产架构的角色(例如,ml_admin)。在此示例中,对这两个环境的访问封装在名为 model_ownerprod_role 的现有角色中,这些角色分别包含对开发和生产架构的诸如 USAGE 和 CREATE MODEL 的权限。通过为新的 ml_admin 角色授予这些角色,使该角色获得所需的权限。

USE ROLE ACCOUNTADMIN;
CREATE ROLE ml_admin;

USE ROLE model_owner;
GRANT ROLE model_owner TO ROLE ml_admin;

USE ROLE prod_role;
GRANT ROLE prod_role TO ROLE ml_admin;
Copy

提升模型的初始版本

使用 ml_admin 角色将模型版本从开发架构复制到生产架构,并通过使用 CREATE MODEL ...FROM MODEL 复制所需版本来执行初始复制。可以将相同的标识符用于生产版本,也可以为生产版本建立不同的编号方案。在这里,开发版本 V12 变成了生产版本 V1

USE ROLE ml_admin;

CREATE MODEL prod_db.prod_schema.prod_model WITH VERSION V1
    FROM MODEL dev_db.dev_sch.dev_model VERSION V12;
Copy

创建模型的初始生产版本后,根据需要向生产角色授予 USAGE 或 OWNERSHIP。

USE ROLE ml_admin;

GRANT USAGE ON MODEL my_model TO ROLE prod_role;
Copy

提升模型的后续版本

当新版本的模型准备好投入生产时,只需将新模型版本复制到生产环境中即可。在这里,开发版本 V24 变成了生产版本 V2。然后将 V2 设置为默认版本。

USE ROLE ml_admin;

ALTER MODEL prod_db.prod_schema.prod_model ADD VERSION V2
    FROM MODEL dev_db.dev_schema.dev_model VERSION V24;

ALTER MODEL prod_db.prod_schema.prod_model
    SET DEFAULT_VERSION = V2;
Copy

小技巧

保留以前的生产版本是个好主意,以防出现需要回滚的情况,届时可以通过将默认版本设置为以前的版本来实现,如下所示。

ALTER MODEL prod_db.prod_schema.prod_model SET DEFAULT_VERSION = V1;
Copy

制定一个关于保留多少旧版本以及保留多长时间的策略。

在生产环境中使用模型

在生产环境中,调用模型的默认版本。

SELECT prod_model!predict(...) ... ;
Copy

开发和测试

要管理预发布版本,可以使用额外的架构,通过将版本从一个阶段复制到下一个阶段来提升版本。如果模型的所有者可以管理预生产阶段,则可以使用更简单的方法(例如 别名)来管理这些版本。当预发布阶段中的一个或多个阶段由其他角色管理时,使用额外的架构对于隔离多个预生产环境(例如开发和测试)可能仍然有用。