23| 实战:如何用深度学习模型实现Sparrow RecSys的个性化推荐功能?
23| 实战:如何用深度学习模型实现Sparrow RecSys的个性化推荐功能?
讲述:王喆
时长14:24大小13.16M
“清点技能库”,看看我们已有的知识储备有哪些
1. 模型特征工程
2. 模型离线训练
3. 模型服务
4. 推荐服务器内部逻辑实现
“猜你喜欢”推荐功能的技术架构
排序层 +TensorFlow Serving 的实现
小结
课后思考
赞 19
提建议
精选留言(18)
- Lucifer2020-12-06思考题:推荐服务器内部专门开发特征加工模块,进行一些人工的处理。比如点击率特征,实际上“点击”会包含多种点击行为,各种行为如何融合,需要灵活配置。既不能放在离线存(更新不便),也不能放在tf serving里(逻辑多了太慢) 1、tf serving只负责简单的模型运算; 2、离线redis等负责通用特征数据的存储; 3、推荐系统服务器进行数据加工展开
作者回复: 非常好
22 - Sebastian2020-12-04思考题:特征分为静态特征和动态特征。对于静态特征,基本长时间不会变更,这块直接从特征池(可以是Redis)里取。但是对于动态特征,比如用户实时行为的特征,这种会通过流式处理(比如spark streaming或者flink)后,直接落盘,同时可以避免特征穿越。特征实时更新后,线上服务阶段,模型的输入就是未进行处理的原格式数据,tf serving 接受请求后,在模型里进行特征预处理,比如使用tf.feature_column进行处理,转为one hot和embedding格式。 但是在QPS很高的场景下,这种处理可能达不到上线要求,想问老师有什么好的解决方案?展开
作者回复: 大致流程确实是这样的。但是其实在实际应用中,tf serving的延迟问题会比较严重。我们会想尽一切办法去减少tf serving的负担。所以特征预处理这块会尽量放到推荐服务器内部来做,或者放到离线做好预存到线上存储。 比如id 2 embeding这一步,可以把id和emb的对应关系放到redis里或者其他线上数据库,减轻tf serving的压力和模型体积。
共 4 条评论9 - Geek_8183d52022-04-05如果是M1芯片的mac,官方 tensorflow-serving 镜像并不支持。您可以在docker中导入模型时通过如下命令使用第三方镜像:(记得把路径$YOUR PATH$替换为您自己的哦) docker run -t --rm -p 8501:8501 -v "$YOUR PATH$/neuralcf:/models/recmodel" -e MODEL_NAME=recmodel emacski/tensorflow-serving:2.6.0 &共 1 条评论5
- tuomasiii2021-01-06想问下老师图1里,“候选物品库”里是放的embeddings还是actual data? 因为我们召回层用embedding来算similarity的话,到底是从redis里读还是到候选物品库拿?
作者回复: 真实的环境下,候选物品库中存放的是物品的一些基本信息,一般不包含embedding。 embedding应该从特征数据库redis中去拿。 我们的课程项目做了一定程度的简化,候选物品库是直接从数据文件中预载入的。
6 - Wiiki2020-12-14非常感谢王老师的细心分享,让我们从零到一建立起推荐系统的概念和实践经验~ 谢谢~
作者回复: 这就是咱们课程的目的,还是多感谢自己的努力,相信能坚持下来的同学一定可以在工作中有所收获,有所提高。
5 - Wiiki2020-12-17王老师,您好。更新了你最近的工程代码,发现新增了pyspark推荐系统的工程实现部分,想请教一下:对于大数据量的特征工程处理,选择用scala还是python版的spark实现有没有什么建议? 谢谢~
作者回复: pyspark的部分是咱们课程的学员贡献的。 现实工作中建议最好还是用scala来维护,毕竟是spark原生支持的语言,真正的大数据工程师一般会使用scala。但是也不反对python来维护,跟其他python项目在一起维护会方便些。
共 5 条评论3 - 金鹏2020-12-06王喆老师好,请教个问题,现在边缘计算或端智能,多大程度解决了用户特征更新的问题,端智能的应用前景如何?
作者回复: 我看好边缘计算的发展,一直是近两年我看好的方向。至于多大程度解决了特征更新的问题,我觉得他们会一直共存。边缘计算永远也替代不了服务器端的特征更新设施。
3 - Berton2020-12-04特征处理这部分,应该是离线计算好得到每个特征的map数据,在推荐服务器内部加载这些map数据,直接将原始特征映射成深度学习需要的向量,将得到的向量送入Tensorflow Serving得到推荐结果 如果在Tensorflow Serving做特征预处理的工作,会导致推荐服务的响应时间边长
作者回复: 是的,最好是可以在推荐服务器内部把特征都准备好,处理好。tf serving只做inference,不承担太多特征预处理压力。
3 - abc-web2021-07-14王老师请问一下,在线推断需要拼装数据提交请求,但数据量大的情况下会影响效率,那除了拼装还有没有其他的方式可用
作者回复: 几乎没有,除非你通过某种方式把模型本身进行蒸馏压缩,让模型需要的特征数量减少。
2 - liuqqwwe2021-07-19王老师,如果想要结合移动端上实时反馈信息,比如迅速划过以及短播这种隐式负反馈,长播、点赞这些正反馈,结合后端下发的用户和部分物品的embedding信息对缓存内容进行前端重排序,这种场景选用什么模型合适呢,如何合并新操作产生的输入呢
作者回复: 这是一个模型更新的问题,不是选用模型的问题。基本思路是做模型的online learning,和embedding的实时生成。
1 - tuomasiii2021-01-01想问下图中Redis到排序层的线上特征具体是指的哪些特征? 是像geographic和current timestamp这些feature吗? 还有就是排序层模型的loss都是使用entropy的loss? 像warp loss和bpr这些能被使用到吗? 谢谢!展开
作者回复: 1.是的,所有线上inference用到的特征都可以放入redis 2.一般二分类问题倾向于用cross entropy loss,当然,不排除可以用其他loss function。
1 - Sebastian2020-12-09老师,我想问下关于“推荐服务器内部专门开发特征加工模块”:如果不单独做特征加工模块,而是把特征做预处理后弄一张编码表,10秒更新一次编码表,在线请求过来后直接读这张编码表的特征,这种方案是否可行?这样是不是也同时避免了线上线下特征处理不一致的问题?
作者回复: 可行。不过10秒钟可能不现实,全量特征更新很难做到这么短的更新时间。
1 - Geek_4716652022-04-05请问docker部署Tensorflow Serving后,为什么只能本地访问呢?外部访问curl、restful api均失败,已经配置了8501防火墙
- wjc2022-01-02tf1的模型能部署吗?
- sky2021-09-14这里的最开始的触发输入是什么呢??感觉没有搜索那么明确
- masiwei2021-06-24想请教下大家,我理解是online/recprocess/RecForYouProcess.java文件里,召回是通过电影评分高低,排序是通过embedding或者nerualCF,而老师讲的召回是用embedding,排序是用nerualCF。不知道我理解的对不对?那种方式,是代码里的方式还是老师讲义里的方式,在实际产品中更合理和普遍呢?
作者回复: 实际产品中没有标准答案,不要总是学生思维要找到一个标准答案
共 2 条评论 - 远方蔚蓝2021-06-19请问一下怎么保存和查看tensorflow serving接收请求的log日志
- X.G2020-12-04基础架构篇里说,最终的系统会有这个功能:随着当前用户不断为电影打分,系统会对首页的推荐结果进行个性化的调整,比如电影类型的排名会进行个性化调整,每个类型内部的影片也会进行个性化推荐。请问这个打分功能也是在后期课程中增加吗?
作者回复: 这个功能因为需要比较多的前端工作,所以暂时不会实现了。我会在后续SparrowRecsys项目的迭代中再实现。本质上来说这个功能和猜你喜欢功能是一样的,区别在于要在server端动态记录用户的当前评价历史。
共 3 条评论