Udostępnij za pośrednictwem


Funkcje obliczeniowe na żądanie przy użyciu funkcji zdefiniowanych przez użytkownika języka Python

W tym artykule opisano sposób tworzenia i używania funkcji na żądanie w usłudze Azure Databricks.

Aby korzystać z funkcji na żądanie, obszar roboczy musi być włączony dla wykazu aparatu Unity i należy użyć środowiska Databricks Runtime 13.3 LTS ML lub nowszego.

Co to są funkcje na żądanie?

Wyrażenie "Na żądanie" odnosi się do funkcji, których wartości nie są znane przed upływem czasu, ale są obliczane w czasie wnioskowania. W usłudze Azure Databricks używasz funkcji zdefiniowanych przez użytkownika (UDF) języka Python, aby określić sposób obliczania funkcji na żądanie. Te funkcje podlegają katalogowi aparatu Unity i można je odnajdywać za pośrednictwem Eksploratora wykazu.

Wymagania

  • Aby utworzyć zestaw trenowania przy użyciu funkcji zdefiniowanej przez użytkownika lub utworzyć punkt końcowy obsługujący funkcję, musisz mieć USE CATALOG uprawnienia system do katalogu w wykazie aparatu Unity.

Przepływ pracy

Aby obliczyć funkcje na żądanie, należy określić funkcję zdefiniowaną przez użytkownika języka Python (UDF), która opisuje sposób obliczania wartości funkcji.

  • Podczas trenowania udostępniasz tę funkcję i jej powiązania wejściowe w feature_lookups parametrze interfejsu create_training_set API.
  • Należy zarejestrować wytrenowany model przy użyciu metody log_modelmagazynu funkcji . Dzięki temu model automatycznie ocenia funkcje na żądanie, gdy jest używany do wnioskowania.
  • W przypadku oceniania score_batch wsadowego interfejs API automatycznie oblicza i zwraca wszystkie wartości funkcji, w tym funkcje na żądanie.
  • Gdy udostępniasz model z usługą Mosaic AI Model Serving, model automatycznie używa funkcji zdefiniowanej przez użytkownika języka Python do obliczania funkcji na żądanie dla każdego żądania oceniania.

Tworzenie funkcji zdefiniowanej przez użytkownika języka Python

Funkcję UDF języka Python można utworzyć w notesie lub w usłudze Databricks SQL.

Na przykład uruchomienie następującego kodu w komórce notesu powoduje utworzenie funkcji zdefiniowanej example_feature przez użytkownika języka Python w katalogu main i schemacie 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)
$$

Po uruchomieniu kodu możesz przejść przez trzypoziomową przestrzeń nazw w Eksploratorze wykazu, aby wyświetlić definicję funkcji:

funkcja w Eksploratorze wykazu

Aby uzyskać więcej informacji na temat tworzenia funkcji zdefiniowanych przez użytkownika języka Python, zobacz Rejestrowanie funkcji zdefiniowanej przez użytkownika języka Python w katalogu aparatu Unity i podręcznik języka SQL.

Jak obsługiwać brakujące wartości funkcji

Gdy funkcja UDF języka Python zależy od wyniku funkcjiLookup, wartość zwrócona, jeśli żądany klucz odnośnika nie zostanie znaleziony, zależy od środowiska. W przypadku użycia score_batchzwracana wartość to None. W przypadku korzystania z usługi online zwracana wartość to float("nan").

Poniższy kod to przykład obsługi obu przypadków.

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

Trenowanie modelu przy użyciu funkcji na żądanie

Aby wytrenować model, należy użyć FeatureFunctionelementu , który jest przekazywany do interfejsu create_training_set API w parametrze feature_lookups .

Poniższy przykładowy kod używa funkcji UDF main.default.example_feature języka Python zdefiniowanej w poprzedniej sekcji.

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

Rejestrowanie modelu i rejestrowanie go w wykazie aparatu Unity

Modele spakowane za pomocą metadanych funkcji można zarejestrować w wykazie aparatu Unity. Tabele funkcji używane do tworzenia modelu muszą być przechowywane w wykazie aparatu Unity.

Aby upewnić się, że model automatycznie ocenia funkcje na żądanie podczas wnioskowania, należy ustawić identyfikator URI rejestru, a następnie zarejestrować model w następujący sposób:

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

Jeśli funkcja UDF języka Python, która definiuje funkcje na żądanie, importuje wszystkie pakiety języka Python, należy określić te pakiety przy użyciu argumentu extra_pip_requirements. Na przykład:

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

Ograniczenie

Funkcje na żądanie mogą zwracać wszystkie typy danych obsługiwane przez magazyn funkcji z wyjątkiem MapType i ArrayType.

Przykłady notesów: funkcje na żądanie

W poniższym notesie przedstawiono przykład trenowania i oceniania modelu korzystającego z funkcji na żądanie.

Podstawowy notes demonstracyjny funkcji na żądanie

Pobierz notes

W poniższym notesie przedstawiono przykład modelu rekomendacji restauracji. Lokalizacja restauracji znajduje się w tabeli online usługi Databricks. Bieżąca lokalizacja użytkownika jest wysyłana w ramach żądania oceniania. Model używa funkcji na żądanie, aby obliczyć odległość w czasie rzeczywistym od użytkownika do restauracji. Ta odległość jest następnie używana jako dane wejściowe do modelu.

Zalecenia dotyczące restauracji dotyczące funkcji na żądanie przy użyciu notesu pokazowego tabel online

Pobierz notes