Snowflake ML モデルの作成、学習、アプリでの使用

このトピックでは、 scikit-learn Python パッケージを使用して、 Snowflake Native App 内で Snowflake ML モデルをトレーニングする方法の例を示します。このトピックの例は、コンシューマーまたはプロバイダーアカウントのデータでモデルをトレーニングするために使用できます。

ストアドプロシージャを保持するバージョンスキーマを作成します。

次の例に示すように、セットアップ・スクリプト内で、ストアドプロシージャを含むバージョンスキーマを作成します。

  1. ストアドプロシージャのバージョンスキーマを作成します。

    CREATE OR ALTER VERSIONED SCHEMA core;
    GRANT USAGE ON SCHEMA core TO APPLICATION ROLE app_public;
    
    Copy

モデルを作成し、訓練するためのストアドプロシージャを作成します。

  1. 次の例に示すように、モデルの学習に使用する 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>
';
Copy

この例では、 py_log_model というストアドプロシージャを作成し、 scikit-learn を使用してモデルを学習するために必要な Python パッケージを宣言します。

  • snowflake-snowpark-python

  • scikit-learn

  • snowflake-ml-python

  • pandas

  • numpy

  • xgboost

ストアドプロシージャを作成したら、ストアドプロシージャの本文に以下のコードを追加します。

  1. ストアドプロシージャの本文に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"
Copy

log_model 関数のパフォーマンスは以下の通りです。

  • pandasnumpy を使って、モデルの学習データとなる DataFrame を作成します。

  • データの学習アルゴリズムとして使用する XGBoost のインスタンスを作成します。

  • XGBoost の fit() 関数を呼び出してモデルを作成し、データセットで学習させます。

  • Snowflake Model Registry の log_model() 関数を呼び出し、モデルをモデルレジストリに追加します。

注釈

アプリによって作成された Modeling は、モデルレジストリに保存する必要があります。ステージングされたモデルにはアクセスできません。

  1. オプション: コンシューマーがストアドプロシージャを実行してモデルを学習できるようにするには、ストアドプロシージャに USAGE 権限を付与します。

    GRANT USAGE ON PROCEDURE core.py_log_model(STRING, STRING) TO APPLICATION ROLE app_public;
    
    Copy

モデルを実行するストアドプロシージャの作成

  1. モデルを呼び出すために使用する 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>
';
Copy
  1. モデルを呼び出すために使用する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)
Copy

run_model 関数は次のような働きをします。

  • load_iris() 関数を実行し、 アイリス機械学習データセット を読み込みます。

  • pandas を使用して、アイリスデータセットに基づいて DataFrame を作成します。

  • get_model() 関数を実行してモデルのレジストリを取得します。

  • モデルに対してpredict関数を実行します。

  • 結果を返します。

  1. オプション: コンシューマーがストアドプロシージャを実行してモデルを学習できるようにするには、ストアドプロシージャに USAGE 権限を付与します。

    GRANT USAGE ON PROCEDURE core.py_call_predict(STRING, STRING) TO APPLICATION ROLE app_public;
    
    Copy

ストアドプロシージャの実行

アプリケーションがこれらのストアドプロシージャの USAGE 権限をアプリケーションロールに付与した場合、コンシューマーは以下の例に示すように、ストアドプロシージャを呼び出してモデルの学習と実行を行うことができます。

CALL my_app.core.py_log_model('md1', 'V1');
Copy

このコマンドは、 py_log_model ストアドプロシージャを呼び出してモデルを訓練します。

CALL my_app.core.py_call_predict('md1', 'V1');
Copy

このコマンドは、 py_call_predict ストアドプロシージャを呼び出し、モデルのpredict関数を呼び出します。