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 utilisateurs doivent avoir les privilèges nécessaires pour créer des schémas, des tables et des zones de préparation afin de créer un registre.

  • Le registre peut être rendu incohérent par la mise à jour des métadonnées du modèle en dehors de l’API Python.

  • Les modèles doivent être explicitement déployés pour pouvoir être utilisés.

  • Les modèles individuels ne peuvent pas faire l’objet d’un contrôle d’accès basé sur les rôles (mais les déploiements de modèles, qui sont des fonctions définies par l’utilisateur, le peuvent).

  • Le portage de l’API de registre nécessite la mise en œuvre de l’ensemble des fonctionnalités de registre dans le nouveau langage.

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 modèles sont stockés dans un schéma existant. Les schémas ne nécessitent aucune préparation particulière pour être utilisés en tant que registre, et les utilisateurs n’ont besoin que d’un seul privilège pour créer un modèle dans un schéma qu’ils ne possèdent pas.

  • Aucune métadonnée n’est stockée en dehors de l’objet modèle, de sorte que le registre ne peut pas devenir incohérent.

  • Les modèles contiennent des méthodes qui peuvent être appelées depuis SQL ou Python et qui n’ont pas besoin d’être déployées explicitement.

  • Les privilèges d’utilisation peuvent être accordés indépendamment pour des modèles spécifiques.

  • Le portage de l’API de registre dans un autre langage est simple puisque la bibliothèque Python est une fine couche au-dessus de SQL.

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
Copy

Utilisez model_registry.ModelRegistry pour accéder à la fonctionnalité du registre.

Public API

from snowflake.ml.registry import Registry
Copy

Utilisez la classe Registry pour accéder à la fonctionnalité du registre.

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(...)
Copy

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")
Copy

Public API

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

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")
Copy

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")
Copy

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, default, qui contient la version du modèle que vous avez désignée comme étant la version par défaut. Il s’agit de l’objet ModelVersion proprement dit, et non d’une chaîne.

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

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

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

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 run d’une version de modèle.

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

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;
Copy

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")
Copy

Public API

Les modèles et les versions de modèles permettent d’accéder à une description par l’intermédiaire des attributs comment et description équivalents.

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

Accès aux balises et mise à jour

Preview API

Les balises sont définies et accessibles au niveau de la version du modèle (les références du modèle se rapportent toujours à une version spécifique).

Toutes les balises

print(model.get_tags())
Copy

Ajouter une balise ou définir une nouvelle valeur de balise

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

Supprimer une balise

model.remove_tag("minor_rev")
Copy

Public API

Les balises sont définies au niveau du modèle (un modèle comprend une collection de versions) et sont mises en œuvre à l’aide de balises SQL. Voir Balisage d’objets pour savoir comment créer des balises et définir leurs valeurs autorisées.

Toutes les balises

print(m.show_tags())
Copy

Ajouter une balise ou définir une nouvelle valeur de balise

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

Supprimer une balise

m.unset_tag("minor_rev")
Copy

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

Définir une métrique hiérarchique (dictionnaire)

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

Définir une métrique multivalente (matricielle)

model.set_metric("confusion_matrix", test_confusion_matrix)
Copy

Tous les indicateurs

print(model.get_metrics())
Copy

Supprimer une métrique

model.remove_metric("test_accuracy")
Copy

Public API

Définir une métrique scalaire

m.set_metric("test_accuracy", test_accuracy)
Copy

Définir une métrique hiérarchique (dictionnaire)

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

Définir une métrique multivalente (matricielle)

m.set_metric("confusion_matrix", test_confusion_matrix)
Copy

Tous les indicateurs

print(m.get_metrics())
Copy

Supprimer une métrique

m.remove_metric("test_accuracy")
Copy

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")
Copy

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")
Copy

Répertorier des versions d’un modèle

Preview API

La méthode list_models renvoie un DataFrame de toutes les versions du modèle. Vous pouvez filtrer cette information pour n’afficher que les versions d’un modèle spécifique.

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

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 ModelVersion ou d’un DataFrame contenant des informations sur les versions du modèle.

Obtenir la liste des ModelVersions instances

version_list = m.versions()
Copy

Obtenir un DataFrame informationnel

version_df = m.show_versions()
Copy

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"
Copy

Vous pouvez alors obtenir la version par défaut du modèle, sous la forme d’un objet ModelVersion, comme suit.

mv = m.default
Copy

Ou vous pouvez appeler immédiatement sa méthode predict.

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