指定模型签名¶
为了确保无论模型在何处运行都能获得一致的体验,Snowflake Model Registry 需要知道模型推理方法的输入和输出架构:即输入或输出 DataFrame 中所有列的名称和类型。这允许这些列在必要时在 Python 和 SQL 数据类型之间映射。这种架构被称为 签名,类似函数的实参及其类型。
对于某些 ML 框架,模型注册表可以从模型本身的数据结构或样本输入数据中推断这些架构。但是,模型通常接受或返回缺少此信息的对象,例如 NumPy 数组。在这些情况下,Snowpark ML 会推断输入特征名称为 input_feature_1
、input_feature_2
等。类似地,输出特征命名为 output_feature_1
、output_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}
)
此示例仅将签名应用于一个方法,但您可以为模型公开的每种方法推断签名。您可以对具有相同签名的所有方法使用相同的签名对象(示例中的 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),
]
)
然后,将签名对象 sig
作为 signatures
实参传递给 ``log_model``(如上面的示例所示),以用于相应的方法。
数据类型映射¶
本节描述在 Snowflake Model Registry 中,对于受支持的类型系统,类型的等价性。
列数据类型¶
下表显示了模型签名 (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 转换¶
除了 列数据类型 中显示的映射外,还适用以下转换:
标度为 0 的
DecimalType
映射到 INT64。标度大于 0 的
DecimalType
映射到 DOUBLE。