女主宣言

该文章出自于ADDOPS团队,是关于如何在K8S上玩转tensorflow的主题,该文章深入浅出的给我们介绍了当前tensorflow的现状和架构特点等,然后介绍了让tensorflow如何基于k8s快速落地,让大家都能简单的上手tensorflow,整体文章脉络清晰,内容适度,所以希望能给大家带来启发。

PS:丰富的一线技术、多元化的表现形式,尽在“HULK一线技术杂谈”,点关注哦!

前言

Tensorflow作为深度学习领域逐渐成熟的项目,以其支持多种开发语言,支持多种异构平台,提供强大的算法模型,被越来越多的开发者使用。但在使用的过程中,尤其是GPU集群的时候,我们或多或少将面临以下问题:

  • 资源隔离。Tensorflow(以下简称tf)中并没有租户的概念,何如在集群中建立租户的概念,做到资源的有效隔离成为比较重要的问题;

  • 缺乏GPU调度。tf通过指定GPU的编号来实现GPU的调度,这样容易造成集群的GPU负载不均衡;

  • 进程遗留问题。tf的分布式模式ps服务器会出现tf进程遗留问题;

  • 训练的数据分发以及训练模型保存,都需要人工介入;

  • 训练日志保存、查看不方便;

因此,我们需要一个集群调度和管理系统,可以解决GPU调度、资源隔离、统一的作业管理和跟踪等问题。

目前,社区中有多种开源项目可以解决类似的问题,比如yarn,kubernetes。yarn是hadoop生态中的资源管理系统,而kubernetes(以下简称k8s)作为Google开源的容器集群管理系统,在tf1.6版本加入GPU管理后,已经成为很好的tf任务的统一调度和管理系统。

下文是我们公司在tensorflow on kubernetes方面的实践经验。

设计目标

我们将tensorflow引入k8s,可以利用其本身的机制解决资源隔离,GPU调度以及进程遗留的问题。除此之外,我们还需要面临下面问题的挑战:

  • 支持单机和分布式的tensorflow任务;

  • 分布式的tf程序不再需要手动配置clusterspec信息,只需要指定worker和ps的数目,能自动生成clusterspec信息;

  • 训练数据、训练模型以及日志不会因为容器销毁而丢失,可以统一保存;

为了解决上面的问题,我们开发了tensorflow on kubernetes系统。

架构

tensorflow on kubernetes包含三个主要的部分,分别是client、task和autospec模块。client模块负责接收用户创建任务的请求,并将任务发送给task模块。task模块根据任务的类型(单机模式和分布式模式)来确定接下来的流程:

如果type选择的是single(单机模式),对应的是tf中的单机任务,则按照按照用户提交的配额来启动container并完成最终的任务;

如果type选择的是distribute(分布式模式),对应的是tf的分布式任务,则按照分布式模式来执行任务。需要注意的是,在分布式模式中会涉及到生成clusterspec信息,autospec模块负责自动生成clusterspec信息,减少人工干预。

下面是tensorflow on kubernetes的架构图:

接下来将对三个模块进行重点介绍。

client模块

tshell

在容器中执行任务的时候,我们可以通过三种方式获取执行任务的代码和训练需要的数据:

  • 将代码和数据做成新的镜像;

  • 将代码和数据通过卷的形式挂载到容器中;

  • 从存储系统中获取代码和数据;

前两种方式不太适合用户经常修改代码的场景,最后一种场景可以解决修改代码的问题,但是它也有下拉代码和数据需要时间的缺点。综合考虑后,我们采取第三种方式。

我们做了一个tshell客户端,方便用户将代码和程序进行打包和上传。比如给自己的任务起名字叫cifar10-multigpu,将代码打包放到code下面,将训练数据放到data下面。

最后打包成cifar10-multigpu.tar.gz并上传到s3后,就可以提交任务。

提交任务

在提交任务的时候,需要指定提前预估一下执行任务需要的配额:cpu核数、内存大小以及gpu个数(默认不提供),当然也可以按照我们提供的初始配额来调度任务。

比如,按照下面格式来将配额信息、s3地址信息以及执行模式填好后,执行send_task.py我们就可以提交一次任务。

task模块

单机模式

对于单机模式,task模块的任务比较简单,直接调用python的client接口启动container。container里面主要做了两件事情,initcontainer负责从s3中下载事先上传好的文件,container负责启动tf任务,最后将日志和模型文件上传到s3里,完成一次tf单机任务。

分布式模式

对于分布式模式,情况要稍微复杂些。下面先简单介绍一下tensforlow分布式框架。tensorflow的分布式并行基于gRPC框架,client负责建立Session,将计算图的任务下发到TF cluster上。

TF cluster通过tf.train.ClusterSpec函数建立一个cluster,每个cluster包含若干个job。 job由好多个task组成,task分为两种,一种是PS(Parameter server),即参数服务器,用来保存共享的参数,还有一种是worker,负责计算任务。

我们在执行分布式任务的时候,需要指定clusterspec信息,如下面的任务,执行该任务需要一个ps和两个worker,我们先需要手动配置ps和worker,才能开始任务。这样必然会带来麻烦。如何解决clusterspec,成为了一个必须要解决的问题。

所以在提交分布式任务的时候,task需要autospec模块的帮助,收集container的ip后,才能真正启动任务。所以分布式模式要做两件事情:

  • 按照yaml文件启动container;

  • 通知am模块收集此次任务container的信息后生成clusterspec;

Autospec模块

tf分布式模式的node按照角色分为ps(负责收集参数信息)和worker,ps负责收集参数信息,worker执行任务,并定期将参数发送给worker。

要执行分布式任务,涉及到生成clusterspec信息,模型的情况下,clusterspec信息是通过手动配置,这种方式比较麻烦,而且不能实现自动化,我们引入autospec模型很好的解决此类问题。

Autospec模块只有一个用途,就是在执行分布式任务时,从container中收集ip和port信息后,生成clusterspec,发送给相应的container。下面是autospec模块的工作流程图:

Container设计

tf任务比较符合k8s中kind为job的任务,每次执行完成以后这个容器会被销毁。我们利用了此特征,将container都设置为job类型。

k8s中设计了一种hook:poststart负责在容器启动之前做一些初始化的工作,而prestop负责在容器销毁之前做一些备份之类的工作。

我们利用了此特点,在poststart做一些数据获取的工作,而在prestop阶段负责将训练产生的模型和日志进行保存。我们接下来分单机和分布式两种模式来说明Container的设计思想。

总结

至此,我们已经介绍了tensorflow on kubernetes的主要流程。还有许多需要完善的地方,比如:web端提交任务以及查看运行状况和作业的日志;支持GPU的亲和性等等,总之,这只是我们前期的探索,后面还有许多东西需要完善。

扫描下方二维码了解更多内容

如何在K8S上玩转TensorFlow ?相关推荐

  1. xcode 可以打开xmind_如何在 iPad 上玩转 XMind?

    懒人目录 用文件夹做好笔记分类 用主题链接&画布提高导图的可读性 利用分屏功能高效记录笔记 利用「搜索功能」快速定位内容 从捷径中快速创建导图 快捷键和手势 ​ iPad 越来越成为很多的人的 ...

  2. 如何在K8S上备份和恢复MySQL

    如何在K8S上备份和恢复MySQL 越来越多的生产系统和关键应用运行在K8S上.在生产系统运行有状态应用,并不是一件容易的事情,它需要我们仔细的计划并部署.我们之前有一篇文章专门介绍如何在K8S上运行 ...

  3. 如何在电脑上玩香肠派对_如何在Chromecast上玩多人派对游戏

    如何在电脑上玩香肠派对 So you have a Chromecast. Did you know that you can do more than just stream movies, mus ...

  4. xbox虚拟服务器,Win8大百科18期:如何在PC上玩Xbox游戏

    1Xbox社交 为了给游戏玩家带来更多的游戏体验,微软此次直接将当家游戏平台Xbox直接植入了Win8系统中.这样用户就可以在PC上直接进行Xbox游戏,并通过帐号共享成就和进行社交活动.本期的Win ...

  5. 如何在Android上玩经典复古游戏

    Thanks to the endless gifts that Moore's Law continues to bestow upon us, cramming many of your favo ...

  6. 有状态软件如何在 k8s 上快速扩容甚至自动扩容

    概述 在传统的虚机/物理机环境里, 如果我们想要对一个有状态应用扩容, 我们需要做哪些步骤? 申请虚机/物理机 安装依赖 下载安装包 按规范配置主机名, hosts 配置网络: 包括域名, DNS, ...

  7. 如何在Mac上玩安卓手游(支持各大安卓手机游戏数据同步)

    很多小伙伴由于手机的型号不同,各大厂商的游戏端不同,导致在助手上下载的游戏不支持自己原来手机的里游戏资料.下面跟随小编来帮助你解决这个烦恼 首先我们需要借助腾讯手游助手 for mac版 腾讯手游助手 ...

  8. 如何在windows上玩转redis的最新特性?

    想要了解redis的最新特性,可是windows下的可以安装的版本最高为3.2,想要验证redis的诸如stream特性的话,就无能为力了. 解决方法之一在windows上安装虚拟机,然后再虚拟机上安 ...

  9. 如何在Linux上玩游戏

    文章目录 前言 一.在软件管家 安装 小游戏 二.大型单机游戏Steam 三.网上下载打包程序 总结 最后 前言 博主机器: Ubuntu 18.04 amd64位 集显 最近要下载的东西很多,无聊的 ...

最新文章

  1. 如何查看Linux系统下程序运行时使用的库?
  2. python json
  3. Webform--LinQ 增、删、改、查
  4. RCC—使用 HSE/HIS 配置时钟
  5. 计算机应用基础中专教材pdf,中等职业教育通用教材-计算机应用基础.pdf
  6. SAP C4C OData服务的filter,客户端分页和排序的使用方式
  7. 模型预测控制_模型预测控制(MPC)算法之一MAC算法
  8. html5字体转换,图片转字符画html5版
  9. python3 多线程爬去mzitu图片
  10. Statement cancelled due to timeout or client request报错
  11. rap开发与rcp开发_使用RAP将RCP应用程序转换为Web应用程序
  12. Linux 使用系统调用进行文件读写
  13. 绝地求生一直崩溃的异常解决
  14. 大数据基础知识(一):认识大数据
  15. 学习Oracle的三种境界
  16. 《Django By Example》读书笔记 01
  17. 【读书笔记】小米生态链战地笔记-精准产品定义
  18. SharePoint ULS Log Viewer 日志查看器
  19. Flink学习1-基础概念
  20. 东财16秋计算机试题,2020秋东财《计算机应用基础》单元作业三

热门文章

  1. Python学习笔记之函数(二)
  2. pythonifelse表达式_Python if else简洁写法,列表推导式,三目运算符写法
  3. 利用Python定时给女友微信发送今日天气情况,异地恋维护感情神器
  4. 阿里云数据中台训练营第一期圆满落幕
  5. OSGL 工具库 - 类型转换的艺术
  6. GMIC来了 HTC VIVE细化VR梦
  7. TIOBE开发语言排行榜
  8. 转: ImageMagick 命令行的图片处理工具(客户端与服务器均可用)
  9. SQL Server命令行
  10. 今日奇葩事件,一位不懂技术,却来管理技术团队的领导