一鍵部署分布式訓(xùn)練,微軟“群策 MARO”上新集群管理助手
編者按:2020年,微軟亞洲研究院發(fā)布并開源了多智能體資源優(yōu)化平臺“群策 MARO”。為了幫助不同需求的用戶進(jìn)行更加便捷、高效的集群管理,也希望用戶可以方便快捷地部署分布式訓(xùn)練任務(wù),微軟亞洲研究院的研究員和工程師們基于“群策M(jìn)ARO”平臺搭建了集群管理界面:MARO CLI。本文將為大家詳細(xì)介紹 MARO CLI 的功能和使用方法。
隨著強(qiáng)化學(xué)習(xí)的不斷發(fā)展,多種多樣的算法、框架層出不窮,對計(jì)算資源的要求也與日俱增。為了推動(dòng)更大規(guī)模的訓(xùn)練,也為了獲得更高的訓(xùn)練效率,如今對分布式集群的需求也在不斷增加。因此,微軟亞洲研究院的研究員和工程師們在此前打造的通用資源優(yōu)化平臺群策(Multi-Agent Resource Optimization Platform,MARO)上,構(gòu)建了一套輕量級的集群管理界面:MARO Command Line Interface(MARO CLI)。
除了提供高效靈活的環(huán)境組件、當(dāng)前主流和前沿的強(qiáng)化學(xué)習(xí)算法,MARO 平臺希望通過 MARO CLI 幫助不同需求的用戶進(jìn)行更加便捷高效的集群管理,也希望用戶可以方便快捷地部署分布式訓(xùn)練任務(wù)?;?MARO 平臺,作為構(gòu)建和管理訓(xùn)練用集群的命令行接口,MARO CLI 提供的主要特性包括:
多種方式的集群構(gòu)建,既可以創(chuàng)建基于 Azure 云服務(wù)器或者 AKS 服務(wù)的遠(yuǎn)端集群, 也可以將已有的計(jì)算資源整合成本地集群,從而提高計(jì)算資源的利用效率。
部署任意的訓(xùn)練任務(wù)到指定集群中,并根據(jù)每個(gè)任務(wù)的資源需求和當(dāng)前集群的空閑資源進(jìn)行任務(wù)分配,從而更合理地利用集群資源。
所有任務(wù)均部署在容器中運(yùn)行,任務(wù)之間更加獨(dú)立,也更方便支持新的強(qiáng)化學(xué)習(xí)框架和算法,具有更好的擴(kuò)展性。
提供了配套的可視化界面,包括對硬件、任務(wù)、日志的監(jiān)控。
下面我們將詳細(xì)介紹一下 MARO CLI 的架構(gòu)和功能,希望能幫助大家更好地利用 MARO CLI 來進(jìn)行分布式集群的訓(xùn)練。
MARO Process
為了讓開發(fā)者能夠平緩地從單機(jī)模式過渡到分布式集群模式、降低調(diào)試成本和開發(fā)成本,MARO CLI 提供了 Process mode,如圖1所示,這是 MARO CLI 中一種比較簡單的本地單機(jī)管理模式。在這種模式下,MARO CLI 并不會創(chuàng)建真正的分布式集群,而是在本機(jī)中通過使用多進(jìn)程來啟動(dòng)訓(xùn)練任務(wù),模擬真實(shí)分布式集群操作。
圖1:MARO Process mode 示意圖
通過在單機(jī)中模擬分布式場景主要有兩個(gè)優(yōu)點(diǎn):易于調(diào)試和開發(fā)成本低。與單機(jī)環(huán)境不同的是,要使任務(wù)能順利地在分步式集群中運(yùn)行,需要對代碼進(jìn)行一系列修改。使用 MARO Process mode 來測試修改好的代碼可以更直接地發(fā)現(xiàn)錯(cuò)誤,而且不需要真正的分布式集群,這樣可以節(jié)省一大筆開發(fā)成本。麻雀雖小,五臟俱全,在 MARO Process mode 下,使用 Redis 和 MARO 服務(wù)也可以做到任務(wù)管理和監(jiān)控。
MARO Grass
Grass mode 是 MARO CLI 中最重要的一部分,如圖2所示。在這種模式下,MARO CLI 支持三種集群的創(chuàng)建模式:本地單機(jī)(grass/local), 本地集群(grass/on-premises) 和 Azure 云集群(grass/azure)。除了 Grass Local 模式外,其他 Grass 模式都會創(chuàng)建并管理真正的分布式集群,正如圖2所示,在 Grass mode 下,MARO CLI 會通過一系列組件來實(shí)現(xiàn)分布式集群管理。
圖2:MARO Grass mode 示意圖
與單機(jī)模式不同的是,我們將 MARO Grass 集群分為 master 節(jié)點(diǎn)和 node 節(jié)點(diǎn)。在 master 節(jié)點(diǎn)上,我們使用 Redis 作為一個(gè)中心化的數(shù)據(jù)庫來儲存運(yùn)行時(shí)產(chǎn)生的數(shù)據(jù),使用 samba-server 進(jìn)行整個(gè)集群的文件共享,并通過 fluentd 進(jìn)行整個(gè)集群的日志收集。與此同時(shí),MARO CLI 也會啟動(dòng) master-agent 服務(wù)來進(jìn)行任務(wù)分配和集群狀態(tài)監(jiān)控,以及一個(gè) RESTFul server: master-api-server 執(zhí)行外部的命令,例如任務(wù)創(chuàng)建或者集群狀態(tài)監(jiān)控。在 node 節(jié)點(diǎn)上,則會啟動(dòng) node-agent 服務(wù)不斷記錄自身節(jié)點(diǎn)的狀態(tài)和任務(wù)容器的狀態(tài)并上傳到 master 上的 Redis,也會運(yùn)行 samber-client 和 RESTFul server: node-api-server 來與 master 節(jié)點(diǎn)進(jìn)行交互。
在 MARO Grass mode 下,與集群的交互都通過 master 節(jié)點(diǎn)來進(jìn)行:可以通過 ssh 進(jìn)行文件和數(shù)據(jù)的傳輸,也可以通過 Web Client 進(jìn)行集群任務(wù)管理和狀態(tài)監(jiān)控。出于安全考慮,對于每次 Web Client 的訪問我們都會使用 RSA+AES 混合加密,而集群內(nèi)部的通訊則是不加密的。master 節(jié)點(diǎn)收到加密指令后,將執(zhí)行具體的操作、與 node 節(jié)點(diǎn)進(jìn)行交互、將任務(wù)部署到具體某個(gè)容器中(可能被分配到不同的 node 節(jié)點(diǎn)上)。下面介紹一下三種集群創(chuàng)建模式的特點(diǎn):
本地單機(jī)(grass/local)
MARO Grass Local 與 MARO Process 類似,都是本地單機(jī)的集群模擬,但與之不同的是 MARO Grass Local 會將任務(wù)部署在容器內(nèi),也允許客戶自定義模擬集群或任務(wù)的資源大小,更加貼合真實(shí)的分布式集群操作。
本地集群(grass/on-premises)
MARO Grass On-Premises 可以利用手邊現(xiàn)有的計(jì)算資源來快速創(chuàng)建集群,并進(jìn)行高效便捷的管理。用戶可以將在同一局域網(wǎng)內(nèi)的資源自由加入到創(chuàng)建的 Grass 集群中,并通過 MARO CLI 進(jìn)行任務(wù)分配和集群管理。
Azure云集群(grass/azure)
MARO Grass Azure 是一種分布式集群管理,主要用于基于 Azure 云的遠(yuǎn)程集群。基于 Azure CLI 的部分接口,MARO CLI 可以實(shí)現(xiàn) Azure 云集群的自定義創(chuàng)建、節(jié)點(diǎn)的增減和集群狀態(tài)監(jiān)控。
MARO K8S
MARO CLI 同樣支持使用 Kubernetes (K8S) 來創(chuàng)建集群,如圖3所示。Kubernetes 是一個(gè)開源的、用于管理云平臺中多個(gè)主機(jī)上的容器化的應(yīng)用,同時(shí)也是一個(gè)知名度很高,并被廣泛應(yīng)用的集群管理軟件。
圖 3:MARO K8S mode 示意圖
通過對 Kubernetes 的支持,可以滿足用戶對 Kubernetes 集群的需求,也更方便那些 Kubernetes 集群用戶上手熟悉 MARO CLI。依賴于 Kubernetes 的架構(gòu),我們可以輕松地創(chuàng)建擁有數(shù)以百計(jì)的節(jié)點(diǎn)的大型集群,這賦予了 MARO CLI 更好的延展性和更高的穩(wěn)定性。在此模式下,我們使用 Azure File Service 在所有 Kubernetes Pods 下進(jìn)行文件共享,同時(shí)所有的任務(wù)都會部署在 Kubernetes Pods 中,由 Kubernetes 進(jìn)行維護(hù)。如果需要使用鏡像,我們則會使用 Azure Container Registry 來進(jìn)行鏡像管理。
舉個(gè)“栗子”:從單機(jī)到分布式
在 MARO 平臺中,我們準(zhǔn)備了很多場景和很多算法的示例,對每個(gè)示例也分別準(zhǔn)備了單機(jī)版和分布式版本。通過使用 MARO 平臺中的 RL toolkit 和 Communication toolkit,就可以將單機(jī)版的訓(xùn)練任務(wù)改成分布式版本。在這里我們使用示例中針對 Container Inventory Management(CIM)問題的 DQN 算法,來說明如何通過MARO CLI 一步步部署分布式訓(xùn)練任務(wù)。完整示例代碼可參考https://github.com/microsoft/maro/tree/master/examples/cim/dqn,對于每個(gè)模式的詳細(xì)使用說明,請見文末。
使用 MARO Process 模式
在 MARO Process 模式下,首先我們通過 maro process create 命令在本地啟動(dòng) MARO Process 模式,之后通過 maro process template 命令來生成 MARO 任務(wù)模版,如圖4所示。
圖 4:MARO Process mode 創(chuàng)建集群模版
在示例中,我們將 DQN 算法拆成了 actor 和 learner,然后將我們需要的數(shù)量和啟動(dòng)命令寫到模版的對應(yīng)位置,再通過 maro process job start 啟動(dòng)任務(wù)。我們可以通過 maro process job stop/list/log 命令進(jìn)行任務(wù)管理,也可以在可視化界面查看任務(wù)狀態(tài)。
使用 MARO Grass/Azure 模式
使用 MARO Grass/Azure 模式需要用戶具有一定的 Azure 使用經(jīng)驗(yàn),因?yàn)樵趧?chuàng)建集群時(shí)會對 Azure 有一定的權(quán)限要求。與 MARO Process 模式一樣的是,我們可以通過 maro grass template 命令來生成集群模版和任務(wù)模版,如圖5、圖6所示。
圖5:MARO Grass mode 創(chuàng)建集群模版
圖 6:MARO Grass mode 創(chuàng)建任務(wù)模版
首先根據(jù)我們的 Azure 賬戶將集群模版補(bǔ)充完整,然后通過 maro grass create 命令啟動(dòng)所需要的集群,并用 maro grass node scale 來控制集群 node 節(jié)點(diǎn)資源。MARO Grass 下的任務(wù)模版與 MARO Process 很不相同,因?yàn)闀⑷蝿?wù)容器化,所以在啟動(dòng)任務(wù)之前,需要通過 maro grass image push 命令將需要的鏡像文件部署到剛剛創(chuàng)建的集群上,再通過 maro grass data push 將需要用到的文件傳送到集群中。
另外,可以給每種組件(component)分配不同的資源,最優(yōu)化地利用集群資源。在鏡像和文件都部署到集群后,我們就可以通過 maro grass job start 將訓(xùn)練任務(wù)部署到集群之中了。
一目了然的可視化界面
MARO CLI 提供了一個(gè)簡潔明了且?guī)в袃?nèi)置命令行終端的可視化界面,方便用戶進(jìn)行集群管理和任務(wù)狀態(tài)查詢。在界面中首先顯示的是當(dāng)前集群的資源信息和使用率,同時(shí)也會依訓(xùn)練任務(wù)狀態(tài)來展示集群內(nèi)的任務(wù)概覽。
圖 7:集群可視化界面
圖 8. MARO CLI 結(jié)構(gòu)概覽
與其他集群管理平臺不同,MARO CLI 并不僅僅支持一種集群,它提供了多種模式來滿足用戶對集群的不同需求。對于剛剛接觸分布式訓(xùn)練的用戶來說,我們建議在熟悉了 MARO RL toolkit 和 Communication toolkit 之后,可以使用 MARO CLI 中的 Process 和 Grass Local 模式在單機(jī)中模擬集群操作。而對于手邊有空閑計(jì)算資源并對分布式集群有一定了解的用戶,則可以通過 MARO CLI 中的 Grass On-Premises 模式快速搭建集群,并在集群中部署訓(xùn)練任務(wù)。對于有一定 Azure 云使用經(jīng)驗(yàn)的用戶,可以通過 MARO CLI 中的 Grass Azure 來構(gòu)建基于 Azure 云的遠(yuǎn)端集群。如果還有已經(jīng)使用過 Kubernetes 的用戶,MARO CLI 同樣也支持搭建 Kubernetes 集群。
MARO CLI 仍是一個(gè)正在蓬勃發(fā)展的項(xiàng)目,未來將會不斷改進(jìn),變得更加簡單、快速和強(qiáng)大。歡迎大家關(guān)注并使用 MARO 平臺,也歡迎大家與我們進(jìn)行技術(shù)交流!
*博客內(nèi)容為網(wǎng)友個(gè)人發(fā)布,僅代表博主個(gè)人觀點(diǎn),如有侵權(quán)請聯(lián)系工作人員刪除。