“一键”部署分布式训练,微软“群策MARO”上新集群管理助手
Posted AI科技大本营
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了“一键”部署分布式训练,微软“群策MARO”上新集群管理助手相关的知识,希望对你有一定的参考价值。
作者 | 李开琪、王金予
编者按:2020年,微软亚洲研究院发布并开源了多智能体资源优化平台“群策MARO”。为了帮助不同需求的用户进行更加便捷、高效的集群管理,也希望用户可以方便快捷地部署分布式训练任务,微软亚洲研究院的研究员和工程师们基于“群策MARO”平台搭建了集群管理界面:MARO CLI。本文将为大家详细介绍MARO CLI的功能和使用方法。
随着强化学习的不断发展,多种多样的算法、框架层出不穷,对计算资源的要求也与日俱增。为了推动更大规模的训练,也为了获得更高的训练效率,如今对分布式集群的需求也在不断增加。因此,微软亚洲研究院的研究员和工程师们在此前打造的通用资源优化平台群策(Multi-Agent Resource Optimization Platform,MARO)上,构建了一套轻量级的集群管理界面:MARO Command Line Interface(MARO CLI)。
除了提供高效灵活的环境组件、当前主流和前沿的强化学习算法,MARO平台希望通过MARO CLI帮助不同需求的用户进行更加便捷高效的集群管理,也希望用户可以方便快捷地部署分布式训练任务。基于MARO平台,作为构建和管理训练用集群的命令行接口,MARO CLI提供的主要特性包括:
- 多种方式的集群构建,既可以创建基于Azure云服务器或者AKS服务的远端集群, 也可以将已有的计算资源整合成本地集群,从而提高计算资源的利用效率。
- 部署任意的训练任务到指定集群中,并根据每个任务的资源需求和当前集群的空闲资源进行任务分配,从而更合理地利用集群资源。
- 所有任务均部署在容器中运行,任务之间更加独立,也更方便支持新的强化学习框架和算法,具有更好的扩展性。
- 提供了配套的可视化界面,包括对硬件、任务、日志的监控。
下面我们将详细介绍一下MARO CLI的架构和功能,希望能帮助大家更好地利用MARO CLI来进行分布式集群的训练。
MARO Process
为了让开发者能够平缓地从单机模式过渡到分布式集群模式、降低调试成本和开发成本,MARO CLI提供了Process mode,如图1所示,这是MARO CLI中一种比较简单的本地单机管理模式。在这种模式下,MARO CLI并不会创建真正的分布式集群,而是在本机中通过使用多进程来启动训练任务,模拟真实分布式集群操作。
图 1. MARO Process mode 示意图
通过在单机中模拟分布式场景主要有两个优点:易于调试和开发成本低。 与单机环境不同的是,要使任务能顺利地在分步式集群中运行,需要对代码进行一系列修改。使用MARO Process mode来测试修改好的代码可以更直接地发现错误,而且不需要真正的分布式集群,这样可以节省一大笔开发成本。麻雀虽小,五脏俱全,在MARO Process mode下,使用Redis和MARO服务也可以做到任务管理和监控。
MARO Grass
Grass mode是MARO CLI中最重要的一部分,如图2所示。在这种模式下,MARO CLI支持三种集群的创建模式:本地单机(grass/local), 本地集群(grass/on-premises) 和 Azure云集群(grass/azure)。除了Grass Local模式外,其他Grass模式都会创建并管理真正的分布式集群,正如图2所示,在Grass mode下,MARO CLI 会通过一系列组件来实现分布式集群管理。
图2. MARO Grass mode 示意图
与单机模式不同的是,我们将MARO Grass集群分为master节点和node节点。在master节点上,我们使用Redis作为一个中心化的数据库来储存运行时产生的数据,使用samba-server进行整个集群的文件共享,并通过fluentd进行整个集群的日志收集。与此同时,MARO CLI也会启动master-agent服务来进行任务分配和集群状态监控,以及一个RESTFul server: master-api-server执行外部的命令,例如任务创建或者集群状态监控。在node节点上,则会启动node-agent服务不断记录自身节点的状态和任务容器的状态并上传到master上的Redis,也会运行samber-client和RESTFul server: node-api-server来与master节点进行交互。
在MARO Grass mode下,与集群的交互都通过master节点来进行:可以通过ssh进行文件和数据的传输,也可以通过Web Client进行集群任务管理和状态监控。出于安全考虑,对于每次Web Client的访问我们都会使用RSA+AES混合加密,而集群内部的通讯则是不加密的。master节点收到加密指令后,将执行具体的操作、与node节点进行交互、将任务部署到具体某个容器中(可能被分配到不同的node节点上)。
下面介绍一下三种集群创建模式的特点:
- 本地单机(grass/local)
MARO Grass Local与MARO Process类似,都是本地单机的集群模拟,但与之不同的是MARO Grass Local会将任务部署在容器内,也允许客户自定义模拟集群或任务的资源大小,更加贴合真实的分布式集群操作。
- 本地集群(grass/on-premises)
MARO Grass On-Premises可以利用手边现有的计算资源来快速创建集群,并进行高效便捷的管理。用户可以将在同一局域网内的资源自由加入到创建的Grass集群中,并通过MARO CLI进行任务分配和集群管理。
- Azure云集群(grass/azure)
MARO Grass Azure是一种分布式集群管理,主要用于基于Azure云的远程集群。基于Azure CLI的部分接口,MARO CLI可以实现Azure云集群的自定义创建、节点的增减和集群状态监控。
MARO K8S
MARO CLI同样支持使用Kubernetes (K8S) 来创建集群,如图3所示。Kubernetes是一个开源的、用于管理云平台中多个主机上的容器化的应用,同时也是一个知名度很高,并被广泛应用的集群管理软件。
图 3. MARO K8S mode 示意图
通过对Kubernetes的支持,可以满足用户对Kubernetes 集群的需求,也更方便那些Kubernetes集群用户上手熟悉MARO CLI。依赖于Kubernetes的架构,我们可以轻松地创建拥有数以百计的节点的大型集群,这赋予了MARO CLI更好的延展性和更高的稳定性。在此模式下,我们使用Azure File Service在所有Kubernetes Pods下进行文件共享,同时所有的任务都会部署在Kubernetes Pods中,由Kubernetes进行维护。如果需要使用镜像,我们则会使用Azure Container Registry来进行镜像管理。
举个“栗子”:从单机到分布式
在MARO平台中,我们准备了很多场景和很多算法的示例,对每个示例也分别准备了单机版和分布式版本。通过使用MARO平台中的RL toolkit 和Communication toolkit,就可以将单机版的训练任务改成分布式版本。在这里我们使用示例中针对Container Inventory Management(CIM)问题的DQN算法,来说明如何通过MARO CLI一步步部署分布式训练任务。完整示例代码可参考https://github.com/microsoft/maro/tree/master/examples/cim/dqn,对于每个模式的详细使用说明,请见文末。
使用MARO Process模式
在MARO Process 模式下,首先我们通过maro process create 命令在本地启动MARO Process 模式,之后通过maro process template 命令来生成MARO任务模版,如图4所示。
图 4. MARO Process mode创建集群模版
在示例中,我们将DQN算法拆成了actor和learner,然后将我们需要的数量和启动命令写到模版的对应位置,再通过maro process job start启动任务。我们可以通过maro process job stop/list/log 命令进行任务管理,也可以在可视化界面查看任务状态。
使用MARO Grass/Azure 模式
使用MARO Grass/Azure 模式需要用户具有一定的Azure使用经验,因为在创建集群时会对Azure有一定的权限要求。与MARO Process模式一样的是,我们可以通过maro grass template 命令来生成集群模版和任务模版,如图5、图6所示。
图5. MARO Grass mode 创建集群模版
图 6. MARO Grass mode 创建任务模版
首先根据我们的Azure账户将集群模版补充完整,然后通过maro grass create 命令启动所需要的集群,并用maro grass node scale来控制集群node节点资源。MARO Grass下的任务模版与MARO Process很不相同,因为会将任务容器化,所以在启动任务之前,需要通过maro grass image push命令将需要的镜像文件部署到刚刚创建的集群上,再通过maro grass data push将需要用到的文件传送到集群中。
另外,可以给每种组件(component)分配不同的资源,最优化地利用集群资源。在镜像和文件都部署到集群后,我们就可以通过maro grass job start将训练任务部署到集群之中了。
一目了然的可视化界面
MARO CLI提供了一个简洁明了且带有内置命令行终端的可视化界面,方便用户进行集群管理和任务状态查询。在界面中首先显示的是当前集群的资源信息和使用率,同时也会依训练任务状态来展示集群内的任务概览。
图 7. 集群可视化界面
图 8. MARO CLI 结构概览
与其他集群管理平台不同,MARO CLI并不仅仅支持一种集群,它提供了多种模式来满足用户对集群的不同需求。对于刚刚接触分布式训练的用户来说,我们建议在熟悉了MARO RL toolkit和Communication toolkit之后,可以使用MARO CLI中的Process和Grass Local 模式在单机中模拟集群操作。而对于手边有空闲计算资源并对分布式集群有一定了解的用户,则可以通过MARO CLI中的 Grass On-Premises 模式快速搭建集群,并在集群中部署训练任务。对于有一定Azure云使用经验的用户,可以通过MARO CLI中的Grass Azure来构建基于Azure云的远端集群。如果还有已经使用过Kubernetes的用户,MARO CLI同样也支持搭建Kubernetes集群。
MARO CLI仍是一个正在蓬勃发展的项目,未来将会不断改进,变得更加简单、快速和强大。欢迎大家关注并使用MARO平台,也欢迎大家与我们进行技术交流!
MARO CLI文档
https://maro.readthedocs.io/en/latest/key_components/orchestration.html
MARO CLI相关模式使用说明:
https://maro.readthedocs.io/en/latest/installation/multi_processes_localhost_provisioning.html
https://maro.readthedocs.io/en/latest/installation/grass_azure_cluster_provisioning.html
https://maro.readthedocs.io/en/latest/installation/grass_on_premises_cluster_provisioning.html
https://maro.readthedocs.io/en/latest/installation/k8s_cluster_provisioning_on_azure.html
MARO GitHub页面
https://github.com/microsoft/maro
MARO 0.2版本具体更新历史
https://github.com/microsoft/maro/pull/239
https://github.com/microsoft/maro/pull/297
以上是关于“一键”部署分布式训练,微软“群策MARO”上新集群管理助手的主要内容,如果未能解决你的问题,请参考以下文章
GitLab + Jenkins实现一键分布式项目自动化部署