Avatar

NextRec:高效,模块化的轻量级深度学习推荐系统框架

Nov 30 · 5min · comments

推荐系统NextRec
介绍一下最近自己写的推荐算法框架。

最近两个月都没有更新博客,是因为在写一个推荐算法框架,现在这个项目已经上线github了,收获了一些好评,因此写一篇介绍性质的文章,来介绍这个框架。

以下是正文。


2014年以后,随着深度学习的发展,推荐系统也在高速发展:从最早的CF/MF类模型,到LR模型,再到深度模型大一统。在这过程里,模型不断复杂化:Embedding,Transformer,MoE,对比学习,多任务学习,生成式召回各种概念迅速被提出。每一篇论文的发布,都可能多出一个新的思路或架构。

但问题也随之而来:

  • 模型越来越多,「样板代码」膨胀
  • 不同论文模型结构相似,却无法复用
  • 特征表达层、模型层、推理 pipeline 缺乏统一封装
  • 学术代码难以落地业务,工业代码不够灵活

逐渐有了一些开源项目框架尝试解决这些问题:例如DeepCTRFuxiCTREasyRectorch-rechub。出于不同的出发点和设计理念,这些框架的侧重点各不相同,有的框架侧重快速实验和复现,有的专门为工业场景开发。

面对数据实时性需求不强的场景时,通常的工作流是通过spark集群拉取离线特征的parquet/csv,在本地训练后进行T+1日期维度的推理。这个场景下,上述的一些框架可能有些太轻,一些框架又有点太重。NextRec正是在这样的背景下诞生的,本文带你全面认识它的设计理念、模型体系、工程亮点和使用体验。

NextRec项目架构

推荐模型就像“搭积木”,Embedding → MLP → Attention → Experts → Towers,这些模块几乎所有主流模型都涵盖。但在论文实现上,各个模型的代码里特征声明方式五花八门;不同模型间难以组合复用。

NextRec 的思路是统一 FeatureSpec → EmbeddingLayer → Backbone → Tower → Serving 流程,让所有模型像拼模块一样组合。此外,模型拆成独立模块,架构与训练目标解耦,模型只负责描述自己的架构。

NextRec 不只是研究框架,也包含了完整的训练流程(callback、metrics、session 管理),流式推理(支持 path-based inference)和模型存储/加载一致化。下面这个流程图简单描述了NextRec的设计架构。

快速使用NextRec训练一个 DIN 模型

开发者可以通过pip install nextrec快速安装NextRec的最新版本,环境要求为Python 3.10+,截止2025年11月30日,NextRec的最新版本为0.3.1。

我们在NextRec的官方github仓库里提供了详细的上手指南和配套数据集,帮助您熟悉框架的不同功能。在datasets/路径下提供了一个来自电商场景的脱敏数据集子集,数据示例如下:

接下来我们将用一个简短的示例,展示如何使用NextRec训练一个DIN模型。DIN(Deep Interest Network)来自于阿里妈妈2018年KDD最佳论文模型,用于CTR预估场景。你也可以直接执行python tutorials/example_ranking_din.py来执行训练推理代码。

开始训练以后,你可以在nextrec_logs/din_tutorial路径下查看详细的训练日志。

import pandas as pd
from nextrec.models.ranking.din import DIN
from nextrec.basic.features import DenseFeature, SparseFeature, SequenceFeature

df = pd.read_csv('dataset/ranking_task.csv')

for col in df.columns and 'sequence' in col: # csv默认将列表读取成文本,我们需要将其转化为对象
    df[col] = df[col].apply(lambda x: eval(x) if isinstance(x, str) else x)

# 我们需要将不同特征进行定义
dense_features = [DenseFeature(name=f'dense_{i}', input_dim=1) for i in range(8)]

sparse_features = [SparseFeature(name='user_id', embedding_name='user_emb', vocab_size=int(df['user_id'].max() + 1), embedding_dim=32), SparseFeature(name='item_id', embedding_name='item_emb', vocab_size=int(df['item_id'].max() + 1), embedding_dim=32),]

sparse_features.extend([SparseFeature(name=f'sparse_{i}', embedding_name=f'sparse_{i}_emb', vocab_size=int(df[f'sparse_{i}'].max() + 1), embedding_dim=32) for i in range(10)])

sequence_features = [
    SequenceFeature(name='sequence_0', vocab_size=int(df['sequence_0'].apply(lambda x: max(x)).max() + 1), embedding_dim=32, padding_idx=0, embedding_name='item_emb'),
    SequenceFeature(name='sequence_1', vocab_size=int(df['sequence_1'].apply(lambda x: max(x)).max() + 1), embedding_dim=16, padding_idx=0, embedding_name='sparse_0_emb'),]

mlp_params = {
    "dims": [256, 128, 64],
    "activation": "relu",
    "dropout": 0.3,
}

model = DIN(
    dense_features=dense_features,
    sparse_features=sparse_features,
    sequence_features=sequence_features,
    mlp_params=mlp_params,
    attention_hidden_units=[80, 40],
    attention_activation='sigmoid',
    attention_use_softmax=True,
    target=['label'],                                     # 目标变量
    device='mps',                                         
    embedding_l1_reg=1e-6,
    embedding_l2_reg=1e-5,
    dense_l1_reg=1e-5,
    dense_l2_reg=1e-4,
    session_id="din_tutorial",                            # 实验id,用于存放训练日志
)

# 编译模型,设置优化器和损失函数
model.compile(
            optimizer = "adam",
            optimizer_params = {"lr": 1e-3, "weight_decay": 1e-5},
            loss = "focal",
            loss_params={"gamma": 2.0, "alpha": 0.25},
        )

model.fit(
    train_data=df,
    metrics=['auc', 'gauc', 'logloss'],  # 添加需要查看的指标
    epochs=3,
    batch_size=512,
    shuffle=True,
    user_id_column='user_id'             # 用于计算GAUC的id列 
)

# 训练完成后进行指标评估
metrics = model.evaluate(
    df,
    metrics=['auc', 'gauc', 'logloss'],
    batch_size=512,
    user_id_column='user_id'
)

# 也可以直接推理新数据集,输入支持dict,dataframe,pathlike
predictions = model.predict(df, batch_size=512)

NextRec拥有统一的日志管理,在训练开始前,NextRec会为你输出以下信息:分别是特征配置Feature Configuration,用于记录特征的维度等信息;模型参数Model Parameters,用于记录模型的架构,和参数量统计;训练参数Training Configuration,用于记录本次训练的超参数等配置项。

开始训练后,则会根据配置的指标,输出每个epoch的评估指标。训练过程中,训练日志会在nextrec_logs/session_id路径下生成,并且同步保存特征信息,模型checkpoint等相关文件。


使用教程

我们在NextRec的官方仓库下提供了详细的上手文档,其中在tutorials/ 目录下,我们提供了多个示例,覆盖排序、召回、多任务、数据处理等场景:

如果想了解更多NextRec框架的细节,我们还提供了Jupyter notebook来帮助你了解:

当前版本[0.3.1],召回模型模块尚不完善,可能存在一些兼容性问题或意外报错,如果遇到问题,欢迎开发者在Issue区提出问题。

写在最后

最后,感谢正在看这篇文章的你关注到NextRec,无论你是推荐算法工程师,对推荐算法感兴趣的学生,还是相关从业者,都是recommender社区的重要一员。

NextRec是一个尚在成长期的框架,作为开发者,还缺少很多相关的开发经验,因此,我们欢迎任何形式的贡献,包括代码提交,提出issue等等,期待和大家一起在这个领域学习和成长!

2025/11/30 于苏州

Comments
CC BY-NC-SA 4.0 2020-PRESENT © zerolovesea