深度学习推荐系统实战
王喆
Roku 推荐系统架构负责人,前 hulu 高级研究员,《深度学习推荐系统》作者
10765 人已学习
立即订阅
登录后,你可以任选4讲全文学习
推荐试读
换一换
01 | 技术架构:深度学习推荐系统的经典技术架构长啥样?
04 | 特征工程:推荐系统有哪些可供利用的特征?
06 | Embedding基础:所有人都在谈的Embedding技术到底是什么?
课程目录
已完结/共 44 讲
开篇词 (1讲)
开篇词 | 从0开始搭建一个深度学习推荐系统
基础架构篇 (5讲)
01 | 技术架构:深度学习推荐系统的经典技术架构长啥样?
02 | Sparrow RecSys:我们要实现什么样的推荐系统?
03 | 深度学习基础:你打牢深度学习知识的地基了吗?
国庆策划 | 关于深度学习推荐系统,我有这些资料想推荐给你
国庆策划 | 深度学习推荐系统基础,你掌握了多少?
特征工程篇 (6讲)
04 | 特征工程:推荐系统有哪些可供利用的特征?
05 | 特征处理:如何利用Spark解决特征处理问题?
06 | Embedding基础:所有人都在谈的Embedding技术到底是什么?
07 | Embedding进阶:如何利用图结构数据生成Graph Embedding?
08 | Embedding实战:如何使用Spark生成Item2vec和Graph Embedding?
答疑 | 基础架构篇+特征工程篇常见问题解答
线上服务篇 (7讲)
09 | 线上服务:如何在线上提供高并发的推荐服务?
10 | 存储模块:如何用Redis解决推荐系统特征的存储问题?
11 | 召回层:如何快速又准确地筛选掉不相关物品?
12 | 局部敏感哈希:如何在常数时间内搜索Embedding最近邻?
13 | 模型服务:怎样把你的离线模型部署到线上?
14 | 融会贯通:Sparrow RecSys中的电影相似推荐功能是如何实现的?
答疑 | 线上服务篇留言问题详解
推荐模型篇 (12讲)
15 | 协同过滤:最经典的推荐模型,我们应该掌握什么?
16 | 深度学习革命:深度学习推荐模型发展的整体脉络是怎样的?
模型实战准备(一) | TensorFlow入门和环境配置
模型实战准备(二) | 模型特征、训练样本的处理
17 | Embedding+MLP:如何用TensorFlow实现经典的深度学习模型?
18|Wide&Deep:怎样让你的模型既有想象力又有记忆力?
19|NeuralCF:如何用深度学习改造协同过滤?
20 | DeepFM:如何让你的模型更好地处理特征交叉?
21|注意力机制、兴趣演化:推荐系统如何抓住用户的心?
22|强化学习:让推荐系统像智能机器人一样自主学习
特别加餐 | “银弹”不可靠,最优的模型结构该怎么找?
23| 实战:如何用深度学习模型实现Sparrow RecSys的个性化推荐功能?
模型评估篇 (5讲)
24 | 离线评估:常用的推荐系统离线评估方法有哪些?
25 | 评估指标:我们可以用哪些指标来衡量模型的好坏?
特别加餐|TensorFlow的模型离线评估实践怎么做?
26 | 在线测试:如何在推荐服务器内部实现A/B测试?
27 | 评估体系:如何解决A/B测试资源紧张的窘境?
前沿拓展篇 (6讲)
28 | 业界经典:YouTube深度学习推荐系统的经典架构长什么样?
29 | 图神经网络:Pinterest是如何应用图神经网络的?
30 | 流处理平台:Flink是如何快速识别用户兴趣,实现实时推荐的?
31|模型迭代:阿里巴巴是如何迭代更新推荐模型的?
32 | 强化学习案例:美团是如何在推荐系统中落地强化学习的?
33|技术权衡:解决方案这么多,哪个最合适?
结束语 (2讲)
结束语|深度学习时代需要什么样的推荐工程师?
期末考试 | “深度学习推荐系统”100分试卷等你来挑战!
深度学习推荐系统实战
15
15
1.0x
00:00/00:00
登录|注册

10 | 存储模块:如何用Redis解决推荐系统特征的存储问题?

你好,我是王喆。今天,我们来解决系统特征的存储问题。
在特征工程篇我们说过,在推荐系统这个大饭馆中,特征工程就是负责配料和食材的厨师,那我们上堂课搭建的推荐服务器就是准备做菜的大厨。配料和食材准备好了,做菜的大厨也已经开火热锅了,这时候我们得把食材及时传到大厨那啊。这个传菜的过程就是推荐系统特征的存储和获取过程。
可是我们知道,类似 Embedding 这样的特征是在离线环境下生成的,而推荐服务器是在线上环境中运行的,那这些离线的特征数据是如何导入到线上让推荐服务器使用的呢?
今天,我们先以 Netflix 的推荐系统架构为例,来讲一讲存储模块在整个系统中的位置,再详细来讲推荐系统存储方案的设计原则,最后以 Redis 为核心搭建起 Sparrow Recsys 的存储模块。

推荐系统存储模块的设计原则

你还记得,我曾在第 1 讲的课后题中贴出过 Netflix 推荐系统的架构图(如图 1)吗?Netflix 采用了非常经典的 Offline、Nearline、Online 三层推荐系统架构。架构图中最核心的位置就是我在图中用红框标出的部分,它们是三个数据库 Cassandra、MySQL 和 EVcache,这三个数据库就是 Netflix 解决特征和模型参数存储问题的钥匙。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/1000字
划线
笔记
复制
01 | 技术架构:深度学习推荐系统的经典技术架构长啥样?
04 | 特征工程:推荐系统有哪些可供利用的特征?
06 | Embedding基础:所有人都在谈的Embedding技术到底是什么?
12 | 局部敏感哈希:如何在常数时间内搜索Embedding最近邻?
24 | 离线评估:常用的推荐系统离线评估方法有哪些?
31|模型迭代:阿里巴巴是如何迭代更新推荐模型的?
该试读文章来自付费专栏《深度学习推荐系统实战》,如需阅读全部文章,
请购买文章所属专栏
立即购买
登录 后留言

精选留言(22)

  • An
    redis keys命令不能用在生产环境中,如果数量过大效率十分低,导致redis长时间堵塞在keys上。

    作者回复: 非常好的点。生产环境我们一般选择提前载入一些warm up物品id的方式载入物品embedding。这里做了一个简化,推荐大家参考这条评论,多谢!

    2020-10-26
    43
  • AIGeek
    Redis value 可以用pb格式存储, 存储上节省空间. 解析起来相比string, cpu的效率也应该会更高

    作者回复: 生产环境确实经常使用protobuf进行压缩,非常好的经验。

    2020-10-26
    4
    31
  • 范闲
    1.redis这种缓存中尽量放活跃的数据,存放全量的embedding数据,对内存消耗太大。尤其物品库,用户embedding特别多的情况下。
    2.分布式kv可以做这种embedding的存储
    3.关于embedding的编码可以用pb来解决。embedding维度太大的时候,redis里的数据结构占用空间会变大,因为除了embedding本身的空间,还有数据结构本身占用的空间。

    作者回复: 优秀。非常好的经验之谈,推荐其他同学学习。

    2020-11-26
    4
    25
  • fsc2016
    老师,有俩个问题
    1,文中关于RecForYou,是来一个用户访问,就把用户的embding存入推荐服务器内存,如果一个短时间一下来百万级用户,都存入服务器内存,这样会不会出问题,优化的话应当也可以对用户分级,活跃用户存下来,非活跃其他还是从Redis实时读取用户特征。
    2,RecForYou中,给用户推荐电影,使用的用户embding和候选电影embding的余弦距离来排序,这俩个不同维度embding计算余弦相似度有意义嘛,还是因为本例子中用户embding由其看过的电影embbding 相加来的。所以这么做嘛

    作者回复: 这两个问题都是非常好的问题,推荐其他同学思考。

    1. 我们并没有把用户embedding保存在内存中,只是把item embedding提前load到内存里,所以其实不存在这样的情况。但你说的也是非常好的用户数据缓存的方案,我们一般会指定一个用户内存区域的大小,用FIFO的方案来缓存,这样内存用完了,就自动把早进来的用户pop出去。

    另外分级的想法也非常好,如果有条件可以判断活跃用户,可以尽量选择活跃用户进行缓存。

    2、你说的没错,用户emb和物品emb必须在一个向量空间内才能够做相似度计算。咱们项目中的用户emb是通过item emb平均生成的,所以可以这样计算。

    2020-11-04
    18
  • Geek_ddf8b1

            用户特征分为长期兴趣特征和实时兴趣特征,长期兴趣特征一般是按天更新,实时特征可能按分钟或者秒级更新。请问实际项目中是长期特征按天更新写入redis,短期特征分钟级更新写入redis这样吗?

    作者回复: 是这样,长期兴趣或这说周期比较长的metadata特征,按天写入特征数据库,实时特征进行实时更新。

    2020-12-06
    6
  • Lucifer
    向量索引faiss
    2020-11-23
    1
    6
  • shenhuaze
    王老师,想问一下关于全量特征存储的数据库选型。业界用来存储全量特征的最主流的数据库是什么?Cassandra吗?HBase是否合适?

    作者回复: 一般来说Cassandra的读性能会比HBase好很多,包括类似的AWS用的dynamoDB,现在用得多一些。

    但也有对HBase的读性能做优化的,比如加缓存,做一些读取命令的优化,但作为服务线上的实时数据库,确实会用的少一些。

    2020-11-04
    5
  • 张宏宇
    老师,我想问的是特征在更新的时候可能发生数据不一致的情况,比如用户特征先更新,物品特征后更新,在两个特征更新过程中线上服务读取特征数据的时候,可能用户特征是新的,物品特征是老的,不知道老师是否遇到过这样的问题以及如何解决的,谢谢!

    作者回复: 这个肯定会存在。但我觉得要点还得具体问题具体分析,要看一下物品和用户特征有没有必要完全协同的更新,比如物品历史ctr这个特征,完全可以独立更新。

    如果一定要一起更新,那么就只能在streaming平台上每次都协同更新这些特征。

    我个人觉得有一些秒级、分钟级的差异,影响不会那么大,没有那么关键。

    2021-03-17
    3
  • Geek_b6bf29
    老师你好,关于这一步 “我们完全可以把所有物品特征阶段性地载入到服务器内存中,大大减少 Redis 的线上压力。” 该如何具体操作呢。比如离线计算每6个小时更新物品特征,是不是在线服务也要重启更新,把最新的物品特征载入服务器?还是有更好的方法,可以支持热更新,不用重启在线服务?

    作者回复: 在线服务内部可以有各种载入和维护feature的缓存逻辑。最简单比如设置一个timer去定期load热门的新feature。不用重启服务器。

    2021-01-08
    3
  • 浣熊当家
    请问老师,文中的两部分redis相关的代码,可以在Maven项目中找到吗?老师可不可以提供以下路径信息方便找到?

    作者回复: 可以,请参照 com.wzhe.sparrowrecsys.offline.spark.embedding.Embedding中的trainItem2vec函数

    以及com.wzhe.sparrowrecsys.online.datamanager.DataManager中的loadMovieEmb函数

    2020-10-26
    2
  • 胡译匀
    请问如何调试scala程序?网上找了半天也没靠谱的,谢谢。

    作者回复: scala 程序本质上就是java程序,在IDEA里面的调试方法和java一样

    2021-01-10
    1
  • Geek_ddf8b1
    为保证线上请求特征和线下日志特征数据一致性,用户线上请求时用户特征和物品特征是从redis查询得到后写到日志文件吗?
            这时用户的实时特征比如过去几分钟点击的物品序列特征是从kafka读取还是从redis读取?
            还是kafka发送用户的行为物品序列数据每隔几分钟写入redis,然后线上请求获取特征做预估打分和写特征数据到日志文件统一从redis读取?

    作者回复: 不可能直接从kafka读取的,线上系统不可能接入任何流处理系统。需要以redis这类特征数据库作为所有数据的线上中转存储。

    2020-12-06
    1
  • Jackie
    文中说把物品特征放到服务器中,“我们完全可以把所有物品特征阶段性地载入到服务器内存中,大大减少 Redis 的线上压力。”,那如果物品也特别多,不也放不下吗?

    作者回复: 那按照咱们这节课讲的分级存储的原则,内存里面放不下,应该怎么解决这个问题呢?能不能放一些经常访问的在内存里,长尾的放在其他地方?或者经常用的特征放内存里等等方法?

    2020-11-03
    2
    1
  • 浣熊当家
    有个很小白的问题请问老师, 我们在IntelliJ的Maven porject里用到的工具比如spark, redis, 这些需要我们额外下载安装到电脑上吗?还是说在Maven项目中已经通过代码添加依赖,就已经完成了安装?

    作者回复: spark本质上是一个java lib,所以可以被maven安装依赖。

    redis是一个数据库,需要按照文中的方式安装到电脑上。

    2020-10-26
    1
  • dandy
    老师你们这边是把item embedding存到内存,那用户存的是原始特征还是embedding后的存到redis呢,如果是原始特征是否需要特征抽取呢。一般现在业内是怎么处理的。 我们内部系统是item和user都是存的原始特征,后面做特征抽取,在embedding
    2022-01-28
  • Geek_ddf8b1
    老师 请教一下 推荐项目中用户有几千万,几千万用户的特征(部分是用户实时行为特征)全部存在redis中,key太多会导致redis查询性能直线下降,请问这个问题如何解决?

    作者回复: 分级cache,区分活跃用户非活跃用户

    2021-09-02
  • Alvin
    have this problem: file:/home/hadoop/SparrowRecSys/src/main/resources/webroot/sampledata/ratings.csv
    2021-08-02
  • .尐
    物品向量一次性加载到内存里,那后续怎么更新这部分数据呢?写个调度热加载吗?

    作者回复: 这个FIFO,LRU之类的逻辑都可以,首次加载最好有warming的过程

    2021-08-01
  • Geek_379a55
    “这样一来,在具体为用户推荐的过程中,我们再利用相似的接口查询出用户的 Embedding,与内存中的 Embedding 进行相似度的计算,就可以得到最终的推荐列表了。“

    王喆老师,用户的embedding是离线计算存储在redis,然后线上服务启动的时候加载在内存中,当离线计算的用户embedding更新时,线上服务内存中的用户embedding如何做到同步更新呢?

    作者回复: 这是一个工程问题,一般利用版本,redis的ttl等方式解决。其实你自己完全可以自己设计一下这个更新机制。

    2021-03-16
  • Sanders
    在SparrowRecsys中,在线计算用户Embedding和物品Embedding的工作放在离线计算更适合呢?在线只缓存用户推荐列表及物品得分,这样避免在线计算。
    在实际情况中,推荐得分都是模型通过计算物品、用户和上下文特征来得到,每次请求包含用户ID,候选集id列表和上下文,假设用户特征在redis,N个物品特征在内存,这时batch预测就可能成为瓶颈,在这块有什么好的设计减少预测计算量?

    作者回复: batch预测是必须要做的,几乎无法减少inference的消耗。只能从精简online inference模型的结构下手。

    2021-02-04
收起评论
22
返回
顶部