特征检索规范及其在训练和推理中的应用

本文描述了特征检索规范,以及如何在训练和推理中使用它。

特征检索规范是一种项目,它定义了在模型输入中使用的特征列表。 特征检索规范中的特征:

  • 必须存在于特征存储中注册的特征集中
  • 可以存在于多个要素集和多个要素库中

在模型训练和模型推理时使用特征检索规范。 这些流程步骤涉及规范:

  1. 选择特征,并生成特征检索规范
  2. 使用该规范和观察数据生成具有时间点联接的训练数据资源
  3. 使用生成的训练数据定型模型。
  4. 将特征检索规范与模型项目打包。
  5. 在模型推理时,使用推理评分脚本中的特征库 SDK 从模型项目文件夹中加载特征检索规范,并从在线存储中查找特征。

创建特征检索规范

使用特征存储 SDK 生成特征检索规范。 用户首先选择特征,然后使用提供的实用工具函数生成规范。


from azureml.featurestore import FeatureStoreClient
from azure.ai.ml.identity import AzureMLOnBehalfOfCredential

featurestore1 = FeatureStoreClient(
    credential=AzureMLOnBehalfOfCredential(),
    subscription_id=featurestore_subscription_id1,
    resource_group_name=featurestore_resource_group_name1,
    name=featurestore_name1,
)

features = featurestore1.resolve_feature_uri(
  [
    f"accounts:1:numPaymentRejects1dPerUser",
    f"transactions:1:transaction_amount_7d_avg",
  ]
)

featurestore2 = FeatureStoreClient(
    credential=AzureMLOnBehalfOfCredential(),
    subscription_id=featurestore_subscription_id2,
    resource_group_name=featurestore_resource_group_name2,
    name=featurestore_name2,
)

features.exend(
  featurestore2.resolve_feature_uri([
    f"loans:1:last_loan_amount",
  ])
)

featurestore1.generate_feature_retrieval_spec("./feature_retrieval_spec_folder", features)

详细示例请参见 2.Experiment-train-models-using-features.ipynb 笔记本,此笔记本托管在此资源中。

函数生成 YAML 文件项目,其结构与本例中的结构相似:

feature_stores:
  - uri: azureml://subscriptions/{sub}/resourcegroups/{rg}/workspaces/{featurestore-workspace-name}
    location: chinanorth3
    workspace_id: {featurestore-workspace-guid-id}
    features:
      - feature_name: numPaymentRejects1dPerUser
        feature_set: accounts:1
      - feature_name: transaction_amount_7d_avg
        feature_set: transactions:1
  - uri: azureml://subscriptions/{sub}/resourcegroups/{rg}/workspaces/{featurestore-workspace-name}
    location: chinaeast2
    workspace_id: {featurestore-workspace-guid-id}
    features:
      - feature_name: last_loan_amount
        feature_set: loans:1
serialization_version: 2

使用特征检索规范创建训练数据

特征存储时间点联接可以通过两种方式创建训练数据:

  • Spark 会话/作业中特征存储 SDK 中的 get_offline_features() API 函数
  • Azure 机器学习内置特征检索(管道)组件

在第一个选项中,特征检索规范本身是可选的,因为用户可以提供 API 上的特征列表。 但是,如果提供了特征检索规范,则 resolve_feature_retrieval_spec() 特征存储 SDK 中的函数可以加载规范定义的特征列表。 然后,该函数将该列表传递给 get_offline_features() API 函数。

from azureml.featurestore import FeatureStoreClient
from azureml.featurestore import get_offline_features
from azure.ai.ml.identity import AzureMLOnBehalfOfCredential

featurestore = FeatureStoreClient(
    credential=AzureMLOnBehalfOfCredential(),
    subscription_id=featurestore_subscription_id,
    resource_group_name=featurestore_resource_group_name,
    name=featurestore_name,
)

features = featurestore.resolve_feature_retrieval_spec("./feature_retrieval_spec_folder")

training_df = get_offline_features(
    features=features,
    observation_data=observation_data_df,
    timestamp_column=obs_data_timestamp_column,
)

第二个选项将特征检索规范设置为内置特征检索(管道)组件的输入。 它将该特征检索规范与其他输入(例如,观察数据集)相结合。 然后,它提交 Azure 机器学习管道 (Spark) 作业,以生成训练数据集作为输出。 建议使用此选项以使训练管道为生产和重复运行做好准备。 有关内置特征检索(管道)组件的更多详细信息,请访问特征检索组件资源。

将特征检索规范与模型项目打包

当使用特征存储中的特征对模型进行数据训练时,特征检索规范必须与模型项目一起打包在根文件夹中:

  • 世系跟踪:对于在 Azure 机器学习工作区中注册的模型,只有当模型项目中存在特征检索规范时,才会跟踪模型和特征集之间的世系。 在 Azure 机器学习工作区中,模型详细信息页面和特征集详细信息页面显示世系。
  • 模型推理:在模型推理时,在评分代码可以从在线存储中查找特征值之前,该代码必须从位于模型项目文件夹中的特征检索规范中加载特征列表。

特性检索规范必须放在模型项目的根文件夹下。 其文件名无法更改:

<model folder>/
├── model.pkl
├── other_folder/
│ ├── other_model_files
└── feature_retrieval_spec.yaml

训练作业应处理规范的包装。

如果内置的特征检索组件生成训练数据,则特征检索规范已与训练数据集打包在其根文件夹下。 这样,训练代码就可以处理副本,如下所示:

import shutil

shutil.copy(os.path.join(args.training_data, "feature_retrieval_spec.yaml"), args.model_output)

查看托管在此资源中的 2.Experiment-train-models-using-features.ipynb 笔记本,以获得完整的管道示例,其使用内置的特征检索组件来生成训练数据并运行具有打包的训练作业

对于其他方法生成的训练数据,可以将特征检索规范作为输入传递给训练作业,然后在训练脚本中处理复制和打包过程。

在线推理中使用特征检索规范

在评分脚本中,特征存储 SDK 必须在调用在线查找之前加载特征检索规范。 评分脚本 init() 函数应处理规范的加载,如本评分脚本所示:

from azure.identity import ManagedIdentityCredential
from azureml.featurestore import FeatureStoreClient
from azureml.featurestore import get_online_features, init_online_lookup

def init()
  credential = ManagedIdentityCredential()
  spec_path = os.path.join(os.getenv("AZUREML_MODEL_DIR"), "model_output")

  global features
  featurestore = FeatureStoreClient(credential=credential)
  features = featurestore.resolve_feature_retrieval_spec(spec_path)
  init_online_lookup(features, credential)

访问托管在此资源中的 4.Enable-online-store-run-inference.ipynb 笔记本,了解详细代码片段。

在批量推理中使用特征检索规范

批量推理需要:

  • 特征检索规范,用于生成批量推理数据
  • 对推理数据进行模型批预测

步骤 1 中使用的特征检索规范的操作方式与生成训练数据的操作方式相同。 内置的特征检索组件生成推理数据。 只要特征检索规范与模型打包在一起,模型就可以方便地作为组件的输入。 这种方法是在特征检索规范中直接传递推理数据的替代方法。

访问托管在此资源中的 3.Enable-recurrent-materialization-run-batch-inference.ipynb 笔记本,了解详细代码片段。

内置特征检索组件

虽然 azureml-featurestoreget_offline_feature() 函数可以处理 Spark 作业中的特征检索,但 Azure 机器学习提供了内置的管道组件:

  • 组件预定义了运行脱机检索查询所需的所有包和脚本,并带有时间点联接
  • 组件将特征检索规范与生成的输出训练数据打包

Azure 机器学习管道作业可以将组件与训练和批量推理步骤一起使用。 它运行 Spark 作业以:

  • 从特征存储中检索特征值(根据特征检索规范)
  • 将特征值与观察数据进行时间点联接,形成训练或批量推理数据
  • 输出具有特征检索规范的数据

组件需要以下输入:

输入 类型 描述 支持的值 注意
input_model custom_model 来自特征存储的特征定型了此模型。 模型项目文件夹有定义特性依赖项的 feature_retrieval_spec.yaml 文件。 此组件使用 YAML 文件从特征存储中检索相应的特征。 批量推理管道通常使用此组件作为准备批量推理数据的第一步。 Azure 机器学习模型资产 azureml:<name>:<version>、模型文件夹的本地路径、模型文件夹的 abfss:// wasbs://azureml:// 路径 只需要 input_modelfeature_retrieval_spec 输入中的一个
feature_retrieval_spec uri_folder 文件夹的 URI 路径。 文件夹必须直接托管 feature_retrieval_spec.yaml 文件。 此组件使用 YAML 文件从特征存储中检索相应的特征。 训练管道通常使用相应的特征检索作为准备训练数据的第一步 Azure 机器学习数据资产 azureml:<name>:<version>、文件夹的本地路径、文件夹的 abfss:// wasbs://azureml:// 路径 只需要 input_modelfeature_retrieval_spec 输入中的一个
observation_data uri_folder 特征所联接的观察数据 Azure 机器学习数据资产 azureml:<name>:<version>、数据文件夹的本地路径、数据文件夹的 abfss:// wasbs://azureml:// 路径
observation_data_format enum 特征检索作业根据格式读取观察数据 parquet, CSV, delta
timestamp_column string 观察数据中的时间戳列名。 时间点联接使用观察数据侧的列

output_data 是唯一输出组件。 输出数据是类型为 uri_folder 的数据资产。 数据始终具有 parquet 格式。 输出文件夹具有以下文件夹结构:

<output folder name>/
├── data/
│ ├── xxxxx.parquet
│ └── xxxxx.parquet
└── feature_retrieval_spec.yaml

要使用组件,请在管道作业 YAML 文件中引用其组件 ID,或者在管道设计器中拖放组件以创建管道。 此内置检索组件发布在 Azure 机器学习注册表中。 其当前版本为 1.0.0 (azureml://registries/azureml/components/feature_retrieval/versions/1.0.0)。

查看这些笔记本以获取内置组件的示例,这两个组件都托管在此资源中:

  • 2.Experiment-train-models-using-features.ipynb
  • 3.Enable-recurrent-materialization-run-batch-inference.ipynb

后续步骤