シリアライズされたファイルを介して独自のモデルタイプを持ち込むことができます。

モデルレジストリは、いくつかの 組み込みモデルタイプ をサポートしています。また、シリアライズ可能で snowflake.ml.model.custom_model.CustomModel クラスを拡張している限り、外部ツールで学習したモデルやオープンソースリポジトリから取得したモデルなど、他のタイプのモデルをログに記録することもできます。

このガイドでは、その方法を説明します。

  • カスタムモデルを作成します。

  • Snowflake Model Registryにログを記録します。

  • 推論のために配置します。

注釈

このクイックスタート は、カスタム PyCaret モデルのログの例を提供します。

キーワード引数によるモデルコンテキストの定義

Snowflake ML では、 ModelContext クラスをインスタンス化する際に任意の数のキーワード引数を指定できます。これにより、カスタムモデルを定義して初期化する際に、パラメーター、構成ファイル、または独自のモデルクラスのインスタンスを簡単に含めることができます。

モデルコンテキストの属性には、 組み込みモデルタイプ のようなサポートされるモデルタイプや、モデル、パラメーター、構成ファイルを含むディレクトリへのパスのようなパスを指定することができます。

以下は、モデルコンテキストによってキーワード引数を提供する方法と、カスタムモデルクラスでそれらを使う方法を示す例です。

import json
import pandas as pd
from snowflake.ml.model import custom_model

# Initialize ModelContext with keyword arguments
# my_model can be any kind of model
mc = custom_model.ModelContext(
    my_model=my_model,
)

# Define a custom model class that utilizes the context
class ExampleBringYourOwnModel(custom_model.CustomModel):
    def __init__(self, context: custom_model.ModelContext) -> None:
        super().__init__(context)

    @custom_model.inference_api
    def predict(self, input: pd.DataFrame) -> pd.DataFrame:
        # Use the model 'my_model' from the context to make predictions
        model_output = self.context['my_model'].predict(input)
        return pd.DataFrame({'output': model_output})
Copy

カスタムモデルのテストとログ記録

カスタムモデルをローカルで実行してテストすることができます。

my_model = ExampleBringYourOwnModel(mc)
output_df = my_model.predict(input_df)
Copy

モデルが意図したとおりに動作したら、Snowflake Model Registryにログを記録します。ここに示すように、モデルクラスが必要とするライブラリを指定するために conda_dependencies (もしくは pip_requirements)をプロバイダーとして指定します。モデルの入力シグネチャを推測するために、 sample_input_data (pandasまたはSnowpark DataFrame)をプロバイダーとして提供します。あるいは、 モデル署名 を提供します。

reg = Registry(session=sp_session, database_name="ML", schema_name="REGISTRY")
mv = reg.log_model(my_model_pipeline,
            model_name="my_custom_model_pipeline",
            version_name="v1",
            conda_dependencies=["scikit-learn"],
            comment="My Custom ML Model Pipeline",
            sample_input_data=train_features)
output_df = mv.run(input_df)
Copy

例: PyCaret モデルのログ記録

PyCaret は、Snowflakeがネイティブにサポートしていない、ローコードで高効率なサードパーティパッケージです。同様の方法で、独自のモデルタイプを持ち込むことができます。

ステップ1:モデルコンテキストの定義

モデルをログに記録する前に、Snowflake ML でネイティブにサポートされていない独自のモデルタイプを参照する ModelContext を定義します。この場合、コンテキストの model_file 属性を使用して、シリアライズされた(ピクルス化された)モデルへのパスを指定します。

pycaret_mc = custom_model.ModelContext(
  model_file = 'pycaret_best_model.pkl',
)
Copy

ステップ2: カスタムモデルクラスの作成

ネイティブサポートのないモデルタイプをログに記録するために、カスタムモデルクラスを定義します。この例では、 CustomModel から派生した PyCaretModel クラスが定義され、モデルがレジストリにログ記録されるようになっています。

from pycaret.classification import load_model, predict_model

class PyCaretModel(custom_model.CustomModel):
    def __init__(self, context: custom_model.ModelContext) -> None:
        super().__init__(context)
        model_dir = self.context["model_file"][:-4]  # Remove '.pkl' suffix
        self.model = load_model(model_dir, verbose=False)
        self.model.memory = '/tmp/'  # Update memory directory

    @custom_model.inference_api
    def predict(self, X: pd.DataFrame) -> pd.DataFrame:
        model_output = predict_model(self.model, data=X)
        return pd.DataFrame({
            "prediction_label": model_output['prediction_label'],
            "prediction_score": model_output['prediction_score']
        })
Copy

注釈

図のように、モデルのメモリディレクトリを /tmp/ にセットします。Snowflakeのウェアハウスノードはディレクトリアクセスが制限されています。 /tmp は常に書き込み可能で、モデルがファイルを書き込む場所が必要な場合に安全な選択です。他のタイプでは必要ないかもしれません。

ステップ 3: カスタムモデルのテスト

以下のようなコードを使用して、 PyCaret モデルをローカルでテストします。

test_data = [
    [1, 237, 1, 1.75, 1.99, 0.00, 0.00, 0, 0, 0.5, 1.99, 1.75, 0.24, 'No', 0.0, 0.0, 0.24, 1],
    # Additional test rows...
]
col_names = ['Id', 'WeekofPurchase', 'StoreID', 'PriceCH', 'PriceMM', 'DiscCH', 'DiscMM',
            'SpecialCH', 'SpecialMM', 'LoyalCH', 'SalePriceMM', 'SalePriceCH',
            'PriceDiff', 'Store7', 'PctDiscMM', 'PctDiscCH', 'ListPriceDiff', 'STORE']

test_df = pd.DataFrame(test_data, columns=col_names)

my_pycaret_model = PyCaretModel(pycaret_mc)
output_df = my_pycaret_model.predict(test_df)
Copy

ステップ 4: モデルシグネチャの定義

この例では、 モデルのシグネチャ を入力検証用に推論するためにサンプルデータを使用します。

predict_signature = model_signature.infer_signature(input_data=test_df, output_data=output_df)
Copy

ステップ5:モデルのログを取る

次のコードは、Snowflake Model Regsitryにモデルをログ(登録)します。

snowml_registry = Registry(session)

custom_mv = snowml_registry.log_model(
    my_pycaret_model,
    model_name="'my_pycaret_best_model",
    version_name="version_1",
    conda_dependencies=["pycaret==3.0.2", "scipy==1.11.4", "joblib==1.2.0"],
    options={"relax_version": False},
    signatures={"predict": predict_signature},
    comment = 'My PyCaret classification experiment using the CustomModel API'
)
Copy

ステップ6:レジストリでモデルを確認します。

モデルが Model Registry で利用可能かどうかを確認するには、 show_models 関数を使用します。

snowml_registry.show_models()
Copy

ステップ7:登録されたモデルによる予測

run 関数を使用して、予測モデルを呼び出します。

snowpark_df = session.create_dataframe(test_data, schema=col_nms)

custom_mv.run(snowpark_df).show()
Copy

次のステップ

Snowflake Model Registryを使用して PyCaret モデルをデプロイすると、Snowsightでモデルを表示できます。 AI & ML の下にある Models ページに移動します。そこに表示されない場合は、 ACCOUNTADMIN ロールまたはモデルのログに使用したロールを使用していることを確認してください。

SQL のモデルを使うには、 SQL を次のように使います:

SELECT
    my_pycaret_model!predict(*) AS predict_dict,
    predict_dict['prediction_label']::text AS prediction_label,
    predict_dict['prediction_score']::double AS prediction_score
from pycaret_input_data;
Copy