Angeben von Modellsignaturen

Um eine konsistente Benutzerumgebung sicherzustellen, egal wo ein Modell ausgeführt wird, muss die Snowflake Model Registry das Eingabe- und Ausgabeschema der Inferenzmethoden des Modells kennen, d. h. Namen und Typ aller Spalten im Eingabe- oder Ausgabe-DataFrame. Dadurch können diese Spalten bei Bedarf zwischen Python- und SQL-Datentypen zugeordnet werden. Dieses Schema wird in Analogie zu den Argumenten einer Funktion und deren Typen als Signatur bezeichnet.

Bei bestimmten ML-Frameworks kann die Modell-Registry diese Schemas entweder aus den Datenstrukturen im Modell selbst oder aus Beispieleingabedaten ableiten. Häufig akzeptieren Modelle jedoch Objekte oder geben diese zurück, denen diese Informationen fehlen, wie z. B. NumPy-Arrays. In diesen Fällen leitet Snowpark ML die Namen der Eingabe-Features ab: input_feature_1, input_feature_2 usw. Analog dazu heißen die Ausgabe-Features output_feature_1, output_feature_2 usw.

Um aussagekräftigere Namen in Ihren benutzerdefinierten Modellen zu verwenden, können Sie eine der folgenden Methoden verwenden:

  • Aktualisieren Sie sample_input_data mit Spaltennamen, normalerweise durch Konvertierung des Datensatzes in ein pandas- oder Snowpark DataFrame.

  • Übergeben Sie Signaturen explizit an log_model. Wenn ein Modell keine Namen in seiner Ausgabe erzeugt, sind explizite Signaturen möglicherweise die einzige Option.

Ableiten einer Signatur

Wie die Modell-Registry selbst können Sie auch Signaturen automatisch erstellen. Verwenden Sie snowflake.ml.model.model_signature.infer_signature, um auf der Grundlage der bereitgestellten Beispieleingaben, Ausgaben und Spaltennamen eine Signatur abzuleiten und diese Signatur dann bei der Protokollierung des Modells auf die entsprechenden Methoden anzuwenden, wie im folgenden Beispiel:

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

Dieses Beispiel wendet die Signatur nur auf ein Modell an, aber Sie können für jede Methode, die Ihr Modell anbietet, eine Signatur ableiten. Sie können dasselbe Signaturobjekt (im Beispiel sig) für alle Methoden verwenden, die dieselbe Signatur haben.

Erstellen einer Signatur

Sie können eine Signatur auch manuell erstellen, indem Sie snowflake.ml.model.model_signature.ModelSignature verwenden. Es werden sowohl Skalar- als auch Tensortypen (einschließlich Ragged-Tensoren) unterstützt.

Beispiel:

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

Übergeben Sie dann das Signaturobjekt sig an log_model wie im Beispiel für die Methoden beschrieben, für die es gilt.

Zuordnung von Datentypen

Dieser Abschnitt beschreibt die Äquivalenz von Typen in der Snowflake Model Registry für unterstützte Typsysteme.

Spaltendatentypen

Die folgende Tabelle zeigt die Äquivalenz von Modellsignaturtyp (SQL), pandas-DataFrames-Typ (NumPy) und Snowpark Python-Typ.

Modellsignaturtyp (SQL)

pandas-DataFrame-Typ (NumPy)

Snowpark Python-Typ

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

Die Darstellung von Tensor-Features, bei denen die Form angegeben ist, verwendet np.object_.

Fehlende Werte

NULL-Werte sind in den Stichproben-Eingabedaten oder den Inferenz-Eingabedaten nicht erlaubt.

Konvertierung von NumPy

Wenn der NumPy-Datentyp sicher in einen NumPy-Typ umgewandelt werden kann, der in Spaltendatentypen angezeigt wird, wird er als der entsprechende Datentyp abgeleitet.

Konvertierung von PyTorch

PyTorch-Typ

Modellsignaturtyp (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

Konvertierung von Snowpark

Zusätzlich zu den Zuordnungen, die unter Spaltendatentypen aufgeführt sind, gelten die folgenden Konvertierungen:

  • DecimalType mit einer Dezimalstellenzahl von 0 wird INT64 zugeordnet

  • DecimalType mit einer Dezimalstellenzahl größer als 0 wird DOUBLE zugeordnet