トレーニング済みモデルをアプリに組み込みます¶
このトピックでは、以前にトレーニングしたモードを Snowflake Native App 内に含める方法について説明します。
ワークフロー - モデルをアプリに追加¶
以下のプロシージャは、プロバイダーが Snowflake ML モデルを作成し、アプリに追加する典型的なワークフローの概要を示しています。
プロバイダーは、Snowflake ML モデルを開発し、 Snowflake Model Registry にログします。
プロバイダーはSnowflake Model Registryからモデルアーティファクトをエクスポートし、ステージングにアップロードして、アプリケーションパッケージからアクセスできるようにします。
プロバイダーは、アプリのセットアップスクリプトでモデルを作成します。
アプリは、インストール中またはアップグレード後に、コンシューマーアカウント内のこれらの成果物からモデルを作成します。オプションで、アプリはアプリケーションロールにモデルへのアクセスを付与することができます。
プロバイダーが機械学習モデルへのアクセスを許可するようにアプリを構成した場合、コンシューマーは機械学習モデルを使用します。
注釈
プロバイダーは、コンシューマーにモデル上のアクセスを許可する必要はありません。モデルは、アプリが内部的に使用するオブジェクトとして作成できますが、コンシューマーからはアクセスできません。
機械学習モデルの開発¶
プロバイダーは新しい機械学習モデルを開発したり、既存のモデルをアプリに組み込むことができます。
モデル開発の情報については、 Snowflake ML Model Development をご参照ください。
Snowflake Model Registry でのモデルの管理については、 Snowflakeモデルレジストリ をご参照ください。
モデルの成果物をエクスポートし、ステージングにアップロードします。¶
モデルをアプリに含めるには、プロバイダーはモデルの成果物をエクスポートし、アプリケーションパッケージにアクセスできるステージングにアップロードする必要があります。
モデルの成果物を手動でエクスポートし、ステージングにアップロードします。¶
モデルの成果物をダウンロードします。 Snowflakeモデルレジストリ をご参照ください。
以下のいずれかの方法を使用して、アプリのリソースがあるステージングに機械学習の成果物をアップロードします。
Snowsightを使用してファイルをアップロードするには、 Snowsightを使用したファイルのステージング をご参照ください。
Snowflake CLI を使用してファイルをアップロードするには、
snow app deploy
コマンドを使用します。 アプリケーションパッケージとアプリケーションオブジェクトを一緒に作成する方法 をご参照ください。SQL を使ってファイルをアップロードするには、 ローカルファイルシステムからのデータファイルのステージング をご参照ください。
ストアドプロシージャを使ってモデルの成果物をエクスポートし、ステージにアップロードします。¶
プロバイダーは、モデル成果物をダウンロードしてステージにアップロードするプロセスを自動化するためのテンプレートとして、以下のストアドプロシージャの例を使用することができます。
CREATE OR REPLACE PROCEDURE copy_model_artifacts_to_stage(src_registry_schema_fqn string, src_model string, src_model_version string, dst string)
RETURNS STRING
LANGUAGE python
runtime_version = 3.11
handler = 'copy_model_artifacts_to_stage'
packages = ('snowflake-snowpark-python')
execute as caller
as
$$
def copy_model_artifacts_to_stage(session, src_registry_schema_fqn, src_model, src_model_version, dst):
session.use_schema(src_registry_schema_fqn)
list_files = session.sql(f"list 'snow://model/{src_model}/versions/{src_model_version}/'")
list_files.collect()
for row in list_files.toLocalIterator():
parts = row["name"].rsplit('/', 1)
directory = parts[0]
filename = parts[1]
session.file.get(f"snow://model/{src_model}/{directory}/{filename}", f"/tmp/{directory}")
session.file.put(f"/tmp/{directory}/{filename}", f"{dst}/{src_model}/{directory}", auto_compress=False, overwrite=True, source_compression="NONE")
return f"Copied [snow://model/{src_model}/versions/{src_model_version}/*] to [{dst}/{src_model}/{directory}/]"
$$;
CALL copy_model_artifacts_to_stage('my_db.my_model_registry, 'my_model', 'V1', '@my_app_pkg.source_schema.source_stage/models');
コンシューマーアカウントにモデルオブジェクトを作成します。¶
コンシューマーアカウントにモデルオブジェクトを作成するために、プロバイダーは次の例に示すように、セットアップスクリプトに必要な SQL コマンドを追加します。
CREATE APPLICATION ROLE IF NOT EXISTS app_user;
CREATE OR ALTER VERSIONED SCHEMA app_code;
GRANT USAGE ON SCHEMA app_code TO APPLICATION ROLE app_user;
CREATE OR REPLACE MODEL app_code.my_model FROM '/models/my_model/versions/V1;
オプションとして、プロバイダーはアプリケーションロールにモデル上の USAGE 権限を付与することで、コンシューマーにモデルへのアクセス権限を付与することができます。
GRANT USAGE ON MODEL app_code.my_model TO APPLICATION ROLE app_user;
アプリ内のモデルへのアクセス¶
アプリの一部として内部的にモデルを使用するには、プロバイダーは、次の例に示すように、セットアップスクリプトに SELECT ステートメントを追加します。
SELECT app_code.my_model!predict(...);
モデルをコンシューマーとして使用¶
プロバイダーがコンシューマーにモデルへのアクセス権限を与えた場合、コンシューマーは以下のコマンドを実行してモデルにアクセスすることができます。
SELECT app_code.my_model!predict(...);
このコマンドを実行するには、コンシューマーは以下のいずれかのロールを使用する必要があります。
モデルに付与された USAGE 権限。
アプリケーションオブジェクトの OWNERSHIP 権限。