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 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}
)
Dieses Beispiel wendet die Signatur nur auf eine Methode 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.
Bemerkung
Für Snowpark DataFrames muss infer_signature
die Abfrage von DataFrame ausführen, um die Daten zu erhalten, aus denen die Signatur abgeleitet wird. Je nach Größe des Datensatzes kann dies mit erheblichen Kosten verbunden sein. Die meisten Trainingsdatensätze sind groß genug, um dies in Betracht zu ziehen.
Um solch umfangreiche Abfragen zu vermeiden, berücksichtigt infer_signature
nur die ersten hundert Zeilen der Daten, indem LIMIT 100 zur Abfrage hinzugefügt wird. Wenn diese Zeilen jedoch nicht repräsentativ für die Daten sind, ist die abgeleitete Signatur möglicherweise nicht genau. Dies tritt häufig auf, wenn der Datensatz viele NULL-Werte enthält und eine Spalte des Datensatzes nur NULL-Werte in den ersten hundert Zeilen hat. In diesem Fall lässt die abgeleitete Signatur diese Spalte fälschlicherweise aus. Geben Sie die Signatur explizit an, wie im nächsten Abschnitt gezeigt, um dieses Problem zu vermeiden.
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:
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),
]
)
Übergeben Sie dann das Signaturobjekt sig
an log_model
mit dem Argument signatures
wie im obigen 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¶
Wenn sample_input_data
zur Ableitung der Modellsignatur verwendet wird, sollte es im Allgemeinen keine NULL-Werte enthalten. Die Modell-Registry versucht, aus den bereitgestellten Daten Signaturen abzuleiten, ist dazu aber möglicherweise nicht immer vollständig in der Lage. Es ist eine gute Praxis, die Aufnahme von NULLs in die Stichprobendaten so früh wie möglich zu verhindern, z. B. bei der Dateneingabe, wann immer dies möglich ist.
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