创建和提供在线特征¶
为延迟敏感的机器学习推理工作流程创建和提供在线特征。在您正在创建的特征视图上启用在线特征,或更新现有特征视图以启用在线服务。
重要
您必须拥有 Snowflake 版本 9.26 或更高版本以及 snowflake-ml-python 版本 1.18.0,才能使用在线特征服务。
在线特征服务具有以下优势:
用于实时推理的低延迟点查找
来自离线源的自动数据同步
完全托管的基础设施和维护
适用于要求苛刻的工作负载的弹性扩展
在线特征服务由 在线特征表 提供支持。
数据新鲜度¶
具有在线特征服务的特征视图会自动同步来自离线商店的数据。
使用 target_lag 参数来配置将数据同步到在线特征表的频率。您可以将此值设置为从最短 10 秒到最长 8 天。
在线功能表会在后台使用您指定的值进行刷新。如果连续五次刷新失败,则在线功能表将暂停。有关刷新失败故障排除的信息,请检查刷新历史记录。
刷新模式¶
Snowflake 使用以下刷新模式来更新数据:
增量刷新:这是首选且最有效的模式。Snowflake 跟踪源中的更改,并仅将新行或更新的行合并到在线商店中。这样可以最大限度地降低计算和 I/O 成本。
完整刷新:此模式会删除表中的所有现有数据,并从源重新加载所有内容。它更耗费资源,在无法进行增量刷新时使用。
您可以显式将刷新模式设置为 INCREMENTAL 或 FULL,也可以将其设置为 AUTO,让 Snowflake 确定最有效的可用刷新模式。
时间序列数据处理¶
为确保数据一致性,可以指定 timestamp_col。当在源中找到具有相同主键的多行时,Snowflake 仅引入具有最新时间戳的版本。如果未指定时间戳列,则最近处理的行优先。
提供创建和提供在线特征的访问权限¶
在开始使用在线特征商店之前,必须向相关角色提供必要的权限。
要提供权限,请使用 SQL 中的访问控制设置 中描述的访问控制脚本。运行脚本后,授予以下权限:
GRANT CREATE ONLINE FEATURE TABLE ON SCHEMA IDENTIFIER($SCHEMA_FQN) TO ROLE IDENTIFIER($FS_ROLE_PRODUCER);
GRANT SELECT, MONITOR ON FUTURE ONLINE FEATURE TABLES IN SCHEMA IDENTIFIER($SCHEMA_FQN) TO ROLE IDENTIFIER($FS_ROLE_CONSUMER);
GRANT SELECT, MONITOR ON ALL ONLINE FEATURE TABLES IN SCHEMA IDENTIFIER($SCHEMA_FQN) TO ROLE IDENTIFIER($FS_ROLE_CONSUMER);
使用 Python API 管理和提供在线特征¶
以下示例展示了在创建新特征视图时如何配置在线特征服务。您可以使用 OnlineConfig 对象来指定在线服务设置,例如目标数据新鲜度滞后。
from snowflake.ml.feature_store import FeatureView
from snowflake.ml.feature_store.feature_view import OnlineConfig
online_config = OnlineConfig(enable=True, target_lag="30 seconds")
fv = FeatureView(
name="MY_FV",
entities=[entity],
feature_df=my_df, # Snowpark DataFrame containing feature transformations
timestamp_col="ts", # optional timestamp column name in the dataframe
refresh_freq="5 minutes",
refresh_mode="AUTO", # refresh mode of the feature data
desc="my feature view", # optional description
online_config=online_config
)
fv = fs.register_feature_view(feature_view=fv, version="v1")
以下是 OnlineConfig 参数:
参数 |
类型 |
描述 |
默认值 |
|---|---|---|---|
启用 |
布尔,可选 |
指定是否应为特征视图启用在线特征服务。 |
默认值:None。False |
target_lag |
Str,可选 |
采用“<num> (seconds|minutes|hours|days|s|m|h|d)”格式的字符串,用于指定目标数据新鲜度滞后。 |
默认值:None。10 秒 |
备注
refresh_freq 和 OnlineConfig.target_lag 独立运作。在上面的示例中,从 my_df 表示的源数据到在线数据存储的有效目标数据传播延迟将是 refresh_freq + online_config.target_lag。
更新特征视图以启用/禁用在线特征服务¶
对于现有的特征视图,您可以使用 update_feature_view 方法更新在线特征服务配置。您可以使用此方法为现有特征视图启用在线特征服务。
使用以下代码启用在线特征服务。
# Enable online feature serving
fs.update_feature_view(
name="<name>",
version="<version>",
online_config=OnlineConfig(enable=True, target_lag="5 minutes")
)
使用以下代码禁用在线特征服务。
# Disable online feature serving
fs.update_feature_view(
name="<name>",
version="<version>",
online_config=OnlineConfig(enable=False)
)
从在线存储中检索特征¶
要从在线存储中检索给定样本的特征值,请使用 read_feature_view 方法并传递特征名称列表以及样本的联接键:
fs.read_feature_view(
feature_view=fv,
keys=[["<k_1>", "<k_2>"]],
feature_names=["<feature1>", "<feature2>", "<feature3>"],
store_type=StoreType.ONLINE
)
暂停/恢复在线数据刷新¶
使用以下代码暂时暂停数据刷新。
fs.suspend_feature_view(feature_view=fv)
使用以下代码恢复数据刷新。
fs.resume_feature_view(feature_view=fv)
这些操作会暂停/恢复离线特征视图(动态表和关联任务)和在线特征表(如果存在),以确保所有存储类型的状态一致。
手动刷新特征视图¶
fs.refresh_feature_view(
feature_view=fv,
store_type=<store_type>
)
store_type 实参指定是否刷新离线 (StoreType.OFFLINE) 或在线 (StoreType.ONLINE) 特征数据。
查看刷新历史记录¶
fs.get_refresh_history(
feature_view=fv,
store_type=store_type
)
store_type 实参指定是否返回离线 (StoreType.OFFLINE) 或在线 (StoreType.ONLINE) 存储刷新历史记录。
了解成本¶
在线特征表在以下使用模式下会产生成本:
虚拟仓库计算:对混合表的查询通过虚拟仓库执行。键查找和数据引入操作都会按标准费率使用虚拟仓库 Credit。有关更多信息,请参阅 虚拟仓库 Credit 使用量。
云服务计算:Snowflake 架构的云服务层在执行身份验证、元数据管理和访问控制等后台任务时会消耗 credit 。需要识别底层基础对象中的变更,并确定何时需要刷新操作。有关更多信息,请参阅 云服务 Credit 使用量。
混合表存储:存储成本基于每 GB 的统一月费率。它比传统的 Snowflake 存储成本更高,但与存储混合表的成本相同。有关更多信息,请参阅 Credit 使用量表 中的表 3(b)。
混合表请求:这些请求将 无服务器 Credit 使用量 用于对行存储群集进行读/写操作。写入这些群集或从这些群集读取的数据量可用于计算 Credit 使用量,每次操作至少 4 KB 使用量。用于执行后台操作(如压缩)的计算资源也会消耗 Credit。有关更多信息,请参阅 Credit 使用量表 中的表 5。
小技巧
增量刷新有助于降低成本。增量更新通常比完全刷新更具成本效益,从而降低计算和数据引入成本。
成本监控¶
要监控成本,请使用以下视图:
-- Hybrid table request credits
SELECT * FROM SNOWFLAKE.ACCOUNT_USAGE.HYBRID_TABLE_USAGE_HISTORY;
-- Storage consumption
SELECT * FROM SNOWFLAKE.ACCOUNT_USAGE.STORAGE_USAGE;
SELECT * FROM SNOWFLAKE.ACCOUNT_USAGE.DATABASE_STORAGE_USAGE_HISTORY;
-- Overall costs
SELECT * FROM SNOWFLAKE.ACCOUNT_USAGE.METERING_HISTORY;