以推荐系统中最经典的MovieLens数据集为例,介绍推荐系统从离线到在线的全流程,所有操作都可以在一台笔记本上完成,虽然缝合的东西多,但所有东西都被封在了Conda和Docker里,不会对本地环境有任何伤害。
- Conda环境安装pandas和PyTorch模拟工业界的HDFS -> Spark -> GPU集群的离线模型训练。
- Conda环境安装Flask模拟工业界的Spring推荐后端。
- Docker环境安装Redis + Elasticsearch + Feast Feature Store + Triton Inference Server四个组件,用本机localhost调用Docker来模拟工业界的推荐后端RPC调用各个组件。
- Redis用于存储召回所需的user标签和向量。
- Elasticsearch用于构建召回所需的item标签和向量索引。
- Feast用于存储排序所需的user和item特征。
- Triton用作排序所需的实时打分引擎。
所有代码整理在了github仓库里,代码可以直接运行。
GitHub链接(所有代码)https://github.com/akiragy/recsys_pipeline
整个推荐系统的架构图如下,下面将分离线、离线到在线、在线三个阶段来介绍召回和排序模块的开发部署流程。
1 离线
1.0 创建conda环境并安装依赖
conda create -n rsppl python=3.8
conda activate rsppl
conda install --file requirements.txt --channel anaconda --channel conda-forge
1.1 预处理
cd offline/preprocess/
python s1_data_split.py
python s2_term_trans.py
在标记、样本、特征方面做了一些预处理:
-
标记:搜广推中隐式反馈推荐系统(点击/未点击)远远多于显式反馈推荐系统(评分),所以我们将ml数据集转化为隐式反馈:将评分大于3的视为正样本,评分小于等于3的视为负样本,共有575281正样本,424928负样本。
-
样本:我们将每个user的打分行为按时间戳排序,每个user最后10个评分的item用作online评估(60400个),对于剩余的样本,每个user的前80%评分的item用作offline训练集(754233个),后20%评分的item用作of