01写在前面

在CTR(Click Through Rate)点击率预估的推荐算法场景,TensorFlow Feature Column被广泛运用到实践中。这一方面带来了模型特征处理的便当,另一方面也带来了一些线上推理服务的功用问题。为了优化推荐事务功算法工程师用,前进线上枸杞服务功率,爱奇艺深度学习途径团队在实践中总结了一些功用优化办法。

通过矩阵等价这些优化,推荐事务的线上推理服务功用功率能够前进一倍以上,p99推迟矩阵等价下降抵达50%以上。

02布景介绍

Feature Column是TensorFlow供应的用于处理结构化数矩阵等价据的东西,是将样本特征映射到用于练习模型特征的桥梁。它供应了多种特征处理办法,让算法人员能够很简单将接口卡各种原始特征转化为模型的算法是什么输入,来进行模型试验。

推理功能提高一倍,TensorFlow Feature Column功能优化实践

如上图所示,悉数Feature Column都源自Featur枸杞eColumn类,并继承了三个子类CategoricalColumn深度学习、DenseColumn和SequenceDense龚俊Column,别离对应稀少特征稠密特征序列稠密特征。算法人员可龚俊以按照样本特征的类型找到对应的接口直接适配。

并且 Feature Column 和 TF Estimator 接口有很好的集成,通过googleplay界说好对应的特征输入就能够直接在预界说的 Estimator 模型中运用。TF Estimator 在推荐算法的运用非常广泛,特别是它封装了分布式练习的功用。

下图是一个运用Feature Column处理特征,进入到矩阵天王 Estimator DNN Classifier的示例:

推理功能提高一倍,TensorFlow Feature Column功能优化实践

尽管Feature Column运用起来很便利,模型代码编写比较快,可是在爱奇艺推荐类事务的线上服务落地进程中,一些功用问题逐步凸显,下面将逐个介绍我们在实践中碰到的一些问题,以及怎样优化。

03整型特征哈希优化

推荐类模型一Go般都会将ID类特征哈希到一定数量的bucket 分桶,然后转化成 Embedding再作为神经网络的输入,比如视频类ID特征,用户ID特征,产品龚俊ID特征等。示例如下:

推理功能提高一倍,TensorFlow Feature Column功能优化实践

在`categoric接口文档al_column_with_hash_bucket `的文档[2]里面说到:关于String类型的输入,会履行`output_id枸杞 = Hash(input_feature_string) % bucket_size`做哈希操作,而关于整数类型的输入会先算法的五个特性转成String类型然后再进行相同的哈希操作。通过查看源代码矩阵的逆[3]能够看到这样的逻辑:

推理功能提高一倍,TensorFlow Feature Column功能优化实践

在推荐事务矩阵乘法中,一般这类ID都是现已过某种办法的哈希,形成64bit的整型特征放矩阵天王到样本里面,因而必定要履行整型转化成String的操作。可是在TensorFlow 的 Timeline中能够看到函数`as_string`所对应的TF内部的`AsString` OP其实是一个比较耗接口crc错误计数时的操作,通过剖析对比发现`AsString` OP的耗时一般是后边的哈希操作的3倍以上,如算法设计与剖析下图所示:

推理功能提高一倍,TensorFlow Feature Column功能优化实践

进一步剖析`AsString` OP内部的代码,能够发现这个OP内部还触及到了内存分配和复制操作,因而比纯哈希核算慢就能够理解了。

很天然,团队考虑去掉相关操作来做优化,因而专门编写了一个给整型做哈希的函数来做优化,示例代码如下:

推理功能提高一倍,TensorFlow Feature Column功能优化实践

通过这样接口crc错误计数做差异类型的哈希办法,完全优化了原先耗时长的类型转化操作。这儿需求留神的是新加的哈希函数对应的新OP相同需求加到 TF Serving 中。

04定长特征转化优化

定长特征是指运用接口`tf.io.FixedLenFeature`来解析的特征,比如用户的性别,年纪等,这类特征的长度一般都是定长的,并且固定为 1 维或多维。这类特征通过接`tf.io.parse_example` 解析成 Dense Tensor,然后通过Feature Column处理,再进入到模型的输入层。常见的代码示例如下:

推理功能提高一倍,TensorFlow Feature Column功能优化实践

以上面的代码为比如,举例解析一Go下 TensorFlow 内部的Tensor 转化逻辑。如下图所示,两个样本user_name别离为bob和wanda,通过样本解析成shape为2的Dense Tensor,然后通过`
categorical_colum算法的五个特性n_with_vocabulary_lis算法导论t`转化,查找词表别离转成0和2,再通过`indicator_column`转化成One hot编码的Dense输入。

推理功能提高一倍,TensorFlow Feature Column功能优化实践

从上面的样本处理来看没宫颈癌有什么问题,然后再算法的五个特性来看一下Feature算法工程师和程序员差异 Column代码内部的转化处理逻辑:

推理功能提高一倍,TensorFlow Feature Column功能优化实践

如上图所示,在算法设计与剖析代码中Vocabulary Catego算法设计与剖析rical Column 会先去除掉一些不合法值,然后把输入的龚俊Dense Tensor 转化成 Sparse Tensor,在Indicator Column中会再次把Tensor从Sparse转成Dense,最矩阵的逆终转成需求的One Hot Te算法剖析的意图是ns矩阵or。

先来考虑一下上面两个转化操公积金作的矩阵的秩意图,一方面是为了去除样本数据中一些失常的值,其他一方面是这样的处理其实是一起统筹了输入是 Sparse Tensor 的状况,假定输入是Spare Tensor就直接做Vocabulary词表接口文档查找,然后再转成Dense Tensor。这样转化尽管抵达代码复用的效果,可是在功用上却有丢掉。假定能直接将原始的Input Tensor转化成One Hot Tensor,就能够省去两个转化进程,并且Sparse算法工程师 Tensor 和D接口的效果ense Tensor之间的转化其实是非常耗时的操作。

再回到定长特征的原始性质,关于这类定长特征来讲,在样本处理的时分假定没有值,会被填充成默认值,并且在生成样本的时分都会被确保不会呈现有空值或许 -1的状况,因而失常值的处理其实是能够被省掉深度学习的。终究Go优化后的内部转化逻辑如下图,省去了两次Sparse Tensor 和Dense Tensor之间的转化。

推理功能提高一倍,TensorFlow Feature Column功能优化实践

除了上面的Vocabulary Categorical Column,还有其他类似Feature Column也有相同的问题,因而针对这类特征,途径专门开发了一套优化的Feature Col宫颈癌umn接口供应给事务运用,优化功用作深度学习用还不错。

05用户特征去重优化

算法的有穷性是指荐类算法模矩阵相乘怎样算型都有个很典型的特色,那就是模型中会包含用户侧特征和要推荐的Item侧特征,比如视频的特征、产品的特征等。模型在线上服务安置的时分,会给一个用户举矩阵游戏荐多个视频或产品,模型会回来接口测验的流程和过程这多个视频或产品的打分,然后按照打分的大小推荐给用户。由所以给单个用户做推荐,这个时分该用户的特征会根据推荐Item狗狗币的数量重复屡矩阵乘法次,再发送给模型。如下是一个典型的推荐算法排序模型线上推理的示意图:

推理功能提高一倍,TensorFlow Feature Column功能优化实践

图示的模矩阵乘法型输入有3个User特征,3个Item特征,假定在对某个用户做推荐,该用户的3个特征别离对应为u1,u2和u3。这时要对两个不同的Item做推荐评分央求,也就是一个央求里面有两个Item,这两个Item别离为I1和I2,这两个Item别离有三个特征,I1对应I11,I12,I13,以此类推,这样构成一个batch size为2的推理央求。从图中能够看到,由所以给同一个用户推荐两个不同的算法是什么Item,Item侧的特征是不同的,接口的效果可是用户的特征被重复了两次。

上面的比如只以2个Item为例,可是实践线上的服务枸杞google个推理央求会带100个Item甚至更多,因而用户的特征也会被重复100次甚至更多,重复的用户特征不只增加了传输的带宽,而矩阵天王且增加了特征处理时的核算量,因而事务非常希接口测验望能处理这个问题。

这个问题的本源要从TensorFlow 的模型练习代码说起。Te龚俊nsor矩阵的秩Flow 练习时的每一条样本是某个用户对某个Item的行为,然后通过shuf接口测验的流程和过程fle和batch后进入到练习模型,这时分一个batch里面的数据必定包含了多个用户行为的样本,这个和线上推理服务的接口测验的流程和过程输入数据算法是什么格局是完全不同的。

怎样处理这个问题?最简略的主意,假定在矩阵的逆线上服务矩阵的逆就只发送一条用户特征会怎样样?快速的测验就能够知道特google征数据进入到模型输入层的时分会 concat失利。这是由于Item特征的batch size是多算法的时刻复杂度取决于个,而用户特征的batch size只需1,示例如下:

推理功能提高一倍,TensorFlow Feature Column功能优化实践

为了处理concat失利的问题,单纯先从模型的视点来看,能够考虑在进入到输入层之前把用户特征复原到和Item特征相同的batch size,如下图所示。

推理功能提高一倍,TensorFlow Feature Column功能优化实践

明显这个从数学模型上是可行的,接下来就是怎样在TensorFlow 的Go代码里面完成这个主意。这儿需求留神的是复制的操作只能在线上服务的模型里面,不能在深度学习练习的模型里面。

现在TF Estimator 接口在推荐类算法的运用比较常见,宫颈癌而Estimator 接口供应了很龚俊好的模型差异办法,通过判别ModeKeys为`tf.estimator接口是什么.Mo接口的效果deK矩阵等价eys.PREDICT`时是线上的服务模型,ModeKeys为算法的有穷性是指`tf.estimator.ModeKeys.TRAIN`时是练习模型,下面是示例代码:

推理功能提高一倍,TensorFlow Feature Column功能优化实践

在实践的模型上,需求将User和It接口测验em的feature column差异开来别离传入,这个算法的时刻复杂度是指什么对本来的模型代码改动比较大,batch size的获取能够通过判别Item特征的长度来获取,这儿不再赘述。

在实践的上线进程中,团队履历了两个阶段,第一个阶段是只对算法模型代码做批接口改,在处理用户特征时只取第一维,可是实践发送的推理央求仍是会把用户特征重复屡次;第二个阶段才把发送的推荐央求优化成算法工程师和程序员差异只发送一份用户特征,这个时分模型代码不需求再做修改,现已主动适配。

推理功能提高一倍,TensorFlow Feature Column功能优化实践

如上图所示,第一阶矩阵乘法段的时分用户特征的输入仍是重复屡次,在模型中,对用户特征只取第一维再进行特征处理,示例代码如下:

推理功能提高一倍,TensorFlow Feature Column功能优化实践

上面的算法是什么模型代码能够一起适配推理央求发送重算法的时刻复杂度是指什么复的用户特征,或许只发送一条用户特征。因而在第二阶段的时接口测验分,不需求再矩阵修改模型代码,只需求优化发送推理央求的引擎侧代码。

通过这样的优化,线上推理服务不需求重复发送用户特征,不只节省了带宽,并且减少了序列化的耗费。对一个 batch 中的用户特征只做一份数据的Feature Column转化,然后做复制操作,复制耗费的时刻远远小于转化的矩阵计算器时刻。

这儿其实还能够做进一步的优化,将复制操作拖延算法的有穷性是指接口是什么第一层神经网络的矩阵乘后边,这样能够减少第一个矩阵乘的部分核算耗费。假定用户特征的维度占比比较高,优化的效果会比较明显。

06总结

本文介绍了爱奇艺深度学习途径在实践进程中总结的一些TensorFlow Feature Column优化。通过这些优化,线上的推理服务功用功率前进一倍以上,p99推迟下降抵达50%以上。并且相比较于做op矩阵计算器 fuse,模型图修改等优化,这些优化在事务实践中也比较简单去落矩阵计算器地。

终究,我们仍是要必定算法的有穷性是指Tens矩阵计算器orFlow Feature Column给推荐矩阵等价类算法带来的特征处理便当性,它将整个特征的处理笼统出来,算法只需略微适配一下样本特征就能够很快的做迭代和试验。

参考文献

1. www.tensorflow.org/tuto算法是什么rials/s…

2. www.t算法的五个特性ensorflow.org/api_docs/p…

3. github.com/tensorf狗狗币low/…