-->

深度学习推荐系统实战_17_13_模型服务怎样把你的离线模型部署到线上

你好,我是王哲。

今天我们来讨论模型服务,说说如何把你的离线模型部署到线上。

在实验室的环境下,我们经常会使用spark、 tencil、 flow、 py、 orch这些流行的机器学习库来训练模型。

因为不直接服务用户,所以往往得到一些离线的训练,结果就觉得大功告成了。

但是啊在业界的生产环境中,模型需要在线上运行,实时的根据用户请求生成模型的预估值。

这个把模型服务部署在线上环境,并实时进行。

模型推断的过程就是模型服务。

模型服务对于推荐系统来说是至关重要的。

线上服务缺少了它离线的模型,只能在离线环境里面干着急,不能发挥功能,但是模型服务的方法可以说是五花八门,各个公司为了部署自己的模型也是各显神通。

那业界主流的模型服务方法有哪些?我们又该如何选择呢?那由于各个公司技术栈的特殊性,采用不同的机器学习平台模型服务的方法会截然不同。

不仅如此,使用不同的模型结构和模型存储方式,也会让模型服务的方法产生区别。

总的来说,业界主流的模型服务方式有四种,分别是预存储、推荐结果或者embedding结果。

预训练embedding加轻量级的线上模型,PMML序列化模型以及TENFLR serving.接下来我们就详细讲讲这些方法的实现原理。

通过对比他们的优缺点,相信你会找到最合适自己业务场景的方法。

那对于推荐系统线上服务来说,最简单直接的模型服务方法就是在离线环境下生成对每个用户的推荐结果,然后把结果预存到以REDIS为代表的线数据库库,这样在线上环境直接取取预存结结推推荐用户就可以以了。

这个方法的优点非明显显。

那对我们不需要实现任何线上推断的过程。

线下训练平台与线上服务平台完全全偶偶,可以灵活的选择任何离线的机器学工具进行模型训练。

那第二个优点就是线上服务过程,没有复杂的计算,推荐系统的线上延迟非常的低。

那对应的它的缺缺,我们也很容易想到也是两个。

第第个个缺是由于需要存储用户乘以物品乘以应用场景的组合推荐结果程线户户量量品数量等规模模大后,容容发生组组爆炸炸情况况,个数据库根本无力支撑如此大规模的数据的存储。

那第二个缺点是这个方法呀无法引入线上的场景类特征。

那由于这些特征是随场景变化的,所以推荐性我们的灵活性和效果都会受到限制。

由于这些优缺点的存在,这种直接存储推荐结果的方式,往往只适用于用户规模比较小。

由于这些冷启动热门榜单等特殊的应用场景呢,那如果在用户规模比较大的场景下,我们该怎么减少模型存储所需的空间呢?我们其实可以通过存储embedding的方式来替代直接存储推荐结果。

那具体来说就是先离线训练好embedding,然后在线上通过相似度运算得到最终的推荐结果。

在前面的特征中,我们已经通过item to back graph embedding等方法生成过物品的embedding,在存入REDIS供线上使用,那这就是预存embedding方法的典型应用。

由于线上推断过程非常简单快速,因此预存embedding的方法是业界经常采用的模型服务手段,但它的局限性也同样存在。

由于完全基于线下计算出embedding这样的方式无法支持线上场景特征的引入,并且无法进行复杂模型结构的线上推断,表达能力还是比较受限的。

因此,对于复杂模型,我们还需要从模型实时线上推断的角度入手,来改进模型服务的方法。

那事实上直接预存embedding的方法,让模型表达能力受限。

这个问题的产生主要是因为我们只采用了很简单的相似度计算这样的方式去得到最终的推荐分数。

既然如此,那我们能不能在线上实现一个比较复杂的操作,甚至是用神经网络来生成最终的预估值呢?那当然是可行的这就是业界很多公司采用的预训练embedding,再加上轻量级线上模型的模型服务方式。

详细一点来说,这样的模型服务方式指的是因复杂的深度学习网络离线训练生成embedding存入内存数据库,在线上实现逻辑回归或者浅层的神经网络等轻量级模型来拟合优化目标。

那口说无凭。

接下来我们就看一个业界实际的例子,我在文稿中放了一张阿里的推荐模型MIMN的模型结构图。

仔细看这张图,你会注意到左边粉色的部分是复杂模型的例子。

右边灰色的是稍微简单的部分。

看这张图的时候,其实你不需要纠结于复杂模型的结构细节。

你只要知道不管左边的部分多么复杂,它其实都是在线下训练生成的。

而右边的部分是一个经典的多层神经网络,它才是真正在线上服务的部分。

那这两部分的接口在哪里呢?你可以看一看图中间连接处的位置有两个被虚线框框住的数据结构,分别是s一到SM和m一到MM.它其实就是在离线生成的embedding向量。

在MAMMM模型中,它被称作多通道用户兴趣向量。

那这些embedding向量就是连接离线模型和线上部分的接口。

那线上部分从registlry的模型数据库中拿到这些离线生成的embedding向量,然后跟其他特征的embedding向量组合在一起,扔给一个标准的多层神经网络进行预估。

这就是一个典型的预训练embedding加轻量级线上模型的服务方式。

那它的好处是显而易见的,就是我们隔离了离线模型的复杂性和线上推断的效率要求。

在离线环境下,你可以尽情的使用复杂的结构,构建你的模型。

只要最终的结果是embedding,就可以轻松的供给线上推断使用。

那总的来说,embedding加轻量级模型的方法确实既高效又实用,但终归它还是把模型给割裂了让模型不完全是n to n的训练,加n to n的部署这种最完美最理想的方式。

那有没有能够在离线训练完模型之后,什么都不用做直接部署模型的方式呢?那当然是有的,也就是我们接下来要讲的脱离于平台的通用模型部署方式PMML.那PMML的全称是预测模型标记语言,它是一种通用的,以XML形式表示模型结构参数的标记语言。

在模型上线的过程中,PMML经常作为中间媒介连接模型训练平台和模型服务模块。

那这么说还比较抽象,接下来我就以spark ML leap模型的训练和上线过程为例,来和你详细解释一下。

Pmml在整个及学习模型训练及上线流程中扮演的角色。

那我们先来看一看文稿。

那图中使用了JPMML作为序列化和解析PMML文件的工具库。

那JPMML项目分为spark和java server两个部分,spark部分完成spark ML leap模型的序列化生成PMML文件,并保存到线上服务器。

能够触达的数据库或者文件系统中。

那java server部分则完成PMM模型的解析,并生成预估模型完成与业务逻辑的整合。

Jpmml在java server部分,只进行推断不考虑模型的训练、分布式部署等一系列的问题。

因此,工具库比较轻量级,能够高效的完成推断过程。

那与JPMML相似的开源项目,还有m leap同样采用了PMML作为模型转换和上线的媒介。

那事实上,JPMML和m leap也具备SK learn啊、TNLL flow等简单模型的转换和上线能力。

我把他们的项目地址放在了文稿里。

如果你有兴趣,可以通过他们进行进一步的学习和实践。

啊,既然PMML已经是n to n的训练加n to n的部署这种最完美的方式了。

那我们的课程中为什么不使用它进行模型服务呢?那这是因为对于具有复杂结构的深度学习模型来说,PMML语言的表示能力还是比较有限的,还足以以持复杂杂深深度习模型结构了。

由由于们课课程中的推模模型模块主要使用tencil flow的原生推荐模型。

这个时候PMML就有点能力不足了。

想要上线TNLL flow模型,我们就需要借助tencil flow的原生模型服务模块,penn LL flow serving支持。

那从整体工作流程来看,TNLL flow serving和NLLL类工具的流程是一致的。

他们都经历了模型存储、模型载入还原以及提供服务的过程。

在具体的细节上,TNLL lolow在在离线把模型序列化存储到文件系统turn l flow serving,把模型文件载入到模型服务器还原模型推断过程对外以HTTP接口或者GRPC接口的方式提供模型服务务。

在具具到到咱们spspr acaccess项目中,我们会在离线使用tn l fo的carrots接口,完成模型的构建和训练,再利用turn l fo serving载入模型,用docker作为服务容器,然后在jetl服务器中发出HTTP请求,到TNF floo serving获得模型推断结果。

最后推荐服务器会利用这一结果完成推荐排序。

好了,搞清楚了模型服务的相关知识,相信你对各种模型服务的方法的优缺点都已经了然于胸了。

那刚才我们提到咱们的课程选用了turn fflow作为深度学习推荐模型的主要平台,并且还选用了turn l flow serving作为模型服务的技术方案。

他们可以说是整个推荐系统的核心了。

那为了给之后的学习打下基础,接下来我就带你搭建一个TNNFLLL serving的服务,把这部分重点内容牢牢掌握住。

那总的来说,搭建一个tn LL serving的服务主要分为三步,分别是安装docker、建立TNNFLL、 sering服务以及请求TNNLOL serving获得预估结果。

为了提高咱们的效率,我希望你能打开电脑跟我的讲解和文稿里的池代码一块来安装。

好,那我们先来看看怎么安装。

Docker参测活的serving最普遍也是最便捷的服务方式,是使用docker建立模型服务API.那为了方便你后面的学习,我再简单说一说docker. Docker是一个开源的应用容器引擎,你可以把它当做一个轻量级的虚拟机,它可以让开发者打包他们的应用以及相关的依赖环境,到一个轻量级可移植的容器中,然后发布到任何的流行的操作系统,比如linux、 windows mac的机器上。

那docker容器相互之间是没有任何接口,不做任何通信的,而且容器本身的开销极低,这就让docker成为了非常灵活、安全、伸缩性极强的计算资源平台。

因为TENSOL算命对外提供的是模型服务接口,所以使用docker作为容器的好处主要有两个,一个是可以非常方便的安装。

二是在模型服务的压力有变化时,可以灵活的增加或者减少docker容器的数量,做到弹性、计算可性作源分配。

Docker安装也非常简单,你可以打开我在文稿中给出的链接,参考官网教程,像安装一个普通软件一样下载安装就好了。

那安装好docker后,你不仅可以通过图形界面打开docker,还可以通过命令行来进行docker相关的操作。

那怎么验证你是否安装成功了呢?那只要你打开命令行输入docker检减version命令,它就能显示出类似docker version一九零三一三这样的版本号。

那这就说明你的docker环境已经准备好了。

那在这之后,我们就可以着手建立transfer serving的服务了。

那首先我们要利用docker命令docker pool tinfer o serving来拉取tinfer for serving的镜像。

然后我们再用docker命令从turn fflow官方的tethub地址上下载transfer serving相关的测试模型文件。

那最后我们在docker中启动一个包含transfer serving的模型服务容器,并载入我们刚才下载的测试文件。

Half plulus那那在lk执行完件后,如你在dodoker er管理界面中看到到了tn LOL ming容器就像文稿一样,那就证明你的tinl OO算ming的服务被成功的建立起来了。

好了,最后我们再来验证一下能否通过HTTP请求从TNNLOL serving的API中获取模型的预估结果。

我们可以通过col命令来发送HTP post,请求在tenn flow serving的地址,或者利用tenn flow这样的软件ttenn polow请求进行验证。

那如果你返回的结果是类似文稿中的jason对象,就说明tenn FL服务已经成功建立起来了。

那对于servservtenn fl serving服务的搭建,我们就讲完了。

如果你对整个过程还有疑问的话,也可以参考TENFOL serving的官方教程。

那不过有一点,我还想提醒你,如果我们只是使用tn f fo serving官方自带的一个测试模型,来告诉你怎么准备环境。

那推荐模型实战的时候,我们还会基于tenn FL lolow构建多种不同的深度学习模型。

到时候NN flow serving就会派上关键的用场了。

那对于深度学习推荐系统来说,我们只会选择tenn flow serving的模型服务方式就万无一失了吗?当然不是,它其实只是一个开始,也有很多需要优化的地方。

在搭建它的过程中,会涉及到模型的更新,整个dolker能的集群的维护。

而且contt NLLL面的线上性能也需要大量的优化来提高。

这些工程问题都是我们在实践过程中必须要解决的。

但是它的应用性和对复杂模型的支持,还是让它成为上线sert NRLOW模型的第一选择。

好了,今天的内容讲完了,我们一起来做个总结。

那业界主流的模型服务方法有四种,分别是预存推荐结果或embedding结果预训练embedding加轻量级线上模型。

对于PMML转换和部署模型以及tenn l fo serving它们各有优缺点。

为了方便你对比而把它们的优缺点都列在了表格中。

你可以到文稿中查看,我们之后的课程,会重点使用turn LLO serving.它是enn to end的解决方案,使用起来非常方便高效,而且它支持绝大多数turn l flow的模型结构。

对于深度学习推荐系统来说,是一个非常好的选择。

那在实践部分我们也一起一步一步搭建起来。

基于docker的turn, l fo serving服务,这为我们之后进行深度学习推荐模型的上线打好了基础。

整个搭建过程非常简单,相信你跟着我的讲解就可以轻松的完成。

好了,最后留一道思考题。

我们今天讲了如此多的模型服务方式,能结合自己的经验谈一谈你是如何在自己的项目中进行模型服务的吗?除了我们今天说的,你还用过哪些模型服务的方法,欢迎在留言区分享你的经验,也欢迎你把这篇文章分享出去。

我们下节课见。