HPC 系列文章(12):交互作业

前面介绍了如何提交作业,不过我们只讲了最简单的作业提交。实际上Slurm的作业提交方式也有多种,将所需的作业编写成脚本再用sbatch命令提交是最为常见的方式,不过这种方式存在弊 端,你可能会因为脚本中某一个命令执行失败而反复编辑脚本,再不断的查看新提交的任务的输出,在调试时显得很不灵活;又或者你的程序需要交互式的应答才能跑通,这时候srunsalloc则是更好的方式。

salloc

salloc从字面上就能看出来,实际上是”slurm allocate”的缩写,在解释salloc之前,我们先回顾一下之前对于作业和作业步的定义:

  • 作业(job):特定时间为用户进行的一次资源申请或分配即可看作一个作业。这和我们惯性思维中的作业概念并不一致,传统意义上我们总是认为作业应该是某个运行的脚本或者程序,但事实上Slurm的作业只代表一次资源申请或分配。理解这个区别将有利于你理解Slurm中一些比较高级的用法。
  • 作业步(job step):Slurm中有作业步的概念,你可以理解为子作业。这允许我们在某个作业中分步骤的细分使用计算资源。

无论是sbatch、srun还是salloc,其本质都是一种对资源的申请并将你所要执行的内容运行在限定的资源内的一种行为,三者提交时对资源指定的参数都是一样的,例如:

salloc -N 2 -n 2 -p node-all

salloc

如果当前资源满足的话,将会显示该资源已分配,你似乎没察觉到任何变化,但实际上你当前使用的shell程序(泛指sh、bash、zsh等)已经发生了变化。你进入了一个新的环境下,不信你可以试试执行exit,你会得到如下输出:

salloc: Relinquishing job allocation 5914

这正是退出salloc任务的方式。

那么这个新的环境有什么玄机呢?实际上slurm在这个过程中完成了资源的申请,然后为新的bash进程配置了一堆环境变量,我们可以通过env来查看,会得到类似如下输出:

env

可以看到其包含了本次作业的各项参数,包括申请到的资源等信息。你肯定好奇那如果我手动修改环境变量,是不是可以改变本次作业的资源呢?答案是当然不能。这些环境变量是可读的,但仅仅是为了让你的作业可以获知这些信息,作业真正的资源分配信息依然是保存在特定的文件中的(这个后面再介绍)

在这个环境下你可以通过srun命令提交任意命令,根据我的设置,每条命令会执行两次,分别在两个节点上。我们可以通过执行命令验证一下:

srun

这就是salloc的使用方式。

srun

上面的试验中,我们使用了srun提交命令,看到一次输出了两个hostname,证明该命令同时在两个节点上被执行了。事实上在作业中通过srun执行命令才是是slurm中正确使用多个节点资源的方式。srun不仅仅可以在salloc中使用,你可以在sbatch的脚本中使用srun,还可以直接使用srun,在某个作业中多次调用srun指令会生成多个作业步。

你还可以单独使用srun,这样会生成一个单步的作业,执行完成后就会退出。

如果我们执行下面的命令,会发生什么呢?

srun bash

slurm会为你分配一个节点并运行bash,此时你执行的任何操作,都相当于在该分配的节点上运行,如果我们加上–pty参数,就会更明了了。

srun --pty bash

这样你会得到类似salloc的体验,不过当前运行的bash是运行在你分配到的节点上的。

sattach

上面介绍了srun的作用,假设你用srun运行了一个启动bash的作业。我们简单叙述一下整个作业流程:

  1. srun向系统中提出资源申请
  2. 调度系统判断出当前的计算资源能满足该申请
  3. 调度系统分配了某个计算节点执行指定的任务
  4. 最后在某个节点上成功运行了bash

这时候你的任何操作实际上是在一个远程节点上执行的,这种感觉有点像一台云主机。那我们要如何连接到这个云主机中呢?所以Slurm提供了一个sattach的工具,用于连接到某个作业步。无论你是运行的一个bash进程或者任何其他进行,在该作业运行期间,你都可以通过sattach直接连接到该作业。

以上就是关于交互作业的内容,一定要自己手动操作一遍才会彻底理解。后面我们会介绍一下这样的使用方式具体能实现什么功能。

坚持原创技术分享,您的支持将鼓励我继续创作!