モデル署名の指定

モデルがどこで実行されても一貫したエクスペリエンスを保証するためには、Snowflake Model Registryがモデルの推論メソッドの入力スキーマと出力スキーマを把握しておく必要があります。つまり、入力または出力DataFrameのすべての列の名前と型です。これにより、これらの列は必要に応じてPythonとSQLのデータ型間でマッピングできるようになります。このスキーマは、関数の引数とその型になぞらえて シグネチャ と呼ばれています。

ある種のMLフレームワークでは、モデルレジストリが、モデル自体のデータ構造から、あるいはサンプル入力データから、これらのスキーマを推測することができます。しかし、 NumPy 配列のような、この情報を持たないオブジェクトをモデルが受け取ったり返したりすることがよくあります。このような場合、Snowpark ML は、入力関数名を input_feature_1input_feature_2 などと推測します。同様に、出力機能には output_feature_1output_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})
Copy

この例ではシグネチャを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),
    ]
)
Copy

そして、シグネチャオブジェクト、 sig を、それが適用されるメソッドについて、上記のように log_model に渡します。

データ型マッピング

このセクションでは、サポートされている型システムのSnowflakeモデルレジストリにおける型の等価性について説明します。

列データ型

次のテーブルは、モデル署名(SQL)型、pandas DataFrames(NumPy)型、Snowpark Python型の等価性を示しています。

モデル署名(SQL)型

pandas DataFrame(NumPy)型

Snowpark Python型

INT8

np.int8

ByteType

INT16

np.int16

ShortType

INT32

np.int32

IntegerType

INT64

np.int64

LongType

FLOAT

np.float32

FloatType

DOUBLE

np.float64

DoubleType

UINT8

np.uint8

ByteType

UINT16

np.uint16

ShortType

UINT32

np.uint32

IntegerType

UINT64

np.uint64

LongType

BOOL

np.bool_

BooleanType

STRING

np.str_

StringType

BYTES

np.bytes_

BinaryType

TIMESTAMP_NTZ

np.datetime64

TimestampType

形状が指定されたテンソル特徴の表現は、 np.object_ を使用します。

欠損値

NULLの値は、サンプル入力データでも推論入力データでも許可されていません。

NumPyからの変換

NumPy データ型が 列データ型 で示される NumPy 型に安全にキャストできる場合、それは対応するデータ型として推論されます。

からの変換PyTorch

PyTorch型

モデル署名(SQL)型

torch.uint8

UINT8

torch.int8

INT8

torch.int16

INT16

torch.int32

INT32

torch.int64

INT64

torch.float32

FLOAT

torch.float64

DOUBLE

torch.bool

BOOL

Snowparkからの変換

列データ型 に示すマッピングに加え、以下の変換が適用されます。

  • DecimalType を0の縮尺で INT64 をマッピングします。

  • DecimalType を0の値より大きい縮尺で DOUBLE をマッピングします。