微服务化分布式机器学习系统概述

背景

一直以来,我们都做着“十项全能”的大型单体应用程序。一种能将产品快速推向市场的很好的方式,刚开始我们也只需要让第一个应用上线。部署一个大应用总是比构建和部署多个小块要容易得多,而且我们总以为可以回头改进它。

然而,这样的应用开发将导致“爆炸式”的工作量和“一次归零”的风险。我们每隔数月的工作后必须再次部署整个应用,并且增量变更将因为构建/测试/部署/发布周期等的复杂特性而来来回回折腾很长时间。尤其是在部署新版本后发现一个严重的 Bug,不得不回滚整个应用,那么这就不是仅仅损失多少钱的问题了。相对于比较小的组件来说,将这样的一个大型应用部署到云上并弹性扩展它们也并不容易。

事情到这里还没有完:某天运维跑来提了点很合理的要求,比如说:简单点的加个黑名单,复杂点的要做个ABtest:将来自iPhone的用户流量导1%到2.0新版本。

其实我们真正需要关心的并不是服务器、交换机、负载均衡器、监控与部署,而是“服务”本身。我们希望有一个平台(或工具)能帮我自动完成分布式部署,并且持续监控它们。当发现某台主机宕机或者某个服务实例故障的时候,平台能够自我修复,从而确保在任何时间点,正在运行的服务实例的数量都是我所预期的。这样一来,我的团队只需关注服务开发本身,而无需再为头疼的基础设施和运维监控的事情而烦恼了。在Kubernetes出现之前,没有一个公开的平台声称实现了上面的“愿景”。什么是Kubernetes?私以为Kubernetes是一套以TCP /IP 方式进行通信的分布式微服务系统。借助于Kubernetes的优势,即使一个小的开发团队,也能在系统架构和运维能力上迅速接近一个大的研发团队的水平。

微服务

微服务是运行在自己的进程中的可独立部署的服务套件。他们通常使用HTTP 资源进行通信,每个服务通常负责整个应用中的某一个单一的领域。比如电子商务,你可以有一个商品条目服务,一个审核服务和一个评价服务,每个都只专注一个领域。

用这种方法来帮助分布式团队各自贡献各种服务,而不需要在每个服务变更时去构建/测试/部署整个应用,而且调试也无需进入彼此的代码。将服务部署到云上也更容易,因为独立的服务就能按需进行自动弹性扩展。

用这种方法让使用不同语言编写的服务也成为可能,这样我们就可以让Java/C++ 服务执行更多的计算密集型工作,让 Rails / Node.js 服务更多来支持前端应用等等。

微服务包含以下功能点:

服务注册

服务发现

服务路由,灰度发布,A/B测试

日志处理

服务监控,性能监控

断路器,限流

服务备份、恢复

认证与权限

动态配置

应用拓扑与编排

服务伸缩

服务通信加密

分布式跟踪

这里就有一个很严肃的问题, 给每个业务程序的开发人员:你到底想往你的业务程序里面塞多少管理和运维的功能? 就算你hold的住技术和时间,你有能力一个一个的满足各种运维和管理的需求吗?当你发现你开始疲于响应各种非功能性的需求时就该开始反省了:我们开发的是业务程序,它的核心价值在业务逻辑的处理和实现,将如此之多的时间精力花费在这些非业务功能上,这真的合理吗? 而且即使是在实现层面,微服务实施时,最重要的是如何划分微服务,如何制定接口协议,你该如何分配你有限的时间和资源?事实上我们只需要一个工具而已!Istio 一次满足你所有愿望!

Istio

Istio是搭建在Kubernetes集群之上的微服务框架。Istio能够保护应用不被片状网络和雪崩式故障所影响。可以通过故障注入等特性在系统中注入网络延迟及网络隔离等故障,系统性地检验应用的灵活性。如果你希望将某个版本的服务迁移至另一个版本,可通过基于权重的流量路由方式,逐渐将流量导向新版本的服务,以此降低风险。更好的办法是,在进行实际的切换之前,你可以模拟出真实的流量指向新的部署服务的行为,以观察它的运行情况。此外,你还可以通过 Istio Gateway 对流入与流出的流量进行负载均衡,并对流量应用各种路由规则,例如超时、重试以及熔断等等,以减少潜在的故障,并从故障中恢复。可是,Istio再牛逼,跟机器学习有什么关系?答案是,基础决定上层建筑,没有稳固的底层服务支撑,本就复杂的机器学习流程只会雪上加霜,机器学习系统只能是镜中花而已。

Kubeflow

Kubeflow基于Kubernetes的机器学习流程工具,它提供了一套最精简的软件开发包,用于开发,训练和部署 ML。在机器学习的生命周期中,大家所了解的Tensorflow、Pytorch、Caffee等工具仅用来做模型训练,占整个机器学习生命周期中很小一部分。至于数据如何准备?模型训练好了如何部署?如何上云?如何上规模Scale?需要Kubeflow来解决。它提供了在生产系统中简易化大规模部署机器学习模型的功能:

·简单,可重复,可移植的部署(笔记本 ML 装备 训练集群 生产集群)

·利用微服务提供松耦合的部署和管理

·按需扩大规模

架构说明

  系统主要功能模块包括:公共库、算法插件(中文分词、预处理、特征选择、分类器)、Istio微服务框架(微服务核加载、HTTP API)、应用服务+WEB、管理维护、服务部署等。

  公共库:包括基础功能,例如ci/cd、abtest、日志、配置等。

Istio微服务框架:主要统一微服务接口,解耦与业务的关系,统一RESTful API。

算法插件:按照微服务接口定义,关注自身的业务实现。实现中文分词、预处理、特征选择、分类器的独立功能。

  管理维护:主要包括Docker镜像化制作、发布,Kubernetes、Docker、微服务资源监控,资源的编排功能。

  应用WEB:处理WEB分类任务的请求、调度和生命周期管理,显示任务运行的状态和机器学习的结果UI显示,还包括资源的监控显示。

服务部署:机器学习任务的协作和交互式训练、部署model服务和查看训练报告。

构建一套生产环境下的机器学习系统需要涉及各种组件,通常需要使用混合供应商并结合自研的解决方案。使用相对复杂的配置来连接和管理这些服务,给学习机器学习带来了巨大障碍。工程师通常会花费大量时间手动部署,然后才能测试一个模型。在简化配置和减轻生产化机器学习工作负载上,微服务框架Istio+Kubeflow方案是最优选择。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20181125A0SDPH00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券