news 2026/9/18 23:46:45

Monolith 3步跑通电影推荐模型:从训练到上线全解

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Monolith 3步跑通电影推荐模型:从训练到上线全解

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步跑起来:最短路径 🎬

  1. 获取代码:
git clone https://gitcode.com/GitHub_Trending/monolith4/monolith
  1. 准备构建环境(仅支持 Linux):安装 bazel 3.1.0,并按 README.md 的 Quick start 装 Python 依赖:
pip install -U --user numpy wheel packaging requests opt_einsum
  1. 运行本地电影评分 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),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/18 23:43:03

DeepSeek V4 迟迟不来,先把 Cursor 的 Base URL 改到 TaoToken

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/18 23:38:48

从火山方舟切到 TaoToken Key,豆包 2.1 Pro 会丢多模态吗

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/18 23:37:19

oh-my-hermes:统一管理Hermes配置,助力RN性能优化

1. 为什么我会写一个 oh-my-hermes:被 Hermes 配置折腾出来的工具1.1 Hermes 普及之后,痛点反而更多了做过 React Native 性能优化的同学应该都有同感:从 RN 0.70 开始 Hermes 成为默认 JavaScript 引擎之后,大多数团队的"优…

作者头像 李华
网站建设 2026/9/18 23:37:06

OpenClaw 跑 CSDN 发布任务,Key 走 TaoToken 行不行

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华