Snowpark ML Ops : migration à partir de l’API en avant-première du registre des modèles¶
Snowflake a précédemment mis à la disposition de certains clients en avant-première un registre des modèles. La fonction de registre décrite dans cette rubrique présente des changements significatifs en termes de fonctionnalité et d’APIs par rapport à la version en avant-première. En particulier, la fonctionnalité principale du registre est désormais hébergée nativement dans Snowflake à l’aide d’un nouvel objet de modèle au niveau du schéma.
Note
La version de prévisualisation publique ne prend pas encore en charge le déploiement de modèles vers Snowpark Container Services (SPCS). Si vous comptez sur cette fonctionnalité, continuez pour l’instant à utiliser le registre disponible en avant-première privée.
Ce tableau résume les principales différences entre les deux mises en œuvre du registre. L’API de la version disponible en avant-première privée est appelée « Preview API », tandis que l’API actuelle disponible au public est appelée « API publique ».
Preview API |
Public API |
---|---|
Les métadonnées sont stockées dans des tables. Les modèles sont stockés dans des zones de préparation. L’API de registre est une bibliothèque Python qui crée et maintient ces objets pour les modèles stockés dans le registre.
|
Les modèles sont des objets natifs de niveau schéma, comme les tables et les zones de préparation. L’API de registre Python est une classe qui facilite l’interaction avec les objets du modèle en Python, en utilisant SQL sous le capot.
|
Les sections suivantes décrivent plus en détail les différences entre les deux APIs.
Importation et accès à l’API de registre¶
Les deux APIs de registre font partie du paquet principal Snowpark ML snowflake.ml
.
Preview API |
from snowflake.ml.registry import model_registry
Utilisez |
---|---|
Public API |
from snowflake.ml.registry import Registry
Utilisez la classe |
Création d’un registre¶
La Preview API exige que le registre soit créé par la bibliothèque Python.
Preview API |
model_registry.create_model_registry(...)
Obligatoire avant d’utiliser le registre pour la première fois. |
---|---|
Public API |
Sans objet. Tout schéma existant peut être utilisé comme registre. |
Ouverture d’un registre¶
Vous ouvrez un registre pour y ajouter de nouveaux modèles et pour travailler avec les modèles qui s’y trouvent déjà.
Preview API |
reg = model_registry.ModelRegistry(
session=session,
database_name="MODEL_REGISTRY")
|
---|---|
Public API |
reg = Registry(
session=session,
database_name="ML",
schema_name="REGISTRY")
|
Journalisation d’un modèle¶
L’ajout d’un modèle au registre s’appelle journalisation. Les deux APIs utilisent une méthode de registre appelée log_model
à cette fin. Cette méthode présente deux différences mineures dans la Public API :
Le paramètre qui spécifie la version du modèle, précédemment appelé
model_version
, est maintenant appeléversion_name
pour mieux refléter sa sémantique.Vous ne pouvez pas définir de balises lors de l’enregistrement d’un modèle. Au lieu de cela, ajoutez des balises après la journalisation en utilisant la méthode
set_tag
du modèle.
Obtention d’une référence à un modèle¶
L’obtention d’une référence à un modèle permet de mettre à jour ses métadonnées et d’effectuer d’autres opérations sur celui-ci.
Preview API |
L’obtention d’un modèle à partir du registre renvoie toujours une version spécifique du modèle, il est donc nécessaire de spécifier la version souhaitée lorsque vous récupérez le modèle. model = model_registry.ModelReference(
registry=registry,
model_name="my_model",
model_version="101")
|
---|---|
Public API |
Les versions du modèle sont distinctes du modèle lui-même. Pour obtenir une référence au modèle : m = reg.get_model("my_model")
Pour obtenir une référence à une version spécifique, il faut d’abord obtenir une référence au modèle comme indiqué ci-dessus, puis récupérer la version souhaitée. Notez que l’objet modèle possède un attribut, mv = m.version('v1')
mv = m.default
|
Déploiement d’un modèle¶
Preview API |
Les modèles doivent être explicitement déployés dans un entrepôt (en tant que fonction définie par l’utilisateur) ou dans Snowpark Container Services (en tant que service). Cet exemple illustre le déploiement dans un entrepôt. model.deploy(
deployment_name="my_warehouse_predict",
target_method="predict",
permanent=True)
|
---|---|
Public API |
Il n’est pas nécessaire de déployer explicitement un modèle. |
Utilisation d’un modèle pour l’inférence¶
L’inférence consiste à utiliser le modèle pour faire des prédictions sur les données d’essai.
Preview API |
Spécifiez le nom de déploiement que vous avez utilisé lorsque vous avez déployé le modèle afin d’exécuter l’inférence. result_dataframe = model.predict(
"my_warehouse_predict", test_dataframe)
|
---|---|
Public API |
Les modèles sont gérés dans un entrepôt. Vous pouvez appeler des méthodes du modèle à partir de Python ou de SQL. Python Vous appelez des méthodes en utilisant la méthode remote_prediction = mv.run(
test_features, function_name="predict")
SQL Vous pouvez appeler les méthodes de la version par défaut à l’aide d’une simple requête SELECT ou spécifier une version à l’aide d’une clause WITH. -- 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;
|
Accès aux descriptions et mise à jour¶
Preview API |
La référence du modèle fournit des méthodes getter et setter pour la description. (Dans ce API, une référence de modèle renvoie toujours à une version spécifique du modèle). print(model.get_model_description())
model.set_model_description("A better description")
|
---|---|
Public API |
Les modèles et les versions de modèles permettent d’accéder à une description par l’intermédiaire des attributs 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"
|
Accès aux métriques et mise à jour¶
Dans les deux APIs, les métriques sont définies au niveau de la version du modèle.
Preview API |
Définir une métrique scalaire model.set_metric("test_accuracy", test_accuracy)
Définir une métrique hiérarchique (dictionnaire) model.set_metric("dataset_test", {"accuracy": test_accuracy})
Définir une métrique multivalente (matricielle) model.set_metric("confusion_matrix", test_confusion_matrix)
Tous les indicateurs print(model.get_metrics())
Supprimer une métrique model.remove_metric("test_accuracy")
|
---|---|
Public API |
Définir une métrique scalaire m.set_metric("test_accuracy", test_accuracy)
Définir une métrique hiérarchique (dictionnaire) mo.set_metric("dataset_test", {"accuracy": test_accuracy})
Définir une métrique multivalente (matricielle) m.set_metric("confusion_matrix", test_confusion_matrix)
Tous les indicateurs print(m.get_metrics())
Supprimer une métrique m.remove_metric("test_accuracy")
|
Suppression d’un modèle¶
Preview API |
Vous ne pouvez supprimer que des versions spécifiques d’un modèle. Pour supprimer complètement le modèle, supprimez toutes ses versions. registry.delete_model(
model_name="my_model",
model_version="100")
|
---|---|
Public API |
La suppression d’un modèle supprime toutes ses versions. Il n’est pas possible actuellement de supprimer une seule version. reg.delete_model("mymodel")
|
Répertorier des versions d’un modèle¶
Preview API |
La méthode model_list = registry.list_models()
model_list.filter(model_list["NAME"] == "mymodel").show()
|
---|---|
Public API |
Étant donné une référence de modèle, vous pouvez obtenir les versions du modèle sous la forme d’une liste d’instances Obtenir la liste des ModelVersions instances version_list = m.versions()
Obtenir un DataFrame informationnel version_df = m.show_versions()
|
Gestion du cycle de vie du modèle¶
Il est prévu de gérer le cycle de vie d’un modèle à l’aide de balises. Par exemple, vous pouvez créer une balise appelée stage
pour enregistrer le statut actuel du modèle, en utilisant des valeurs telles que « expérimental », « alpha », « bêta », « production », « déprécié » et « obsolète ».
Dans la Public API, les balises sont mises en œuvre à l’aide d’objets de balises SQL. Voir Balisage d’objets pour savoir comment créer des balises et définir leurs valeurs autorisées.
La Public API a également le concept de version par défaut d’un modèle, qui est le modèle utilisé lorsqu’une version n’est pas spécifiée, en particulier en SQL. Lorsque vous formez une nouvelle version d’un modèle et que le nouveau modèle est prêt à être utilisé à grande échelle, vous pouvez mettre à jour la version par défaut. Vous pouvez définir la version par défaut en utilisant l’attribut default
du modèle.
m.default = "2"
Vous pouvez alors obtenir la version par défaut du modèle, sous la forme d’un objet ModelVersion
, comme suit.
mv = m.default
Ou vous pouvez appeler immédiatement sa méthode predict
.
m.default.run(test_features, function_name="predict"))