当前位置: 首页 > 编程日记 > 正文

“一键”部署分布式训练,微软“群策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

相关文章:

1968年12月9日,恩格尔巴特公开演示了世界上第一个鼠标盒子

鼠标之父”道格拉斯恩格尔巴特 腾讯科技讯,肖华2013年12月19日编译 计算机的几次革命和大规模普及都是始于人机交互的改变,今年7月2日,“鼠标之父”道格拉斯恩格尔巴特溘然辞世。人们才发现,他的发明远不止鼠标。作为人机交互的先…

GPT-3模型为何难以复现?这也许是分布式AI框架的最优设计

作者 | 成诚头图 | 下载于视觉中国2020 年,最轰动的 AI 新闻莫过于 OpenAI 发布的 GPT-3 了。它的1750亿参数量及其在众多NLP任务上超过人类的出众表现让大家坚信:大模型才是未来。但与之带来的问题是,训练超大模型所需的算力、存储已不再是单…

c#中什么情况下用(int)什么情况下用Convert.ToInt32

1.c#中什么情况下用(int)什么情况下用Convert.ToInt32 ? 比如说有一个string型的3 ,要给它转换成int型的是用(int)3 ,还是用Convert.ToInt32(3); 还是两个都可以用,为什么? 解答:这两个都是转换成整型的,只是它们的长度不同。…

困扰多日的C#调用Haskell问题竟然是Windows的一个坑

最近一直被C#调用Haskell时的“尝试读取或写入受保护的内存”问题所困扰(详见C#调用haskell遭遇Attempted to read or write protected memory,C#调用haskell时的“尝试读取或写入受保护的内存”问题),而且困在其中,越…

“移花接木”偷换广告:HTTPS劫匪木马每天打劫200万次网络访问

本文讲的是“移花接木”偷换广告:HTTPS劫匪木马每天打劫200万次网络访问,近年来,国内各大网站逐渐升级为HTTPS加密连接,以防止网站内容被篡改、用户数据被监听。但是一向被认为“安全可靠”的HTTPS加密传输,其实也可以…

Oracle之sqlpluse显示格式

SQL> show linesize; #设置每行显示的字符数 linesize 10000 SQL> show pagesize; #设置每页显示的行数 pagesize 1000 SQL> set linesize 100; SQL> set pagesize 300; SQL> show linesize; linesize 100 SQL> show pagesize; pagesize 300 col 列名 for …

ASP.Net中利用CSS实现多界面两法

通过使页面动态加载不同CSS实现多界面 方法一: <%page language"C#"%> <%import namespace"System.Data"%> <script language"c#" runat"server"> public void page_load(Object obj,EventArgs e) { //创建服务器…

面试90%都会翻车的高可用+高并发+负载均衡架构设计 !

很多人面试的时候被问到一个让人特别手足无措的问题&#xff1a;你的系统如何支撑高并发&#xff1f;对于一个公司而言&#xff0c;“为什么要高可用”关于负载均衡架构设计你了解多少&#xff1f;大多数同学被问到这个问题压根儿没什么思路去回答&#xff0c;不知道从什么地方…

Linux 如何通过命令查看一个文件的某几行(中间几行或最后几行)

linux 如何显示一个文件的某几行(中间几行) 【一】从第3000行开始&#xff0c;显示1000行。即显示3000~3999行 cat filename | tail -n 3000 | head -n 1000 【二】显示1000行到3000行 cat filename | head -n 3000 | tail -n 1000 *注意两种方法的顺序 分解&#xff1a; tail …

PHP更新数据库记录

//更新记录$query"insert into chinachaodai (name,theindex)values (公司,1)";$result$mysqli->query($query);if($result){ echo ("返回行数:".$mysqli->affected_rows);}else{ echo("失败了");}$mysqli->close();

MySQL 用户与授权管理详解

大纲一、前言二、创建用户并授权三、GRANT语句的种类四、撤权并删除用户一、前言做为Mysql数据库管理员管理用户账户&#xff0c;是一件很重要的事&#xff0c;指出哪个用户可以连接服务器&#xff0c;从哪里连接&#xff0c;连接后能做什么。Mysql从3.22.11开始引入两个语句来…

聚焦联机交易分析一体化,巨杉数据库湖仓一体云产品全线升级

2021年5月15日&#xff0c;领先的金融级分布式数据库厂商 SequoiaDB巨杉数据库 举行了2021年春季发布会。在本次发布会中&#xff0c;巨杉数据库基于「湖仓一体」架构&#xff0c;针对不同的业务需求场景细分出全新的产品线。同时进行了最新的SequoiaDB Cloud数据库云平台操作演…

css :after或:before写小三角形

2019独角兽企业重金招聘Python工程师标准>>> .type_form_tab:after {content: ;position: relative;border: 0.3rem solid #d8d8d8;border-color: #d8d8d8 transparent transparent;width: 0;height: 0;top: 0.7rem;left: 0.3rem; }转载于:https://my.oschina.net/d…

C#调用windows api的要点

在.Net Framework SDK文档中&#xff0c;关于调用Windows API的指示比较零散&#xff0c;并且其中稍全面一点的是针对Visual Basic .net讲述的。本文将C#中调用API的要点汇集如下&#xff0c;希望给未在C#中使用过API的朋友一点帮助。另外如果安装了Visual Studio .net的话&…

如何全面认识联邦学习

作者 | 王健宗 李泽远 何安珣来源 | 大数据DT头图 | 下载于视觉中国什么是联邦学习联邦学习是一种带有隐私保护、安全加密技术的分布式机器学习框架&#xff0c;旨在让分散的各参与方在满足不向其他参与者披露隐私数据的前提下&#xff0c;协作进行机器学习的模型训练。经典联邦…

android 各种控件颜色值的设置(使用Drawable,Color)

在Android中&#xff0c;如果需要改变控件默认的颜色&#xff0c;包括值的颜色&#xff0c;需要预先在strings.xml中设置&#xff0c;类似字符串&#xff0c;可以反复调用。Android中颜色可以使用drawable或是color来定义。本例中strings.xml内容&#xff1a;<a href"h…

[20170914]tnsnames.ora的管理.txt

[20170914]tnsnames.ora的管理.txt--//昨天朋友讲tnsnams.ora的内容太长了,而且许多不需要的.管理不方便.我记得以前写[20150409]tnsnames.ora与IFILE.txt.链接--//http://blog.itpub.net/267265/viewspace-1561107/--//这样你可以按照某种分类管理.实际上这个我也是以前看别人…

C# ref和out关键字

ref和out关键字初解参数可以通过引用和值传递给方法。通过引用传递给方法的变量可以有调用它的方法作自由改变&#xff0c;所作的修改会影响原来的变量的值&#xff1b;在C#中&#xff0c;除非特别说明&#xff0c;所有的参数都是值传递。 这是默认情况&#xff0c;也可以使用r…

王炸不断,半导体巨头们到底在打什么牌?

作者 | 马超 责编 | 欧阳姝黎出品 | CSDN博客头图 | 下载于视觉中国最近整个半导体行业实在风起云涌&#xff0c;IBM 推出了 2nm 的芯片&#xff0c;苹果春季发布会上搭载 M1 的 iPad Pro 再度炸场、四月中旬 ARM 推出了新一代的 ARMv9、英特尔也拿出了最的至强三代 Ice Lake-…

什么是软件定义数据中心

近年来&#xff0c;“云计算”已经成为一个被滥用的名称&#xff0c;现在几乎所有的IT公司的项目都用云计算来冠名&#xff0c;似乎贴上了“云”标签&#xff0c;立刻变得高大上起来。提到云计算&#xff0c;很多人第一反应都是&#xff0c;亚马逊的AWS服务&#xff0c;或者谷歌…

React Native常用组件之ListView

1. ListView常用属性 ScrollView 相关属性样式全部继承dataSource ListViewDataSource 设置ListView的数据源initialListSize number 设置ListView组件刚刚加载的时候渲染的列表行数&#xff0c;用这个属性确定首屏或者首页加载的数量&#xff0c;而不是花大量的时间渲染加载很…

Oracle中merge into的使用

http://blog.csdn.net/yuzhic/article/details/1896878 http://blog.csdn.net/macle2010/article/details/5980965 该命令使用一条语句从一个或者多个数据源中完成对表的更新和插入数据. ORACLE 9i 中&#xff0c;使用此命令必须同时指定UPDATE 和INSERT 关键词,ORACLE 10g 做了…

C#运算符资料

☆C#的运算符定义只有四种形式:--------------------------------------- ①public static 返回类型 operator ?(单形参) ②public static 返回类型 operator ?(双形参) ③public static implicit operator 隐转目标类型(单源类型形参) ④public static explicit operator 显…

厉害了,网易伏羲三篇论文上榜 AI 顶会 ACL

近日&#xff0c;国际AI顶尖学术会议ACL 2021&#xff08;Annual Meeting of the Associationfor Computational Linguistics&#xff09;公布了论文录用结果。网易伏羲共有三项研究被本届ACL收录&#xff0c;内容包括自然语言生成、无监督文本表示学习等方向&#xff0c;相关技…

软件架构设计学习总结(1):标准Web系统的架构分层

1、架构体系分层图 在上图中我们描述了Web系统架构中的组成部分。并且给出了每一层常用的技术组件/服务实现。需要注意以下几点&#xff1a; 系统架构是灵活的&#xff0c;根据需求的不同&#xff0c;不一定每一层的技术都需要使用。例如&#xff1a;一些简单的CRM系统可能在产…

iOS 设置UILabel 的内边距

iOS 设置UILabel 的内边距 - (void)drawTextInRect:(CGRect)rect {UIEdgeInsets insets {0, 5, 0, 5};[super drawTextInRect:UIEdgeInsetsInsetRect(rect, insets)]; } 参考&#xff1a;http://stackoverflow.com/questions/3476646/uilabel-text-margin http://unmi.cc/uila…

从程序媛到启明星辰集团云安全总经理,郭春梅博士揭秘云时代安全攻防之道...

从无序中寻找踪迹&#xff0c;从眼前事探索未来。2021 年正值黄金十年新开端&#xff0c;CSDN 以中立技术社区专业、客观的角度&#xff0c;深度探讨中国前沿 IT 技术演进&#xff0c;推出年度重磅企划栏目——「拟合」&#xff0c;通过对话企业技术高管大咖&#xff0c;跟踪报…

javascript 异步实现方案

1、回调函数 fn1( fn2 ); 2、事件监听 fn1.on(done, fn2);function fn1() {setTimeout(function(){fn1.trigger(done);},1000) }3、发布-订阅 &#xff08;1&#xff09;fn2像“信号中心”订阅了done信号Jquery.subscribe("done", fn2);(2) fn1向信号中心发布信…

csc命令帮助

大家还是要常用用csc&#xff0c;个人感觉有时vs有不少不太方便的东西。C:/>csc /help |more Microsoft (R) Visual C# 编译器版本7.00.9254 [CLR version v1.0.2914] 版权所有 (C) Microsoft Corp 2000-2001。保留所有权利。 Visual C# 编译器选项…

利用apache+svn+jenkins+maven 实现java环境的自动化构建和部署(三)(网内首发超详细版)...

3.3 权限配置样例注意&#xff1a;* 权限配置文件中出现的用户名必须已在用户配置文件中定义。* 对权限配置文件的修改立即生效&#xff0c;不必重启svn。用户组格式&#xff1a;[groups] ,其中&#xff0c;1个用户组可以包含1个或多个用户&#xff0c;用户间以逗号分隔。版本库…