Tensorflow作为深度学习领域逐渐成熟的项目,以其支持多种开发语言,支持多种异构平台,提供强大的算法模型,被越来越多的开发者使用。但在使用的过程中,尤其是GPU集群的时候,我们或多或少将面临以下问题:资源隔离。Tensorflow(以下简称tf)中并没有租户的概念,何如在集群中建立租户的概念,做到资源的有效隔离成为比较重要的问题;缺乏GPU调度。
接下来将对三个模块进行重点介绍。在容器中执行任务的时候,我们可以通过三种方式获取执行任务的代码和训练需要的数据:将代码和数据做成新的镜像;将代码和数据通过卷的形式挂载到容器中;从存储系统中获取代码和数据;前两种方式不太适合用户经常修改代码的场景,最后一种场景可以解决修改代码的问题,但是它也有下拉代码和数据需要时间的缺点。综合考虑后,我们采取第三种方式。
最后打包成cifar10-multigpu.tar.gz并上传到s3后,就可以提交任务。在提交任务的时候,需要指定提前预估一下执行任务需要的配额:cpu核数、内存大小以及gpu个数(默认不提供),当然也可以按照我们提供的初始配额来调度任务。比如,按照下面格式来将配额信息、s3地址信息以及执行模式填好后,执行send_task.py我们就可以提交一次任务。
对于单机模式,task模块的任务比较简单,直接调用python的client接口启动container。container里面主要做了两件事情,initcontainer负责从s3中下载事先上传好的文件,container负责启动tf任务,最后将日志和模型文件上传到s3里,完成一次tf单机任务。对于分布式模式,情况要稍微复杂些。下面先简单介绍一下tensforlow分布式框架。
我们在执行分布式任务的时候,需要指定clusterspec信息,如下面的任务,执行该任务需要一个ps和两个worker,我们先需要手动配置ps和worker,才能开始任务。这样必然会带来麻烦。如何解决clusterspec,成为了一个必须要解决的问题。
所以在提交分布式任务的时候,task需要autospec模块的帮助,收集container的ip后,才能真正启动任务。
领取专属 10元无门槛券
私享最新 技术干货