使用 Snowflake Model Registry 管理模型¶
Snowflake Model Registry 简化了将机器学习模型从开发环境转入生产环境的过程。一个组织良好的模型注册表用作所有模型及其指标和元数据的中央枢纽和单一来源。在注册表中登记您的模型是 Snowflake ML Ops 旅程中第一步,也是最重要的一步,这将使您的机器学习在 Snowflake 知道的控制、安全性和治理下运作。
Snowflake Model Registry 足够灵活,可以满足广泛的 ML 模型管理用例和场景。本主题提供的指导说明了如何充分利用注册表以在从开发到生产的过程中无缝管理模型,其中包括:
如何控制对模型的访问权限,以便正确的用户或角色组可以执行各种操作。
如何查询所有模型的指标和其他元数据。
如何管理模型从开发到生产的生命周期。
如何在不更改生产代码的情况下推出模型的新版本。
治理¶
因为 机器学习模型 是 Snowflake 中的一级对象,您可以将所有标准的 Snowflake 治理功能用于它们,包括基于角色的访问控制和信息架构。
基于角色的访问控制¶
模型对象有两个权限:OWNERSHIP 和 USAGE。
权限 |
描述 |
---|---|
OWNERSHIP |
模型的全面控制,包括管理模型版本、访问工件和更新模型元数据。只有一个角色可以拥有该模型,但您可以 授予角色 给多个用户或其他角色。 |
USAGE |
对模型的只读访问权限,允许推理(预测)和使用 SHOW MODELS 和 SHOW VERSIONS IN MODEL 命令。只有 USAGE 的角色无法访问模型代码、权重或其他工件。 |
模型的所有者可以按如下方式为任何角色授予访问权限:
GRANT USAGE ON MODEL my_model TO ROLE prod_role;
信息架构查询¶
与所有 Snowflake 对象一样,模型在 Snowflake Information Schema 中以视图的形式表示。模型及其版本的视图是 INFORMATION_SCHEMA.MODEL_VERSIONS。模型版本信息是模型信息的超集,因此没有单独的 MODEL 视图。
通过这个视图,您可以查询注册表本身。例如,假设您维护一个准确性指标,使用 SQL 将其添加到每个模型版本中,如下所示。
ALTER MODEL my_model MODIFY VERSION v1
SET METADATA = '{"metric": {"accuracy": 0.769}}';
备注
mv = reg.get_model("my_model").version("v1").set_metric("accuracy", 0.769)
将此指标添加到所有版本的模型后,可以使用类似于此处的查询来检索有关所有模型对象的信息,并按从高到低的准确性顺序列出它们。
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;
可以创建更复杂的查询,这些查询可以联接到其他信息架构视图或其他表,以进行更详细的分析。
模型生命周期管理¶
为了满足大中小企业的多样化需求,Snowflake Model Registry 提供了四种简单而强大的架构,用于管理模型从开发到生产的生命周期。根据您偏好的治理结构,选择最适合您的选项。
使用默认版本¶
模型是有版本控制的,并且其中一个版本被指定为默认版本。您可以根据惯例将模型的默认版本视为生产版本;生产代码仅调用模型的默认版本。
在这种情况下,您可以通过将模型版本设置为默认版本来将其提升到生产状态,也许是在它满足您的模型评分或性能评估工作流程要求之后。这是控制在生产中使用哪个模型版本的最简单方法。
在以下情况下使用此方法:
模型的所有者有权决定在生产中使用哪个版本。
您不需要跟踪除开发/生产之外的任何生命周期阶段。
初始设置¶
模型所有者授予生产角色对模型的使用权。
GRANT USAGE ON MODEL my_model TO ROLE prod_role;
最初登记模型时,它的唯一版本是默认版本,并且该版本已准备好使用。
重要
模型必须始终具有默认版本。那么在此架构下,不能将模型指定为尚未拥有生产版本。如果需要防止模型在准备好之前投入使用,可以登记会立即抛出错误的初始版本。此版本将保持为默认版本,直到其他版本准备好使用。
将模型提升到生产状态¶
当下面的 SQL 中名为 new_version
的新版本通过质量标准时,将其指定为默认版本,以将它标记为生产版本。
ALTER MODEL my_model SET DEFAULT_VERSION = new_version;
在生产环境中使用模型¶
在生产环境中,直接调用模型以使用默认版本。
SELECT my_model!predict(...) ... ;
开发和测试¶
要使用预发布版本,请按名称调用所需的模型版本:
WITH my_version AS MODEL my_model VERSION new_version
SELECT my_version!predict(...) ...;
使用别名¶
许多组织使用多个阶段来管理模型生命周期,例如开发、金丝雀、预发布、生产和弃用。模型版本可以有 别名、用户定义的标签或标签,可以专门将其附加到模型的任何版本上。可以使用别名来表示贵组织使用的生命周期阶段。
在以下情况下使用此方法:
模型所有者有权做出模型生命周期阶段的决策。
您想跟踪多个生命周期阶段,而不仅仅是开发/生产。
下面的示例使用了两个预生产阶段(alpha
和 beta
)和一个生产阶段 (production
)。
初始设置¶
模型所有者授予生产角色对模型的使用权。
GRANT USAGE ON MODEL my_model TO ROLE prod_role;
提升模型的初始版本¶
登记模型时,将 production
别名设置为指向第一个版本,这里命名为 v1
。
ALTER MODEL my_model VERSION v1 SET ALIAS = production;
管理预生产版本¶
最初,模型没有指定的 alpha
或 beta
版本。添加新版本时,最初将其指定为 alpha
。
ALTER MODEL my_model VERSION v2 SET ALIAS = alpha;
稍后,将新版本提升为 beta
:
ALTER MODEL my_model VERSION v2 UNSET ALIAS;
ALTER MODEL my_model VERSION v2 SET ALIAS = beta;
提升模型的后续版本¶
当一个新版本的模型通过审核后,从当前生产版本(在这里为 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;
在生产环境中使用模型¶
通过 production
别名调用模型的生产版本。
WITH my_version AS MODEL my_model VERSION production
SELECT my_version!predict(...) ...;
开发和测试¶
要使用预发布版本,请通过 alpha
或 beta
别名调用模型。例如,要测试 Alpha 版本:
WITH my_version AS MODEL my_model VERSION alpha
SELECT my_version!predict(...) ...;
使用多个架构¶
您可以使用多个架构来管理生命周期阶段。通过这种方法,代码仅在指定的生产架构中调用模型,该架构仅包含在生产中使用的模型。其他阶段的模型存储在其他地方。当模型版本准备好投入生产时,它会被复制到生产架构。由于生产模型是具有自己访问控制的独立对象,因此您可以保护它们免受意外修改,同时模型开发人员可以自由地处理处于开发阶段的模型。
在以下情况下使用此方法:
一个非模型所有者的角色将模型提升到生产状态。
您希望开发环境和生产环境之间有严格的隔离。
初始设置¶
创建一个可以访问开发和生产架构的角色(例如,ml_admin
)。在此示例中,对这两个环境的访问封装在名为 model_owner
和 prod_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;
提升模型的初始版本¶
使用 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;
在创建模型的初始生产版本后,为将在生产环境中使用它的角色授予 USAGE 和任何其他必要的权限。
USE ROLE ml_admin;
GRANT USAGE ON MODEL my_model TO ROLE prod_role;
提升模型的后续版本¶
当新版本的模型准备好投入生产时,只需将新模型版本复制到生产环境中即可。在这里,开发版本 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;
小技巧
保留以前的生产版本是个好主意,以防出现需要回滚的情况,届时可以通过将默认版本设置为以前的版本来实现,如下所示。
ALTER MODEL prod_db.prod_schema.prod_model SET DEFAULT_VERSION = V1;
制定一个关于保留多少旧版本以及保留多长时间的策略。
在生产环境中使用模型¶
在生产环境中,调用模型的默认版本。
SELECT prod_model!predict(...) ... ;
开发和测试¶
要管理预发布版本,可以使用额外的架构,通过将版本从一个阶段复制到下一个阶段来提升版本。如果模型的所有者可以管理预生产阶段,则可以使用更简单的方法(例如 别名)来管理这些版本。当预发布阶段中的一个或多个阶段由其他角色管理时,使用额外的架构对于隔离多个预生产环境(例如开发和测试)可能仍然有用。