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

发布时间:2026/9/16 18:57:26

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),仅供参考
延伸阅读

更多相关文章

2026/9/16 18:57:26

Unity调起iOS相机相册:原生桥接方案详解与踩坑实录

做 Unity 移动端开发的人,迟早会碰上一个绕不过去的需求:游戏里要拍照、要选图、要识别二维码,结果发现Unity 自己没有一套能直接调起 iOS 系统相机和相册的官方接口。社区里是有现成插件,但插件一多维护成本就上来了,…

2026/9/16 18:57:26

Qt文件资源管理器开发:QFileSystemModel核心实践与性能优化

简介:QT文件资源管理器是一份基于C与Qt框架的完整工程示例,面向刚接触桌面开发或希望系统学习Qt文件操作的中初级开发者。项目实现了类似Windows资源管理器的常用交互:文件与文件夹的复制、剪切、重命名、删除,新建文件夹&#xf…

2026/9/16 18:57:26

技术演进对人类存在形态的三重解构与重构

1. 技术演进对人类存在形态的三重解构人类文明发展史本质上是一部技术与人相互塑造的历史。最近在整理技术哲学资料时,我注意到一个有趣的现象:医学、工业和智能三个技术时代,分别对人类不同维度的存在形态进行了系统性解构与重构。这种解构不…

2026/9/16 19:52:35

Java课程设计餐厅点菜系统:MySQL表设计与JDBC事务实践

简介:基于Java Eclipse设计实现的餐厅点餐系统课程设计源码与配套说明文档,适合Java初学者、软件工程课程设计学生,以及需要快速搭建点餐原型的开发者。资料围绕课程设计任务展开,涵盖系统可行性分析、需求建模、订单流程与用户界…

2026/9/16 19:52:35

Windows平台LibTorch开发环境配置指南

1. 环境准备与工具选型在Windows平台上配置LibTorch开发环境需要先明确几个关键要素。LibTorch是PyTorch的C前端,为需要在C环境中使用PyTorch功能的开发者提供了官方支持。选择VS2019作为开发环境主要考虑到其对C17标准的完整支持,以及微软生态下的调试工…

2026/9/16 19:52:35

TuShare 行情写入 ACCESS 出差错?让 Codex 走 TaoToken 查 pyodbc 脚本

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/16 19:52:35

51单片机+Proteus仿真:多功能断路器开发设计全解析

简介:基于51单片机Proteus仿真的多功能断路器开发设计资料包,主要面向单片机初学者、电子类课程设计学生以及嵌入式项目开发者。资源围绕智能断路器展开,能够实现电流、电压、温度的实时检测,过压、欠压、过流、过热判断与报警控制…

2026/9/16 19:52:35

PAJ7620手势识别寄存器级开发指南:I²C初始化与置信度过滤实战

简介:本资源是一套面向嵌入式开发工程师与STM32初学者的手势识别系统完整开发套件,聚焦PAJ7620U2手势传感器模块的硬件接入与软件驱动实现。内容覆盖从芯片选型、电路设计到多平台移植的全链路技术支撑,特别适配F103/F407/F429等主流STM32系列…

2026/9/16 19:47:35

vmdk转qcow2完整指南:StarWind V2V迁移KVM/OpenStack与镜像瘦身技巧

做虚拟化运维的朋友应该都遇过这种尴尬:vCenter上跑得好好的虚拟机,上面承载着各种老业务,突然因为成本、架构调整或者国产化要求,需要整体迁到KVM或OpenStack这套开源虚拟化环境里。业务迁移本身倒不难,难就难在第一步…

2026/9/16 12:52:37

拯救者Y7000黑屏故障排查与维修实战指南

1. 项目概述:一台黑屏的拯救者Y7000,到底卡在哪一步? 联想拯救者Y7000系列笔记本,从2018年第一代搭载i5-8300H开始,到后来的i7-9750H、i7-10750H、i5-11400H,再到2023年款的R7-7840HS,它始终是学…

2026/9/16 0:04:09

PHP源码部署实战:从环境配置到运行情侣游戏全攻略

简介:这是一套面向情侣互动场景的PHP完整源码,集成情侣飞行棋、真心话大冒险、情趣骰子等玩法,并内置完整分销制度,可自定义多种返佣比例,源码完全开源无加密,支持微信无感自动授权登录与第三方授权&#x…

2026/9/15 14:22:53

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/15 21:31:11

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/15 11:42:23

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
咨询二维码