Inférence par lots native de Snowflake (SQL)

Utilisez le registre des modèles de Snowflake pour exécuter des appels d’inférence par lots sur vos modèles. Vous pouvez intégrer ces appels d’inférence par lots à vos workflows Snowflake. Avec l’inférence par lots native de Snowflake, vous pouvez effectuer les opérations suivantes :

  • Intégrer vos appels d’inférence à vos workflows Snowflake SQL, Snowpark Python, Streaming et Dynamic Tables

  • Utiliser des outils tiers tels que dbt avec les résultats de vos appels d’inférence

Où exécuter un modèle ?

Sélectionner un environnement d’exécution

Vous pouvez héberger un modèle sur un entrepôt virtuel ou sur un pool de calcul SPCS. Utilisez les informations suivantes pour déterminer où héberger votre modèle.

Temps d’exécution

Mieux adapté pour…

Éviter en cas…

Entrepôt virtuel

• In-Database Batch Inference: Executing models as native SQL functions.
• Zero-Ops Experience: Leveraging existing warehouses without managing compute pools.
• Small Models: CPU-runnable models (e.g., scikit-learn, XGBoost).
• Hardware Constraints: The model requires a GPU for execution.
• Memory Limits: Model size exceeds 15GB. (this limit is lower for smaller warehouse sizes).

Snowpark Container Services (SPCS)

• Large Models: Optimized for LLMs, deep learning models requiring high memory, or models requiring GPUs.
• Custom Environments: For specific pip packages or a custom OS-level environment not found in standard warehouses.
• Organizational Policy: SPCS is not yet approved or enabled in your account.
• Sufficient warehouse compute: If your warehouse can process your batch inference requests, you don’t need the additional compute from SPCS.

Exécuter un modèle sur un entrepôt

Pour héberger votre modèle sur un entrepôt, spécifiez WAREHOUSE dans l’argument target_plateforms pour enregistrer votre modèle. Pour plus d’informations, consultez la section Utilisation des dépendances et des plateformes cibles.

Pour savoir si un modèle existant est exécutable dans un entrepôt, exécutez SHOW VERSIONS IN MODEL. Si la colonne runnable_in indique WAREHOUSE comme valeur, vous pouvez l’exécuter.

Exécuter un modèle sur SPCS

Pour utiliser votre modèle dans SPCS, vous devez déployer le modèle en tant que service. Pour plus d’informations sur le déploiement d’un modèle dans SPCS, consultez la section Déploiement du modèle pour l’inférence en ligne. Assurez-vous que la suspension automatique est active.

Note

Si votre service est suspendu, il se relance automatiquement lorsqu’il existe une demande d’inférence. Cependant, si le service ne parvient pas à se relancer dans un délai déterminé, la requête peut échouer. Les requêtes peuvent ne pas réussir à se relancer s’il manque des nœuds disponibles dans le pool de calcul. Pour atténuer ce risque, vous pouvez explicitement relancer le service et attendre sa disponibilité.

Utilisez un entrepôt XSMALL ou SMALL pour acheminer vos demandes d’inférence vers le pool de calcul SPCS. Un entrepôt peut exécuter plusieurs threads par nœud et envoyer un grand nombre de demandes d’inférence avec chaque requête. Par conséquent, le service fonctionnant au sein de SPCS peut être facilement surchargé. Par conséquent, il est recommandé d’utiliser un entrepôt XSMALL ou SMALL lorsque le modèle est déployé dans SPCS.

Inférence à partir de Python

Si vous utilisez l’API Snowflake Python pour effectuer des requêtes d’inférence, vous devez disposer du paquet snowflake-ml-python.

Se connecter au registre des modèles

Récupérez le modèle que vous utilisez pour les demandes d’inférence à partir du registre des modèles. Utilisez le code suivant pour récupérer le modèle :

from snowflake.ml.registry import Registry

registry = Registry(session=session, database_name=DATABASE, schema_name=REGISTRY_SCHEMA)
mv = registry.get_model('my_model').version('my_version')  # returns ModelVersion
Copy

Exécuter une tâche d’inférence par lots

Utilisez la méthode d’exécution de votre objet de version de modèle pour exécuter une tâche d’inférence par lots. En utilisant la méthode d’exécution, vous pouvez :

  • Exécuter une tâche d’inférence sur un entrepôt ou un pool de calcul SPCS.

  • Fournir un dataframe Snowpark ou pandas avec les données d’inférence.

La méthode d’exécution renvoie un dataframe qui correspond au type de dataframe que vous avez spécifié. Par exemple, si vous spécifiez un dataframe pandas comme entrée, vous obtenez un dataframe pandas comme sortie.

Note

Les DataFrames Snowpark sont soumis à une évaluation paresseuse. L’exécution ne se produit que lorsque la méthode collect, show ou to_pandas du DataFrame est utilisée.

L’exemple suivant exécute une tâche d’inférence par lots sur un entrepôt :

# Run inference on a warehouse
# mv: snowflake.ml.model.ModelVersion
remote_prediction = mv.run(input_features, function_name="predict")
remote_prediction.show()
Copy

Pour exécuter l’inférence sur SPCS au lieu d’un entrepôt, ajoutez l’argument service_name à l’appel run :

# Run inference on SPCS
# mv: snowflake.ml.model.ModelVersion
remote_prediction = mv.run(input_features, function_name="predict", service_name="example_spcs_service")
remote_prediction.show()
Copy

Pour voir les méthodes que vous pouvez appeler à partir d’un modèle, exécutez mv.show_functions. La valeur de retour de cette méthode est une liste d’objets ModelFunctionInfo. Chacun de ces objets comprend les attributs suivants :

  • name : Nom de la fonction qui peut être appelée depuis Python ou SQL.

  • target_method : Nom de la méthode Python dans le modèle original enregistré.

# Get signature of the inference function in Python
# mv: snowflake.ml.model.ModelVersion
mv.show_functions()
Copy

Transmission de paramètres pendant l’inférence

Si la signature du modèle comprend des paramètres définis dans l’objet ParamSpec, vous pouvez transmettre les valeurs des paramètres au moment de l’inférence en utilisant l’argument params. Tout paramètre non inclus dans le dictionnaire utilise sa valeur par défaut à partir de la signature. L’argument params fonctionne de la même manière que vous exécutiez l’inférence sur un entrepôt ou sur SPCS.

# Pass parameters to override default values
# mv: snowflake.ml.model.ModelVersion
remote_prediction = mv.run(
    input_features,
    function_name="predict",
    params={"temperature": 0.9, "max_tokens": 512}
)
Copy

Inférence à partir de SQL

Utilisez la commande suivante pour comprendre les fonctions disponibles et la signature d’une version de modèle :

SHOW FUNCTION IN MODEL mymodel VERSION myversion;
Copy

Exécuter un modèle sur un entrepôt

Utilisez la syntaxe MODEL(model_name)!method_name(...) pour appeler ou invoquer les méthodes d’un modèle. Les méthodes disponibles sur un modèle sont déterminées par la classe de modèle Python sous-jacente. Par exemple, de nombreux types de modèles utilisent une méthode appelée « prédire » pour l’inférence.

Pour appeler une méthode du modèle par défaut, utilisez la syntaxe suivante. Incluez les arguments de la méthode entre parenthèses et spécifiez la table contenant les données d’inférence dans la clause FROM.

SELECT MODEL(<model_name>)!<method_name>(...) FROM <table_name>;
Copy

Pour invoquer une méthode à partir d’une version spécifique d’un modèle, créez un alias vers la version spécifique du modèle et appelez la méthode par l’intermédiaire de l’alias.

Utilisez la syntaxe suivante pour appeler une méthode à partir d’une version spécifique d’un modèle.

SELECT MODEL(<model_name>,<version_or_alias_name>)!<method_name>(...) FROM <table_name>;
Copy

L’exemple suivant utilise l’alias LAST pour appeler la dernière version d’un modèle.

SELECT MODEL(my_model,LAST)!predict(...) FROM my_table;
Copy

Transmission de paramètres en SQL

Si la signature du modèle comprend des paramètres définis avec ParamSpec, vous pouvez transmettre les valeurs des paramètres en tant qu’arguments supplémentaires après les colonnes d’entrée. Les paramètres peuvent être spécifiés par la position ou par le nom.

Lorsque vous utilisez des arguments positionnels, les paramètres peuvent être omis du côté droit, et les valeurs par défaut de la signature sont utilisées :

-- Pass all parameters positionally (temperature, then max_tokens)
SELECT MODEL(my_model, v1)!predict(input_text, 0.9, 512) FROM my_table;

-- Omit max_tokens from the right; its default value from the signature is used
SELECT MODEL(my_model, v1)!predict(input_text, 0.9) FROM my_table;
Copy

En cas d’utilisation d’arguments nommés, tous les arguments (y compris les colonnes d’entrée) doivent être spécifiés par leur nom. Cela vous permet de ne transmettre que des paramètres spécifiques, quelle que soit leur position :

SELECT MODEL(my_model, v1)!predict(
    input_text => input_text,
    max_tokens => 512
) FROM my_table;
Copy

Note

Vous devez spécifier tous les arguments soit par leur nom, soit par leur position. Vous ne pouvez pas mélanger des arguments positionnels et nommés dans le même appel.

Exécuter un modèle sur SPCS

Contrairement à l’exécution dans un entrepôt, les fonctions peuvent être appelées à partir d’un service en appelant service_name!method_name(...).

SELECT <mservice_name>!<method_name>(...) FROM <table_name>;
Copy

Les paramètres sont transmis de la même manière que pour les fonctions d’entrepôt, soit tous par leur position, soit tous par leur nom :

-- Positional
SELECT my_service!predict(input_text, 0.9, 512) FROM my_table;

-- Named arguments (all arguments must be named)
SELECT my_service!predict(input_text => input_text, max_tokens => 512) FROM my_table;
Copy

Inférence de modèles en continu avec des tables dynamiques

Les tables dynamiques de Snowflake établissent une couche de transformation continue sur les données en continu. En définissant une table dynamique qui applique les prédictions d’un modèle de machine learning aux données entrantes, vous pouvez maintenir un pipeline d’inférence de modèle automatisé fonctionnant en continu sur les données sans avoir besoin d’une orchestration manuelle.

Considérons, par exemple, un flux d’événements de connexion alimentant une table (LOGINS_RAW), qui comprend des colonnes telles que USER_ID, LOCATION et un horodatage. Cette table est ensuite mise à jour avec les prédictions du modèle concernant le risque de connexion pour les événements nouvellement arrivés. Fondamentalement, seules les nouvelles lignes sont traitées avec les prédictions du modèle.

SQL

Les tables dynamiques offrent aux utilisateurs de Snowflake une capacité robuste leur permettant d’effectuer une inférence incrémentielle sur les données entrantes. Utilisez SQL pour définir une table dynamique qui fait référence au modèle et l’applique aux nouvelles lignes entrantes dans LOGINS_RAW :

CREATE OR REPLACE DYNAMIC TABLE logins_with_predictions
    WAREHOUSE = my_wh
    TARGET_LAG = '20 minutes'
    REFRESH_MODE = INCREMENTAL
    INITIALIZE = on_create
    COMMENT = 'Dynamic table with continuously updated model predictions'
AS
SELECT
    login_id,
    user_id,
    location,
    event_time,
    MODEL(ml.registry.mymodel)!predict(l.user_id, l.location) AS prediction_result
FROM logins_raw;
Copy

Snowpark Python

L’API de Snowpark Python vous permet d’accéder au registre des modèles par programmation et d’exécuter l’inférence directement sur le site DataFrames. Cette approche peut être plus souple et plus facile à maintenir, en particulier dans les environnements axés sur le code.

from snowflake.snowpark import Session
from snowflake.snowpark.functions import col
from snowflake.ml.registry import Registry

# Initialize the registry
reg = Registry(session=sp_session, database_name="ML", schema_name="REGISTRY")

# Retrieve the default model version from the registry
model = reg.get_model("MYMODEL")

# Load the source data
df_raw = sp_session.table("LOGINS_RAW")

# Run inference on the necessary features
predictions_df = model.run(df_raw.select("USER_ID", "LOCATION"))

# Join predictions back to the source data
joined_df = df_raw.join(predictions_df, on=["USER_ID", "LOCATION"])

# Create or replace a dynamic table from the joined DataFrame
joined_df.create_or_replace_dynamic_table(
    name="LOGINS_WITH_PREDICTIONS",
    warehouse="MY_WH",
    lag='20 minutes',
    refresh_mode='INCREMENTAL',
    initialize="ON_CREATE",
    comment="Dynamic table continuously updated with model predictions"
)
Copy

L’échantillon de code ci-dessus exécutera automatiquement l’inférence à l’aide de MYMODEL sur les nouvelles données contenues dans LOGINS_RAW toutes les 20 minutes.

Immuable vs volatile

Cette valeur incrémentielle est essentielle et nécessite que toutes les fonctions invoquées dans la définition de table dynamique soient désignées comme IMMUTABLE. Alors que les fonctions au sein d’un modèle standard sont généralement IMMUTABLE, les modèles personnalisés ont pour valeur par défaut VOLATILE. Si le modèle sous-jacent est connu comme étant immuable, il est essentiel de s’assurer que la fonction de modèle correspondante est explicitement marquée comme immuable lorsque le modèle est enregistré.