实战_电商场景中精排服务的实践
精排服务框架介绍
框架流程图

机器学习平台
数据流服务: 产生训练所需的训练样本
训练平台: 模型开发和训练的统一平台
模型部署平台: 负责各种模型的文件的部署后用于线上预估




排序服务相关参数服务器
小样本无需分布式
分布式机器学习分成两个部分,即参数和训练:
-
对于大型的算法,比如DNN,CNN,参数上亿的时候,自然需要一个集群来存储这么多的参数。因而,参数服务器就是专门用来存储这么多参数的服务。
-
训练部分自然是并行的,不然无法体现分布式机器学习的优势。因为参数服务器的存在,每个计算节点在拿到新的batch数据之后,都要从参数服务器上取下最新的参数,然后计算梯度,再将梯度更新回参数服务器。
参数服务器通常对外提供两个方法:push(对应值传给参数服务器) 和 pull(从参数服务器中拉取对应的值)
在参数服务中,参数都是可以被表示成(key, value)的集合,key就是feature ID,而value就是它
的权值。把参数表示成k-v, 形式更自然, 易于理,更易于编程解。workers跟servers之间通过push与pull来通信的。
worker通过push将计算好的梯度发送到server,然后通过pull从server更新参数。
参数服务器架构:

server 节点可以跟其他 server 节点通信
server group 共同维持所有参数的更新
server manager node 负责维护一致性
worker 节点之间没有通信,只跟自己对应的server进行通信。
task scheduler负责向worker分配任务并且监控worker的运行情况

eg: 特征 user_id: 100001获取对应的embedding参数
-
hash(“user=100001”)
-
基于这个hash值,通过一定方法定位到server group中的node , 从这个node节点中取出
embedding
- 训练更新这个embedding权重向量后写回对应的 node
经典的参数服务器PS-lite

流程:
-
training data 数据切分
-
worker N 拿到自己的数据,从servers中pull参数
-
Worker N 基于参数compute每个参数对应的梯度push给servers
-
Servers收集所有workers进行统一梯度,更新参数
DNN & DeepFM排序模型实践
精排模型开发

eg:
假设现在有4个特征,每个特征有100个值,定义embedding长度为8
Input -> layer1 的输入x的个数为4*8=32
此时的参数量为 100 * 8*4 = 3200,Layer1 -> layer2 的输入为32, 输出为3
此时的参数量为 32*3 +1 = 97,Layer2 - > layer3 的输入为3, 输出为1
此时的参数量为3*1 + 1 = 4
embedding向量长度存到对应的参数服务器中,网络结构内部权重W则放在网络模型中
DNN模型的前向传播:

DeepFM = DNN与FM的融合

-
FM公式限制,Dense Embeddings 的向量长度必须一致
-
Embedding传给FM的同时也会传给DNN,共享Embedding
-
FM的输出是取隐层求和前的向量和DNN的隐层的输出一起concat再进行output层

电商推荐排序线上模拟
排序线上流程
-
预估服务会先加载好model文件。
-
引擎请求中会带上item_id集合,这是召回流程中筛选出来的。
-
预估服务通过引擎请求中的user_id与item_id去请求特征服务。
-
从特征服务器中得到对应特征后去参数服务中获得每个对应特征的向量。
-
向量拼接后进入预估服务得到预估分,将预估分得到返回给引擎请求。
预估服务的开发流程
-
加载模型文件, 初始预估服务
-
请求特征服务器,获取用户和商品的特征
-
基于特征值去参数服务器中找出对应的向量
-
拼接对应的向量后传入网络中进行预估
-
返回预估分值