如何使用ScyllaDB NoSQL构建AI/ML特征存储

自2017年Uber通过Michelangelo引入机器学习(ML)特征存储的概念以来,这一技术在关键业务应用中的关注度和应用率持续攀升。本文将深入探讨ML特征存储的基础知识,并探究为何ScyllaDB能成为特征存储架构中的关键组成部分。

要理解特征存储的本质,首先需明确特征的含义。

### 什么是特征?

在机器学习领域,特征是一组数据点,用于训练模型并对未来进行预测,这些预测基于历史数据。例如,我们的特征存储示例应用允许用户根据历史航班记录预测航班延误情况。

特征是复杂数据处理和转换流程的产物。海量的特征数据是实现精准预测和成功机器学习项目的基础。

### 什么是特征存储?

A feature store is a central database in your machine-learning architecture that contains your real-time and historical features. Feature stores allow your data engineers and data scientists to use the same central repository to discover, monitor, and analyze features.
What does a feature store architecture look like?

#### 特征存储中的在线与离线数据库

在讨论特征存储时,用户通常会在其架构中区分两种类型的数据库:一方面是使用在线数据库,另一方面可能还拥有一个离线数据库。这两种数据库各司其职,发挥着不同的作用。

离线数据库:这种数据库存储历史处理过的特征,通常是批量导入。离线数据库包含来自历史的大时间跨度的特征数据,因此对于处理特定历史时期的特征集非常有用。

在线数据库:此数据库可能包含来自实时数据流和离线数据库的数据。在线存储用于为生产模型和其他实时应用提供最新的特征数据。在这里,性能和低延迟至关重要。如果数据库无法快速提供实时特征,那么模型可能会使用过时或不准确的数据进行预测。

特征库数据建模:宽表设计与窄表设计

在设计特征库(无论是离线还是在线)的数据模型时,可以选择两种类型的表设计:宽表和窄表。每种设计都有其优缺点。让我们通过实际例子来了解它们为何适合或不适合您的用例:

宽表设计

宽表设计为每个特征包含单独的列。想要存储在表中的特征类型越多,就需要创建更多的列。

宽表布局示例

create table feature_store.wide_example(
    date TIMESTAMP,
    feature_id INT,
    feature_col1 FLOAT,
    feature_col2 FLOAT,
    feature_col3 FLOAT,
    feature_col4 FLOAT,
    feature_col5 FLOAT,
    feature_col6 FLOAT,
    feature_col7 FLOAT
)

view rawgistfile1.txt 

这种布局一开始可能易于上手,但随着时间的推移,维护变得复杂,且难以进行更改。每当您想要引入新特征(或删除现有特征)时,都需要修改架构,这可能相当复杂。

窄表设计

窄表设计简洁且易于维护,这是因为列数在将来不会增加或减少,即便添加或移除功能也是如此。

窄表布局示例

create table feature_store.narrow_example(
    feature_id INT,
    feature_name TEXT,
    feature_value FLOAT
)

view rawgistfile1.txt 

采用此布局,您可以长期仅使用两个固定列来存储功能:一列用于功能名称(例如,LATE_AIRCRAFT_DELAY),另一列用于该功能的值。

通常,窄表在检索数据时可能需要进行数据类型转换,因为数据格式不正确(例如,列类型为FLOAT,但实际上数据值为INTEGER)。幸运的是,在讨论特征存储时,在线和离线存储中的数据已经以适当的清洁数字(FLOAT)格式存在,且所有值具有相同的数据类型,这意味着对于特征存储而言,这并非缺点。

什么是ScyllaDB,以及如何在特征存储架构中使用它?

为了使机器学习团队能够构建实时推理应用,他们需要能够大规模低延迟返回特征的数据库。ScyllaDB是一种高性能、低延迟的NoSQL数据库,能够处理大量读写操作。此外,ScyllaDB是GE Healthcare或ShareChat等公司用于关键任务特征存储工作负载的可靠数据库。凭借其高可用性和容错能力,ScyllaDB可以在对性能和可靠性至关重要的基础设施中承担重任。

除了将ScyllaDB作为特征存储架构中的在线存储外,它还被用作在线/离线混合存储解决方案。采用这种方法,您可以通过单一数据库来处理所有特征存储工作负载,从而减轻团队的维护负担。

用户常将ScyllaDB置于架构核心,用于持久化存储和检索特征及特征存储元数据。在这种情况下,ScyllaDB充当在线存储。其他用户也将ScyllaDB用作其在线/离线混合存储。为了加速模型开发,性能是一个关键要求,而ScyllaDB的读写性能始终能够达到或超过用户期望。

事实上,一些用户发现ScyllaDB能够替代多个数据库,作为其机器学习数据需求的单一中心存储。例如,ScyllaDB可以取代Redis(在线存储)和PostgreSQL(离线存储),使得基础设施维护成本更低且更简单。

在需要低延迟和高性能的使用场景中,ScyllaDB表现出色。此外,ScyllaDB与Cassandra和DynamoDB兼容,这意味着如果您已经在使用这些数据库之一,您可以无缝迁移而无需更改查询。

教程:ScyllaDB在线存储

为了帮助您开始使用ScyllaDB作为在线存储,我们创建了一个示例应用(也可在GitHub上获取)。

  1. 克隆仓库
  2. 注册ScyllaDB云服务或本地安装ScyllaDB
  3. 创建模式:
    cqlsh “node-0.aws_us_east_1.xxxxxxxxx.clusters.scylla.cloud” 9042 -u scylla -p “password” -f schema.cql
  4. 通过cqlsh连接实例并导入示例数据集
    cqlsh “node-0.aws_us_east_1.xxxxxxxxx.clusters.scylla.cloud” 9042 -u scylla -p “password” scylla@cqlsh> COPY feature_store.flight_features FROM ‘flight_features.csv’;

此命令将一个示例航班数据集导入:

op_carrier_fl_num|actual_elapsed_time|air_time|arr_delay|arr_time|cancellation_code|cancelled|carrier_delay|crs_arr_time|crs_dep_time|crs_elapsed_time|dep_delay|dep_time|dest|distance|diverted|fl_date            |late_aircraft_delay|nas_delay|op_carrier|origin|security_delay|taxi_in|taxi_out|weather_delay|wheels_off|wheels_on|
—————–+——————-+——–+———+——–+—————–+———+————-+————+————+—————-+———+——–+—-+——–+——–+——————-+——————-+———+———-+——+————–+——-+——–+————-+———-+———+
             4317|               96.0|    73.0|    -19.0|  2113.0|                 |      0.0|             |        2132|        2040|           112.0|     -3.0|  2037.0|MLI |   373.0|     0.0|2018-12-31 02:00:00|                   |         |OO        |DTW   |              |    5.0|    18.0|             |    2055.0|   2108.0|
             3372|               94.0|    74.0|     81.0|  1500.0|                 |      0.0|          0.0|        1339|        1150|           109.0|     96.0|  1326.0|RNO |   564.0|     0.0|2018-12-31 02:00:00|               81.0|      0.0|OO        |SEA   |           0.0|    3.0|    17.0|          0.0|    1343.0|   1457.0|
             1584|              385.0|   348.0|    -21.0|  2023.0|                 |      0.0|             |        2034|        1700|           394.0|     -9.0|  1658.0|SFO |  2565.0|     0.0|2018-12-31 02:00:00|                   |         |UA        |EWR   |              |   13.0|    33.0|             |    1731.0|   2019.0|
             4830|              119.0|    85.0|    -35.0|  1431.0|                 |      0.0|             |        1437|        1245|           136.0|    -13.0|  1232.0|MSP |   546.0|     0.0|2018-12-31 02:00:00|                   |         |OO        |MSP   |              |   16.0|    18.0|             |    1250.0|   1415.0|
             2731|              158.0|   146.0|    -19.0|  1911.0|                 |      0.0|             |        1930|        1800|           160.0|     -8.0|  1800.0|MSP |   842.0|     0.0|2018-12-31 02:00:00|                   |         |WN        |PVD   |              |    7.0|     7.0|             |    1807.0|   1904.0|

view rawgistfile1.txt hosted with ❤ by GitHub.

ScyllaDB + Feast

ScyllaDB还与Feast等特征存储工具集成。Feast是一个流行的开源生产ML特征存储。在使用Feast时,您可以选择多种数据库作为在线特征存储,包括ScyllaDB。

要将ScyllaDB设置为Feast的在线存储,您需要编辑Feast的配置文件并添加ScyllaDB凭据。由于ScyllaDB与Cassandra兼容,因此可以使用Feast内置的Cassandra连接器。

# feature_store.yaml
project: scylla_feature_repo
registry: data/registry.db
provider: local
online_store:
    type: cassandra
    hosts:
        – node-0.aws_us_east_1.xxxxxxxx.clusters.scylla.cloud
        – node-1.aws_us_east_1.xxxxxxxx.clusters.scylla.cloud
        – node-2.aws_us_east_1.xxxxxxxx.clusters.scylla.cloud
    keyspace: feast
    username: scylla
    password: password

view rawgistfile1.txt hosted with ❤ by GitHub.

总结

特征存储对于特征工程和构建机器学习模型至关重要。如果您正在构建实时特征存储基础设施,则需要仔细考虑性能。低延迟、高性能和高吞吐量的要求使得NoSQL数据库成为特征存储中在线存储解决方案的理想选择。

Source:
https://dzone.com/articles/tutorial-whats-an-aiml-feature-store-and-how-to-bu