项目地址:https://github.com/CHanzyLazer/SmartSLURM
(资料图片)
我们考虑这样一个情景:你有成百上千个任务需要提交到远程服务器来进行计算,并且其中有些任务需要其他的任务的结果来作为初始条件,此时你的工作流就是这样:
对于这种需求,原始的直接ssh到远程服务器,然后把这些任务写到一个脚本中提交就会非常困难:
这种超长的工作流应该使用matlab或者jupyter可以分段执行脚本的功能,实时进行调试,全部放在服务端则难以实现这个功能(现在一般的远程服务器也不支持jupyter,matlab没有gui的话也就没什么意义,配置起来难度也不低)
数据处理部分会被迫在远程服务器完成,难度很高并且非常受限(如果没有实现直接运行远程服务器的jupyter,那么也只会是在本地调试完成后上传到服务器来运行,那么为何不直接全都在本地执行?)
不能跨服务器提交任务
鉴于本人更倾向于使用matlab而不是jupyter,因此我就没去研究怎么直接在本地运行远程服务器的jupyter了,转而将项目全都放在本地,而远程服务器只负责计算部分,并且这个方法也可以在jupyter中使用。
我之前的一次专栏上有给出一个工具可以使用java的线程池来并行运行指令,这样就可以配合ssh免密登录,使用类似于这样的指令:
来直接向远程服务器执行指令,而线程池可以并行的执行这些指令,从而可以实现并行提交任务并且等待任务完成的功能。
在我的实际使用后,这样也会存在一些问题:
上传下载文件使用scp指令会很慢,需要使用linux中的rsync指令,可以比较方便的实现整个文件夹的同步,并且支持并发以及压缩传输,但是在windows上则需要安装wsl或者使用第三方软件,门槛就会比较高。
java的线程池提交的指令需要使用长期挂起直到指令执行完成的形式,但是如果任务执行的时间过长,可能ssh连接会中断,这样挂起就中断了,从而让脚本出现意料之外的结果。并且如果手动取消这些任务,这些任务实际还会继续在远程服务器运行。
每个部分都是割裂开的,没有形成整体,每个操作都要重新建立一次ssh连接,效率很低并且使用起来也很不方便。
最近发现java中有第三方库jsch(http://www.jcraft.com/jsch/)可以直接创建一个ssh连接,然后在java中进行操作。当然直接使用起来很不方便,并且有很多进阶的功能也没有实现,因此我这里对这个库进行了封装,提供了一些进阶的功能方便使用,并且对支持SLURM系统提交任务的服务器做了专门的适配。
首先需要为了使用方便考虑,这个软件不需要依赖任何第三方库,直接下载放入项目就可以使用。实现了基本的功能从而不再需要装wsl或者免密登录等麻烦的操作。
首先从项目的release(https://github.com/CHanzyLazer/SmartSLURM/releases)中下载最新的软件,其中SmartSLURM-with-demo.zip包含了使用例子,而smartSlurm.jar则是软件本体。
对于matlab,由于matlab原生支持java,因此只需要导入软件包即可(认为jar包位于include目录下):
使用完成后可以移除java类的路径:
由于使用的java编写,python中同样也能使用,不过需要安装第三方库,这里使用py4j(https://www.py4j.org/):
使用完成后记得关闭GATEWAY:
而后将ServerSSH以及ServerSLURM当作matlab或者python中内部的类使用即可。
此软件提供了两种类,ServerSSH主要提供了一般的对远程ssh服务器的操作,包括提交指令,上传下载文件夹,清空远程服务器的文件夹等操作;ServerSLURM则对SLURM的服务器提供了专门的适配,包括提交sbatch任务,通过squeue来获取任务执行状况,使用scancel来取消任务等。
这里只提供一些基本的功能介绍,详细的介绍可以参看项目(https://github.com/CHanzyLazer/SmartSLURM)。
首先都使用静态方法get来获得类的实例,同时会进行ssh连接:
为了后续的操作保持简洁,这里认为你的使用场景就是类似于最开始提到的那样,项目存在本地,而远程服务器则存放项目的镜像,因此这里需要指定本地的项目路径以及你希望的存放在远程服务器的项目路径。
其中密码是可选的,如果不填则会使用密钥登录。
ServerSLURM则需要多一个参数(4),用来指定同时在SLURM上运行的最大作业数目(如果达到了则后续提交的任务会排队执行)。
ServerSLURM提供了ssh()接口来获取内部的ServerSSH,从而执行ssh的基本操作,对于上述工作流,则只需要进行如下的操作:
可以看到本软件支持并发的文件传输并且也支持数据压缩,因此实际速度不会慢于rsync指令。
从 github 项目中下载:https://github.com/CHanzyLazer/SmartSLURM
或者直接下载:https://github.com/CHanzyLazer/SmartSLURM/releases/download/v1.2/smartSlurm.jar
X 关闭
Copyright © 2015-2022 人人五金网版权所有 备案号:粤ICP备18023326号-36 联系邮箱:8557298@qq.com