Snowflake ML モデルの作成、学習、アプリでの使用¶
このトピックでは、 scikit-learn
Python パッケージを使用して、 Snowflake Native App 内で Snowflake ML モデルをトレーニングする方法の例を示します。このトピックの例は、コンシューマーまたはプロバイダーアカウントのデータでモデルをトレーニングするために使用できます。
ストアドプロシージャを保持するバージョンスキーマを作成します。¶
次の例に示すように、セットアップ・スクリプト内で、ストアドプロシージャを含むバージョンスキーマを作成します。
ストアドプロシージャのバージョンスキーマを作成します。
CREATE OR ALTER VERSIONED SCHEMA core; GRANT USAGE ON SCHEMA core TO APPLICATION ROLE app_public;
モデルを作成し、訓練するためのストアドプロシージャを作成します。¶
次の例に示すように、モデルの学習に使用する Python 関数のストアドプロシージャを作成します。
CREATE OR REPLACE PROCEDURE core.py_log_model(db STRING, schema STRING, mname STRING, mvname STRING) RETURNS STRING LANGUAGE python RUNTIME_VERSION = 3.11 HANDLER = 'log_model' PACKAGES = ('snowflake-snowpark-python','scikit-learn', 'snowflake-ml-python >=1.6.2', 'pandas', 'numpy') AS ' -- <body of the stored procedure> ';この例では、
py_log_model
というストアドプロシージャを作成し、scikit-learn
を使用してモデルを学習するために必要な Python パッケージを宣言します。
snowflake-snowpark-python
scikit-learn
snowflake-ml-python
pandas
numpy
xgboost
ストアドプロシージャを作成したら、ストアドプロシージャの本文に以下のコードを追加します。
ストアドプロシージャの本文にPythonコードを追加します。
import _snowflake from snowflake.ml.registry import Registry import pandas as pd import numpy as np from sklearn import datasets from snowflake.ml.modeling.xgboost import XGBClassifier def log_model(sp_session, mname, mvname): reg = Registry(session=sp_session, schema_name=''stateful_schema'') iris = datasets.load_iris() df = pd.DataFrame(data=np.c_[iris["data"], iris["target"]], columns=iris["feature_names"] + ["target"]) df.columns = [s.replace(" (CM)", "").replace(" ", "") for s in df.columns.str.upper()] input_cols = ["SEPALLENGTH", "SEPALWIDTH", "PETALLENGTH", "PETALWIDTH"] label_cols = "TARGET" output_cols = "PREDICTED_TARGET" clf_xgb = XGBClassifier( input_cols=input_cols, output_cols=output_cols, label_cols=label_cols, drop_input_cols=True ) clf_xgb.fit(df) model_ref = reg.log_model( clf_xgb, model_name=f"{mname}", version_name=f"{mvname}", options={"enable_explainability": False}, ) return "success"
log_model
関数のパフォーマンスは以下の通りです。
pandas
とnumpy
を使って、モデルの学習データとなる DataFrame を作成します。データの学習アルゴリズムとして使用する XGBoost のインスタンスを作成します。
XGBoost の
fit()
関数を呼び出してモデルを作成し、データセットで学習させます。Snowflake Model Registry の
log_model()
関数を呼び出し、モデルをモデルレジストリに追加します。注釈
アプリによって作成された Modeling は、モデルレジストリに保存する必要があります。ステージングされたモデルにはアクセスできません。
オプション: コンシューマーがストアドプロシージャを実行してモデルを学習できるようにするには、ストアドプロシージャに USAGE 権限を付与します。
GRANT USAGE ON PROCEDURE core.py_log_model(STRING, STRING) TO APPLICATION ROLE app_public;
モデルを実行するストアドプロシージャの作成¶
モデルを呼び出すために使用する Python 関数のストアドプロシージャを作成します。
CREATE OR REPLACE PROCEDURE core.py_call_predict(mname STRING, mvname STRING)
RETURNS TABLE()
LANGUAGE python
RUNTIME_VERSION = 3.11
HANDLER = 'run_model'
PACKAGES = ('snowflake-snowpark-python','scikit-learn', 'snowflake-ml-python>=1.6.2', 'pandas', 'xgboost')
AS
'
-- <body of the stored procedure>
';
モデルを呼び出すために使用するPythonコードを追加します。
import _snowflake from snowflake.ml.registry import Registry import pandas as pd from sklearn import datasets def run_model(sp_session, mname, mvname): iris = datasets.load_iris() df = pd.DataFrame(data=iris["data"], columns=iris["feature_names"]) df.columns = [s.replace(" (CM)", "").replace(" ", "") for s in df.columns.str.upper()] reg = Registry(session=sp_session, schema_name="stateful_schema") mv = reg.get_model(mname).version(mvname) pred = mv.run(df.head(10), function_name="predict") return sp_session.create_dataframe(pred)
run_model
関数は次のような働きをします。
load_iris()
関数を実行し、 アイリス機械学習データセット を読み込みます。
pandas
を使用して、アイリスデータセットに基づいて DataFrame を作成します。
get_model()
関数を実行してモデルのレジストリを取得します。モデルに対してpredict関数を実行します。
結果を返します。
オプション: コンシューマーがストアドプロシージャを実行してモデルを学習できるようにするには、ストアドプロシージャに USAGE 権限を付与します。
GRANT USAGE ON PROCEDURE core.py_call_predict(STRING, STRING) TO APPLICATION ROLE app_public;
ストアドプロシージャの実行¶
アプリケーションがこれらのストアドプロシージャの USAGE 権限をアプリケーションロールに付与した場合、コンシューマーは以下の例に示すように、ストアドプロシージャを呼び出してモデルの学習と実行を行うことができます。
CALL my_app.core.py_log_model('md1', 'V1');
このコマンドは、 py_log_model
ストアドプロシージャを呼び出してモデルを訓練します。
CALL my_app.core.py_call_predict('md1', 'V1');
このコマンドは、 py_call_predict
ストアドプロシージャを呼び出し、モデルのpredict関数を呼び出します。