Snowpark ML Ops: Migration von der Vorschau-API der Modell-Registry

Snowflake hatte zuvor bereits ausgewählten Kunden eine Modell-Registry in privater Vorschau zur Verfügung gestellt. Das unter diesem Thema beschriebene Registry-Feature weist im Vergleich zur Vorschauversion erhebliche Änderungen in Bezug auf Funktionalität und APIs auf. Vor allem die Kernfunktionalität der Registry wird jetzt nativ innerhalb von Snowflake gehostet, indem ein neues Modellobjekt auf Schemaebene verwendet wird.

Bemerkung

Die öffentliche Vorschauversion unterstützt noch nicht die Bereitstellung von Modellen in Snowpark Container Services (SPCS). Wenn Sie auf diese Funktionalität angewiesen sind, verwenden Sie vorerst weiterhin die Registry der privaten Vorschau.

In der folgenden Tabelle sind die wichtigsten Unterschiede zwischen den beiden Implementierungen der Registry zusammengefasst. Die API der privat verfügbaren Vorschauversion wird als „Vorschau-API“ bezeichnet, während die aktuelle, öffentlich freigegebene API als „Öffentliche API“ bezeichnet wird.

Vorschau-API

Öffentliche API

Metadaten werden in Tabellen gespeichert. Modelle werden in Stagingbereichen gespeichert. Die Registry-API ist eine Python-Bibliothek, die diese Objekte für die in der Registry gespeicherten Modelle erstellt und verwaltet.

  • Benutzer müssen über die Berechtigung zum Erstellen von Schemas, Tabellen und Stagingbereichen verfügen, um eine Registry erstellen zu können.

  • Das Aktualisieren der Modell-Metadaten außerhalb der Python-API kann zu Inkonsistenz in der Registry führen.

  • Modelle müssen explizit bereitgestellt werden, um verwendet werden zu können.

  • Einzelne Modelle können keine rollenbasierte Zugriffssteuerung haben (bei Modellbereitstellungen, die benutzerdefinierte Funktionen sind, ist dies aber möglich).

  • Für das Portieren der Registry-API ist es erforderlich, dass die gesamte Registry-Funktionalität in der neuen Sprache implementiert wird.

Modelle sind systemeigene Objekte auf Schemaebene, wie Tabellen und Stagingbereiche. Die Python-Registry-API ist eine Klasse, die die Interaktion mit Modellobjekten in Python vereinfacht, wobei im Hintergrund SQL verwendet wird.

  • Modelle werden in einem bestehenden Schema gespeichert. Schemas müssen nicht speziell für die Verwendung als Registry vorbereitet werden, und die Benutzer benötigen nur eine einzige Berechtigung, um ein Modell in einem Schema zu erstellen, das ihnen nicht gehört.

  • Es werden keine Metadaten außerhalb des Modellobjekts gespeichert, sodass die Registry nicht inkonsistent werden kann.

  • Modelle enthalten Methoden, die über SQL oder Python aufgerufen werden können und nicht explizit bereitgestellt werden müssen.

  • USAGE-Berechtigungen können für spezifische Modelle unabhängig voneinander erteilt werden.

  • Das Portieren der Registry-API in eine andere Sprache ist einfach, da die Python-Bibliothek eine dünne Schicht über SQL ist.

In den folgenden Abschnitten werden die Unterschiede zwischen den beiden APIs ausführlicher beschrieben.

Importieren und Zugreifen auf die Registry-API

Beide Registry-APIs befinden sich im Snowpark ML-Hauptpaket snowflake.ml.

Vorschau-API

from snowflake.ml.registry import model_registry
Copy

Verwenden Sie model_registry.ModelRegistry, um auf die Registry-Funktionen zuzugreifen.

Öffentliche API

from snowflake.ml.registry import Registry
Copy

Verwenden Sie die Klasse Registry für den Zugriff auf Registry-Funktionen.

Erstellen einer Registry

Die Vorschau-API erfordert, dass die Registry von der Python-Bibliothek erstellt wird.

Vorschau-API

model_registry.create_model_registry(...)
Copy

Vor der erstmaligen Verwendung der Registry erforderlich.

Öffentliche API

Nicht anwendbar. Jedes vorhandene Schema kann als Registry verwendet werden.

Öffnen einer Registry

Sie öffnen eine Registry, um neue Modelle hinzuzufügen und die bereits vorhandenen Modellen zu verwenden.

Vorschau-API

reg = model_registry.ModelRegistry(
          session=session,
          database_name="MODEL_REGISTRY")
Copy

Öffentliche API

reg = Registry(
          session=session,
          database_name="ML",
          schema_name="REGISTRY")
Copy

Protokollieren eines Modells

Das Hinzufügen eines Modells zur Registry wird Protokollierung (Logging) genannt. Beide APIs verwenden zu diesem Zweck eine Registry-Methode namens log_model. Diese Methode weist in der öffentlichen API zwei kleine Unterschiede auf:

  • Der Parameter, der die Modellversion angibt und bisher model_version hieß, heißt jetzt version_name, um seine Semantik besser wiederzugeben.

  • Sie können beim Protokollieren eines Modells keine Tags setzen. Fügen Sie stattdessen Tags nach dem Protokollieren mit der Methode set_tag des Modells hinzu.

Abrufen einer Referenz auf ein Modell

Wenn Sie eine Referenz auf ein Modell abrufen, können Sie dessen Metadaten aktualisieren und andere Operationen darauf ausführen.

Vorschau-API

Wenn Sie ein Modell aus der Registry abrufen, wird immer eine bestimmte Version des Modells zurückgegeben. Daher müssen Sie beim Abrufen des Modells die gewünschte Version angeben.

model = model_registry.ModelReference(
            registry=registry,
            model_name="my_model",
            model_version="101")
Copy

Öffentliche API

Modellversionen sind vom Modell selbst getrennt. So erhalten Sie eine Referenz auf das Modell:

m = reg.get_model("my_model")
Copy

Um eine Referenz auf eine bestimmte Version zu erhalten, rufen Sie zunächst eine Referenz auf das Modell wie oben beschrieben ab, und rufen Sie dann die gewünschte Version ab. Beachten Sie, dass das Modellobjekt ein Attribut default hat, das die Version des Modells enthält, die Sie als Standard festgelegt haben. Dies ist das eigentliche ModelVersion-Objekt, keine Zeichenfolge.

mv = m.version('v1')
mv = m.default
Copy

Bereitstellen eines Modells

Vorschau-API

Modelle müssen explizit in einem Warehouse (als benutzerdefinierte Funktion) oder in den Snowpark Container Services (als Dienst) bereitgestellt werden. Im folgenden Beispiel wird die Bereitstellung in einem Warehouse gezeigt.

model.deploy(
    deployment_name="my_warehouse_predict",
    target_method="predict",
    permanent=True)
Copy

Öffentliche API

Es ist nicht notwendig, ein Modell explizit bereitzustellen.

Verwenden eines Modells für Inferenzen

Unter Inferenz wird die Verwendung eines Modells zum Erstellen von Vorhersagen auf Grundlage von Testdaten verstanden.

Vorschau-API

Geben Sie zum Ausführen der Inferenz den Bereitstellungsnamen an, den Sie beim Bereitstellen des Modells verwendet haben.

result_dataframe = model.predict(
    "my_warehouse_predict", test_dataframe)
Copy

Öffentliche API

Modelle werden in einem Warehouse ausgeführt. Sie können Methoden des Modells aus Python oder aus SQL aufrufen.

Python

Sie rufen Methoden mit der Methode run einer Modellversion auf.

remote_prediction = mv.run(
    test_features, function_name="predict")
Copy

SQL

Sie können Methoden der Standardversion aufrufen, indem Sie eine einfache SELECT-Abfrage verwenden oder eine Version mit einer WITH-Klausel angeben.

-- Use default version
SELECT my_model!predict() FROM test_table;

-- Use a specific version
WITH my_model_v1 AS MODEL my_model VERSION "1"
     SELECT my_model_v1!predict() FROM test_table;
Copy

Zugriff auf und Aktualisierung von Beschreibungen

Vorschau-API

Die Modellreferenz bietet Get- und Set-Methoden für die Beschreibung. (Bei dieser API bezieht sich eine Modellreferenz immer auf eine bestimmte Version des Modells.)

print(model.get_model_description())

model.set_model_description("A better description")
Copy

Öffentliche API

Sowohl Modelle als auch Modellversionen ermöglichen den Zugriff auf eine Beschreibung über ihre entsprechenden Attribute comment und description.

print(m.comment)
m.comment = "A better description"

print(m.description)
m.description = "A better description"

print(mv.comment)
mv.comment = "A better description"

print(mv.description)
mv.description = "A better description"
Copy

Zugriff auf und Aktualisierung von Tags

Vorschau-API

Das Festlegen und Abrufen von Tags erfolgt auf Ebene der Modellversion (Modellreferenzen beziehen sich immer auf eine bestimmte Version).

Alle Tags abrufen

print(model.get_tags())
Copy

Tag hinzufügen oder neuen Tag-Wert festlegen

model.set_tag("minor_rev", "1")
Copy

Tag entfernen

model.remove_tag("minor_rev")
Copy

Öffentliche API

Tags werden auf Modellebene gesetzt (ein Modell besteht aus einer Sammlung von Versionen) und werden mit SQL-Tags implementiert. Informationen zum Erstellen von Tags und zum Definieren zulässiger Werte finden Sie unter Objekt-Tagging.

Alle Tags abrufen

print(m.show_tags())
Copy

Tag hinzufügen oder neuen Tag-Wert festlegen

m.set_tag("minor_rev", "1")
Copy

Tag entfernen

m.unset_tag("minor_rev")
Copy

Zugriff auf und Aktualisierung von Kennzahlen

In beiden APIs werden die Kennzahlen auf Ebene der Modellversion festgelegt.

Vorschau-API

Skalare Kennzahl festlegen

model.set_metric("test_accuracy", test_accuracy)
Copy

Hierarchische (Dictionary-)Kennzahl festlegen

model.set_metric("dataset_test", {"accuracy": test_accuracy})
Copy

Multivalente (Matrix-)Kennzahl festlegen

model.set_metric("confusion_matrix", test_confusion_matrix)
Copy

Alle Kennzahlen abrufen

print(model.get_metrics())
Copy

Kennzahl entfernen

model.remove_metric("test_accuracy")
Copy

Öffentliche API

Skalare Kennzahl festlegen

m.set_metric("test_accuracy", test_accuracy)
Copy

Hierarchische (Dictionary-)Kennzahl festlegen

mo.set_metric("dataset_test", {"accuracy": test_accuracy})
Copy

Multivalente (Matrix-)Kennzahl festlegen

m.set_metric("confusion_matrix", test_confusion_matrix)
Copy

Alle Kennzahlen abrufen

print(m.get_metrics())
Copy

Kennzahl entfernen

m.remove_metric("test_accuracy")
Copy

Löschen eines Modells

Vorschau-API

Sie können nur bestimmte Versionen eines Modells löschen. Um ein Modell vollständig zu löschen, müssen Sie alle seine Versionen löschen.

registry.delete_model(
    model_name="my_model",
    model_version="100")
Copy

Öffentliche API

Beim Löschen eines Modells werden alle seine Versionen gelöscht. Es ist derzeit nicht möglich, nur eine Version zu löschen.

reg.delete_model("mymodel")
Copy

Auflisten aller Versionen eines Modells

Vorschau-API

Die Methode list_models gibt einen DataFrame aller Modellversionen zurück. Sie können diesen filtern, um nur die Versionen eines bestimmten Modells anzuzeigen.

model_list = registry.list_models()
model_list.filter(model_list["NAME"] == "mymodel").show()
Copy

Öffentliche API

Bei einer Modellreferenz können Sie die Versionen des Modells entweder als Liste von ModelVersion-Instanzen oder als DataFrame mit Informationen zu den Versionen des Modells abrufen.

Liste der ModelVersions-Instanzen abrufen

version_list = m.versions()
Copy

Informationen im DataFrame abrufen

version_df = m.show_versions()
Copy

Verwalten des Modelllebenszyklus

Für das Verwalten des Lebenszyklus eines Modells sollten Tags verwendet werden. Sie könnten zum Beispiel ein Tag mit dem Namen stage erstellen, um den aktuellen Status des Modells mit Werten wie „experimentell“, „alpha“, „beta“, „produktiv“, „veraltet“ und „obsolet“ zu erfassen.

In der öffentlichen API werden Tags mit SQL-Tag-Objekten implementiert. Informationen zum Erstellen von Tags und zum Definieren zulässiger Werte finden Sie unter Objekt-Tagging.

Die öffentliche API hat auch das Konzept der Standardversion eines Modells. Diese Modellversion wird verwendet, wenn keine spezifische Version angegeben ist, insbesondere in SQL. Wenn Sie eine neue Version eines Modells trainieren und das neue Modell für den allgemeinen Einsatz bereit ist, können Sie die Standardversion aktualisieren. Sie können die Standardversion mit dem Attribut default des Modells festlegen.

m.default = "2"
Copy

Sie können dann die Standardversion des Modells als ModelVersion-Objekt wie folgt abrufen.

mv = m.default
Copy

Oder Sie können das Modell direkt mit seiner predict-Methode aufrufen.

m.default.run(test_features, function_name="predict"))
Copy