Freigeben über


Berechnen von On-Demand-Features mithilfe von benutzerdefinierten Python-Funktionen

In diesem Artikel wird beschrieben, wie Sie On-Demand-Features in Azure Databricks erstellen und verwenden.

Ihr Arbeitsbereich muss für Unity Catalog aktiviert sein, und Sie müssen Databricks Runtime 13.3 LTS for Machine Learning oder höher verwenden, um On-Demand-Features verwenden zu können.

Was sind On-Demand-Features?

„On-Demand“ bezieht sich auf Features, deren Werte zuvor nicht bekannt sind, jedoch zum Zeitpunkt des Rückschlusses berechnet werden. In Azure Databricks verwenden Sie benutzerdefinierte Python-Funktionen (User-Defined Fuctions, UDFs), um anzugeben, wie On-Demand-Features berechnet werden. Diese Funktionen werden von Unity Catalog verwaltet und stehen in Catalog Explorer zur Verfügung.

Anforderungen

  • Um eine benutzerdefinierte Funktion (User-Defined Function, UDF) zum Erstellen eines Trainingssatzes verwenden oder einen Feature-Serving-Endpunkt erstellen zu können, müssen Sie über USE CATALOG-Berechtigungen für den system-Katalog im Unity-Katalog verfügen.

Workflow

Geben Sie zum Berechnen von On-Demand-Features eine benutzerdefinierte Python-Funktion (User-Defined Fuction, UDF) an, die beschreibt, wie die Featurewerte berechnet werden.

  • Während des Trainings stellen Sie diese Funktion und die zugehörigen Eingabebindungen im Parameter feature_lookups der create_training_set-API bereit.
  • Sie müssen das trainierte Modell mithilfe der Feature Store-Methode log_model protokollieren. Dadurch wird sichergestellt, dass das Modell automatisch On-Demand-Features auswertet, wenn es für den Rückschluss verwendet wird.
  • Bei der Batchbewertung berechnet die score_batch-API automatisch alle Featurewerte einschließlich On-Demand-Features und gibt diese zurück.
  • Wenn Sie ein Modell mit Mosaic AI Model Serving bereitstellen, verwendet das Modell automatisch die Python-UDF, um On-Demand-Features für jede Bewertungsanforderung zu berechnen.

Erstellen einer Python-UDF

Sie können eine Python-UDF in einem Notebook oder in Databricks SQL erstellen.

Wenn Sie beispielsweise den folgenden Code in einer Notebookzelle ausführen, wird die Python-UDF example_feature im Katalog main und Schema defaulterstellt.

%sql
CREATE FUNCTION main.default.example_feature(x INT, y INT)
RETURNS INT
LANGUAGE PYTHON
COMMENT 'add two numbers'
AS $$
def add_numbers(n1: int, n2: int) -> int:
  return n1 + n2

return add_numbers(x, y)
$$

Nach dem Ausführen des Codes können Sie in Catalog Explorer durch den Namespace mit drei Ebenen navigieren, um die Funktionsdefinition anzuzeigen:

Funktion im Katalog-Explorer

Weitere Informationen zum Erstellen von Python-UDFs finden Sie unter Registrieren einer Python-UDF für Unity Catalog und Handbuch zur Sprache „SQL“.

Behandeln fehlender Featurewerte

Wenn eine Python-UDF vom Ergebnis eines FeatureLookup abhängt, hängt der zurückgegebene Wert, wenn der angeforderte Lookup-Schlüssel nicht gefunden wird, von der Umgebung ab. Bei Verwendung von score_batch wird None als Wert zurückgegeben. Bei Verwendung der Online-Bereitstellung wird float("nan") als Wert zurückgegeben.

Der folgende Code ist ein Beispiel für die Behandlung beider Fälle.

%sql
CREATE OR REPLACE FUNCTION square(x INT)
RETURNS INT
LANGUAGE PYTHON AS
$$
import numpy as np
if x is None or np.isnan(x):
  return 0
return x * x
$$

Trainieren eines Modells mithilfe von On-Demand-Features

Sie verwenden eine FeatureFunction, die an die create_training_set-API im Parameter feature_lookups übergeben wird, um das Modell zu trainieren.

Im folgenden Beispielcode wird die Python-UDF main.default.example_feature verwendet, die im vorherigen Abschnitt definiert wurde.

# Install databricks-feature-engineering first with:
# %pip install databricks-feature-engineering
# dbutils.library.restartPython()

from databricks.feature_engineering import FeatureEngineeringClient
from databricks.feature_engineering import FeatureFunction, FeatureLookup
from sklearn import linear_model

fe = FeatureEngineeringClient()

features = [
  # The feature 'on_demand_feature' is computed as the sum of the the input value 'new_source_input'
  # and the pre-materialized feature 'materialized_feature_value'.
  # - 'new_source_input' must be included in base_df and also provided at inference time.
  #   - For batch inference, it must be included in the DataFrame passed to 'FeatureEngineeringClient.score_batch'.
  #   - For real-time inference, it must be included in the request.
  # - 'materialized_feature_value' is looked up from a feature table.

  FeatureFunction(
      udf_name="main.default.example_feature",    # UDF must be in Unity Catalog so uses a three-level namespace
      input_bindings={
        "x": "new_source_input",
        "y": "materialized_feature_value"
      },
      output_name="on_demand_feature",
  ),
  # retrieve the prematerialized feature
  FeatureLookup(
    table_name = 'main.default.table',
    feature_names = ['materialized_feature_value'],
    lookup_key = 'id'
  )
]

# base_df includes the columns 'id', 'new_source_input', and 'label'
training_set = fe.create_training_set(
  df=base_df,
  feature_lookups=features,
  label='label',
  exclude_columns=['id', 'new_source_input', 'materialized_feature_value']     # drop the columns not used for training
)

# The training set contains the columns 'on_demand_feature' and 'label'.
training_df = training_set.load_df().toPandas()

# training_df columns ['materialized_feature_value', 'label']
X_train = training_df.drop(['label'], axis=1)
y_train = training_df.label

model = linear_model.LinearRegression().fit(X_train, y_train)

Protokollieren und Registrieren des Modells in Unity Catalog

Mit Featuremetadaten gepackte Modelle können in Unity Catalog registriert werden. Die Featuretabellen, die für die Erstellung eines Modells verwendet werden, müssen in Unity Catalog gespeichert werden.

Um sicherzustellen, dass das Modell automatisch On-Demand-Features auswertet, wenn es für den Rückschluss verwendet wird, müssen Sie den Registrierungs-URI festlegen und dann das Modell folgendermaßen protokollieren:

import mlflow
mlflow.set_registry_uri("databricks-uc")

fe.log_model(
    model=model,
    artifact_path="main.default.model",
    flavor=mlflow.sklearn,
    training_set=training_set,
    registered_model_name="main.default.recommender_model"
)

Wenn die Python-UDF, die die On-Demand-Features definiert, beliebige Python-Pakete importiert, müssen Sie diese Pakete mithilfe des Arguments extra_pip_requirements angeben. Beispiel:

import mlflow
mlflow.set_registry_uri("databricks-uc")

fe.log_model(
    model=model,
    artifact_path="model",
    flavor=mlflow.sklearn,
    training_set=training_set,
    registered_model_name="main.default.recommender_model",
    extra_pip_requirements=["scikit-learn==1.20.3"]
)

Einschränkung

On-Demand-Features können alle von Feature Store unterstützten Datentypen außer „MapType“ und „ArrayType“ ausgeben.

Notebookbeispiele: On-Demand-Features

Das folgende Notebook zeigt ein Beispiel für das Trainieren und Bewerten eines Modells, das ein On-Demand-Feature verwendet.

Einfaches Demonotebook für On-Demand-Features

Notebook abrufen

Das folgende Notebook zeigt ein Beispiel für ein Modell zum Empfehlen von Restaurants. Die Lage des Restaurants wird in einer Databricks-Onlinetabelle nachgeschlagen. Der aktuelle Standort der Benutzer*innen wird als Teil der Bewertungsanforderung übermittelt. Das Modell verwendet ein On-Demand-Feature, um die Distanz zwischen den Benutzer*innen und dem Restaurant in Echtzeit zu berechnen. Diese Distanz wird dann als Eingabe für das Modell verwendet.

Demonotebook für On-Demand-Features für Restaurantempfehlungen mithilfe von Onlinetabellen

Notebook abrufen