- 数据自助服务实践指南:数据开放与洞察提效
- (美)桑迪普·乌坦坎达尼
- 2075字
- 2022-05-20 19:18:51
4.4 实现模式
与现有的任务图相对应,特征存储服务的自动化有三个级别(如图4-4所示)。每个级别都对应将目前手工或效率低下的任务组合自动化。
图4-4:特征存储服务的不同自动化级别
混合特征计算模式
将批处理和流处理组合用于计算特征的模式。
特征注册模式
用于训练和推理的特征的模式。
特征存储服务越来越流行,开源的特征存储服务有Uber的Michelangelo(https://oreil.ly/56ukj)、Airbnb的Zipline(https://oreil.ly/cKwoi)、Gojek的Feast(https://oreil.ly/foWgT)、Comcast的Applied AI(https://oreil.ly/pw9it)、Logical Clock的Hopsworks(https://oreil.ly/EMeHg)、Netflix的Fact Store(https://oreil.ly/aiIZJ)和Pinterest的Galaxy(https://oreil.ly/sFSeL)。你可以在featurestore.org上找到特征存储的完整开源项目列表。从体系结构的角度来看,每个项目都有两个关键的功能模块:特征计算和特征服务。
4.4.1 混合特征计算模式
特征计算模块必须支持两组机器学习场景:
- 离线训练和推断,以小时为频率计算批量历史数据。
- 在线训练和推断,以分钟为频率计算一次特征值。
在混合特征计算模式中,有三个功能模块(如图4-5所示):
图4-5:混合特征计算模式中的并行管道
批处理计算管道
传统的批处理作为ETL作业,每隔几个小时运行一次或每天运行一次,以计算历史特征值。该管道经过优化,可以在大时间窗口上运行。
流式计算管道
在实时消息总线上对数据事件进行流式分析,以低延迟计算特征值。特征值被回填到批处理管道的大量历史数据中。
特征规范
为了确保一致性,数据用户不需要为新特征创建管道,而是使用特定领域的语言(DSL)定义一个特征规范。该规范指定了数据源和依赖关系,以及生成特征所需的转换。该规范会自动转换为批处理管道和流式管道,这确保了用于训练和推理的管道代码的一致性,并且无须用户参与。
混合特征计算模式的一个示例是Uber的Michelangelo(https://oreil.ly/56ukj),它集成了Apache Spark和Samza两个框架。它使用Spark计算批处理特征,并将结果持久化到Hive中。批处理作业计算特征组,并以每列一个特征的形式写到一个Hive表中。例如,Uber Eats(Uber的送餐服务)使用批处理管道来处理餐厅过去7天的平均备餐时间等特征。对于流式管道,Kafka主题与Samza流式计算作业一起使用,以生成近实时的特征值,这些特性值在Cassandra中以键-值格式持久化。历史特征会定期从Hive中批量预计算并加载到Cassandra中。例如,Uber Eats使用流式管道来获取特征,比如餐厅在过去一小时内的平均备餐时间。特征是使用DSL定义的,DSL可以选择、转换和组合在训练和预测时发送给模型的特征。DSL是作为Scala的一个子集来实现的,Scala是一种纯函数语言,拥有一套完整的常用函数。数据用户还可以添加用户实现的自定义函数。
混合特征计算模式的优点:
- 在跨批处理和流时间窗口的特征计算中,能获得最佳性能。
- 用DSL来定义特征,避免了训练和推理的管道实现中的差异带来的不一致性。
混合特征计算模式的缺点:
- 在生产中实现和管理该模式并不简单,它的实现依赖成熟的数据平台。
混合特征计算模式是实现特征计算的一种先进方法,它同时针对批处理和流式计算进行了优化。Apache Beam等编程模型正在逐渐将批处理和流式计算融合起来。
4.4.2 特征注册模式
特征注册模式可以让特征易于发现和管理,并能高效地为在线/离线训练和推理服务提供特征值。正如Li等人(https://oreil.ly/sFfDJ)观察到的,这些用例的需求差异很大。批量训练和推理需要高效的批量访问,实时预测需要低延迟、每条记录的访问。单一存储对于历史和近实时特征来说并不是最佳选择,原因主要有:
a. 数据存储对于点查询或批量访问都是高效的,但不是同时都高效;
b. 频繁的批量访问会对点查询的延迟产生负面影响,使得两者难以共存。不管是哪种用例,特征都是通过规范名称来标识的。
对于特征发现和管理,特征注册模式是发布和发现特征以及训练数据集的用户界面。特征注册模式还可以作为一种工具,通过比较特征版本来分析特征随时间的变化。当开始一个新的数据科学项目时,数据科学家通常会先扫描特征注册中的可用特征,只为模型添加特征存储中尚不存在的新特征。
特征注册模式有以下功能模块:
特征值存储
存储特征值。针对批量存储的常见解决方案有Hive(Uber和Airbnb使用)、S3(Comcast使用)和Google BigQuery(Gojek使用)。对于在线数据,通常使用Cassandra等NoSQL存储。
特征注册存储
存储计算特征的代码、特征版本信息、特征分析数据和特征文档。特征注册提供自动特征分析、特征依赖跟踪、特征作业跟踪、特征数据预览,以及对特征/特征组/训练数据集元数据的关键字搜索。
特征注册模式的一个示例是Hopsworks特征存储(https://oreil.ly/7c_fx)。用户用SQL或编程的方式查询特征存储,然后特征存储以数据帧的形式返回特征(如图4-6所示)。在Hopsworks特征存储中,特征组和训练数据集连接到Spark/NumPy/pandas作业,这样可以在必要时复制和重新计算特征。除了特征组或训练数据集之外,特征存储还实现了数据分析功能,可以查看特征值、特征相关性、特征直方图和描述性统计的聚类分析。例如,特征相关信息可用于识别冗余特征;特征直方图可用于监控特征在不同版本之间的特征分布,以发现协方差;聚类分析可用于发现异常值。在特征注册中访问这些统计信息有助于用户决定使用哪些特征。
图4-6:用户对特征存储的查询会产生数据帧(以通用的格式表示,即pandas、NumPy或Spark)(来自Hopsworks文档(https://oreil.ly/2o1e0))
特征注册模式的优点:
- 它提供了高性能的训练数据集和特征值服务。
- 它能减少数据用户的特征分析时间。
特征注册模式的缺点:
- 当为数百个模型提供服务时,可能存在性能瓶颈。
- 特征数量不断增加时,需要为连续特征分析进行扩展。