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})
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),
]
)
Ü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 |
|
|
INT16 |
|
|
INT32 |
|
|
INT64 |
|
|
FLOAT |
|
|
DOUBLE |
|
|
UINT8 |
|
|
UINT16 |
|
|
UINT32 |
|
|
UINT64 |
|
|
BOOL |
|
|
STRING |
|
|
BYTES |
|
|
TIMESTAMP_NTZ |
|
|
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) |
---|---|
|
UINT8 |
|
INT8 |
|
INT16 |
|
INT32 |
|
INT64 |
|
FLOAT |
|
DOUBLE |
|
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 zugeordnetDecimalType
mit einer Dezimalstellenzahl größer als 0 wird DOUBLE zugeordnet