Komputasi fitur berdasarkan permintaan

Artikel ini menjelaskan cara membuat dan menggunakan fitur sesuai permintaan di Azure Databricks.

Untuk menggunakan fitur sesuai permintaan, ruang kerja Anda harus diaktifkan untuk Unity Catalog dan Anda harus menggunakan Databricks Runtime 13.3 LTS ML atau lebih tinggi.

Apa itu fitur sesuai permintaan?

"Sesuai permintaan" mengacu pada fitur yang nilainya tidak diketahui sebelumnya, tetapi dihitung pada saat inferensi. Di Azure Databricks, Anda menggunakan fungsi yang ditentukan pengguna (UDF) Python untuk menentukan cara menghitung fitur sesuai permintaan. Fungsi-fungsi ini diatur oleh Katalog Unity dan dapat ditemukan melalui Catalog Explorer.

Alur kerja

Untuk menghitung fitur sesuai permintaan, Anda menentukan fungsi yang ditentukan pengguna (UDF) Python yang menjelaskan cara menghitung nilai fitur.

  • Selama pelatihan, Anda menyediakan fungsi ini dan pengikatan inputnya dalam feature_lookups parameter create_training_set API.
  • Anda harus mencatat model terlatih menggunakan metode log_modelPenyimpanan Fitur . Ini memastikan bahwa model secara otomatis mengevaluasi fitur sesuai permintaan saat digunakan untuk inferensi.
  • Untuk penilaian batch, API score_batch secara otomatis menghitung dan mengembalikan semua nilai fitur, termasuk fitur sesuai permintaan.
  • Saat Anda melayani model dengan Mosaic AI Model Serving, model secara otomatis menggunakan Python UDF untuk menghitung fitur sesuai permintaan untuk setiap permintaan penilaian.

Membuat UDF Python

Anda dapat membuat UDF Python menggunakan kode SQL atau Python. Contoh berikut membuat UDF Python di katalog main dan skema default.

Phyton

Untuk menggunakan Python, Anda harus terlebih dahulu menginstal databricks-sdk[openai] paket. Gunakan %pip install sebagai berikut:

%pip install unitycatalog-ai[databricks]
dbutils.library.restartPython()

Kemudian, gunakan kode yang mirip dengan yang berikut ini untuk membuat UDF Python:

from unitycatalog.ai.core.databricks import DatabricksFunctionClient

client = DatabricksFunctionClient()

CATALOG = "main"
SCHEMA = "default"

def add_numbers(number_1: float, number_2: float) -> float:
  """
  A function that accepts two floating point numbers, adds them,
  and returns the resulting sum as a float.

  Args:
      number_1 (float): The first of the two numbers to add.
      number_2 (float): The second of the two numbers to add.

  Returns:
      float: The sum of the two input numbers.
  """
  return number_1 + number_2

function_info = client.create_python_function(
  func=add_numbers,
  catalog=CATALOG,
  schema=SCHEMA,
  replace=True
)

Databricks SQL

Kode berikut menunjukkan cara menggunakan Databricks SQL untuk membuat UDF Python:

%sql
CREATE OR REPLACE FUNCTION main.default.add_numbers(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)
$$

Setelah menjalankan kode, Anda dapat menavigasi melalui namespace tiga tingkat di Catalog Explorer untuk melihat definisi fungsi:

fungsi dalam Penjelajah Katalog

Untuk detail selengkapnya tentang membuat UDF Python, lihat Mendaftarkan UDF Python ke Katalog Unity dan manual bahasa SQL.

Cara menangani nilai fitur yang hilang

Ketika UDF Python bergantung pada hasil FeatureLookup, nilai yang dikembalikan jika kunci pencarian yang diminta tidak ditemukan tergantung pada lingkungan. Saat menggunakan score_batch, nilai yang dikembalikan adalah None. Saat menggunakan penyajian online, nilai yang dikembalikan adalah float("nan").

Kode berikut adalah contoh cara menangani kedua kasus.

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

Melatih model menggunakan fitur sesuai permintaan

Untuk melatih model, Anda menggunakan FeatureFunction, yang diteruskan ke create_training_set API dalam feature_lookups parameter .

Contoh kode berikut menggunakan UDF main.default.example_feature Python yang ditentukan di bagian sebelumnya.

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

Tentukan nilai default

Untuk menentukan nilai default untuk fitur, gunakan default_values parameter di FeatureLookup.

FeatureLookup(
  table_name = 'main.default.table',
  feature_names = ['materialized_feature_value'],
  lookup_key = 'id',
  default_values={
    "materialized_feature_value": 0
  }
)

Jika kolom fitur diganti namanya menggunakan rename_outputs parameter , default_values harus menggunakan nama fitur yang diganti namanya.

FeatureLookup(
  table_name = 'main.default.table',
  feature_names = ['materialized_feature_value'],
  lookup_key = 'id',
  rename_outputs={"materialized_feature_value": "feature_value"},
  default_values={
    "feature_value": 0
  }
)

Catat model dan daftarkan ke Katalog Unity

Model yang di kemas dengan metadata fitur dapat didaftarkan ke Unity Catalog. Tabel fitur yang digunakan untuk membuat model harus disimpan di Unity Catalog.

Untuk memastikan bahwa model secara otomatis mengevaluasi fitur sesuai permintaan saat digunakan untuk inferensi, Anda harus mengatur URI registri lalu mencatat model, sebagai berikut:

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

Jika UDF Python yang menentukan fitur sesuai permintaan mengimpor paket Python apa pun, Anda harus menentukan paket ini menggunakan argumen extra_pip_requirements. Contohnya:

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

Keterbatasan

  • Fitur sesuai permintaan dapat menghasilkan semua jenis data yang didukung oleh Penyimpanan Fitur kecuali MapType dan ArrayType.
  • Untuk databricks-feature-engineering versi di bawah 0.14.0, izin Katalog Unity berikut diperlukan untuk menggunakan fungsi yang ditentukan pengguna (UDF) untuk membuat set pelatihan atau membuat titik akhir Penyajian Fitur.
    • USE CATALOG hak istimewa atas system katalog
    • USE SCHEMA hak istimewa pada system.information_schema skema

Contoh buku catatan: Fitur sesuai permintaan

Notebook berikut ini memperlihatkan contoh cara melatih dan menilai model yang menggunakan fitur sesuai permintaan.

Notebook demo fitur dasar sesuai permintaan

Dapatkan buku catatan

Buku catatan berikut ini memperlihatkan contoh model rekomendasi restoran. Lokasi restoran dicari dari tabel online Databricks. Lokasi pengguna saat ini dikirim sebagai bagian dari permintaan penilaian. Model ini menggunakan fitur sesuai permintaan untuk menghitung jarak real-time dari pengguna ke restoran. Jarak tersebut kemudian digunakan sebagai input ke model.

Fitur rekomendasi restoran sesuai permintaan menggunakan buku catatan demo untuk tabel online.

Dapatkan buku catatan