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})
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),
]
)
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 |
|
|
INT16 |
|
|
INT32 |
|
|
INT64 |
|
|
FLOAT |
|
|
DOUBLE |
|
|
UINT8 |
|
|
UINT16 |
|
|
UINT32 |
|
|
UINT64 |
|
|
BOOL |
|
|
STRING |
|
|
BYTES |
|
|
TIMESTAMP_NTZ |
|
|
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) |
---|---|
|
UINT8 |
|
INT8 |
|
INT16 |
|
INT32 |
|
INT64 |
|
FLOAT |
|
DOUBLE |
|
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.