方案二:实时获取每一台机器的状态,把任务发给负载最轻的 。
这一方案比较直观,但问题在于在分布式系统中没有真正的“实时”,信息从一台机器传递到另一台机器一定会花费时间,而在这一时间中,机器状态就可以发生了改变 。比如在某一瞬间,某一台 Worker 机器是最空闲的,多台负责任务分发的 Master 机器都感知到了,于是都把任务分配给这台最空闲的 Worker,这台最空闲的 Worker 瞬间变成了最忙的,这就是负载均衡中著名的潮汐效应 。
方案三:维护一个全局唯一的任务队列,所有负责任务分发的 Master 都把任务发送到队列中,所有 Worker 都从队列中取任务 。
这一方案中,任务队列本身就可能成为一个单点瓶颈,难以横向扩展 。
动态负载均衡难以完美的根本原因是信息的传递需要时间,当一个状态被观测到后,这个状态一定已经“过去”了 。YouTube 上有一个视频,推荐给大家,“Load Balancing is Impossible” https://www.youtube.com/watch?v=kpvbOzHUakA 。
关于动态负载均衡算法,Power of 2 Choices 算法是随机选择两个 worker,将任务分配给更空闲的那个 。这个算法是我们目前使用的动态均衡算法的基础 。但是 Power of 2 Choices 算法存在两大问题:首先,每次分配任务之前都需要去查询下 Worker 的空闲状态,多了一次 RTT;另外,有可能随机选择的两个 worker 刚好都很忙 。为了解决这些问题,我们进行了改进 。
文章插图
改进后的算法是 Joint-Idle-Queue 。
文章插图
我们在 Master 机器上增加了两个部件,Idle-Queue 和 Amnesia 。Idle-Queue 用来记录目前有哪些 Worker 处于空闲状态 。Amnesia 记录在最近一段时间内有哪些 Worker 给自己发送过心跳包,如果某个 Worker 长期没有发送过心跳包,那么 Amnesia 就会逐渐将其遗忘掉 。每一个 Worker 周期性上报自己是否空闲,空闲的 Worker 选择一个 Master 上报自己的 IdIeness,并且报告自己可以处理的数量 。Worker 在选择 Master 时也是用到 Power of 2 Choices 算法,对其他的 Master,Worker 上报心跳包 。
有新的任务到达时,Master 从 Idle-Queue 里随机 pick 两个,选择历史 latency 更低的 。如果 Idle-Queue 是空的,就会去看 Amnesia 。从 Amnesia 中随机 pick 两个,选择历史 latency 更低的 。
在实际的效果上,采用该算法,可以把 P99/P50 压缩到 1.5 倍,相比 Random 算法有 10 倍的提升 。
五、总结在模型服务化的实践中,我们遇到了三个方面的挑战:
首先是对于大量的微服务,如何进行管理,如何优化开发、上线和部署的流程,我们的解决方案是尽量自动化,抽取重复流程,将其做成自动化流水线和程序 。
第二是模型性能优化方面,如何让深度学习模型微服务运行得更加高效,我们的解决方案是从模型的实际需求出发,对于比较稳定、流量较大的服务进行定制化的优化,对于实验型的服务采用 PyInter,直接用 Python 脚本上线服务,也能达到 C++ 的性能 。
第三是任务调度问题,如何实现动态负载均衡,我们的解决方案是在 Power of 2 Choices 的基础上,开发了 JIQ 算法,大幅缓解了服务耗时的长尾问题 。
【微信 NLP 算法微服务治理】
推荐阅读
- 如何搭建一个智能客服:从NLP到多轮对话与多流程设计
- 抖音直播间小风车怎样跳转微信?如何实现跳转微信技术!
- 微信录音功能,90%的人都不知道!
- 微信、支付宝、淘宝居然都有隐藏功能!太好用了!
- 欠钱不还,微信钱包会被冻结吗?
- 怎样找回被自己误删的微信群?教你3招,只要没有退出就能找回
- 微信零钱通收益时间?微信的零钱通收益是怎么算的?
- 相亲后怎么在微信上和女方聊天?必备这些高情商聊天技巧
- 怎么要女生微信不尴尬?分享三个高情商套路
- 别人介绍的对象第一次怎么聊微信?要会这些聊天技巧