Snowflake Native Batch-Inferenz (SQL)

Verwenden Sie die Snowflake Modell-Registry, um Batch-Inferenzaufrufe für Ihre Modelle auszuführen. Sie können diese Batch-Inferenzaufrufe in Ihre Snowflake-Workflows integrieren. Mit Snowflake Native Batch-Inferenz können Sie Folgendes tun:

  • Integration in Ihre Snowflake-SQL-, Snowpark Python-, Streaming- und dynamischen Tabellen-Workflows.

  • Verwenden von Tools von Drittanbietern wie dbt mit den Ergebnissen Ihrer Inferenzaufrufe

Wo kann ein Modell ausgeführt werden?

Auswählen einer Laufzeitumgebung

Sie können ein Modell entweder in einem Virtual Warehouse oder in einem hosten SPCS-Computepool hosten. Verwenden Sie die folgenden Informationen, um festzustellen, wo Sie Ihr Modell hosten.

Laufzeit

Am besten geeignet für …

Vermeiden, wenn …

Virtuelles Warehouse

• 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.

So führen Sie das Modell auf dem Warehouse aus

Um Ihr Modell in einem Warehouse zu hosten, geben Sie WAREHOUSE im Argument „target_platforms“ zum Protokollieren des Modells an. Weitere Informationen dazu finden Sie unter dem Thema zum Verwenden von Abhängigkeiten und Zielplattformen.

Um Informationen darüber zu erhalten, ob ein vorhandenes Modell in einem Warehouse ausgeführt werden kann, führen Sie SHOW VERSIONS IN MODEL aus. Wenn für die Spalte „runnable_in“ der Wert WAREHOUSE festgelegt ist, können Sie es ausführen.

So führen Sie das Modell unter SPCS aus

Damit Sie das Modell in SPCS verwenden können, müssen Sie das Modell als Dienst bereitstellen. Weitere Informationen zum Bereitstellen eines Modells für SPCS finden Sie im Thema zum Bereitstellen des Modells für Online-Inferenz. Stellen Sie sicher, dass das automatische Anhalten aktiv ist.

Bemerkung

Wenn Ihr Dienst ausgesetzt wird, wird er automatisch fortgesetzt, sobald eine Inferenzanfrage vorliegt. Wenn der Dienst jedoch nicht innerhalb eines bestimmten Zeitrahmens fortgesetzt wird, kann die Abfrage fehlschlagen. Abfragen werden möglicherweise nicht fortgesetzt, wenn keine Konten mehr im Computepool verfügbar sind. Um dieses Risiko zu minimieren, können Sie den Dienst explizit fortsetzen und auf seine Verfügbarkeit warten.

Verwenden Sie ein Warehouse der Größe XSMALL oder SMALL, um Ihre Inferenzanfragen an den SPCS-Computepool weiterzuleiten. Ein Warehouse kann mehrere Threads pro Knoten ausführen und mit jeder Anfrage eine große Anzahl von Inferenzanfragen senden. Folglich kann der Dienst, der in SPCS ausgeführt wird, leicht überfordert werden. Daher wird empfohlen, ein Warehouse der Größe XSMALL oder SMALL zu nutzen, wenn das Modell in SPCS bereitgestellt wird.

Inferenz aus Python

Wenn Sie die Snowflake Python-API verwenden, um Inferenzanfragen zu stellen, müssen Sie über das snowflake-ml-python-Paket verfügen.

Verbinden mit Modell-Registry

Rufen Sie das Modell, das Sie für Inferenzanfragen verwenden, aus der Modell-Registry ab. Verwenden Sie den folgenden Code, um das Modell abzurufen:

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

Batch-Inferenz-Job ausführen

Verwenden Sie die Run-Methode des Modellversionsobjekts, um einen Batch-Inferenz-Job auszuführen. Mit der Run-Methode können Sie Folgendes tun:

  • Einen Inferenz-Job entweder in einem Warehouse oder in einem SPCS-Computepool ausführen.

  • Einen Snowpark- oder pandas-Datenframe mit den Inferenzdaten bereitstellen.

Die Run-Methode gibt einen Datenframe zurück, der dem Typ des von Ihnen angegebenen Datenframes entspricht. Wenn Sie zum Beispiel einen pandas-Datenframe als Eingabe angeben, erhalten Sie einen pandas-Datenframe als Ausgabe.

Bemerkung

Snowpark-DataFrames durchlaufen nur eine „faule“ Evaluierung. Die Ausführung erfolgt nur bei der Methode „collect“, „show“ oder „to_pandas“ des DataFrame.

Das folgende Beispiel führt einen Batch-Inferenz-Job für ein Warehouse aus:

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

Um die Inferenz in SPCS anstelle eines Warehouses auszuführen, fügen Sie das service_name-Argument für den run-Aufruf hinzu:

# 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

Um die Methoden zu sehen, die Sie von einem Modell aus aufrufen können, führen Sie „mv.show_functions“ aus. Der Rückgabewert dieser Methode ist eine Liste von ModelFunctionInfo-Objekten. Jedes dieser Objekte enthält die folgenden Attribute:

  • name: Der Name der Funktion, die von Python oder SQL aufgerufen werden kann.

  • target_method: Der Name der Python-Methode in dem ursprünglich protokollierten Modell.

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

Übergeben von Parametern während der Inferenz

Wenn die Signatur des Modells Parameter enthält, die im Objekt ParamSpec definiert sind, können Sie Parameterwerte zur Inferenzzeit mithilfe des Arguments params übergeben. Jeder Parameter, der nicht im Dictionary enthalten ist, verwendet seinen Standardwert aus der Signatur. Das params-Argument funktioniert auf dieselbe Weise, unabhängig davon, ob Sie die Inferenz für ein Warehouse oder für SPCS ausführen.

# 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

Inferenz aus SQL

Verwenden Sie den folgenden Befehl, um die verfügbaren Funktionen und die Signatur für eine Modellversion zu verstehen:

SHOW FUNCTION IN MODEL mymodel VERSION myversion;
Copy

So führen Sie das Modell auf dem Warehouse aus

Verwenden Sie die Syntax MODEL(model_name)!method_name(...), um Methoden eines Modells aufzurufen. Die für ein Modell verfügbaren Methoden werden durch die zugrunde liegende Python-Modellklasse bestimmt. Viele Arten von Modellen verwenden zum Beispiel eine Methode namens Vorhersage für die Inferenz.

Um eine Methode des Standardmodells aufzurufen, verwenden Sie die folgende Syntax. Fügen Sie alle Methodenargumente in Klammern ein und geben Sie in der FROM-Klausel die Tabelle an, die die Inferenzdaten enthält.

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

Um eine Methode aus einer bestimmten Version eines Modells aufzurufen, erstellen Sie einen Alias für die spezifisch Version des Modells und rufen dann die Methode über den Alias auf.

Verwenden Sie die folgende Syntax, um eine Methode aus einer bestimmten Version eines Modells aufzurufen.

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

Das folgende Beispiel verwendet den Alias LAST, um die neueste Version eines Modells aufzurufen.

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

Übergeben von Parametern in SQL

Wenn die Signatur des Modells Parameter enthält, die mit ParamSpec definiert sind, können Sie Parameterwerte als zusätzliche Argumente nach den Eingabespalten übergeben. Parameter können über die Position oder über den Namen angegeben werden.

Bei der Verwendung von Positionsargumenten können die Parameter auf der rechten Seite weggelassen werden, und die Standardwerte aus der Signatur werden verwendet:

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

Bei der Verwendung von benannten Argumenten müssen alle Argumente (einschließlich der Eingabespalten) mit dem Namen angegeben werden. So können Sie nur bestimmte Parameter übergeben, unabhängig von deren Position:

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

Bemerkung

Sie müssen alle Argumente über den Namen oder über die Position angeben. Sie können Positionsargumente und benannte Argumente nicht in demselben Aufruf vermischen.

So führen Sie das Modell unter SPCS aus

Im Gegensatz zur Ausführung in einem Warehouse können Funktionen von einem Dienst aus aufgerufen werden, indem service_name!method_name(...) aufgerufen wird.

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

Parameter werden auf die gleiche Weise wie bei Warehouse-Funktionen übergeben, entweder alle positionsbezogen oder alle über den Namen:

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

Kontinuierliche Modellinferenz mit dynamischen Tabellen

Die dynamischen Tabellen von Snowflake bieten eine kontinuierliche Transformationsschicht über Streaming-Daten. Durch die Definition einer dynamischen Tabelle, die die Vorhersagen eines Machine Learning-Modells auf eingehende Daten anwendet, kann eine automatisierte, kontinuierlich arbeitende Modellinferenz-Pipeline für die Daten aufrechterhalten werden, ohne dass eine manuelle Orchestrierung erforderlich ist.

Betrachten Sie zum Beispiel einen Stream von Anmeldeereignissen, die eine Tabelle füllen (LOGINS_RAW), die Spalten wie USER_ID, LOCATIONund einen Zeitstempel umfasst. Diese Tabelle wird anschließend mit den Vorhersagen des Modells bezüglich des Anmeldungsrisikos für neu eingetretene Ereignisse aktualisiert. Hier ist wichtig, dass nur neue Zeilen mit den Vorhersagen des Modells verarbeitet werden.

SQL

Dynamische Tabellen bieten Snowflake-Benutzenden eine robuste Möglichkeit, um inkrementelle Inferenzen für eingehende Daten auszuführen. Verwenden Sie SQL, um eine dynamische Tabelle zu definieren, die das Modell referenziert und es auf neu eingehende Zeilen in LOGINS_RAW anwendet:

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

Mit der Snowpark Python-API können Sie programmgesteuert auf die Modell-Registry zugreifen und Inferenzen direkt auf DataFrames ausführen. Dieser Ansatz kann flexibler und wartungsfreundlicher sein, insbesondere in codegesteuerten Umgebungen.

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

Das obige Codebeispiel führt automatisch alle 20 Minuten eine Inferenz mit MYMODEL auf neue Daten in LOGINS_RAW durch.

Unveränderlich im Vgl. zu flüchtig

Diese Inkrementalität ist wichtig und erfordert, dass alle Funktionen, die innerhalb der Definition der dynamischen Tabelle aufgerufen werden, als IMMUTABLE festgelegt werden. Während Funktionen innerhalb eines Standardmodells in der Regel sind IMMUTABLE sind, sind kundenspezifischen Modellen standardmäßig VOLATILE. Wenn das zugrunde liegende Modell als unveränderlich bekannt ist, muss unbedingt sichergestellt werden, dass die entsprechende Modellfunktion bei Protokollierung des Modells ausdrücklich als unveränderlich markiert wird.