RecSys-Pipeline[全流程推荐系统]

RecSys-Pipeline

项目框架

全流程推荐系统

项目需要把细节搞清楚,即为什么这么做

项目背景:基于经典的MovieLens数据集,设计并实现的一个离线到在线的推荐系统。在单机环境下实现了推荐系统的完整流程,成功将离线数据处理、模型训练、特征存储、实时推荐打分模块集成在一个系统内。

这个系统显然是包含offline、online、offline to online(即使用离线训练好的数据对在线模型进行更新)三个部分

  • 离线阶段使用Pandas和PyTorch模拟工业界HDFS/Spark/GPU集群的大规模数据处理与深度学习模型训练流程。

  • 在线阶段通过Docker调用多个微服务组件,包括Redis(用于用户标签与向量存储)、Elasticsearch(实现基于倒排索引和向量检索的候选召回)、Feast(进行特征存储和管理)和Triton(使用 DeepFM 模型对特征进行实时打分和排序),模拟工业界Spring推荐后端的RPC调用流程。

    什么是微服务组件?什么是微服务?

    • 微服务(Microservices)是一种软件架构风格,它将一个应用程序分解为多个小型、独立的服务,每个服务只负责单一的功能或业务能力。这些服务可以独立开发、部署、扩展,并通过轻量级的通信协议(通常是HTTP/REST API)进行互相通信。

    四个框架(redis、es、feast、triton是什么?原理?使用?)

  • 单机环境下实现了推荐系统的完整流程,成功将离线数据处理、模型训练、特征存储、实时推荐打分模块集成在一个系统内。

MovieLens数据集

  • 推荐系统领域最为经典的数据集之一,其地位类似计算机视觉领域里的MNIST数据集
  • 文件解压之后,可以得到4个文件
  • movies.dat 电影的相关信息,即电影id、电影标题、电影类型
  • user.dat 用户的相关信息,包括性别、年龄、职业
  • ratings.dat 用户id、电影id、该用户对此电影的评分、时间戳。每个用户至少会对20部电影进行评级。
  • README

在线推理流程(online)

  • 使用redis进行user info存储;

  • 使用es进行召回(两条通道:(1)使用user-term即用户的偏好电影类型进行召回(2)使用user-vector和item-vector进行knn召回;)

  • 使用feast进行特征存储(通过id返回特征)

    feast的特殊性在哪里?为什么不使用redis进行id->feature的过程?

  • 使用 triton inference server 进行模型推理。

特征类型

在推荐系统中,特征通常分为稀疏特征(sparse features)和稠密特征(dense features)。

offline-to-online端

截屏2024-10-06 23.22.41
  • 由于online端是实时的,要在offline一侧对online需要的数据进行更新

recall阶段:

  • (1)对redis中的user信息进行维护;(从data_exchange_center.paths中取出数据并插入redis)

  • (2)对es中的item信息进行维护;(创建index、删除现有的数据、插入最新的数据)

    es的具体原理和用法看黑马的视频,并写作博客;

rank阶段:

  • (1)对feast中的feature信息进行维护;
  • (2)对triton中的模型信息进行维护(使用torch.onnx.export的方法将模型导出为onnx格式);
  • (3)分别使用offline模型以及online模型(即在triton部署的推理模型)对同一批样本进行推理,验证部署的有效性;

offline端

截屏2024-10-06 23.23.40
  • 包括预处理、离线recall、离线rank三个部分;其中torchfm是pytorch提供的机器学习模型包

recall阶段:

  • 在racall的offline部分主要负责:生成es所需要的item/user vector以及term

  • 其中vector-recall部分:使用MF(矩阵分解)模型进行训练;构建user矩阵P以及item矩阵Q;使用实际的评分训练集对嵌入矩阵P和Q进行训练;

    虽然叫做MF模型,但是并没有实际的使用矩阵分解;而是通过对P和Q矩阵进行Xavier初始化,然后使用训练数据进行迭代训练;

  • 最后的AUC(使用测试集的预测成功概率的ROC)达到0.81,性能相对优秀;

rank阶段:

  • 在rank的offline部分负责

    (1)生成feast所需要的user/item feature,这部分需要详细的特征工程;

    (2)进行rank模型(DeepFM)的模型训练;

DeepFM

论文链接:DeepFM: AFactorization-Machine based Neural Network for CTR Prediction

  • 结构/原理效果

数据交换中心

  • 数据的统一集成:整合来自不同来源(如用户行为日志、物品特征、外部数据源等)的数据
  • 数据的统一存储和标准化
  • 有利于实时数据流动

如何召回?

  • 在实时online的召回阶段:主要通过(1)倒排索引(2)向量检索

如何排序?

  • 通过deepfm模型对特征的相似度进行打分,排序;

技术选型

Flask Web框架:

  • Python常用的web框架有Django, Flask, FastAPI, Tornado等,都可以实现REST API请求 -> url路由到某个函数 -> 处理的逻辑,各有优缺点,随机选取了Flask 。这里使用Python作为后端仅仅是因为环境安装方便,工业界的推荐系统一般会使用Java + SpringBoot或者Go + Gin作为web后端。

  • Triton 全称是Triton Inference Server,是Nvidia开源的全模型serving引擎,支持TensorFlow、PyTorch、ONNX和其他各种模型,虽然是N家的产品,但是也可以使用cpu进行serving,所以请放心使用。业界更通用的方案是TensorFlow -> SavedModel -> TF Serving,但Triton因为不会被绑定在一家平台上,个人非常看好它的前景,所以这里使用的是PyTorch -> ONNX -> Triton Server的方案。

  • Elasticsearch 的大名也是无人不知,我们使用它来为item构建倒排索引和向量索引。它最初被用于搜索领域,最原始的用法是用word去检索doc,如果我们将一个item视为一篇doc,它的标签(如电影类别)视为word,就可以借助ES来根据标签检索item,这就是倒排索引的概念,因此Elasticsearch也常被用于推荐系统的term召回模块。对于向量召回,经典工具是facebook开源的faiss,但是为了方便整合,我们在这里使用Elasticsearch提供的向量检索功能,Elasticsearch自版本7开始支持向量检索,版本8开始支持近似KNN检索算法,这里我们安装的是8及以后的版本,因为精确KNN检索的性能几乎不可能满足线上使用。

项目创新点

+

参考链接: