3 个不稳定版本

0.3.1 2022 年 6 月 21 日
0.3.0 2022 年 4 月 5 日
0.2.9 2022 年 4 月 3 日

#196科学

Apache-2.0

1MB
3K SLoC

包含 (ZIP 文件,1MB) assets/example/example.zip

Serenade:低延迟基于会话的推荐

Crates.io Crates.io License Build Status API Docs Contributors

此仓库包含基于 VMIS-kNN 的官方代码的会话推荐系统 Serenade。它通过捕捉用户行为的演变中的短期和顺序模式来学习用户的偏好,并支持数百万个不同项,以低延迟预测有趣的下一个项。VMIS-kNN 是基于会话推荐的最先进的最近邻算法的索引变体,可扩展到处理数亿个点击以进行搜索的使用案例。

VMIS-kNN 实现在我们的私人训练集和公共训练集上的微基准测试中,对 60M 个用户-项交互和 1.76M 个不同项的预测延迟为 <1.7ms。使用总共两个 vCPU,Serenade 推荐服务使用 VMIS-kNN 算法轻松处理每秒 1000 个预测。部署系统的端到端预测延迟为 < 7ms,从不同的节点使用 http 客户端进行测量,包括 http 过载、网络流量、istio 负载均衡器、从 RocksDb 获取会话信息、过滤产品可用性和亲密性以及结果序列化等。训练数据有 23 亿条记录,其中经过索引修剪后使用 5.82 亿条训练记录,包含约 650 万个不同的产品。索引每个服务节点需要大约 11GB 的内存。

快速入门:开始使用 Serenade。

目录

  1. 下载
  2. 找到最佳超参数值
  3. 配置 Serenade 以使用超参数值
  4. 启动 Serenade 服务
  5. 使用 Python 获取推荐
  6. 评估测试集
  7. 使用您自己的训练集和测试集
  8. 引用
  9. 许可证

下载

Serenade 可以在此处下载:链接。提供了 Windows、Linux 和 MacOS 的二进制可执行文件。下载包含玩具数据集和预配置配置文件的 玩具示例项目

将下载的文件提取到同一目录中。现在你有以下文件

serving
tpe_hyperparameter_optm
evaluator
train.txt
test.txt
valid.txt
example.toml

寻找最佳超参数值

下一步是使用训练集和测试集来寻找超参数。Serenade 使用树结构帕累托估计器(TPE)来寻找超参数。与穷举网格搜索相比,TPE 实现了低验证误差(Bergstra 等人)。[hyperparam]example.toml 的部分包含了将要探索的超参数值的范围。

  • 可以使用以下命令启动超参数搜索
./tpe_hyperparameter_optm example.toml

结果将打印在终端上,例如

===============================================================
===          HYPER PARAMETER OPTIMIZATION RESULTS          ====
===============================================================
MRR@20 for validation data: 0.3197
MRR@20 for test data: 0.3401
enabled business_logic for evaluation:false
best hyperparameter values:
n_most_recent_sessions:1502
neighborhood_size_k:288
idf_weighting:2
last_items_in_session:4
HPO done

并且也将在配置文件中定义的输出文件中,例如

out_path = "results.csv"

配置 Serenade 使用超参数值

我们现在更新配置文件 example.toml 中的 [model] 的值,以使用超参数值,并使用 train.txt 的位置设置 training_data_path。这是具有新的 [model] 参数值的示例配置文件的内容。

config_type = "toml"

[server]
host = "0.0.0.0"
port = 8080
num_workers = 4

[log]
level = "info" # not implemented

[data]
training_data_path="train.txt"

[model]
m_most_recent_sessions = 1502
neighborhood_size_k = 288
max_items_in_session = 4
num_items_to_recommend = 21
idf_weighting = 1

[logic]
enable_business_logic = "false"

[hyperparam]
training_data_path = "train.txt"
test_data_path = "test.txt"
validation_data_path = "valid.txt"
num_iterations = 15
save_records = true
out_path = "results.csv"
enable_business_logic = false
n_most_recent_sessions_range = [100, 2500]
neighborhood_size_k_range = [50, 1500]
last_items_in_session_range = [1, 20]
idf_weighting_range = [0, 5]

启动 Serenade 服务

使用配置文件的位置作为参数,使用您的平台的 serving 二进制文件启动服务

./serving example.toml

您可以在 Web 浏览器中打开并转到 http://127.0.0.1:8080/,您应该看到 Serenade 的内部页面。

Serenade 默认暴露 Prometheus 指标 用于监控。

使用 Python 获取推荐

import requests
from requests.exceptions import HTTPError
try:
    myurl = 'http://127.0.0.1:8080/v1/recommend'
    params = dict(
        session_id='144',
        user_consent='true',
        item_id='13598',
    )
    response = requests.get(url=myurl, params=params)
    response.raise_for_status()
    # access json content
    jsonResponse = response.json()
    print(jsonResponse)
except HTTPError as http_err:
    print(f'HTTP error occurred: {http_err}')
except Exception as err:
    print(f'Other error occurred: {err}')
[2835,10,12068,4313,3097,8028,3545,7812,17519,1164,17935,1277,13335,8655,14664,14556,6868,13509,9248,2498,11724]

返回的 JSON 对象是一个包含推荐项目的列表。

评估测试集

可以使用 evaluator 应用程序来评估测试数据集。它报告了几个指标。

  • 可以使用以下命令启动评估
./evaluator example.toml
===============================================================
===               START EVALUATING TEST FILE               ====
===============================================================
Mrr@20,Ndcg@20,HitRate@20,Popularity@20,Precision@20,Coverage@20,Recall@20,F1score@20
0.3277,0.3553,0.6402,0.0499,0.0680,0.2765,0.4456,0.1180
Qty test evaluations: 931
Prediction latency
p90 (microseconds): 66
p95 (microseconds): 66
p99.5 (microseconds): 66

使用自己的训练集和测试集

必须从历史用户-项目点击数据中创建训练集和测试集,这些数据位于 Serenade 之外。训练集或测试集中的每一行都应该包含一个历史用户-项目交互事件,并具有以下字段

  • SessionId 会话 ID。格式:64 位整数
  • ItemId 交互项的 ID。格式:64 位整数
  • Time 用户-项目交互发生的时间。以纪元秒为单位:32 位浮点数。

可以使用历史数据中的最后 24 小时作为测试集,而其余会话可以用于训练集,并作为纯文本文件使用 '\t' 作为字段分隔符。这是一个训练数据 CSV 文件 train.txt 的示例

SessionId       ItemId  Time
10036   14957   1592337718.0
10036   14713   1592337765.0
10036   2625    1592338184.0
10037   7267    1591979344.0
10037   13892   1591979380.0
10037   7267    1591979504.0
10037   3595    1591979784.0
10038   6424    1591008704.0

引用

Serenade - 大规模电子商务中的低延迟基于会话的推荐

@article{Kersbergen2022SerenadeScale,
    title = {{Serenade - Low-Latency Session-Based Recommendation in e-Commerce at Scale}},
    year = {2022},
    journal = {SIGMOD},
    author = {Kersbergen, Barrie and Sprangers, Olivier and Schelter, Sebastian}
}

许可证

此项目根据 Apache 2.0 许可协议 许可。

依赖关系

~73MB
~1.5M SLoC