1. 在线和离线特征
如果在训练和推理系统中特征工程代码不相同,则存在代码不一致的风险,因此,预测可能不可靠,因为特征可能不相同。一种解决方案是让特征工程作业将特征据写入在线和离线数据库。训练和推理应用程序在做出预测时都需要读取特征-在线应用可能需要低延迟(实时)访问该特征数据,另一种解决方案是使用共享特征工程库(在线应用程序和训练应用程序使用相同的共享库)。
2. 时间旅行
“考虑到过去发生的事件,事件发生期间特征价值是什么?“
通常数据库不支持时间旅行,即通常无法在某个时间点查询某个列的值。当然可以通过确保定义特征数据的schema都包含datetime / event-time列来解决此问题,最近的数据湖通过存储所有更新以支持对旧特征值查询,从而增加了对时间旅行查询的支持。一些支持时间旅行功能的数据平台:
- Apache Hudi
- Databricks Delta
- Data Version Control (更像Git而不是数据库)
3. 特征工程
Michelangelo添加了特定领域语言(DSL)以支持原始数据源(数据库,数据湖)的工程特征。使用通用框架(如Apache Spark / PySpark,Pandas,Apache Flink和Apache Beam)也是一个不错的选择。
4. 物化训练/测试数据
模型的训练数据既可以直接从特征存储传输到模型中,也可以物化到存储系统(例如S3,HDFS或本地文件系统)中。如果将多个框架用于ML – TensorFlow,PyTorch,Scikit-Learn,则建议将训练/测试数据物化为框架的本机文件格式(Tensorflow为.tfrecords,PyTorch为.npy)。
ML框架的常见文件格式:
- .tfrecords(TensorFlow / Keras)
- .npy(PyTorch,Scikit-Learn)
- .csv(Scikit-Learn等)
- .petastorm(TensorFlow / Keras,PyTorch)
- .h5(Keras)
5. 在线特征存储
模型可能具有数百个特征,但是在线应用程序可能只是从用户交互(userId,sessionId,productId,datetime等)中接收了其中的一些特征。在线应用程序使用在线特征存储来查找缺失的特征并构建特征向量,该特征向量被发送到在线模型以进行预测。在线模型通常通过网络提供服务,因为它将模型的生命周期与应用程序的生命周期不相同。在线特征存储的延迟、吞吐量、安全性和高可用性对于其在企业中的成功至关重要。下面显示了现有特征存储中使用k-v数据库和内存数据库的吞吐量。
6. 特征存储对比