Beräkningsfunktioner på begäran med hjälp av användardefinierade Python-funktioner
Den här artikeln beskriver hur du skapar och använder funktioner på begäran i Azure Databricks.
Om du vill använda funktioner på begäran måste arbetsytan vara aktiverad för Unity Catalog- och du måste använda Databricks Runtime 13.3 LTS ML eller senare.
Vad är funktioner på begäran?
"På begäran" avser funktioner vars värden inte är kända i förväg, men som beräknas vid tidpunkten för slutsatsdragningen. I Azure Databricks använder du användardefinierade Python-funktioner (UDF: er) för att ange hur du beräknar funktioner på begäran. Dessa funktioner styrs av Unity Catalog och kan identifieras via Catalog Explorer.
Krav
- Om du vill använda en användardefinierad funktion (UDF) för att skapa en träningsuppsättning eller för att skapa en funktionsserverslutpunktmåste du ha
USE CATALOG
behörighet påsystem
-katalogen i Unity Catalog.
Arbetsflöde
För att beräkna funktioner på begäran anger du en Användardefinierad Python-funktion (UDF) som beskriver hur du beräknar funktionsvärdena.
- Under träningen anger du den här funktionen och dess indatabindningar i parametern
feature_lookups
för API:etcreate_training_set
. - Du måste logga den tränade modellen med hjälp av metoden
log_model
Feature Store . Detta säkerställer att modellen automatiskt utvärderar funktioner på begäran när den används för slutsatsdragning. - För batchbedömning beräknar och returnerar
score_batch
API automatiskt alla funktionsvärden, inklusive funktioner på begäran. - När du hanterar en modell med Mosaic AI Model Serving använder modellen automatiskt Python UDF för att beräkna funktioner på begäran för varje bedömningsbegäran.
Skapa en Python UDF
Du kan skapa en Python UDF i en notebook-fil eller i Databricks SQL.
Om du till exempel kör följande kod i en notebook-cell skapas Python UDF-example_feature
i katalogen main
och schema default
.
%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)
$$
När du har kört koden kan du navigera genom namnområdet på tre nivåer i Catalog Explorer för att visa funktionsdefinitionen:
Mer information om hur du skapar Python-UDF:er finns i Registrera en Python UDF till Unity Catalog och sql-språkhandboken.
Hantera saknade funktionsvärden
När en Python UDF är beroende av resultatet av en FeatureLookup beror värdet som returneras om den begärda uppslagsnyckeln inte hittas på miljön. När du använder score_batch
är None
värdet som returneras . När du använder onlineservering är float("nan")
värdet som returneras .
Följande kod är ett exempel på hur du hanterar båda fallen.
%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
$$
Träna en modell med hjälp av funktioner på begäran
Om du vill träna modellen använder du en FeatureFunction
, som skickas till API:et create_training_set
i parametern feature_lookups
.
I följande exempelkod används Python UDF main.default.example_feature
som definierades i föregående avsnitt.
# 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)
Logga modellen och registrera den i Unity Catalog
Modeller som paketeras med funktionsmetadata kan registreras i Unity Catalog. De funktionstabeller som används för att skapa modellen måste lagras i Unity Catalog.
För att säkerställa att modellen automatiskt utvärderar funktioner på begäran när den används för slutsatsdragning måste du ange register-URI:n och sedan logga modellen enligt följande:
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"
)
Om Python UDF som definierar funktionerna på begäran importerar alla Python-paket måste du ange dessa paket med argumentet extra_pip_requirements
. Till exempel:
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"]
)
Begränsning
Funktioner på begäran kan mata ut alla datatyper som stöds av Funktionsarkiv förutom MapType och ArrayType.
Notebook-exempel: Funktioner på begäran
Följande notebook-fil visar ett exempel på hur du tränar och poängsätter en modell som använder en funktion på begäran.
Demo notebook-fil för grundläggande funktioner på begäran
Följande notebook-fil visar ett exempel på en modell för restaurangrekommendationer. Restaurangens läge söks upp från en Databricks online-tabell. Användarens aktuella plats skickas som en del av bedömningsbegäran. Modellen använder en funktion på begäran för att beräkna realtidsavståndet från användaren till restaurangen. Avståndet används sedan som indata till modellen.