基于TensorFlow Serving的深度学习在线预估

一、前言

随着深度学习在图像、语言、广告点击率预估等各个领域不断发展,很多团队开始探索深度学习技术在业务层面的实践与应用。而在广告CTR预估方面,新模型也是层出不穷: Wide and Deep[^1]、DeepCross Network[^2]、DeepFM[^3]、xDeepFM[^4],美团很多篇深度学习博客也做了详细的介绍。但是,当离线模型需要上线时,就会遇见各种新的问题: 离线模型性能能否满足线上要求、模型预估如何镶入到原有工程系统等等。只有准确的理解深度学习框架,才能更好地将深度学习部署到线上,从而兼容原工程系统、满足线上性能要求。

本文首先介绍下美团平台用户增长组业务场景及离线训练流程,然后主要介绍我们使用TensorFlow Serving部署WDL模型到线上的全过程,以及如何优化线上服务性能,希望能对大家有所启发。

二、业务场景及离线流程

2.1 业务场景

在广告精排的场景下,针对每个用户,最多会有几百个广告召回,模型根据用户特征与每一个广告相关特征,分别预估该用户对每条广告的点击率,从而进行排序。由于广告交易平台(AdExchange)对于DSP的超时时间限制,我们的排序模块平均响应时间必须控制在10ms以内,同时美团DSP需要根据预估点击率参与实时竞价,因此对模型预估性能要求比较高。

2.2 离线训练

离线数据方面,我们使用Spark生成TensorFlow[^5]原生态的数据格式tfrecord,加快数据读取。

模型方面,使用经典的Wide and Deep模型,特征包括用户维度特征、场景维度特征、商品维度特征。Wide 部分有 80多特征输入,Deep部分有60多特征输入,经过Embedding输入层大约有600维度,之后是3层256等宽全连接,模型参数一共有35万参数,对应导出模型文件大小大约11M。

离线训练方面,使用TensorFlow同步 + Backup Workers[^6]的分布式框架,解决异步更新延迟和同步更新性能慢的问题。

在分布式ps参数分配方面,使用GreedyLoadBalancing方式,根据预估参数大小分配参数,取代Round Robin取模分配的方法,可以使各个PS负载均衡。

计算设备方面,我们发现只使用CPU而不使用GPU,训练速度会更快,这主要是因为尽管GPU计算上性能可能会提升,但是却增加了CPU与GPU之间数据传输的开销,当模型计算并不太复杂时,使用CPU效果会更好些。

同时我们使用了Estimator高级API,将数据读取、分布式训练、模型验证、TensorFlow Serving模型导出进行封装。 使用Estimator的主要好处在于:

  1. 单机训练与分布式训练可以很简单的切换,而且在使用不同设备:CPU、GPU、TPU时,无需修改过多的代码。
  2. Estimator的框架十分清晰,便于开发者之间的交流。
  3. 初学者还可以直接使用一些已经构建好的Estimator模型:DNN模型、XGBoost模型、线性模型等。

三、TensorFlow Serving及性能优化

3.1 TensorFlow Serving介绍

TensorFlow Serving是一个用于机器学习模型Serving的高性能开源库,它可以将训练好的机器学习模型部署到线上,使用gRPC作为接口接受外部调用。TensorFlow Serving支持模型热更新与自动模型版本管理,具有非常灵活的特点。

下图为TensorFlow Serving整个框架图。Client端会不断给Manager发送请求,Manager会根据版本管理策略管理模型更新,并将最新的模型计算结果返回给Client端。

TensorFlow Serving架构,图片来源于TensorFlow Serving官方文档

美团内部由数据平台提供专门TensorFlow Serving通过YARN分布式地跑在集群上,其周期性地扫描HDFS路径来检查模型版本,并自动进行更新。当然,每一台本地机器都可以安装TensorFlow Serving进行试验。

在我们站外广告精排的场景下,每来一位用户时,线上请求端会把该用户和召回所得100个广告的所有信息,转化成模型输入格式,然后作为一个Batch发送给TensorFlow Serving,TensorFlow Serving接受请求后,经过计算得到CTR预估值,再返回给请求端。

部署TensorFlow Serving的第一版时,QPS大约200时,打包请求需要5ms,网络开销需要固定3ms左右,仅模型预估计算需要10ms,整个过程的TP50线大约18ms,性能完全达不到线上的要求。接下来详细介绍下我们性能优化的过程。

3.2 性能优化

3.2.1 请求端优化

线上请求端优化主要是对一百个广告进行并行处理,我们使用OpenMP多线程并行处理数据,将请求时间性能从5ms降低到2ms左右。

#pragma omp parallel for 
for (int i = 0; i < request->ad_feat_size(); ++i) {tensorflow::Example example;data_processing();
}

3.2.2 构建模型OPS优化

在没有进行优化之前,模型的输入是未进行处理的原格式数据,例如,渠道特征取值可能为:’渠道1’、’渠道2’ 这样的string格式,然后在模型里面做One Hot处理。

最初模型使用了大量的高阶tf.feature_column对数据进行处理, 转为One Hot和embedding格式。 使用tf.feature_column的好处是,输入时不需要对原数据做任何处理,可以通过feature_column API在模型内部对特征做很多常用的处理,例如:tf.feature_column.bucketized_column可以做分桶,tf.feature_column.crossed_column可以对类别特征做特征交叉。但特征处理的压力就放在了模型里。

为了进一步分析使用feature_column的耗时,我们使用tf.profiler工具,对整个离线训练流程耗时做了分析。在Estimator框架下使用tf.profiler是非常方便的,只需加一行代码即可。

with tf.contrib.tfprof.ProfileContext(job_dir + ‘/tmp/train_dir’) as pctx:estimator = tf.estimator.Estimator(model_fn=get_model_fn(job_dir),config=run_config,params=hparams)    

下图为使用tf.profiler,网络在向前传播的耗时分布图,可以看出使用feature_column API的特征处理耗费了很大时间。

优化前profiler记录, 前向传播的耗时占总训练时间55.78%,主要耗费在feature_column OPS对原始数据的预处理

为了解决特征在模型内做处理耗时大的问题,我们在处理离线数据时,把所有string格式的原生数据,提前做好One Hot的映射,并且把映射关系落到本地feature_index文件,进而供线上线下使用。这样就相当于把原本需要在模型端计算One Hot的过程省略掉,替代为使用词典做O(1)的查找。同时在构建模型时候,使用更多性能有保证的低阶API替代feature_column这样的高阶API。下图为性能优化后,前向传播耗时在整个训练流程的占比。可以看出,前向传播的耗时占比降低了很多。

优化后profiler记录,前向传播耗时占总训练时间39.53%

3.2.3 XLA,JIT编译优化

TensorFlow采用有向数据流图来表达整个计算过程,其中Node代表着操作(OPS),数据通过Tensor的方式来表达,不同Node间有向的边表示数据流动方向,整个图就是有向的数据流图。

XLA(Accelerated Linear Algebra)是一种专门对TensorFlow中线性代数运算进行优化的编译器,当打开JIT(Just In Time)编译模式时,便会使用XLA编译器。整个编译流程如下图所示:

TensorFlow计算流程

首先TensorFlow整个计算图会经过优化,图中冗余的计算会被剪掉。HLO(High Level Optimizer)会将优化后的计算图 生成HLO的原始操作,XLA编译器会对HLO的原始操作进行一些优化,最后交给LLVM IR根据不同的后端设备,生成不同的机器代码。

JIT的使用,有助于LLVM IR根据 HLO原始操作生成 更高效的机器码;同时,对于多个可融合的HLO原始操作,会融合成一个更加高效的计算操作。但是JIT的编译是在代码运行时进行编译,这也意味着运行代码时会有一部分额外的编译开销。

网络结构、Batch Size对JIT性能影响[7]

上图显示为不同网络结构,不同Batch Size下使用JIT编译后与不使用JIT编译的耗时之比。可以看出,较大的Batch Size性能优化比较明显,层数与神经元个数变化对JIT编译优化影响不大。

在实际的应用中,具体效果会因网络结构、模型参数、硬件设备等原因而异。

3.2.4 最终性能

经过上述一系列的性能优化,模型预估时间从开始的10ms降低到1.1ms,请求时间从5ms降到2ms。整个流程从打包发送请求到收到结果,耗时大约6ms。

模型计算时间相关参数:QPS:1308,50line:1.1ms,999line:3.0ms。下面四个图分别为:耗时分布图显示大部分耗时控制在1ms内;请求次数显示每分钟请求大约8万次,折合QPS为1308;平均耗时时间为1.1ms;成功率为100%

3.3 模型切换毛刺问题

通过监控发现,当模型进行更新时,会有大量的请求超时。如下图所示,每次更新都会导致有大量请求超时,对系统的影响较大。通过TensorFlow Serving日志和代码分析发现,超时问题主要源于两个方面,一方面,更新、加载模型和处理TensorFlow Serving请求的线程共用一个线程池,导致切换模型时候无法处理请求;另一方面,模型加载后,计算图采用Lazy Initialization方式,导致第一次请求需要等待计算图初始化。

模型切换导致请求超时

问题一主要是因为加载和卸载模型线程池配置问题,在源代码中:

uint32 num_load_threads = 0; uint32 num_unload_threads = 0;

这两个参数默认为 0,表示不使用独立线程池,和Serving Manager在同一个线程中运行。修改成1便可以有效解决此问题。

模型加载的核心操作为RestoreOp,包括从存储读取模型文件、分配内存、查找对应的Variable等操作,其通过调用Session的run方法来执行。而默认情况下,一个进程内的所有Session的运算均使用同一个线程池。所以导致模型加载过程中加载操作和处理Serving请求的运算使用同一线程池,导致Serving请求延迟。解决方法是通过配置文件设置,可构造多个线程池,模型加载时指定使用独立的线程池执行加载操作。

对于问题二,模型首次运行耗时较长的问题,采用在模型加载完成后提前进行一次Warm Up运算的方法,可以避免在请求时运算影响请求性能。这里使用Warm Up的方法是,根据导出模型时设置的Signature,拿出输入数据的类型,然后构造出假的输入数据来初始化模型。

通过上述两方面的优化,模型切换后请求延迟问题得到很好的解决。如下图所示,切换模型时毛刺由原来的84ms降低为4ms左右。

优化后模型切换后,毛刺降低

四、总结与展望

本文主要介绍了用户增长组基于Tensorflow Serving在深度学习线上预估的探索,对性能问题的定位、分析、解决;最终实现了高性能、稳定性强、支持各种深度学习模型的在线服务。

在具备完整的离线训练与在线预估框架基础之后,我们将会加快策略的快速迭代。在模型方面,我们可以快速尝试新的模型,尝试将强化学习与竞价结合;在性能方面,结合工程要求,我们会对TensorFlow的图优化、底层操作算子、操作融合等方面做进一步的探索;除此之外,TensorFlow Serving的预估功能可以用于模型分析,谷歌也基于此推出What-If-Tools来帮助模型开发者对模型深入分析。最后,我们也会结合模型分析,对数据、特征再做重新的审视。

作者简介

  • 仲达,2017年毕业于美国罗彻斯特大学数据科学专业,后在加州湾区Stentor Technology Company工作,2018年加入美团,主要负责用户增长组深度学习、强化学习落地业务场景工作。
  • 鸿杰,2015年加入美团点评。美团平台与酒旅事业群用户增长组算法负责人,曾就职于阿里,主要致力于通过机器学习提升美团点评平台的活跃用户数,作为技术负责人,主导了美团DSP广告投放、站内拉新等项目的算法工作,有效提升营销效率,降低营销成本。
  • 廷稳,2015年加入美团点评。在美团点评离线计算方向先后从事YARN资源调度及GPU计算平台建设工作。

招聘信息

美团DSP是美团在线数字营销的核心业务方向,加入我们,你可以亲身参与打造和优化一个可触达亿级用户的营销平台,并引导他们的生活娱乐决策。同时,你也会直面如何精准,高效,低成本营销的挑战,也有机会接触到计算广告领域前沿的AI算法体系和大数据解决方案。你会和美团营销技术团队一起推动建立流量运营生态,支持酒旅、外卖、到店、打车、金融等业务继续快速的发展。

我们诚邀有激情、有想法、有经验、有能力的你,和我们一起并肩奋斗!参与美团点评站外广告投放体系的实现,基于大规模用户行为数据,优化在线广告算法,提升DAU,ROI, 提高在线广告的相关度、投放效果。欢迎邮件wuhongjie#meituan.com咨询。

参考文献

  • [^1]: Cheng, H. T., Koc, L., Harmsen, J., Shaked, T., Chandra, T., Aradhye, H., … & Anil, R. (2016, September). Wide & deep learning for recommender systems. In Proceedings of the 1st Workshop on Deep Learning for Recommender Systems (pp. 7-10). ACM.
  • [^2]: Wang, R., Fu, B., Fu, G., & Wang, M. (2017, August). Deep & cross network for ad click predictions. In Proceedings of the ADKDD’17 (p. 12). ACM.
  • [^3]: Guo, H., Tang, R., Ye, Y., Li, Z., & He, X. (2017). Deepfm: a factorization-machine based neural network for ctr prediction. arXiv preprint arXiv:1703.04247.
  • [^4]: Lian, J., Zhou, X., Zhang, F., Chen, Z., Xie, X., & Sun, G. (2018). xDeepFM: Combining Explicit and Implicit Feature Interactions for Recommender Systems. arXiv preprint arXiv:1803.05170.
  • [^5]: Abadi, M., Barham, P., Chen, J., Chen, Z., Davis, A., Dean, J., … & Kudlur, M. (2016, November). TensorFlow: a system for large-scale machine learning. In OSDI (Vol. 16, pp. 265-283).
  • [^6]: Goyal, P., Dollár, P., Girshick, R., Noordhuis, P., Wesolowski, L., Kyrola, A., … & He, K. (2017). Accurate, large minibatch SGD: training imagenet in 1 hour. arXiv preprint arXiv:1706.02677.
  • [^7]: Neill, R., Drebes, A., Pop, A. (2018). Performance Analysis of Just-in-Time Compilation for Training TensorFlow Multi-Layer Perceptrons.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/479005.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python库Camelot从pdf抽取表格数据以及python库camelot安装及使用中的一些注意事项

一、python库camelot安装及使用中的一些注意事项 1&#xff09;camelot方法有两种解析模式&#xff1a;流解析&#xff08;stream&#xff09;、格子解析&#xff08;lattice&#xff09;&#xff0c;其中格子解析能够保留表格完整的样式&#xff0c;对于复杂表格来说要优于流…

LeetCode 561. 数组拆分 I

1. 题目 给定长度为 2n 的数组, 你的任务是将这些数分成 n 对, 例如 (a1, b1), (a2, b2), …, (an, bn) &#xff0c;使得从1 到 n 的 min(ai, bi) 总和最大。 示例 1:输入: [1,4,3,2]输出: 4 解释: n 等于 2, 最大总和为 4 min(1, 2) min(3, 4).来源&#xff1a;力扣&…

论文浅尝 - 计算机工程 | 知识图谱可视化查询技术综述

本文转载自公众号&#xff1a;计算机工程。知识图谱可视化查询技术综述王鑫, 傅强, 王林, 徐大为, 王昊奋知识图谱作为符号主义发展的产物&#xff0c;是人工智能技术和系统中的重要组成部分&#xff0c;其在百科知识、生物信息、社交网络以及网络安全等领域被广泛运用。知识图…

用VS Code直接浏览GitHub代码 | 12.1K星

文 | 金磊(发自凹非寺)源 | 量子位“看GitHub代码”这件事上&#xff0c;还在网页上点点点&#xff1f;用开发工具看代码&#xff0c;不香吗&#xff1f;于是&#xff0c;它来了&#xff0c;它来了——可以直接用VS Code方式打开GitHub代码的工具。而且在短短几天时间里&#x…

APPKIT打造稳定、灵活、高效的运营配置平台

一、背景 美团App、大众点评App都是重运营的应用。对于App里运营资源、基础配置&#xff0c;需要根据城市、版本、平台、渠道等不同的维度进行运营管理。如何在版本快速迭代过程中&#xff0c;保持运营资源能够被高效、稳定和灵活地配置&#xff0c;是我们团队面临的重大考验。…

Android官方开发文档Training系列课程中文版:通知用户之大视图通知

原文地址&#xff1a;http://android.xsoftlab.net/training/notify-user/expanded.html#big-view 通知在通知栏中以两种风格呈现&#xff1a;正常视图与大视图。只有在通知展开的时候才会展示大视图。这只有在通知处于通知栏顶部时或者用户点击了通知时才会出现。 大视图于A…

论文浅尝-WSDM | Stepwise Reasoning for Multi-Relation QA

论文笔记整理&#xff1a;谭亦鸣&#xff0c;东南大学博士。来源&#xff1a;WSDM ’20链接&#xff1a;https://dl.acm.org/doi/pdf/10.1145/3336191.33718121.介绍知识图谱问答旨在利用知识图谱的结构化信息回答以自然语言提出的问题。当面对多关系问题时&#xff0c;现有基于…

从零搭建基于知识图谱的问答系统(以医疗行业为例)

清华大学人工智能研究院院长张钹院士2020年发表署名文章&#xff0c;首次全面阐述第三代人工智能的理念&#xff0c;提出第三代人工智能的发展路径是融合第一代的知识驱动和第二代的数据驱动的人工智能。基于知识图谱的推理&#xff0c;恰恰体现了第三代人工智能的特点。知识图…

Android官方开发文档Training系列课程中文版:通知用户之在通知中显示进度

原文地址&#xff1a;http://android.xsoftlab.net/training/notify-user/display-progress.html#FixedProgress 通知中包含了一个进度指示器&#xff0c;用来向用户展示一项正在进行中的工作状态。如果你可以确保任务会花费多长时间&#xff0c;并且可以在任何时候得知它完成…

LeetCode 109. 有序链表转换二叉搜索树(快慢指针+递归)

1. 题目 给定一个单链表&#xff0c;其中的元素按升序排序&#xff0c;将其转换为高度平衡的二叉搜索树。 本题中&#xff0c;一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1。 来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 链…

beeshell —— 开源的 React Native 组件库

背景 beeshell 是一个 React Native 应用的基础组件库&#xff0c;基于 0.53.3 版本&#xff0c;提供一整套开箱即用的高质量组件&#xff0c;包含 JavaScript&#xff08;以下简称 JS&#xff09;组件和复合组件&#xff08;包含 Native 代码&#xff09;&#xff0c;涉及前端…

论文浅尝 - ACL2020 | 用于链接预测的开放知识图谱嵌入

本文转载自公众号&#xff1a;PaperWeekly。 作者&#xff1a;舒意恒&#xff0c;南京大学硕士&#xff0c;研究方向&#xff1a;知识图谱。当前大量的知识图谱都是通过文本直接构建的。由于当前的知识图谱构建方法的局限性&#xff0c;其中难免包含对同一实体或关系…

论文审稿人可以下岗了?CMU都做出论文审稿机器人了!

文 | Sheryc_王苏机器学习真是越来越火了&#xff0c;这从各大会议逐年增加的投稿量上就可见一斑&#xff1a;AAAI21收到了9034篇投稿&#xff0c;NeurIPS20收到了9467篇投稿&#xff0c;一篇投稿至少要经过3位审稿人同行评议&#xff0c;耗费的人力可想而知。那么问题来了&…

Android官方开发文档Training系列课程中文版:多样屏幕之支持不同的屏幕尺寸

原文地址&#xff1a;http://android.xsoftlab.net/training/multiscreen/index.html 引言 Android运行于数以百计不同尺寸的设备上。范围小到手持移动电话&#xff0c;大到电视设备。因此&#xff0c;在设计APP时应当兼顾到尽可能多的屏幕尺寸。这样才能照顾到较多的潜在用户…

阿里云开源EasyTransfer:业界首个面向NLP场景深度迁移学习框架

阿里云开源EasyTransfer&#xff1a;业界首个面向NLP场景深度迁移学习框架 原文链接&#xff1a;https://zhuanlan.zhihu.com/p/267392773 阿里云正式开源了深度迁移学习框架 EasyTransfer&#xff0c;本文详细介绍了 EasyTransfer 框架的核心功能。机器之心发布&#xff0c;机…

LeetCode 559. N叉树的最大深度

文章目录1. 题目2. 解题2.1 递归2.2 按层queue遍历1. 题目 给定一个 N 叉树&#xff0c;找到其最大深度。 最大深度是指从根节点到最远叶子节点的最长路径上的节点总数。 2. 解题 2.1 递归 class Solution { public:int maxDepth(Node* root) {if(root NULL)return 0;int …

全链路压测平台(Quake)在美团中的实践

背景 在美团的价值观中&#xff0c;“以客户为中心”被放在一个非常重要的位置&#xff0c;所以我们对服务出现故障越来越不能容忍。特别是目前公司业务正在高速增长阶段&#xff0c;每一次故障对公司来说都是一笔非常不小的损失。而整个IT基础设施非常复杂&#xff0c;包括网络…

陈华钧等 | OpenKG区块链:构建可信开放的联邦知识图谱平台

文章导读本文介绍了OpenKG在区块链方向的一些实践和尝试。经过一年努力&#xff0c;OpenKG初步完成了底层区块链平台测试&#xff0c;以及OpenKG数据集、工具集和Openbase细粒度知识众包的上链测试工作。在这个测试平台中&#xff0c;已包含1033位确权的知识贡献者。上链测试两…

ICLR'21 | 一个二值化词向量模型,是怎么跟果蝇搭上关系的?

文&#xff5c;苏剑林&#xff08;追一科技&#xff09; 编 | 小轶可能有些读者最近会留意到ICLR 2021的论文Can a Fruit Fly Learn Word Embeddings?&#xff0c;文中写到它是基于仿生思想&#xff08;仿果蝇的嗅觉回路&#xff09;做出来的一个二值化词向量模型。其实论文的…

如何解决NLP分类任务的11个关键问题:类别不平衡低耗时计算小样本鲁棒性测试检验长文本分类 JayLou娄杰

原文链接&#xff1a;https://zhuanlan.zhihu.com/p/183852900 欢迎关注《高能AI》公众号&#xff5e;声明&#xff1a;文中观点谨代表笔者个人立场&#xff0c;盲目搬运有风险&#xff5e;在2020这个时间节点&#xff0c;对于NLP分类任务&#xff0c;我们的关注重点早已不再是…