Monolith 3步跑通电影推荐模型:从训练到上线全解
【免费下载链接】monolithA Lightweight Recommendation System项目地址: https://gitcode.com/GitHub_Trending/monolith4/monolith
刷短视频时,你是否注意过刚点开一部电影,它马上就被推到了你面前?这种"恰好对味"的推荐,背后是一套推荐系统在起作用。可自己想做的时候,新手往往卡在同一处:用户 ID、电影 ID 动辄上亿,哈希进固定大小的表会撞车,模型分不清两个不同的人;而且昨天批量训练的模型,根本追不上今天的热度。Monolith 是字节跳动开源的一个轻量级推荐系统框架,基于 TensorFlow 构建,专门解决这两类大规模 ID 特征难题。读完本文,你会在本地跑通一个电影评分推荐模型的分布式训练,并看懂"点击 → 训练 → 上线"的完整链路。
一句话看懂 Monolith
它是"TensorFlow + 无碰撞哈希表 + 流式实时训练"的组合拳,帮你处理"海量 ID 特征"的推荐场景:
- 内容平台:电影、视频、文章的排序与推荐(官方 demo 就是电影评分)
- 电商/广告:上亿用户、上亿商品下的个性化推荐
- 在线服务:通过 Kubernetes 把模型一键部署成推荐服务
核心能力拆解
无碰撞嵌入表:亿级 ID 不再"撞车"
解决什么问题:传统做法把 ID 哈希到固定桶里,不同用户可能落进同一个桶、共享同一个向量,画像被"搅浑";预分配词表又得提前猜 ID 总数,来了新用户就废了。
它怎么做:Monolith 用 C++ 实现了动态哈希表(如 CuckooHash,一种靠"让条目互相挪位置"来保证查找速度的表结构),新 ID 出现时自动扩展,保证每个 ID 拿到唯一向量。实现见 monolith/runtime/hash_table/,里面有多种表结构的对比与优化。
对你有什么用:不用再预估"词表大小",ID 是 1 万个还是 10 亿个,声明特征即可。
流式训练:模型边跑边学 ⚡
解决什么问题:批量训练用的是"昨天的数据",今天爆火的电影它一无所知。
它怎么做:只需把input_fn换成 Monolith 的 KafkaDataset——直接从 Kafka topic 里实时读用户行为,用tf.io.parse_example解码成训练批次,持续更新模型。markdown/demo/Stream.md 里有完整教程。
对你有什么用:新片上线、热点事件几分钟后就能影响排序结果。
MLService:K8s 上的"一键上线"
解决什么问题:模型训好了,serving 还得手工写 Deployment、手动扩容。
它怎么做:deploy/ 目录提供 Kubernetes Operator,MLService是一个自定义资源(CRD,即给 K8s 新增的"资源类型"),声明 Entry 与 PS 两种角色后自动生成部署。示例在 deploy/config/samples/mlplatform_v1_mlservice.yaml。
对你有什么用:改一个shardNum就能扩缩分片,kubectl apply即上线。
数据是怎么流动的
白话版:用户点击行为先进 Kafka,训练任务按批拉取并解码;嵌入表为用户 ID 和电影 ID 查出向量,网络输出一个评分预估;损失函数算完误差、反向传播更新参数服务器(PS,集中存放模型权重的组件)上的权重;线上 serving 复用同一套权重返回排序。
3步跑起来:最短路径 🎬
- 获取代码:
git clone https://gitcode.com/GitHub_Trending/monolith4/monolith- 准备构建环境(仅支持 Linux):安装 bazel 3.1.0,并按 README.md 的 Quick start 装 Python 依赖:
pip install -U --user numpy wheel packaging requests opt_einsum- 运行本地电影评分 demo(2 个参数服务器 + 2 个训练 worker,全在单机):
bazel run //markdown/demo:demo_local_runner -- --training_type=batch终端里看到 loss 持续下降,说明分布式训练已经跑通。想部署上线:cd deploy && make deploy(装 CRD 和控制器),再 apply 一份 MLService,关键角色只需:
spec: roles: - name: "Entry" # 服务入口,接预测请求 shardNum: 1 - name: "PS" # 参数服务器,存嵌入表权重 shardNum: 2跑通后你手里会有两样东西:一个能预测电影评分的本地分布式模型,以及一套可扩缩的在线推荐服务。
接下来你可以把参数换成--training_type=stream试试流式训练,或按 markdown/demo/AWS-EKS.md 把任务搬上云端。建议下一步直接打开 markdown/demo/demo_model.py,对照本文的model_fn逐行看——你会发现 Monolith 的 API 和你熟悉的 TensorFlow 几乎没有区别。
【免费下载链接】monolithA Lightweight Recommendation System项目地址: https://gitcode.com/GitHub_Trending/monolith4/monolith
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考