用蜻蜓经营盛宴特色商店
#database #体系结构 #redis

盛宴的简要介绍

Feast是一家出色的开源功能商店,彻底改变了实时应用程序的高效管理和机器学习功能(ML)功能。
盛宴以其核心提供了一个复杂的界面,用于存储,发现和访问特征,即ML建模必不可少的单个可测量属性或数据的特性。
在分布式体系结构上操作,盛宴和谐地整合了几个关键组件,包括盛宴注册表,流处理器,批处理物质化引擎和商店。

通过利用存储在数据源中的历史特征值来促进离线和在线存储范式,可以实现全面的时间序列分析。
为了实时响应能力,盛宴利用在线商店,确保在低潜伏期中提供功能。
使用简单的feast materialize命令,功能值从数据源流到在线商店,以无与伦比的敏捷性和性能增强您的ML应用程序。

盛宴支持的在线商店之一是Redis。在这篇博客文章中,我们将探讨如何将蜻蜓用作Redis的替代品作为盛宴的在线商店。

内存在线商店

确定功能存储成功的最关键因素之一是其在低潜伏期中服务功能的能力。
高潜伏期会严重影响模型性能和用户体验,从而导致预测延迟和次优结果。

内存数据存储在低延迟功能上提供了可观的优势。
通过将数据直接存储在内存中,它们消除了磁盘I/O操作的需求,这通常是从传统存储系统中检索数据的瓶颈。
随着数据驻留在RAM中,内存数据存储迅速检索并提供特征,从而导致近乎触发的响应时间。



它使机器学习模型能够迅速访问必要的功能,从而允许更有效,及时的预测或推断。
无论是提供个性化的建议,做出即时决定还是为实时分析提供动力,内存数据存储确保快速访问功能,从而有助于改善模型性能并提高用户满意度。

遇到蜻蜓

Dragonfly是一种尖端的内存数据存储,通过集成到多线程,无共享的体系结构中的新算法和数据结构来区分自己。

它的硬件效率使蜻蜓可以在8GB机器上运行单个节点或垂直扩展到具有64个内核的巨大的1TB机器上的单个节点。


这种多功能性不仅可以节省大量的基础架构,而且简化了建筑复杂性。

另一个真正的奇迹在于蜻蜓的出色API兼容性,不仅在盛宴中而且在许多其他情况下都可以替代Redis。
从版本1.6.2开始,蜻蜓拥有超过200个redis命令的令人印象深刻的实现,涵盖了绝大多数用例,包括对盛宴依靠的哈希数据结构来存储特征值的支持。

,随着蜻蜓的兼容性,效率和全面功能的令人印象深刻的融合,我们开始探索它作为在线功能商店的巨大福利,从而解除了性能和可扩展性的新维度。

与蜻蜓一起参加盛宴:动手指南

在本节中,我们将进行一些动手步骤,以演示如何无缝与蜻蜓进行盛宴。
本教程受到official Feast documentation的高度启发,重点是将蜻蜓作为盛宴的在线商店。

1.先决条件

确保在您的平台上安装了Pythonpip。然后,我们可以安装盛宴SDK和CLI:

pip install feast

为了将蜻蜓用作在线商店,我们需要安装redis额外:

pip install 'feast[redis]'

2.创建功能存储库

开始,我们可以使用feast cli来引导一个新功能存储库。

feast init feast_dragonfly
cd feast_dragonfly/feature_repo

Feast feature repository

组成
  • 包含特征声明的Python文件集合。
  • 一个包含基础结构配置的feature_store.yaml文件。
  • 一个.feastignore文件,其中包含要忽略的功能存储库中的路径。

我们对feature_store.yaml文件感兴趣,因为它包含基础架构的配置,例如在线商店,用于盛宴。
使用以下内容更新feature_store.yaml文件:

project: feast_dragonfly
registry: data/registry.db
provider: local
online_store:
  type: redis
  connection_string: "localhost:6379"

3.开始蜻蜓

get Dragonfly up and running quickly有几个选项,我们将使用Docker进行本教程:

docker run --network=host --ulimit memlock=-1 docker.dragonflydb.io/dragonflydb/dragonfly

将蜻蜓作为在盛宴上的在线商店的融合而令人惊讶地直接而没有障碍。
我们没有在本地运行Redis实例,而是毫不费力地发起了蜻蜓。
在提供的feature_store.yaml配置文件中,我们指示盛宴使用在线商店,指向localhost:6379,该商店与Dragonfly的默认运行配置一致。

这种过渡的美在于易于实现。它不需要盛宴的核心配置。
我们只是指示盛宴使用蜻蜓,仅此而已!从这一点开始,教程将继续作为典型的盛宴指南,使您有能力探索其巨大的能力。

4.注册功能定义并部署功能存储

在同一feast_dragonfly/feature_repo目录中,使用以下命令:

feast apply

apply命令扫描当前目录中的python文件(在这种情况下为example_repo.py)进行功能视图和实体定义,注册对象并部署基础结构。
我们应该在成功后看到以下输出:

....
Created entity driver
Created feature view driver_hourly_stats_fresh
Created feature view driver_hourly_stats
Created on demand feature view transformed_conv_rate
Created on demand feature view transformed_conv_rate_fresh
Created feature service driver_activity_v1
Created feature service driver_activity_v3
Created feature service driver_activity_v2

5.生成培训数据

将下面的代码保存为generate_training_data.py

from datetime import datetime
import pandas as pd

from feast import FeatureStore

# Note: see https://docs.feast.dev/getting-started/concepts/feature-retrieval for 
# more details on how to retrieve for all entities in the offline store instead
entity_df = pd.DataFrame.from_dict(
    {
        # entity's join key -> entity values
        "driver_id": [1001, 1002, 1003],
        # "event_timestamp" (reserved key) -> timestamps
        "event_timestamp": [
            datetime(2021, 4, 12, 10, 59, 42),
            datetime(2021, 4, 12, 8, 12, 10),
            datetime(2021, 4, 12, 16, 40, 26),
        ],
        # (optional) label name -> label values. Feast does not process these
        "label_driver_reported_satisfaction": [1, 5, 3],
        # values we're using for an on-demand transformation
        "val_to_add": [1, 2, 3],
        "val_to_add_2": [10, 20, 30],
    }
)

store = FeatureStore(repo_path=".")

training_df = store.get_historical_features(
    entity_df=entity_df,
    features=[
        "driver_hourly_stats:conv_rate",
        "driver_hourly_stats:acc_rate",
        "driver_hourly_stats:avg_daily_trips",
        "transformed_conv_rate:conv_rate_plus_val1",
        "transformed_conv_rate:conv_rate_plus_val2",
    ],
).to_df()

print("----- Feature schema -----\n")
print(training_df.info())

print()
print("----- Example features -----\n")
print(training_df.head())

要生成培训数据,运行:

python generate_training_data.py

6.将批处理功能摄入在线商店

接下来,我们将功能的最新值序列化以来为服务准备的时间:

feast materialize-incremental $(date -u +"%Y-%m-%dT%H:%M:%S")

当使用蜻蜓作为在线商店存储功能数据时,盛宴利用哈希数据结构存储两级地图。
地图的第一级包含盛宴项目名称和实体密钥。实体密钥由实体名称和值组成。
第二级键(即Hash的field)包含功能表名称和功能名称,Hash value包含特征值。
如果您想了解更多有关蜻蜓中的盛宴特征的信息,请随时使用redis-cli连接到本地蜻蜓实例。

7.提取推理特征向量

在推理时,我们需要快速阅读使用get_online_features()的在线功能存储中的不同驱动程序(否则可能仅在批处源中存在的)。
将下面的脚本保存为fetch_feature_vectors.py

from pprint import pprint
from feast import FeatureStore

store = FeatureStore(repo_path=".")

feature_vector = store.get_online_features(
    features=[
        "driver_hourly_stats:conv_rate",
        "driver_hourly_stats:acc_rate",
        "driver_hourly_stats:avg_daily_trips",
    ],
    entity_rows=[
        # {join_key: entity_value}
        {"driver_id": 1004},
        {"driver_id": 1005},
    ],
).to_dict()

pprint(feature_vector)

要获取功能向量,运行:

python fetch_feature_vectors.py

我们应该看到类似于以下的输出:

{
    'acc_rate': [0.1056235060095787, 0.7656288146972656],
    'avg_daily_trips': [521, 45],
    'conv_rate': [0.24400927126407623, 0.48361605405807495],
    'driver_id': [1004, 1005]
}

结论

在这篇博客文章中,我们目睹了蜻蜓作为盛宴的在线商店的轻松整合。
通过简单地指示盛宴使用蜻蜓,我们接受了一个现代的内存数据存储,能够提供Swift功能。

我们在上面的教程中的主要重点是蜻蜓的redis命令兼容性。
但是,蜻蜓的功能超出了单纯的协议和命令兼容性。
无论是在小型实例上部署还是为大型机器提供动力,蜻蜓的多功能性闪耀,提供无与伦比的硬件效率,以降低基础架构成本和复杂性。
要深入研究蜻蜓的硬件效率,请探索this dedicated blog post关于缩放和性能比较。

我们的command referencedocumentation提供了广泛的资源,以全面了解蜻蜓的全部能力。

在我们的核心中,我们致力于培养一个蓬勃发展的开源社区。
作为对尖端技术的热情支持者,我们的团队正在积极地与更多的开源项目合作,以确保与蜻蜓的简化集成。
通过扩大我们的影响力并参与协作努力,我们旨在通过蜻蜓的无与伦比的效率增强各种生态系统的能力。
请继续关注我们的新闻通讯并加入我们的社交媒体渠道,以了解更多的蜻蜓集成!