Snowflake Model Registryによるモデルの管理

Snowflake Model Registryは、機械学習モデルを開発からプロダクションに導入するプロセスを簡素化します。よく整理されたモデル・レジストリは、すべてのモデル、そのメトリクス、およびそのメタデータの中心的なハブであり、単一のソースとして機能します。レジストリにモデルを記録することは、Snowflake ML Opsのジャーニーにおける最初の、そして最も重要なステップであり、機械学習オペレーションをSnowflakeのコントロール、セキュリティ、ガバナンスの下に置くことになります。

Snowflake Model Registryは、 ML モデル管理の幅広いユースケースとシナリオに対応できる柔軟性を備えています。このトピックでは、開発からプロダクションまでモデルをシームレスに管理するためにレジストリを使用する最善の方法について、以下のようなガイダンスを提供します。

  • 適切なユーザーグループまたはロールがさまざまな操作を実行できるように、モデルへのアクセスを制御する方法。

  • すべてのモデルのメトリクスやその他のメタデータをクエリする方法。

  • 開発からプロダクションまでのモデルのライフサイクルを管理する方法。

  • プロダクションコードに変更を加えることなく、モデルの新バージョンをロールアウトする方法。

ガバナンス

機械学習モデル は Snowflake のファーストクラスオブジェクトであるため、ロールベースのアクセス制御や情報スキーマなど、標準的な Snowflake ガバナンス機能をすべて使用することができます。

ロールベースのアクセス制御

モデル・オブジェクトには、 OWNERSHIP と USAGE の2つの権限があります。

権限

説明

OWNERSHIP

モデルのバージョン管理、成果物へのアクセス、モデルのメタデータの更新などを含む、モデルの完全なコントロール。モデルを所有できるのは1つのロールだけですが、 そのロールの付与 を複数のユーザーや他のロールに対して行うことができます。

USAGE

モデルへの読み取り専用アクセスで、推論(予測)や SHOW MODELS 、 SHOW VERSIONS IN MODEL コマンドの使用が可能です。USAGE のみを持つロールは、モデルコード、ウェイト、その他の成果物にアクセスできません。

モデルのオーナーは、以下のように任意のロールにアクセス権を付与することができます。

GRANT USAGE 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は、開発からプロダクションまでのモデルのライフサイクルを管理するための、シンプルかつ強力な4つのスキームを提供します。お好きなガバナンス構造に応じて、最適なものをお選びください。

デフォルトバージョンの使用

モデルにはバージョンがあり、1つのバージョンがデフォルトバージョンとして指定されています。慣習として、モデルのデフォルトバージョンを製品版として扱うことができます。プロダクションコードはモデルのデフォルトバージョンだけを呼び出します。

このシナリオでは、モデルのスコアリングやパフォーマンス評価のワークフロー要件を満たした後に、モデルのバージョンをデフォルトとして設定するだけで、プロダクションに昇格させることができます。これは、プロダクションで使用するモデルのバージョンをコントロールする最も簡単な方法です。

このメソッドは次のような場合に使用します。

  • どのバージョンをプロダクションに使用するかは、モデルの所有者に決定権があります。

  • 開発/プロダクション以外のライフサイクル・ステージを追跡する必要はありません。

初期設定

モデルの所有者は、プロダクションロールにモデルの利用を許可します。

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

エイリアスの使用

多くの組織は、開発、キャナリー、ステージング、プロダクション、非推奨といった複数のステージを使用してモデルのライフサイクルを管理しています。モデルのバージョンは、 aliases を持つことができます。これは、ユーザー定義のラベルやタグで、モデルのどのバージョンにも排他的に付けることができます。エイリアスを使用して、組織が使用するライフサイクル・ステージを表すことができます。

このメソッドは次のような場合に使用します。

  • モデル所有者は、モデルのライフサイクル・ステージを決定する権限を持ちます。

  • 開発/プロダクションだけでなく、複数のライフサイクル・ステージを追跡したいとします。

以下の例では、2つのプリプロダクション・ステージ(alphabeta)と1つのプロダクション・ステージ(production)を使用しています。

初期設定

モデルの所有者は、プロダクションロールにモデルの利用を許可します。

GRANT USAGE ON MODEL my_model TO ROLE prod_role;
Copy

モデルの初期バージョンの昇格

モデルをログに記録する際には、 production のエイリアスを設定し、最初のバージョン(ここでは v1 という名前)を指すようにします。

ALTER MODEL my_model VERSION v1 SET ALIAS = production;
Copy

プリプロダクション・バージョンの管理

当初、このモデルには指定された alpha 、あるいは beta バージョンがありません。新しいバージョンを追加する場合、最初は alpha を指定します。

ALTER MODEL my_model VERSION v2 SET ALIAS = alpha;
Copy

その後、nevバージョンを 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

ローカル開発とテスト

プレリリースバージョンを使用するには、代わりに alpha または beta エイリアスを通してモデルを呼び出します。例えば、アルファ版をテストします。

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

プロダクションのロールには、モデルのタグを確認し、タグの値を読み取る機能も必要です。ここで前者は、広範な APPLY TAG ON ACCOUNT の権限をそのロールに与えることで達成される。後者はスキーマに USAGE を付与することで達成されます。

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

タグを作成するには、ロールには CREATE TAG ON 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 は、この2段階のプロセスを示しています。

注釈

SYSTEM$GET_TAG で使用するモデルの SQL ドメインは 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 など)を使って同じ方法を使うことができます。しかし、多くの組織では、エンジニアリングが管理するのはプロダクションへの昇格だけであり、より単純な エイリアス 方式でプレリリースステージを管理するのが合理的です。

複数のスキーマの使用

ライフサイクル・ステージを管理するために、複数のスキーマを使用することができます。このアプローチでは、コードはプロダクションで使用されるモデルのみを保持する、指定された本番スキーマ内のモデルのみを呼び出します。他のステージのモデルは別の場所に保管されます。モデルのバージョンがプロダクション稼動できるようになると、プロダクションスキーマにコピーされます。プロダクション モデルは独自のアクセス制御を持つ独立したオブジェクトであるため、モデル開発者が開発ステージのモデルを自由に扱える一方で、不慮の変更からモデルを保護することができます。

このメソッドは次のような場合に使用します。

  • モデルの所有者以外のロールは、モデルをプロダクションに昇格させます。

  • 開発環境とプロダクション環境をしっかりと分離したい場合があります。

初期設定

開発スキーマと本番スキーマの両方にアクセスできるロール(例えば、 ml_admin)を作成します。この例では、これら2つの環境へのアクセスは、 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 を付与し、本番用でこのモデルを使用するロールに必要な権限を付与します。

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

Tip

ロールバックが必要になったときのために、以前の本番用バージョンを残しておくとよいでしょうう。これは、以下のようにデフォルト・バージョンを以前のバージョンに設定することで可能になります。

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

どれくらいの古いバージョンをどれくらいの期間保存するか、ポリシーを確立します。

プロダクション現場でのモデルの使用

本番では、モデルのデフォルトバージョンを呼び出します。

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

ローカル開発とテスト

プレリリースのバージョンを管理するには、スキーマを追加し、あるスキーマから次のスキーマにコピーすることで、あるステージから次のステージにバージョンを昇格させることができます。もしモデルのオーナーがプリ プロダクションのステージを変更できるのであれば、 aliases のような、よりシンプルな方法でこれらのバージョンを管理することができます。追加スキーマを使用することは、開発およびテストのような複数のプリプロダクション環境を分離するために、これらのステージの1つ以上が別のロールによって管理されている場合にも有用です。