Apporter vos propres types de modèles via des fichiers sérialisés

Le registre des modèles permet de connecter les types de modèles intégrés directement dans le registre. Nous fournissons également une méthode permettant de connecter d’autres types de modèles à snowflake.ml.model.custom_model.CustomModel. Les modèles sérialisables formés à l’aide d’outils externes ou obtenus à partir de référentiels open source peuvent être utilisés avec CustomModel.

Ce guide explique comment :

  • Créez un modèle personnalisé.

  • Créez un contexte de modèle avec des fichiers et des objets de modèle.

  • Connectez le modèle client à Snowflake Model Registry.

  • Déployez le modèle pour l’inférence.

Note

Ce démarrage rapide fournit un exemple de connexion d’un modèle personnalisé PyCaret.

Définition du contexte du modèle à l’aide d’arguments de type mot-clé

Le snowflake.ml.model.custom_model.ModelContext peut être instancié avec des arguments de type mot-clé définis par l’utilisateur. Les valeurs peuvent être des chemins de fichiers sous forme de chaînes ou des instances de types de modèles pris en charge </developer-guide/snowflake-ml/model-registry/built-in-models/overview>. Les fichiers et les modèles sérialisés seront empaquetés avec le modèle pour être utilisés dans la logique d’inférence du modèle.

Les fichiers peuvent être des modèles sérialisés, des fichiers de configuration ou des fichiers contenant des paramètres. Une utilisation courante consiste à charger un fichier pickle ou json dans le modèle personnalisé __init__ ou dans la méthode d’inférence.

Vous trouverez ci-dessous un exemple montrant comment fournir des modèles et des fichiers avec le contexte de modèle, et les utiliser dans une classe de modèle personnalisée :

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

# Initialize ModelContext with keyword arguments
# my_model can be any supported model type
# my_file_path is a local pickle file path
model_context = custom_model.ModelContext(
    my_model=my_model,
    my_file_path='/path/to/file.pkl',
)

# 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)

        # Use 'my_file_path' key from the context to load the pickled object
        with open(self.context['my_file_path'], 'rb') as f:
            self.obj = pickle.load(f)

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

# Instantiate the custom model with the model context. This instance can be logged in the model registry.
my_model = ExampleBringYourOwnModel(model_context)
Copy

Tester et connecter un modèle personnalisé

Vous pouvez tester un modèle personnalisé en l’exécutant localement.

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

Lorsque le modèle fonctionne comme prévu, connectez-le au Snowflake Model Registry. Comme indiqué dans l’exemple de code suivant, fournissez conda_dependencies (ou pip_requirements) pour spécifier les bibliothèques dont la classe de modèle a besoin. Fournissez sample_input_data (un pandas ou un DataFrame Snowpark) pour déduire la signature d’entrée du modèle. Vous pouvez également fournir une signature du modèle.

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

Exemple : Connecter un modèle PyCaret

PyCaret est un paquet tiers à faible code et à haute efficacité que Snowflake ne supporte pas de manière native. Vous pouvez apporter vos propres types de modèles par des méthodes similaires.

Étape 1 : Définir le contexte du modèle

Avant de connecter le modèle, définissez un ModelContext qui fait référence à votre propre type de modèle qui n’est pas pris en charge nativement par Snowflake ML. Dans ce cas, vous spécifiez le chemin vers le modèle sérialisé (pickled) à l’aide de l’attribut model_file du contexte. Vous pouvez choisir n’importe quel nom pour l’attribut tant que ce nom n’est pas utilisé pour autre chose.

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

Important

Lorsque vous combinez un type de modèle pris en charge (tel que XGBoost) avec des modèles ou des données non pris en charge, vous n’avez pas besoin de sérialiser vous-même le modèle pris en charge. Paramétrez l’objet de modèle pris en charge directement dans le contexte (par exemple, base_model = my_xgb_model) et il est sérialisé automatiquement.

Étape 2 : Créer une classe de modèle personnalisée

Définissez une classe de modèle personnalisée pour connecter un type de modèle sans support natif. Dans cet exemple, une classe PyCaretModel, dérivée de CustomModel, est définie pour que le modèle puisse être connecté au registre.

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

Note

Comme indiqué, définissez le répertoire de la mémoire du modèle sur /tmp/. Les nœuds de l’entrepôt de Snowflake ont un accès restreint aux répertoires. /tmp est toujours accessible en écriture et constitue un choix sûr lorsque le modèle a besoin d’un emplacement pour écrire des fichiers. Cela peut ne pas être nécessaire pour d’autres types de modèles.

Étape 3 : Tester le modèle personnalisé

Testez le modèle PyCaret localement à l’aide d’un code comme le suivant.

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_model_context)
output_df = my_pycaret_model.predict(test_df)
Copy

Étape 4 : Définir une signature de modèle

Dans cet exemple, utilisez les données de l’échantillon pour déduire une signature de modèle pour la validation des entrées :

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

Étape 5 : Connecter le modèle

Le code suivant journalise (enregistre) le modèle dans 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

Étape 6 : Vérifier le modèle dans le registre

Pour vérifier que le modèle est disponible dans le registre des modèles, utilisez la fonctionnalité show_models.

snowml_registry.show_models()
Copy

Étape 7 : Faire des prédictions avec le modèle enregistré

Utilisez la fonctionnalité run pour appeler le modèle de prédiction.

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

custom_mv.run(snowpark_df).show()
Copy

Prochaines étapes

Après avoir déployé un modèle PyCaret via le Snowflake Model Registry, vous pouvez voir le modèle dans Snowsight. Naviguez jusqu’à la page Models sous AI & ML. Si vous ne le voyez pas, assurez-vous que vous utilisez le rôle ACCOUNTADMIN ou le rôle que vous avez utilisé pour connecter le modèle.

Pour utiliser le modèle depuis SQL, utilisez SQL comme suit :

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