シリアライズされたファイルを介して独自のモデルタイプを持ち込むことができます。¶
モデルレジストリは、いくつかの 組み込みモデルタイプ をサポートしています。また、シリアライズ可能で 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})
カスタムモデルのテストとログ記録¶
カスタムモデルをローカルで実行してテストすることができます。
my_model = ExampleBringYourOwnModel(mc)
output_df = my_model.predict(input_df)
モデルが意図したとおりに動作したら、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)
例: PyCaret モデルのログ記録¶
PyCaret は、Snowflakeがネイティブにサポートしていない、ローコードで高効率なサードパーティパッケージです。同様の方法で、独自のモデルタイプを持ち込むことができます。
ステップ1:モデルコンテキストの定義¶
モデルをログに記録する前に、Snowflake ML でネイティブにサポートされていない独自のモデルタイプを参照する ModelContext
を定義します。この場合、コンテキストの model_file
属性を使用して、シリアライズされた(ピクルス化された)モデルへのパスを指定します。
pycaret_mc = custom_model.ModelContext(
model_file = 'pycaret_best_model.pkl',
)
ステップ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']
})
注釈
図のように、モデルのメモリディレクトリを /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)
ステップ 4: モデルシグネチャの定義¶
この例では、 モデルのシグネチャ を入力検証用に推論するためにサンプルデータを使用します。
predict_signature = model_signature.infer_signature(input_data=test_df, output_data=output_df)
ステップ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'
)
ステップ6:レジストリでモデルを確認します。¶
モデルが Model Registry で利用可能かどうかを確認するには、 show_models
関数を使用します。
snowml_registry.show_models()
ステップ7:登録されたモデルによる予測¶
run
関数を使用して、予測モデルを呼び出します。
snowpark_df = session.create_dataframe(test_data, schema=col_nms)
custom_mv.run(snowpark_df).show()
次のステップ¶
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;