指定模型签名

为了确保无论模型在何处运行都能获得一致的体验,Snowflake Model Registry 需要知道模型推理方法的输入和输出架构:即输入或输出 DataFrame 中所有列的名称和类型。这允许这些列在必要时在 Python 和 SQL 数据类型之间映射。这种架构被称为 签名,类似函数的实参及其类型。

对于某些 ML 框架,模型注册表可以从模型本身的数据结构或样本输入数据中推断这些架构。但是,模型通常接受或返回缺少此信息的对象,例如 NumPy 数组。在这些情况下,Snowpark ML 会推断输入特征名称为 input_feature_1input_feature_2 等。类似地,输出特征命名为 output_feature_1output_feature_2 等。

要在自定义模型中使用更有意义的名称,可以使用以下方法之一:

  • 使用列名更新 sample_input_data,通常是将数据集转换为 Pandas 或 Snowpark DataFrame

  • 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 a signature for every function the model exposes, in this case only `predict`.
mv = reg.log_model(
    clf,
    model_name='my_model',
    version_name='v1',
    signatures={"predict": sig}
)
Copy

此示例仅将签名应用于一个方法,但您可以为模型公开的每种方法推断签名。您可以对具有相同签名的所有方法使用相同的签名对象(示例中的 sig)。

构造签名

您还可以使用 snowflake.ml.model.model_signature.ModelSignature 手动构造签名。支持标量类型和张量类型(包括不规则张量)。

示例:

from snowflake.ml.model.model_signature import ModelSignature, FeatureSpec, DataType

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 作为 signatures 实参传递给 ``log_model``(如上面的示例所示),以用于相应的方法。

数据类型映射

本节描述在 Snowflake Model Registry 中,对于受支持的类型系统,类型的等价性。

列数据类型

下表显示了模型签名 (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 转换

除了 列数据类型 中显示的映射外,还适用以下转换:

  • 标度为 0 的 DecimalType 映射到 INT64。

  • 标度大于 0 的 DecimalType 映射到 DOUBLE。

语言: 中文