ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Feast 0.13 三大特性深度解析:On-Demand 特征转换、Python 特征服务器与无实体特征视图

Feast 0.13 三大特性深度解析:On-Demand 特征转换、Python 特征服务器与无实体特征视图 Feast 0.13 三大特性深度解析On-Demand 特征转换、Python 特征服务器与无实体特征视图【免费下载链接】feastThe Open Source Feature Store for AI/ML项目地址: https://gitcode.com/GitHub_Trending/fe/feast本文基于 Feast 官方博客《Feast 0.13 adds on-demand transforms, feature servers, and feature views without entities》docs/blog/feast-0-13-adds-on-demand-transforms-feature-servers-and-feature-views-without-entities.md展开。这篇 2021 年 10 月 2 日由 Danny Chiao、Tsotne Tabidze、Achal Shah 和 Felix Wang 发布的版本公告是 Feast 从特征存储走向特征计算平台的关键节点它一次性引入了 On-Demand Feature Views按需转换特征视图含 request data 概念、Python Feature ServerHTTP 在线特征服务以及无实体特征视图三项能力。读完本文你将理解这三项特性的设计动机与 0.13 时代的原始用法并能对照当前仓库源码如 sdk/python/feast/on_demand_feature_view.py、sdk/python/feast/feature_server.py掌握它们在今天的真实形态与可复制的用法。需要说明的适用前提0.13 中的 On-Demand Feature Views 与 Python Feature Server 当时均标注为实验特性Experimental官方明确提示实验特性的 API 在未来可能随时变更。本文后半部分会逐一说明这些 API 在当前仓库中的演进与兼容关系实际编码请以当前仓库代码为准。一、发布背景Feast 0.13 解决了什么问题博客原文列出了 0.13 版本的三项核心新增[实验] On demand feature views允许对已有特征和请求数据request data做转换以生成新特征转换逻辑在历史检索训练路径和在线检索服务路径中一致执行。其中request data是一个全新概念——指仅在预测请求时刻才可用例如用户发起的 HTTP 请求中携带的字段的数据它可以作为转换的输入。[实验] Python feature servers提供一个本地 HTTP 服务器来对外提供在线特征使任何能发起 HTTP 请求的编程语言都能从 Feast 取数。博客同时预告了两个路线图方向Serverless 部署与低延迟 Java 特征服务器即将推出。Feature views without entities允许定义仅按事件时间戳event timestamp参与连接的、不带实体的特征视图——定义和取数时都不需要再提供实体名与实体值列表。博客原文还附了一个初始化仓库的基础命令示例$ feast init feature_repo Creating a new Feast repository in /home/tsotne/feast/feature_repo.这三项能力共同指向一个目标降低训练/服务偏差training-serving skew并拓宽特征的输入边界。下文逐一深入。二、On-Demand Feature Views让训练与服务共用同一份转换逻辑2.1 设计动机与典型用例博客原文给出的定义是On demand feature views 允许用户利用已有特征和请求数据做转换并创建新特征用户以 Python 函数定义转换逻辑该逻辑同时执行于历史检索与在线检索两条路径。这正是解决训练/服务偏差的关键机制——同一份 UDF 决定两条路径的特征产出。博客列举了三类典型用例特征名原文照录交易类特征如transaction_amount_greater_than_7d_average其特征输入本身就是交易、预订或订单事件的一部分依赖当前位置或时间的特征如user_account_age、distance_driver_customer键空间大到无法预计算的交叉特征feature crosses如movie_category_x_movie_rating或lat_bucket_x_lon_bucket。这三类用例的共同点是输入中有一部分不是存在离线表里的历史数据而是请求时刻才出现的上下文或者组合空间大到无法预物化——这正是普通 Batch/Stream Feature View 无法覆盖的盲区。2.2 Request Data 概念从 RequestDataSource 到 RequestSource博客 0.13 版本的原始写法历史 API用于忠实呈现当时形态# 定义一个 request data source编码仅在请求时刻可用的特征/信息 # 例如属于用户发起的 HTTP 请求的一部分 input_request RequestDataSource( namevals_to_add, schema{ val_to_add: ValueType.INT64, } )对照当前源码该概念在 sdk/python/feast/data_source.py 中实现为RequestSource类类名从RequestDataSource更名为RequestSourceschema 从字典改为Field列表typechecked class RequestSource(DataSource): RequestSource that can be used to provide input features for on demand transforms Attributes: name: Name of the request data source schema: Schema mapping from the input feature name to a ValueType ... name: str schema: List[Field]对应的当前 API 等价写法from feast import Field, RequestSource from feast.types import Int64 input_request RequestSource( namevals_to_add, schema[Field(nameval_to_add, dtypeInt64)], )RequestSource继承自DataSource但没有任何物理存储后端它只是一个请求时刻字段的 schema 声明——在线取数时这些字段从entity_rows中取值历史取数时从entity_df中取值随后进入 ODFV 的转换函数。2.3 源码实现on_demand_feature_view 装饰器ODFV 的完整定义位于 sdk/python/feast/on_demand_feature_view.pyOnDemandFeatureView类定义于第 116 行注册用的on_demand_feature_view装饰器定义于第 1360-1457 行。从源码结构看其参数集相比 0.13 已大幅扩展核心参数与默认值如下参数类型/默认值作用nameOptional[str]视图名缺省时取用户函数名参考文档亦确认视图名即函数名如transformed_conv_rateentitiesOptional[List[Entity]]关联实体列表schemalist[Field]转换输出的特征字段定义sourcesOptional[list[FeatureView \| RequestSource \| FeatureViewProjection]]输入源既有特征视图 请求数据源即 0.13 引入的组合方式input_schemaOptional[list[Field]]请求时刻输入但不是聚合列的上下文字段阈值、币种等aggregationsOptional[List[Aggregation]]声明式聚合与转换函数互斥见参考文档modestr pandas执行模式pandas接收/返回 DataFramepython使用原生 Python 处理值列表或单行字典write_to_online_storebool FalseTrue表示转换在写入时执行并物化到在线库加速在线读False默认表示转换在读取时执行singletonbool False仅在modepython下可用UDF 逐行单条字典处理track_metricsbool False是否为该 ODFV 输出 Prometheus 计时指标需服务器以 metrics 模式启动explodebool False转换是否会把一行输入炸开为多行装饰器内部有两个值得注意的实现细节sdk/python/feast/on_demand_feature_view.pydef mainify(obj) - None: # Needed to allow dill to properly serialize the udf. Otherwise, clients will need to have a file with the same # name as the original file defining the ODFV. if obj.__module__ ! __main__: obj.__module__ __main__ def decorator(user_function): udf_string dill.source.getsource(user_function) mainify(user_function) on_demand_feature_view_obj OnDemandFeatureView(...)其一UDF 源码通过dill.source.getsource捕获为字符串udf_string即转换逻辑是以文本形式序列化进 registry的而不是依赖调用方本地能 import 到该函数——这是转换能在任意执行点本地、特征服务器、转换服务器被还原执行的基础。其二mainify强制把模块名改成__main__规避 dill 反序列化时对源文件路径的依赖。2.4 完整的读时转换示例继承自仓库参考文档博客 0.13 只给出了请求数据源片段完整的 ODFV 定义用法可参考当前仓库的参考文档 docs/reference/beta-on-demand-feature-view.md。以 Pandas 模式为例from feast import Field, RequestSource from feast.on_demand_feature_view import on_demand_feature_view from feast.types import Float64, Int64 import pandas as pd input_request RequestSource( namevals_to_add, schema[ Field(nameval_to_add, dtypeInt64), Field(nameval_to_add_2, dtypeInt64), ], ) on_demand_feature_view( sources[driver_hourly_stats_view, input_request], schema[ Field(nameconv_rate_plus_val1, dtypeFloat64), Field(nameconv_rate_plus_val2, dtypeFloat64), ], modepandas, ) def transformed_conv_rate(features_df: pd.DataFrame) - pd.DataFrame: df pd.DataFrame() df[conv_rate_plus_val1] features_df[conv_rate] features_df[val_to_add] df[conv_rate_plus_val2] features_df[conv_rate] features_df[val_to_add_2] return df参考文档同时给出原生 Python 列表输入模式modepython、单行字典模式singletonTrue、声明式聚合Aggregation(column..., functionsum/mean/count, time_window...)聚合列自动命名为{function}_{column}如sum_trips、写时转换write_to_online_storeTrue配合store.push摄入输入列以及物化预转换数据的transform_on_writeFalse路径。取数时通过store.get_historical_features(features[transformed_conv_rate:conv_rate_plus_val1, ...])与store.get_online_features(...)引用后者在entity_rows中直接携带请求数据字段例如entity_rows [ { driver_id: 1001, val_to_add: 1, val_to_add_2: 2, } ]2.5 CLI 与管理命令参考文档 docs/reference/beta-on-demand-feature-view.md 记载了两条 ODFV 管理命令对应实现位于 sdk/python/feast/cli/on_demand_feature_views.pydescribe在第 21 行、list在第 45 行feast on-demand-feature-views list # 列出 feast apply 后注册的所有 ODFV feast on-demand-feature-views describe NAME # 查看某个 ODFV 的定义另外参考文档的 Troubleshooting 一节说明feast apply会对 ODFV 做构造随机输入并执行 UDF 推断输出 schema的校验复杂逻辑被误伤时可用store.apply([my_odfv], skip_feature_view_validationTrue)或feast apply --skip-feature-view-validation跳过该开关只跳过视图名唯一性、ODFV 校验与 schema 推断不跳过数据源校验与基础设施更新。2.6 从本地执行到转换服务器博客原文明确写道Currently, these transformations are executed locally. Future milestones include building a feature transformation server for executing transformations at higher scale.当前转换在本地执行未来里程碑是构建更高规模的转换服务器。从源码结构看这一路线图已兑现仓库中存在 sdk/python/feast/transformation_server.py独立转换服务器以及FeatureStore.serve_transformations(port)方法sdk/python/feast/feature_store.py且在线特征服务器侧具备读时执行转换的能力——参考文档明确指出即使以transform_on_writeFalse跳过了写入时转换特征服务器仍可在 API 调用期间为缺失值或需要实时计算的特征执行转换。三、Python Feature Server用 HTTP 把特征服务化3.1 0.13 的定位博客原文对 Python feature server 的定位是提供 HTTP 端点对外提供特征从而让任何能发起 HTTP 请求的编程语言都能从 Feast 取特征。当时的限制与路线只能本地运行远程 Serverless 特征服务器正在开发中低延迟 Java 特征服务器也在开发中。3.2 当前实现FastAPI 端点全貌当前仓库中Python 特征服务器实现于 sdk/python/feast/feature_server.py约 1500 行基于 FastAPI 构建。从源码看除博客时期核心的在线取数端点外端点面已扩展为完整的服务面端点方法位置说明/get-online-featuresPOSTL610核心在线特征检索入口/searchPOSTL694在线向量相似度检索/pushPOSTL812推送特征数据入在线库/write-to-online-storePOSTL920写入在线库含 ODFV 写时转换路径/healthGETL935健康检查/chatGET/POSTL943会话类接口/materialize、/materialize-incrementalPOSTL958、L1017物化任务触发所有端点均挂载Depends(inject_user_details)依赖意味着鉴权含 RBAC 权限断言是服务端内建能力。典型取数请求形如curl -X POST http://localhost:6559/get-online-features \ -H Content-Type: application/json \ -d { features: [driver_hourly_stats:conv_rate], entity_rows: [{driver_id: 1001}] }请求体字段结构与文件中GetOnlineFeaturesRequest模型一致端口按实际启动参数为准。启动方式上sdk/python/feast/feature_store.py 提供FeatureStore.serve(...)系列方法含serve_ui、serve_registry、serve_offline、serve_transformations等变体完整的部署形态包括 Kubernetes Operator Helm Chart 下的无状态多副本部署见 docs/reference/feature-servers/python-feature-server.md。3.3 路线图兑现情况博客中coming soon的两项——Serverless 部署与 Java 特征服务器——在当前仓库中均已可见实体Java 侧有 java/serving服务端与 java/serving-client客户端并配套发布脚本 infra/scripts/publish-java-sdk.shGo 侧有 go/internal/feast/onlineserving 与嵌入式示例 go/embedded/online_features.goKubernetes 侧有 infra/charts/feast-feature-server 与 infra/feast-operator。可以这样理解 0.13 的定位它确立了特征即 HTTP 服务的抽象后续各语言、各部署形态都是在这一抽象上的横向扩展。四、Feature Views Without Entities只按事件时间连接的视图4.1 概念博客原文的表述是这类特征视图允许你声明仅按事件时间戳连接joined on event timestamps的特征在定义和取数时都不需要实体/实体值列表。它的价值在于对于全局统计、环境类、时间序列类特征没有哪个 driver / 哪个 user的维度用户不必再编造一个假实体如id 0来适配带实体的接口。4.2 源码实现DUMMY_ENTITY 占位机制从源码结构看无实体在 Feast 内部并不是删除实体概念而是引入了一个占位实体。sdk/python/feast/feature_view.py 中定义了# DUMMY_ENTITY is a placeholder entity used in entityless FeatureViews DUMMY_ENTITY_ID __dummy_id DUMMY_ENTITY_NAME __dummy DUMMY_ENTITY_VAL DUMMY_ENTITY Entity( nameDUMMY_ENTITY_NAME, join_keys[DUMMY_ENTITY_ID], value_typeValueType.UNKNOWN, ) DUMMY_ENTITY_FIELD Field( nameDUMMY_ENTITY_ID, dtypefrom_value_type(ValueType.STRING), )也就是说当用户声明一个不带实体的视图时registry 内部会为该视图补上名为__dummy、join key 为__dummy_id、取值为空串的占位实体。这样下游的 point-in-time join、在线键拼装key composition等统一走实体路径的代码无需为无实体写特判分支——实体化抽象得以保持单一。这一设计与 docs/getting-started/concepts/batch-feature-view.md 和 docs/getting-started/concepts/feature-view.md 中关于实体与连接键的描述相衔接。4.3 定义与取数形态定义一个无实体特征视图的典型形态entities置空内部按上述占位机制处理from feast import BatchFeatureView, Field from feast.types import Float64 driver_stats_entityless BatchFeatureView( batch_sourcebatch_source, schema[Field(nameglobal_conv_rate, dtypeFloat64)], entities[], # 无实体视图仅按 event_timestamp 参与连接 )取数时对应地省略实体值get_historical_features不需要为该视图提供实体列get_online_features的entity_rows中也不需要driver_id之类的键——请求只需给出时间语义由事件时间戳驱动连接。这与第二章 ODFV 是天然互补的无实体视图为 ODFV 提供全局上下文输入request data 提供请求时刻输入两者在同一转换函数中组合覆盖博客列举的交易类、位置/时间类与交叉特征三类用例。五、总结0.13 的三项能力在今天的坐标0.13 特性0.13 状态当前仓库对应实现On-demand feature views实验转换本地执行sdk/python/feast/on_demand_feature_view.py、docs/reference/beta-on-demand-feature-view.md执行点扩展至特征服务器/转换服务器sdk/python/feast/transformation_server.pyRequest data 概念首次引入sdk/python/feast/data_source.py 的RequestSourcePython feature server实验仅本地sdk/python/feast/feature_server.py另见 Java/Go 实现与 Operator/Helm 部署Feature views without entities正式特性sdk/python/feast/feature_view.py 的DUMMY_ENTITY占位机制使用注意事项本文代码示例区分了0.13 原始写法与当前 API 写法两者类名RequestDataSource→RequestSource与 schema 形式字典 →Field列表不同复制前请确认所用版本ODFV 相关 API 在博客时期即被声明为实验特性仓库参考文档同样保留 Beta 警示生产使用前建议先在小数据集上跑通get_historical_features与get_online_features双路径验证参考文档给出的 7 步开发工作流再用feast on-demand-feature-views list/describe核对注册结果。【免费下载链接】feastThe Open Source Feature Store for AI/ML项目地址: https://gitcode.com/GitHub_Trending/fe/feast创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表