Especificação das assinaturas de modelo

Para garantir uma experiência consistente, não importa onde um modelo seja executado, o Registro de modelo Snowflake precisa saber o esquema de entrada e saída dos métodos de inferência do modelo: ou seja, o nome e o tipo de todas as colunas no DataFrame de entrada ou saída. Isso permite que essas colunas sejam mapeadas entre os tipos de dados Python e SQL quando necessário. Esse esquema é chamado de assinatura por analogia aos argumentos de uma função e seus tipos.

Com determinados frameworks de ML, o registro do modelo pode inferir esses esquemas, seja a partir de estruturas de dados no próprio modelo ou de dados de entrada de amostra. No entanto, os modelos geralmente aceitam ou retornam objetos que não possuem essas informações, como matrizes NumPy. Nestes casos, o Snowpark ML infere os nomes dos recursos de entrada como input_feature_1, input_feature_2, e assim por diante. Da mesma forma, os recursos de saída são nomeados output_feature_1, output_feature_2 e assim por diante.

Para usar nomes mais significativos em seus modelos personalizados, você pode usar um dos seguintes métodos:

  • Atualize sample_input_data com nomes de colunas, geralmente convertendo o conjunto de dados em um pandas ou DataFrame Snowpark.

  • Passe assinaturas explicitamente para log_model. Quando um modelo não produz nomes em sua saída, assinaturas explícitas podem ser a única opção.

Como inferir uma assinatura

Assim como o próprio registro de modelos, você pode gerar assinaturas automaticamente. Use snowflake.ml.model.model_signature.infer_signature para inferir uma assinatura com base nos nomes de entrada, saída e coluna de amostra fornecidos e, em seguida, aplique essa assinatura aos métodos apropriados ao registrar o modelo, como no exemplo a seguir:

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

Este exemplo aplica a assinatura a apenas um modelo, mas você pode inferir uma assinatura para cada método que seu modelo expõe. Você pode usar o mesmo objeto de assinatura (sig no exemplo) para todos os métodos que têm a mesma assinatura.

Como construir uma assinatura

Você também pode construir manualmente uma assinatura usando snowflake.ml.model.model_signature.ModelSignature. São suportados tanto tipos escalares quanto tensores (incluindo tensores irregulares).

Exemplo:

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

Em seguida, passe o objeto de assinatura, sig, para log_model como no exemplo para os métodos aos quais ele se aplica.

Mapeamentos de tipos de dados

Esta seção descreve a equivalência de tipos no Registro de modelo Snowflake para sistemas de tipos suportados.

Tipos de dados de coluna

A tabela a seguir mostra a equivalência do tipo da assinatura do modelo (SQL), tipo de pandas DataFrames (NumPy) e tipo Snowpark Python.

Tipo de assinatura do modelo (SQL)

Tipo pandas DataFrame (NumPy)

Tipo 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

A representação de recursos tensores onde a forma é especificada usa np.object_.

Valores ausentes

Valores NULL não são permitidos nos dados de entrada da amostra ou nos dados de entrada da inferência.

Conversão de NumPy

Se o tipo de dados NumPy puder ser convertido com segurança em um tipo NumPy mostrado em Tipos de dados de coluna, será inferido como o tipo de dados correspondente.

Conversão de PyTorch

Tipo de PyTorch

Tipo de assinatura do modelo (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

Conversão do Snowpark

Além dos mapeamentos mostrados em Tipos de dados de coluna, as seguintes conversões se aplicam:

  • DecimalType com escala de 0 mapas para INT64.

  • DecimalType com escala maior que 0 mapas para DOUBLE.