Java和Matlab混合編程2,管理遠(yuǎn)程服務(wù)器任務(wù)提交

項(xiàng)目地址:https://github.com/CHanzyLazer/SmartSLURM
問(wèn)題描述
我們考慮這樣一個(gè)情景:你有成百上千個(gè)任務(wù)需要提交到遠(yuǎn)程服務(wù)器來(lái)進(jìn)行計(jì)算,并且其中有些任務(wù)需要其他的任務(wù)的結(jié)果來(lái)作為初始條件,此時(shí)你的工作流就是這樣:
對(duì)于這種需求,原始的直接ssh到遠(yuǎn)程服務(wù)器,然后把這些任務(wù)寫(xiě)到一個(gè)腳本中提交就會(huì)非常困難:
這種超長(zhǎng)的工作流應(yīng)該使用matlab或者jupyter可以分段執(zhí)行腳本的功能,實(shí)時(shí)進(jìn)行調(diào)試,全部放在服務(wù)端則難以實(shí)現(xiàn)這個(gè)功能(現(xiàn)在一般的遠(yuǎn)程服務(wù)器也不支持jupyter,matlab沒(méi)有g(shù)ui的話也就沒(méi)什么意義,配置起來(lái)難度也不低)
數(shù)據(jù)處理部分會(huì)被迫在遠(yuǎn)程服務(wù)器完成,難度很高并且非常受限(如果沒(méi)有實(shí)現(xiàn)直接運(yùn)行遠(yuǎn)程服務(wù)器的jupyter,那么也只會(huì)是在本地調(diào)試完成后上傳到服務(wù)器來(lái)運(yùn)行,那么為何不直接全都在本地執(zhí)行?)
不能跨服務(wù)器提交任務(wù)
鑒于本人更傾向于使用matlab而不是jupyter,因此我就沒(méi)去研究怎么直接在本地運(yùn)行遠(yuǎn)程服務(wù)器的jupyter了,轉(zhuǎn)而將項(xiàng)目全都放在本地,而遠(yuǎn)程服務(wù)器只負(fù)責(zé)計(jì)算部分,并且這個(gè)方法也可以在jupyter中使用。
我之前的一次專欄上有給出一個(gè)工具可以使用java的線程池來(lái)并行運(yùn)行指令,這樣就可以配合ssh免密登錄,使用類似于這樣的指令:
來(lái)直接向遠(yuǎn)程服務(wù)器執(zhí)行指令,而線程池可以并行的執(zhí)行這些指令,從而可以實(shí)現(xiàn)并行提交任務(wù)并且等待任務(wù)完成的功能。
在我的實(shí)際使用后,這樣也會(huì)存在一些問(wèn)題:
上傳下載文件使用scp指令會(huì)很慢,需要使用linux中的rsync指令,可以比較方便的實(shí)現(xiàn)整個(gè)文件夾的同步,并且支持并發(fā)以及壓縮傳輸,但是在windows上則需要安裝wsl或者使用第三方軟件,門(mén)檻就會(huì)比較高。
java的線程池提交的指令需要使用長(zhǎng)期掛起直到指令執(zhí)行完成的形式,但是如果任務(wù)執(zhí)行的時(shí)間過(guò)長(zhǎng),可能ssh連接會(huì)中斷,這樣掛起就中斷了,從而讓腳本出現(xiàn)意料之外的結(jié)果。并且如果手動(dòng)取消這些任務(wù),這些任務(wù)實(shí)際還會(huì)繼續(xù)在遠(yuǎn)程服務(wù)器運(yùn)行。
每個(gè)部分都是割裂開(kāi)的,沒(méi)有形成整體,每個(gè)操作都要重新建立一次ssh連接,效率很低并且使用起來(lái)也很不方便。
最近發(fā)現(xiàn)java中有第三方庫(kù)jsch(http://www.jcraft.com/jsch/)可以直接創(chuàng)建一個(gè)ssh連接,然后在java中進(jìn)行操作。當(dāng)然直接使用起來(lái)很不方便,并且有很多進(jìn)階的功能也沒(méi)有實(shí)現(xiàn),因此我這里對(duì)這個(gè)庫(kù)進(jìn)行了封裝,提供了一些進(jìn)階的功能方便使用,并且對(duì)支持SLURM系統(tǒng)提交任務(wù)的服務(wù)器做了專門(mén)的適配。
使用方法
首先需要為了使用方便考慮,這個(gè)軟件不需要依賴任何第三方庫(kù),直接下載放入項(xiàng)目就可以使用。實(shí)現(xiàn)了基本的功能從而不再需要裝wsl或者免密登錄等麻煩的操作。
首先從項(xiàng)目的release(https://github.com/CHanzyLazer/SmartSLURM/releases)中下載最新的軟件,其中SmartSLURM-with-demo.zip包含了使用例子,而smartSlurm.jar則是軟件本體。
對(duì)于matlab,由于matlab原生支持java,因此只需要導(dǎo)入軟件包即可(認(rèn)為jar包位于include目錄下):
使用完成后可以移除java類的路徑:
由于使用的java編寫(xiě),python中同樣也能使用,不過(guò)需要安裝第三方庫(kù),這里使用py4j(https://www.py4j.org/):
使用完成后記得關(guān)閉GATEWAY:
而后將ServerSSH以及ServerSLURM當(dāng)作matlab或者python中內(nèi)部的類使用即可。
功能介紹
此軟件提供了兩種類,ServerSSH主要提供了一般的對(duì)遠(yuǎn)程ssh服務(wù)器的操作,包括提交指令,上傳下載文件夾,清空遠(yuǎn)程服務(wù)器的文件夾等操作;ServerSLURM則對(duì)SLURM的服務(wù)器提供了專門(mén)的適配,包括提交sbatch任務(wù),通過(guò)squeue來(lái)獲取任務(wù)執(zhí)行狀況,使用scancel來(lái)取消任務(wù)等。
這里只提供一些基本的功能介紹,詳細(xì)的介紹可以參看項(xiàng)目(https://github.com/CHanzyLazer/SmartSLURM)。
首先都使用靜態(tài)方法get來(lái)獲得類的實(shí)例,同時(shí)會(huì)進(jìn)行ssh連接:
為了后續(xù)的操作保持簡(jiǎn)潔,這里認(rèn)為你的使用場(chǎng)景就是類似于最開(kāi)始提到的那樣,項(xiàng)目存在本地,而遠(yuǎn)程服務(wù)器則存放項(xiàng)目的鏡像,因此這里需要指定本地的項(xiàng)目路徑以及你希望的存放在遠(yuǎn)程服務(wù)器的項(xiàng)目路徑。
其中密碼是可選的,如果不填則會(huì)使用密鑰登錄。
ServerSLURM則需要多一個(gè)參數(shù)(4),用來(lái)指定同時(shí)在SLURM上運(yùn)行的最大作業(yè)數(shù)目(如果達(dá)到了則后續(xù)提交的任務(wù)會(huì)排隊(duì)執(zhí)行)。
ServerSLURM提供了ssh()接口來(lái)獲取內(nèi)部的ServerSSH,從而執(zhí)行ssh的基本操作,對(duì)于上述工作流,則只需要進(jìn)行如下的操作:
可以看到本軟件支持并發(fā)的文件傳輸并且也支持?jǐn)?shù)據(jù)壓縮,因此實(shí)際速度不會(huì)慢于rsync指令。
下載
從 github 項(xiàng)目中下載:https://github.com/CHanzyLazer/SmartSLURM
或者直接下載:https://github.com/CHanzyLazer/SmartSLURM/releases/download/v1.2/smartSlurm.jar