将上述计算任务迁移到volcano平台上进行测试。
Volcano支持Multi-podjobs,拓展“tasks”字段,tasks下可以定义多个pod描述,其中“replicas”字段描述task将要生成的pod数量,“name”描述task名称,pod名称将根据task名称生成。Template字段与kubernetes“podTemplate”一致。ctr的demo中含有两个task:“pserver”和“trainer”,每个task的replicas都是2,将会创建两个PServer任务,两个Trainer任务。
使用Volcano调度器,在job的配置中需要指定“schedulerName”为“volcano”,如果schedulerName没有指定为“volcano”,job下的任务调度将会使用kubernetes的默认调度器“default”调度器。
Volcano通过指定“minAvailable”字段保证计算任务的gang-scheduler调度策略。“minAvailable”数值指明在对当前计算任务下的pods进行调度时,需保证多少计算任务都能够调度才会执行调度任务,“minAvailable”的数值需要小于或等于计算任务下的所有任务数量的总和。对于PaddlePaddle框架计算任务,只有当所有的PServer和Trainer任务都处于运行中,才能开始计算任务。因此对于飞桨计算任务,“minAvailable”的数值需要与计算任务下的所有计算任务总和相等。
对于使用飞桨分布式训练的应用,在计算过程中,如果PServer任务或者Trainer任务被驱逐或失败,PServer和Trainer形成的计算集群将会失效,所有的PServer任务和Trainer任务都需要重启,以形成新的集群开始新的计算。Volcano可以通过设置“policies”实现上述目的。设置“PodEvicted”事件对应“RestartJob”动作,设置“PodFailed”事件对应“RestartJob”动作,在设置了这两个“policies”之后,当计算任务被驱逐或者失败,所有的计算任务将会重启。
下面是使用Volcano平台执行CTR任务的配置ctr-volcano.yaml,配置文件可从Volcano代码库获取
Volcano代码仓库地址:
root@volcano-paddlepaddle:~#kubectlapply-fctr-volcano.yamljob.batch.volcano.sh/ctr-volcanocreate检查pods的状态,无论是pserver任务还是trainer任务都被下发到集群中,并开始运行。如果当前集群下的空闲资源,不能满足pserver任务和trainer任务的资源述求,任何任务都不会被创建。
root@volcano-paddlepaddle:~#kubectlgetpods|grepctr-volcanoctr-volcano-pserver-01/1Running016sctr-volcano-pserver-11/1Running016sctr-volcano-trainer-01/1Running016sctr-volcano-trainer-11/1Running016选择一个PServer任务查看日志,看到PServer在监听端口,并对外提供服务
root@volcano-paddlepaddle:~#kubectlgetpod|grepctr-volcanoctr-volcano-trainer-00/1Completed077mctr-volcano-trainer-10/1Completed077与此同时,在训练结束之后,我们可能需要训练出来的模型用于别处。在yaml文件当中,我们规定了该任务volcanosh/edlctr:v1镜像,该镜像的工作目录在/workspace/ctr下,在train.py当中有定义,会在每1000个batch或是每一轮pass(跑完一遍训练集)的时候,调用save_inference_model接口来保存模型。保存的模型在/workspace/ctr/models文件夹下。那么如何在任务结束后获取模型呢?我们建议以下几种方式。
1)在yaml文件当中trainer部分的spec当中定义volume,通过docker的volume映射容器路径和宿主机路径的机制,将/workspace/ctr/models文件夹映射到宿主机的文件夹中。接下来通过kubectldescribepodctr-volcano-trainer-0,可以得知我们的模型所在的节点,接下来ssh登陆到对应的节点上,到宿主机被映射到路径下,就可以获取到训练出来到模型了。
2)如果需要更加灵活的,自动化的模型配送流程,可以在K8S集群上建立FileServer和分布式文件系统,例如GlusterFS。将ctr-volcano-trainer-0容器内部的/workspace/ctr/models文件夹映射到GlusterFS的PVC(PersistentVolumeClaim)上。通过ftp的wget/curl操作命令就可以实现模型的获取和配送。
综上,使用Volcano平台执行PaddlePaddle框架计算任务,可以实现计算任务的批量创建,任务的自动化管理,实现计算任务的自我管理。相较于普通的Replicaset+Job的模式,使用Volcano平台可以提升并行计算的管理效率。
作者
董大祥,@guru4elephant,PaddlePaddleArchitect,PrincipalArchitect,Baidu
王嘉炜,@wangjiawei04,PaddlePaddleEngineer,SeniorEngineer,Baidu
于佃海,@raindrops2sea,PaddlePaddleArchitect,DistinguishedArchitect,Baidu
张经辉,@sivanzcw,VolcanoContributor,CloudNativesoftwareengineer,Huawei
马达,@k82cn,KubernetesMaintainer,SIG-SchedulingCo-Leader,VolcanoLead,Huawei
参考文献
PaddlePaddle官网
PaddleonSpark
RunDeepLearningwithPaddlePaddleonKubernetes
Volcano官网
Volcao社区
百度CTRDemo
CTR-volcano配置文件
华为开发者空间发布
让每位开发者拥有一台云主机
在此一键设置昵称,即可参与社区互动!
*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。