Integrieren eigener Modelltypen mittels serialisierter Dateien

Die Modell-Registry unterstützt mehrere integrierte Modelltypen. Sie können auch weitere Typen von Modellen protokollieren, einschließlich solcher, die mit externen Tools trainiert wurden oder aus Open-Source-Repositorys stammen, solange sie serialisierbar sind und die Klasse snowflake.ml.model.custom_model.CustomModel erweitern.

In dieser Anleitung wird Folgendes erklärt:

  • Erstellen benutzerdefinierter Modelle

  • Protokollieren dieser Modelle in der Snowflake Model Registry

  • Bereitstellen dieser Modelle für Inferenz

Bemerkung

Dieser Quickstart bietet ein Beispiel für die Protokollierung eines benutzerdefinierten PyCaret-Modells.

Definieren des Modellkontexts durch Schlüsselwortargumente

Snowflake ML erlaubt eine beliebige Anzahl von Schlüsselwortargumenten bei der Instanziierung der Klasse ModelContext, sodass Sie bei der Definition und Initialisierung eines benutzerdefinierten Modells problemlos Parameter, Konfigurationsdateien oder Instanzen Ihrer eigenen Modellklassen einbeziehen können.

Attribute des Modellkontexts können unterstützte Modelltypen sein, z. B. integriert Modelltypen oder ein Pfad, z. B. ein Pfad zu einem Verzeichnis mit einer Modell-, Parameter- oder Konfigurationsdatei.

Nachfolgend finden Sie ein Beispiel für die Bereitstellung von Schlüsselwortargumenten über den Modellkontext und deren Verwendung in einer benutzerdefinierten Modellklasse:

import json
import pandas as pd
from snowflake.ml.model import custom_model

# Initialize ModelContext with keyword arguments
# my_model can be any kind of model
mc = custom_model.ModelContext(
    my_model=my_model,
)

# Define a custom model class that utilizes the context
class ExampleBringYourOwnModel(custom_model.CustomModel):
    def __init__(self, context: custom_model.ModelContext) -> None:
        super().__init__(context)

    @custom_model.inference_api
    def predict(self, input: pd.DataFrame) -> pd.DataFrame:
        # Use the model 'my_model' from the context to make predictions
        model_output = self.context['my_model'].predict(input)
        return pd.DataFrame({'output': model_output})
Copy

Testen und Protokollieren eines benutzerdefinierten Modells

Sie können ein benutzerdefiniertes Modell testen, indem Sie es lokal ausführen.

my_model = ExampleBringYourOwnModel(mc)
output_df = my_model.predict(input_df)
Copy

Wenn das Modell wie vorgesehen funktioniert, tragen Sie es in die Snowflake Model Registry ein. Wie im nächsten Codebeispiel gezeigt, geben Sie conda_dependencies (oder pip_requirements) an, um die Bibliotheken anzugeben, die die Modellklasse benötigt. Stellen Sie sample_input_data (ein pandas- oder Snowpark-DataFrame) zur Verfügung, um die Eingabesignatur für das Modell abzuleiten. Alternativ können Sie auch eine Modellsignatur bereitstellen.

reg = Registry(session=sp_session, database_name="ML", schema_name="REGISTRY")
mv = reg.log_model(my_model_pipeline,
            model_name="my_custom_model_pipeline",
            version_name="v1",
            conda_dependencies=["scikit-learn"],
            comment="My Custom ML Model Pipeline",
            sample_input_data=train_features)
output_df = mv.run(input_df)
Copy

Beispiel: Protokollieren eines PyCaret-Modells

PyCaret ist ein Low-Code-Paket eines Drittanbieters mit hoher Effizienz, das Snowflake nicht nativ unterstützt. Sie können Ihre eigenen Modelltypen mit ähnlichen Methoden integrieren.

Schritt 1: Modellkontext definieren

Bevor Sie das Modell protokollieren, definieren Sie einen ModelContext, der auf Ihren eigenen Modelltyp verweist, der von Snowflake ML nicht nativ unterstützt wird. In diesem Fall geben wir den Pfad zum serialisierten (pickled) Modell über das model_file-Attribut des Kontexts an.

pycaret_mc = custom_model.ModelContext(
  model_file = 'pycaret_best_model.pkl',
)
Copy

Schritt 2: Benutzerdefinierte Modellklasse erstellen

Definieren Sie eine benutzerdefinierte Modellklasse, um einen Modelltyp ohne native Unterstützung zu protokollieren. In diesem Beispiel wird eine PyCaretModel-Klasse definiert, die von CustomModel abgeleitet ist, damit das Modell in der Registry protokolliert werden kann.

from pycaret.classification import load_model, predict_model

class PyCaretModel(custom_model.CustomModel):
    def __init__(self, context: custom_model.ModelContext) -> None:
        super().__init__(context)
        model_dir = self.context["model_file"][:-4]  # Remove '.pkl' suffix
        self.model = load_model(model_dir, verbose=False)
        self.model.memory = '/tmp/'  # Update memory directory

    @custom_model.inference_api
    def predict(self, X: pd.DataFrame) -> pd.DataFrame:
        model_output = predict_model(self.model, data=X)
        return pd.DataFrame({
            "prediction_label": model_output['prediction_label'],
            "prediction_score": model_output['prediction_score']
        })
Copy

Bemerkung

Legen Sie, wie gezeigt, das Speicherverzeichnis des Modells auf /tmp/ fest. Die Warehouse-Knoten von Snowflake haben einen eingeschränkten Zugriff auf Verzeichnisse. /tmp ist immer beschreibbar und ist eine sichere Wahl, wenn das Modell einen Platz zum Schreiben von Dateien benötigt. Bei anderen Typen von Modellen ist dies möglicherweise nicht erforderlich.

Schritt 3: Benutzerdefiniertes Modell testen

Testen Sie das PyCaret-Modell lokal mit einem Code wie dem folgenden.

test_data = [
    [1, 237, 1, 1.75, 1.99, 0.00, 0.00, 0, 0, 0.5, 1.99, 1.75, 0.24, 'No', 0.0, 0.0, 0.24, 1],
    # Additional test rows...
]
col_names = ['Id', 'WeekofPurchase', 'StoreID', 'PriceCH', 'PriceMM', 'DiscCH', 'DiscMM',
            'SpecialCH', 'SpecialMM', 'LoyalCH', 'SalePriceMM', 'SalePriceCH',
            'PriceDiff', 'Store7', 'PctDiscMM', 'PctDiscCH', 'ListPriceDiff', 'STORE']

test_df = pd.DataFrame(test_data, columns=col_names)

my_pycaret_model = PyCaretModel(pycaret_mc)
output_df = my_pycaret_model.predict(test_df)
Copy

Schritt 4: Modellsignatur definieren

In diesem Beispiel verwenden Sie die Beispieldaten, um eine Modellsignatur zur Eingabevalidierung abzuleiten:

predict_signature = model_signature.infer_signature(input_data=test_df, output_data=output_df)
Copy

Schritt 5: Modell protokollieren

Der folgende Code protokolliert (registriert) das Modell in der Snowflake Model Registry.

snowml_registry = Registry(session)

custom_mv = snowml_registry.log_model(
    my_pycaret_model,
    model_name="'my_pycaret_best_model",
    version_name="version_1",
    conda_dependencies=["pycaret==3.0.2", "scipy==1.11.4", "joblib==1.2.0"],
    options={"relax_version": False},
    signatures={"predict": predict_signature},
    comment = 'My PyCaret classification experiment using the CustomModel API'
)
Copy

Schritt 6: Modell in der Registry überprüfen

Um zu überprüfen, ob das Modell in der Model Registry verfügbar ist, verwenden Sie die Funktion show_models.

snowml_registry.show_models()
Copy

Schritt 7: Vorhersagen mit dem registrierten Modell machen

Verwenden Sie die Funktion run, um das Modell für die Vorhersage aufzurufen.

snowpark_df = session.create_dataframe(test_data, schema=col_nms)

custom_mv.run(snowpark_df).show()
Copy

Nächste Schritte

Nachdem Sie ein PyCaret-Modell über die Snowflake Model Registry bereitgestellt haben, können Sie das Modell in Snowsight anzeigen. Rufen Sie die Seite Models unter AI & ML auf. Wenn Sie es dort nicht sehen, vergewissern Sie sich, dass Sie die ACCOUNTADMIN-Rolle oder die Rolle verwenden, die Sie zum Protokollieren des Modells verwendet haben.

Um das Modell von SQL aus zu verwenden, nutzen Sie SQL wie folgt:

SELECT
    my_pycaret_model!predict(*) AS predict_dict,
    predict_dict['prediction_label']::text AS prediction_label,
    predict_dict['prediction_score']::double AS prediction_score
from pycaret_input_data;
Copy