13 | 模型服务:怎样把你的离线模型部署到线上?
13 | 模型服务:怎样把你的离线模型部署到线上?
讲述:王喆
时长16:03大小14.67M
业界的主流模型服务方法
预存推荐结果或 Embedding 结果
预训练 Embedding+ 轻量级线上模型
利用 PMML 转换和部署模型
TensorFlow Serving
实战搭建 TensorFlow Serving 模型服务
1. 安装 Docker
2. 建立 TensorFlow Serving 服务
3. 请求 TensorFlow Serving 获得预估结果
小结
课后思考
赞 24
提建议
精选留言(36)
- 找大夫吗2021-01-18老师好 想问下模型部署到线上之后 把flink处理后的特征输入到模型,实时更新用户embedding时,如果需要用到像 ‘年龄’ 这样的基础数据 流处理平台无法提供,是不是以为着依然需要到HDFS去取‘年龄’特征,但是这样是不是会很影响线上服务的效率? 有什么好的方案呢 ?
作者回复: 是的,大量特征还是从hdfs或者一些数据仓库中去取的。这些特征因为不用高频更新,我想通过分级存储供线上使用就好了,比如高频用户的年龄特征放到redis里面,这应该不会影响线上服务效率。
12 - Teddy2020-11-19老师好,模型部署通常需要进行预处理,如果使用tfserving方式部署,由于不是端到端,所以一次推导请求需要进行2次进程间通信,通信开销比较大。因此想了2种方案,1. 自己用c++/go封装预处理,并且在进程中自行loadsavedmodel,这样就把预处理和模型计算放到一个进程处理,减少一次通信。2. 把预处理放入tfserving,运行到gpu机器上,但这种方式又担心浪费有限的gpu资源。并发量大的时候哪种方案好呢?
作者回复: 效率上讲肯定是1比较高效一些,但需要比较大的改动。2方便部署,确实比较浪费资源。如果可以投入比较多的时间精力,我建议去研究一下方法一,特别是在有大量embedding数据的时候,甚至可以把embedding从模型中单独提取出来,这样可以大幅减小模型大小,提高部署和serving的速度。
共 3 条评论12 - Sebastian2020-11-13老师好,关于推荐的机制策略里的疲劳度优化想从工程实践上想再多问一下:内容瀑布流里如何防止重复推荐?最简单的做法是直接过滤用户30分钟内曝光的内容,这种做法过于粗糙,而且忽略的用户的即时兴趣(比如点击过的内容关联的标签)。比较合适的做法是实时采集用户点击过的内容标签,根据标签再进行推荐,但是这种做法如何保证推荐内容不重复呢?从工程上有什么好的方法吗?
作者回复: 模型中加入曝光次数,或者根据曝光次数训练一个decay函数跟模型融合。
共 3 条评论13 - myrfy2020-11-05老师您好,看到上面的介绍,对端到端的理解还不是很清楚。感觉上面介绍的pmml和tf serving都是单向的,从离线模型到线上服务,并没有体现出用端上数据反过来训练模型这个方向。是我对端对端的理解有偏差,还是框架不支持呢
作者回复: 嗯嗯,再解释一下端到端。这里跟端上数据没关系,指的是训练完后,不用经过任何诸如拆分啊,提取特征和参数啊之类的特殊步骤,训练完直接部署,不用做什么改变。 这里的端到端是这个意思。
13 - Geek_2099092021-01-22[已解决,分享一下给可能有需要的人] 我在Windows下的Git命令行里照着输入这些指令碰到了下面的问题,运行docker run那个指令报错: E tensorflow_serving/sources/storage_path/file_system_storage_path_source.cc:364] FileSystemStoragePathSource encountered a filesystem access error: Could not find base path /models/half_plus_two for servable half_plus_two 报错说找不到模型文件。 原因:$TESTDATA这里的路径前面是"/c:/xxx/"这种,识别不了 解决方法:手动输入路径,把c盘前面的'/'符号去掉,就本来是‘/c:/xxx/xxx’改成‘c:/xxx/xxx’就可以了展开共 2 条评论7
- Lin D.2021-02-16如果是在windows环境下运行tensorflow serving 建议参考这个视频 https://www.youtube.com/watch?v=uabNEQlpGM8共 1 条评论6
- Sebastian2020-11-11老师好,想问下在线服务是否会涉及一些推荐的机制策略?比如流量控制,多样性,疲劳度优化等等?流量控制一般又有什么手段实现?这方面有什么资料可以推荐吗?谢谢!
作者回复: 你的问题很好,但我觉得估计不好找到很高质量的资料,因为都是业界的一些工程手段。 我理解你说的流量控制应该是指对不同用户使用不同的模型或者策略生成推荐结果是吧?这是一个很好的降低复杂模型qps的角度,但我觉得更多是一个工程问题,需要你在实践中摸索总结。
6 - Geek_ad1a2b2022-03-07win10环境遇到以下问题,应该是由于不同系统间命令的差异导致的 (1)TESTDATA路径变量无法设置,可跳过这一步,在下面对应位置用绝对路径替代即可 (2)docker run命令,下面的可运行命令取自评论区,路径部分内容还要根据你的具体路径修改 docker run -t --rm -p 8501:8501 -v "C:/Users/lenovo/serving/tensorflow_serving/servables/tensorflow/testdata/saved_model_half_plus_two_cpu:/models/half_plus_two" -e MODEL_NAME=half_plus_two tensorflow/serving '&' (3)crul命令 curl http://127.0.0.1:8501/v1/models/half_plus_two:predict -d "{\"instances\": [1.0, 2.0, 5.0]}" 参考于https://blog.csdn.net/xxw52mao1/article/details/98073095展开3
- fsc20162020-11-09老师,有2个问题请教您。 1,模型的离线训练完,部署到线上,产生推荐结果,根据用户行为反馈数据,然后在更新模型。实际工作上模型更新频率是怎么样,是根据各推荐指标按需进行调整嘛 2,文中说TensorFlow serving部署后,需要考虑性能优化问题,这个主要是指推荐服务器高并发请求下,保证准确,及时产生推荐结果嘛
作者回复: 1.模型更新频率其实是根据你的观察确定的,比如有的公司模型可能一周才更新一次,因为发现提高更新频率也对效果没什么影响。 有的公司可能需要做实时训练,比如我知道国内某主流电商团队,更新的频率在20分钟级别。 所以根据你自己的测试结果调整,一般天级别的更新是可行的。 2. 是的。TensorFlow serving本身在高并发下有一定的性能问题,有一些坑,我知道各一线团队都在进行一些魔改。
共 2 条评论4 - 嗅嗅的小胖🐷2021-01-21老师你好,如果是高并发大流量的场景下tfserving延迟会不会有问题,和普通的ps架构来讲那个会更好一些
作者回复: 一般来说原生的tfserving是肯定有延迟问题的。ps一般来说更轻量级,但很多模型也不好支持。总的来说serving是一个非常复杂的工程问题,没有银弹。
3 - Geek_3c29c32020-12-10老师,你好,想问一下如果是sklearn的模型,上线就是PMML最合适不过了吧。sklearn导出到PMML格式的文件我会,后面服务器利用JPMML调用模型文件,编写预测逻辑,生成服务,然后并发调用,这一系列不太会操作,还有服务器怎么选择服务架构,对后端的东西不太熟悉,有相关的资料可以学习吗?
作者回复: 我记得jpmml的官方文档上有描述相关的过程,基于我们的java server就可以实现这一过程。 我在我的项目 https://github.com/wzhe06/CTRmodel 中也有一些相关的部分,可以参考。
4 - Geek_8a732a2021-08-10# 启动TensorFlow Serving容器,在8501端口运行模型服务API docker run -t --rm -p 8501:8501 -v "C:\Users\Think\serving\tensorflow_serving\servables\tensorflow\testdata\saved_model_half_plus_two_cpu:/models/half_plus_two" -e MODEL_NAME=half_plus_two tensorflow/serving '&' # 请求模型服务API curl -Uri 'http://localhost:8501/v1/models/half_plus_two:predict' -Body '{"instances":[1.0, 2.0, 5.0]}' -Method 'POST'展开3
- Alan2021-03-08建议:第一步初次安装的国内小伙伴,添加Docker 引擎源加快拉取数据:{ "experimental": true, "debug": true, "registry-mirrors": [ "http://hub-mirror.c.163.com" ] }展开2
- 啊黄黄黄2021-01-13老师好,我现在排序过程中利用tf-serving加载模型,这里耗时很严重有什么好的方法可以解决的嘛?
作者回复: 没有好的解决方法,tf-serving的效率问题是业界非常棘手的问题,建议持续关注业界公布的一些tf-serving优化方案,虽然非常少。。
2 - 旦旦2020-11-23王喆老师好,想请问下tensorflow训练的深度模型想要离线部署到spark集群有什么好的解决办法吗?
作者回复: 不是特别理解这个需求。tensorflow是离线的,spark集群也是离线的,为什么要把tensorflow模型部署到spark集群呢?
共 4 条评论2 - Wiiki2020-11-03王老师,您好。我按照您说的步骤,在window7上面通过docker toolbox安装好了docker,然后在docker toolbox上pull tensorflow serving镜像。再把tensorflow测试模型文件下载到本地,并配置TESTDATA地址,然后docker run服务。最后报错了:error response form daemon: invalid mode: /models/half_plus_two。不知道是哪里出了问题,麻烦解答一下呀~ 谢谢
作者回复: 估计还是TESTDATA的路径问题,参考这篇文章https://stackoverflow.com/questions/50540721/docker-toolbox-error-response-from-daemon-invalid-mode-root-docker
2 - Geek_0601742021-11-01老师好。想问下如果既想用模型提供在线服务,又想根据新样本,实时更新这个在线模型。用什么架构比较合适呢?像老师课上讲到的这几种服务方式,比如pmml或者tf server,模型都是离线训练好的,可以实时根据用户动态更新吗。以最简单的lr或者fm模型为例,有没有办法让模型既提供可靠在线服务,又能根据到来的新数据实时更新呢?一般怎么做呢?
作者回复: 一般利用深度学习框架的checkpoint功能实现。巨头公司通过魔改TF或者pytorch来实现模型的流式训练。小公司很难有这种能力。
1 - 菜鸟2021-07-14JPMML是AGPLv3开源协议,不论是否分发软件都要开源,即使是云服务。生产环境都不敢用,宁可造个轮子。1
- longhx2021-07-06tfserving方式怎么加载外部预先训练好的的embedding数据呢
作者回复: 一般不在tfserving内部去做,而是在recsys server内部准备好,然后传给tfserving
1 - Sanders2021-02-0409#中讲到的推荐服务和模型服务是怎么结合的?是不是两者运行在Jetty + TF Serving一个容器运行时中,他们之间通过localhost的方式进行GRPC调用?感觉这样虽然耦合度高一些,但是会减少网络通信开销。
作者回复: 我觉得都没问题。有时候online service本身就是上百个容器,所以肯定没法放在一个容器里,所以具体的做法看工程需要吧。
1