モデル署名の指定¶
モデルがどこで実行されても一貫したエクスペリエンスを保証するためには、Snowflake Model Registryがモデルの推論メソッドの入力スキーマと出力スキーマを把握しておく必要があります。つまり、入力または出力DataFrameのすべての列の名前と型です。これにより、これらの列は必要に応じてPythonとSQLのデータ型間でマッピングできるようになります。このスキーマは、関数の引数とその型になぞらえて シグネチャ と呼ばれています。
ある種のMLフレームワークでは、モデルレジストリが、モデル自体のデータ構造から、あるいはサンプル入力データから、これらのスキーマを推測することができます。しかし、 NumPy 配列のような、この情報を持たないオブジェクトをモデルが受け取ったり返したりすることがよくあります。このような場合、Snowpark ML は、入力関数名を input_feature_1
、 input_feature_2
などと推測します。同様に、出力機能には output_feature_1
、 output_feature_2
などの名前が付けられています。
カスタムモデルでより意味のある名前を使うには、以下のいずれかを行います。
通常はデータセットをpandasまたは Snowpark DataFrame に変換して、
sample_input_data
を列名で更新します。log_model
に明示的に署名を渡します。モデルが出力に名前を生成しない場合、明示的なシグネチャが唯一の選択肢になる可能性があります。
シグネチャの推測¶
モデルレジストリ自体のように、シグネチャを自動的に生成することができます。 snowflake.ml.model.model_signature.infer_signature
を使って、提供されたサンプルの入力、出力、列名に基づいてシグネチャを推測し、以下の例のように、モデルをログに記録する際に適切なメソッドにそのシグネチャを適用します。
import pandas as pd
from sklearn import svm, datasets
from snowflake.ml.model import model_signature
digits = datasets.load_digits()
target_digit = 6
def one_vs_all(dataset, digit):
return [x == digit for x in dataset]
train_features = digits.data[:10]
train_labels = one_vs_all(digits.target[:10], target_digit)
clf = svm.SVC(gamma=0.001, C=10.0, probability=True)
clf.fit(train_features, train_labels)
sig = model_signature.infer_signature(
train_features,
labels_df,
input_feature_names=['column1', 'column2', ...],
output_feature_names=['is_target_digit'])
# Supply signature for every functions the model exposes. In this case only `predict`.
mv = reg.log_model(clf, model_name='my_model', version_name='v1', signatures={"predict": sig})
この例ではシグネチャを1つのモデルだけに適用していますが、モデルが公開するメソッドごとにシグネチャを推論することができます。同じシグネチャを持つすべてのメソッドに、同じシグネチャオブジェクト(例では sig
)を使うことができます。
シグネチャの構築¶
snowflake.ml.model.model_signature.ModelSignature
を使って手動でシグネチャを構築することもできます。スカラー型とテンソル型(ラグドテンソルを含む)の両方がサポートされています。
例:
sig = ModelSignature(
inputs=[
FeatureSpec(dtype=DataType.DOUBLE, name=f_0),
FeatureSpec(dtype=DataType.INT64,
name=sparse_0_fixed_len, shape=(5, 5)),
FeatureSpec(dtype=DataType.INT64, name=sparse_1_variable_len, shape=(-1,)),
],
outputs=[
FeatureSpec(dtype=DataType.FLOAT, name=output),
]
)
そして、シグネチャオブジェクト、 sig
を、それが適用されるメソッドについて、上記のように log_model
に渡します。
データ型マッピング¶
このセクションでは、サポートされている型システムのSnowflakeモデルレジストリにおける型の等価性について説明します。
列データ型¶
次のテーブルは、モデル署名(SQL)型、pandas DataFrames(NumPy)型、Snowpark Python型の等価性を示しています。
モデル署名(SQL)型 |
pandas DataFrame(NumPy)型 |
Snowpark Python型 |
---|---|---|
INT8 |
|
|
INT16 |
|
|
INT32 |
|
|
INT64 |
|
|
FLOAT |
|
|
DOUBLE |
|
|
UINT8 |
|
|
UINT16 |
|
|
UINT32 |
|
|
UINT64 |
|
|
BOOL |
|
|
STRING |
|
|
BYTES |
|
|
TIMESTAMP_NTZ |
|
|
形状が指定されたテンソル特徴の表現は、 np.object_
を使用します。
欠損値¶
NULLの値は、サンプル入力データでも推論入力データでも許可されていません。
NumPyからの変換¶
NumPy データ型が 列データ型 で示される NumPy 型に安全にキャストできる場合、それは対応するデータ型として推論されます。
からの変換PyTorch¶
PyTorch型 |
モデル署名(SQL)型 |
---|---|
|
UINT8 |
|
INT8 |
|
INT16 |
|
INT32 |
|
INT64 |
|
FLOAT |
|
DOUBLE |
|
BOOL |
Snowparkからの変換¶
列データ型 に示すマッピングに加え、以下の変換が適用されます。
DecimalType
を0の縮尺で INT64 をマッピングします。DecimalType
を0の値より大きい縮尺で DOUBLE をマッピングします。