Apporter vos propres types de modèles via des fichiers sérialisés¶
Le registre des modèles prend en charge plusieurs types de modèles intégrés. Vous pouvez également connecter d’autres types de modèles, y compris ceux formés à l’aide d’outils externes ou obtenus à partir de référentiels open source, à condition qu’ils soient sérialisables et qu’ils étendent la classe snowflake.ml.model.custom_model.CustomModel
.
Ce guide explique comment :
Créer des modèles personnalisés.
Les connecter au Snowflake Model Registry.
Les déployer 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é¶
Snowflake ML autorise un nombre arbitraire d’arguments de type mot-clé lors de l’instanciation de la classe ModelContext
, ce qui vous permet d’inclure facilement des paramètres, des fichiers de configuration ou des instances de vos propres classes de modèles lors de la définition et de l’initialisation d’un modèle personnalisé.
Les attributs du contexte du modèle peuvent être des types de modèles pris en charge, tels que les types de modèles intégrés ou un chemin, tel qu’un chemin vers un répertoire contenant un modèle, un paramètre ou un fichier de configuration.
Vous trouverez ci-dessous un exemple montrant comment fournir des arguments de mot-clé par le biais du contexte du modèle et comment les utiliser dans une classe de modèle personnalisée :
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})
Tester et connecter un modèle personnalisé¶
Vous pouvez tester un modèle personnalisé en l’exécutant localement.
my_model = ExampleBringYourOwnModel(mc)
output_df = my_model.predict(input_df)
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_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)
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, nous spécifions le chemin vers le modèle sérialisé (pickled) à l’aide de l’attribut model_file
du contexte.
pycaret_mc = custom_model.ModelContext(
model_file = 'pycaret_best_model.pkl',
)
É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']
})
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_mc)
output_df = my_pycaret_model.predict(test_df)
É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)
Étape 5 : Connecter le modèle¶
Le code suivant connecte (enregistre) le modèle dans le registre des modèles de Snowflake.
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'
)
É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()
É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()
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;