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. Signaturen können auch optionale Parameter enthalten, die das Inferenzverhalten steuern, wie z. B. eine Temperatureinstellung.
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_datamit 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,
train_labels,
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 derart große Abfragen zu vermeiden, berücksichtigt infer_signature nur die ersten hundert Zeilen der Daten, indem das LIMIT für die Abfrage auf 100 begrenzt 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 das Datenset viele NULL-Werte enthält und eine Spalte im Datenset nur NULL-Werte in den ersten hundert Zeilen beinhaltet. In diesem Fall lässt die abgeleitete Signatur diese Spalte fälschlicherweise weg. 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.
Angeben von Parametern mit ParamSpec¶
Zusätzlich zu den Eingabe- und Ausgabe-Features können Modellsignaturen Parameter enthalten. Parameter definieren optionale Konfigurationswerte, die Sie an Modell-Inferenzmethoden übergeben können, wenn Sie eine Inferenzanfrage stellen. Im Gegensatz zu Eingabe-Features, die die zu verarbeitenden Daten angeben, steuern Parameter das Inferenzverhalten, z. B. die Anzahl der zurückzugebenden Ergebnisse oder eine Temperatureinstellung.
Verwenden Sie ParamSpec von snowflake.ml.model.model_signature.ModelSignature, um einen Parameter zu definieren.
Jede ParamSpec erfordert einen Namen, einen Datentyp und einen Standardwert. Der Standardwert wird verwendet, wenn der Parameter zum Zeitpunkt der Inferenz nicht explizit angegeben wird.
Erstellen einer Signatur mit Parametern¶
Im folgenden Beispiel wird eine Modellsignatur erstellt, die sowohl Eingabe-/Ausgabe-Features als auch Parameter enthält:
from snowflake.ml.model.model_signature import ModelSignature, FeatureSpec, ParamSpec, DataType
sig = ModelSignature(
inputs=[
FeatureSpec(dtype=DataType.STRING, name="input_text"),
],
outputs=[
FeatureSpec(dtype=DataType.STRING, name="output_text"),
],
params=[
ParamSpec(name="temperature", dtype=DataType.DOUBLE, default_value=0.7),
ParamSpec(name="max_tokens", dtype=DataType.INT32, default_value=256),
]
)
mv = reg.log_model(
my_model,
model_name='my_model',
version_name='v1',
signatures={"predict": sig}
)
Sie können beim Ableiten einer Signatur mit infer_signature auch Parameter angeben:
from snowflake.ml.model.model_signature import ParamSpec, DataType
from snowflake.ml.model import model_signature
params = [
ParamSpec(name="top_k", dtype=DataType.INT32, default_value=10),
ParamSpec(name="threshold", dtype=DataType.DOUBLE, default_value=0.5),
]
sig = model_signature.infer_signature(
input_data,
output_data,
params=params
)
Bemerkung
Parameternamen müssen innerhalb der Signatur eindeutig sein und dürfen Namen nicht mit Eingabe-Features teilen. Wenn ein Parametername mit einem Eingabe-Feature-Namen in Konflikt steht, wird ein ValueError ausgelöst.
Eine vollständige Liste der ParamSpec-Argumente finden Sie in der API-Referenz.
Einzelheiten zur Übergabe von Parameterwerten zum Zeitpunkt der Inferenz finden Sie unter Übergeben von Parametern während der Inferenz und Übergeben von Parametern in SQL.
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, pandas-DataFrames (NumPy)-Typ und Snowpark Python-Typ.
Modellsignaturtyp |
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 |
|---|---|
|
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:
DecimalTypemit einer Dezimalstellenzahl von 0 wird INT64 zugeordnetDecimalTypemit einer Dezimalstellenzahl größer als 0 wird DOUBLE zugeordnet