vivo基于Kubernetes构建企业级TaaS平台实践

服务器

浏览数:389

2020-6-16

Author: xidianwangtao@gmail.com

vivo TaaS架构

关于如何将Kubernetes和TensorFlow整合起来的Topic,以及我们的CaaS技术栈的介绍,请参考过往的两篇文章,在这里我不再赘述。

下面是当前我们的TaaS平台架构图:

想多说以下两点:

  • 有的同学问我,我们是如何将HDFS的训练数据迁移到Glusterfs的,在这统一回复:目前基于HDFS作为后端分布式存储的TaaS能满足算法团队的需求,所以最终我们也没有做这个数据迁移工作。

  • 由于这个方案中,每个TensorFlow训练都会对应一个Kubernetes NameSpace,每个TensorFlow Task都会对应一个Headless Service,各个Task通过KubeDNS进行发现和域名解析。在我们的环境中,当一个TensorFlow训练的Task数超过600时,偶尔会出现Headless Service Name域名解析失败的情况,导致分布式TensorFlow集群内部的Session连接建立失败,最终无法成功启动这次Between-Graph训练。我们通过Kubernetes的孵化项目cluster-proportional-autoscaler来根据集群Node数量对KubeDNS副本数进行弹性伸缩来解决这一问题的。下面是我们使用的kube-dns-autoscaler配置:

    	kind: ConfigMap
    	apiVersion: v1
    	metadata:
    	  name: kube-dns-autoscaler
    	  namespace: kube-system
    	data:
    	  linear: |
    	    {
    	    "nodesPerReplica": 10,
    	    "min": 1,
    	    "max": 50,
    	    "preventSinglePointFailure": true
    	    } 
    

    关于这个问题的深入探讨,请参考我的博文cluster-proportional-autoscaler源码分析及如何解决KubeDNS性能瓶颈。当然更好的解决办法其实是应该是对cluster-proportional-autoscaler进行二次开发,根据集群中Service Number来对KubeDNS进行弹性伸缩。因为在我们AI的场景下,一台高配的服务器能运行的Pods数可以多达80个,正常情况不会超过30个,这么大的弹性范围,无疑使用Service Number来对KubeDNS进行弹性伸缩是最好的选择。

vivo TaaS介绍

我们TaaS平台目前支持训练脚本的托管、训练项目的创建和管理、TensorBoard服务的一键创建能力,虽然支持一键创建TensorFlow Serving服务帮助模型上线,但是因为还没做TensorFlow Serving的Load Balance,所以这个特性还没正式上线,目前正在开发中,以后有机会再跟大家分享。

算法托管

用户登录TaaS Portal, 上传本地的算法脚本到TaaS平台, 提供一系列算法脚本管理的能力,这个没多少可说的。

每个算法,我们约定使用run.sh文件启动训练。

训练项目

接下来,用户根据算法脚本的路径创建对应的训练项目。

训练项目分两种类型:普通训练和定时训练。定时训练顾名思义,就是通过定时器控制训练实例,每隔一定周期启动一次训练,并且支持启动下一次训练前是否强行杀死上一次的训练。还可以设置该次训练最长允许的时长,超时强行杀死本次训练。

创建完项目后,接下来就是启动训练了,填入worker数和ps数,选择对应的resource.requests,提交训练请求。

然后请求转到Kubernetes中,创建对应的Namespace, workers job, ps deployment及其对应的Headless Services,imagePullSecret等Object,TaaS生成对应的训练记录。

每个训练记录都对应一个Kubernetes Namespace,可以查看训练详情、各个task的日志和对应的Grafana监控面板。

TensorBoard服务

TensorBoard通过加载log目录下的summary data,为模型和训练提供了web视图,可以帮助算法工程师定位算法的瓶颈。vivo TaaS平台支持一键创建TensorBoard服务。

请求会转到Kubernetes创建对应的TensorBoard Deployment等Object,TaaS页面提供该TensorBoard服务的访问入口。

点击“模型展示”,即可跳转到对应的TensorBoard Web视图。

vivo TaaS后续规划

目前我们的TaaS平台仍然处于早期阶段,还有很多工作需要去做:

  • 基于任务优先级进行线上线下混合部署、资源抢占式调度;
  • 训练和TensorFlow Serving物理资源资源共享并进行资源池管理;
  • 为训练添加自定义命令行参数;
  • 大规模TensorFlow训练的调度优化;
  • 调度时考虑服务器的网络IO资源;
  • 训练数据和模型的管理;
  • 基于LVS为TensorFlow Serving提供自动化LB配置;
  • 基于gpu的调度和训练;
  • 集群资源使用情况的动态监控,并对新的TensorFlow集群创建请求做更有意义的资源检查;
  • 如果需要,使用Glusterfs提高训练数据的Read IO;
  • …(事情总是做不完的)

总结

这里对vivo TaaS平台做了简单介绍,在这背后摸索的过程中我们解决了很多问题,但是未来的路很长,随着集群规模的快速膨胀,我们要做的工作会越来越多。TaaS平台只是我们Kubernetes在vivo落地的一个方向,DevOps、ESaaS等平台的开发也面临很多挑战,如果你也有志于深耕容器云相关技术,欢迎加入我们团队。

广告:更多干货欢迎微信关注“vivo互联网技术”公众号

作者:WaltonWang