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;
情報スキーマクエリ¶
他のSnowflake オブジェクトと同様に、モデルは Snowflake Information Schema のビューで表現されます。モデルとそのバージョンのビューは、 INFORMATION_SCHEMA.MODEL_VERSIONS です。モデルのバージョン情報は、モデルの情報のスーパーセットであるため、分離された MODEL ビューはありません。
このビューを通じて、レジストリ自体にクエリすることができます。例えば、次のような SQL を使って、各モデルのバージョンに精度の指標を追加して管理するとします。
ALTER MODEL my_model MODIFY VERSION v1
SET METADATA = '{"metric": {"accuracy": 0.769}}';
注釈
また、 レジストリのPython API を使って、メトリクスを設定する こともできます。
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は、開発からプロダクションまでのモデルのライフサイクルを管理するための、シンプルかつ強力な4つのスキームを提供します。お好きなガバナンス構造に応じて、最適なものをお選びください。
デフォルトバージョンの使用¶
モデルにはバージョンがあり、1つのバージョンがデフォルトバージョンとして指定されています。慣習として、モデルのデフォルトバージョンを製品版として扱うことができます。プロダクションコードはモデルのデフォルトバージョンだけを呼び出します。
このシナリオでは、モデルのスコアリングやパフォーマンス評価のワークフロー要件を満たした後に、モデルのバージョンをデフォルトとして設定するだけで、プロダクションに昇格させることができます。これは、プロダクションで使用するモデルのバージョンをコントロールする最も簡単な方法です。
このメソッドは次のような場合に使用します。
どのバージョンをプロダクションに使用するかは、モデルの所有者に決定権があります。
開発/プロダクション以外のライフサイクル・ステージを追跡する必要はありません。
初期設定¶
モデルの所有者は、プロダクションロールにモデルの利用を許可します。
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(...) ...;
エイリアスの使用¶
多くの組織は、開発、キャナリー、ステージング、プロダクション、非推奨といった複数のステージを使用してモデルのライフサイクルを管理しています。モデルのバージョンは、 aliases を持つことができます。これは、ユーザー定義のラベルやタグで、モデルのどのバージョンにも排他的に付けることができます。エイリアスを使用して、組織が使用するライフサイクル・ステージを表すことができます。
このメソッドは次のような場合に使用します。
モデル所有者は、モデルのライフサイクル・ステージを決定する権限を持ちます。
開発/プロダクションだけでなく、複数のライフサイクル・ステージを追跡したいとします。
以下の例では、2つのプリプロダクション・ステージ(alpha
と beta
)と1つのプロダクション・ステージ(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;
その後、nevバージョンを 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
エイリアスを通してモデルを呼び出します。例えば、アルファ版をテストします。
WITH my_version AS MODEL my_model VERSION alpha
SELECT my_version!predict(...) ...;
複数のスキーマの使用¶
ライフサイクル・ステージを管理するために、複数のスキーマを使用することができます。このアプローチでは、コードはプロダクションで使用されるモデルのみを保持する、指定された本番スキーマ内のモデルのみを呼び出します。他のステージのモデルは別の場所に保管されます。モデルのバージョンがプロダクション稼動できるようになると、プロダクションスキーマにコピーされます。プロダクション モデルは独自のアクセス制御を持つ独立したオブジェクトであるため、モデル開発者が開発ステージのモデルを自由に扱える一方で、不慮の変更からモデルを保護することができます。
このメソッドは次のような場合に使用します。
モデルの所有者以外のロールは、モデルをプロダクションに昇格させます。
開発環境とプロダクション環境をしっかりと分離したい場合があります。
初期設定¶
開発スキーマと本番スキーマの両方にアクセスできるロール(例えば、 ml_admin
)を作成します。この例では、これら2つの環境へのアクセスは、 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;
Tip
ロールバックが必要になったときのために、以前の本番用バージョンを残しておくとよいでしょうう。これは、以下のようにデフォルト・バージョンを以前のバージョンに設定することで可能になります。
ALTER MODEL prod_db.prod_schema.prod_model SET DEFAULT_VERSION = V1;
どれくらいの古いバージョンをどれくらいの期間保存するか、ポリシーを確立します。
プロダクション現場でのモデルの使用¶
本番では、モデルのデフォルトバージョンを呼び出します。
SELECT prod_model!predict(...) ... ;
ローカル開発とテスト¶
プレリリースのバージョンを管理するには、スキーマを追加し、あるスキーマから次のスキーマにコピーすることで、あるステージから次のステージにバージョンを昇格させることができます。もしモデルのオーナーがプリ プロダクションのステージを変更できるのであれば、 aliases のような、よりシンプルな方法でこれらのバージョンを管理することができます。追加スキーマを使用することは、開発およびテストのような複数のプリプロダクション環境を分離するために、これらのステージの1つ以上が別のロールによって管理されている場合にも有用です。