🧮 任务提交和结果下载

如果你没有任何Linux基础,我们强烈建议你首先花费几十分钟乃至几个小时学习Linux基础知识,尤其是Linux文件系统导航操作。 此类操作非常简单, 教学材料内容也多。比如,你可以轻松找到大量视频教程。

我们将以运行Python代码为例进行讲解。

在开始此 任务提交和结果下载 教程前,请确保你已经登录到了GigaRiver。如果还没有完成登录,请查看 🔑 登录(Login) 。 同时,请下载下列此教程需要用到的文件到你的电脑:

其中,.py 文件是一个简单的python程序代码。我们将在此教程中运行此程序代码作为示范。而上述 .sh 文件是一个任务配置文件, 它包含了所有必要的任务信息(如任务的内容、所需的硬件资源、所需最大运行时间、输出结果的路径等等)。 我们将通过提交此文件至GigaRiver从而完成任务的提交。

🔑 登录(Login) 部分一样,我们这里使用MobaXterm作为工具特意为Windows用户提供教程。如果你已经是一位Linux/Mac用户, 你应该能迅速理解这个教程背后的原理/方法。

📤️ 文件上传

假如你需要GigaRiver为你运行此教程提供的样板代码 my_example_program.py,那么你首先需要把它上传到你在GigaRiver的目录。 上传方法非常简单。在已经成功完成登录到GigaRiver的MobaXterm终端(terminal)的左侧,你能够看到一个类似于Windows文件浏览器的可交互界面(文件导航界面),如下图。

../../_images/MobaXterm_browser.png

在你的文件导航界面中,图中的usergroup0应当被你所在的用户组替代,tu6应该被你的用户名替代。

这个文件导航界面在其上端提供了数个交互功能按键。其中第三个为上传功能的按键(即上图顶部从左往右数的第三个,符号为向上的箭头)。点击此按键可以将本地 文件上传至GigaRiver你的当前文件目录(即此文件导航界面当下显示的目录)下。 如果你成功使用这个功能将已经下载到本地的 my_example_program.pymy_job.sh 文件上传到GigaRiver,你将看到如下文件导航界面

../../_images/MobaXterm_browser_1.png

⚾ 任务提交

在提交任务前,请确保你当前所处的目录包含了你刚上传的 my_example_program.pymy_job.sh 文件。 你可以通过 ls 命令查看当前目录所包含的文件信息。如:

$ ls

回车后你将在终端看到一个列表显示当前目录下的所有常规文件。如果你一直跟随此教程,那么你当前所处目录以及你上传文件的目录都应该是你的主目录(home)。 你可以使用 pwd 命令查看当前工作目录,即

$ pwd

默认情况下,终端应该返回

/mnt/usergroup0/yourusername

其中,usergroup0可能被替换成你所处的用户组,yourusername显示为你的GigaRiver用户名。如果你已经学习了基础Linux知识, 你应该已经知道如何使用 cd 命令导航至不同目录。那么你也可以尝试将上述文件上传至不同文件夹,并进行接下来的测试。

接下来,我们将介绍如何提交任务并且监视任务状态。

提交任务使用的命令是 sbatch 。提交的对象是 my_job.sh 文件,即一个简单的任务配置文件。现在,请你执行以下命令:

$ sbatch my_job.sh

如果任务提交成功,终端将返回一个任务号(JOBID)。比如

Submitted batch job 107

那么你提交的这个任务的任务号为107。接下来,你可以通过 squeue 命令查看任务信息,

$ squeue

你的终端将显示一个任务列表,其表头为

JOBID PARTITION     NAME     USER ST       TIME  NODES NODELIST(REASON)

这个列表将展示所有的当前任务的信息;从左至右分别为

  • 任务号(JOBID)

  • 分区(PARTITION)

  • 提交任务的用户名(USER)

  • 状态(ST)

  • 运行时间(TIME)

  • 节点数目(NODES)

  • 节点列表和状态原因(NODELIST(REASON))

你可以通过任务号(JOBID)来定位到你刚才提交的任务。

由于此教程任务只申请使用一个计算核心, 一般情况下,系统都具有足够资源运行执行此任务,因此你将在状态(ST)一栏看到R字样,即“运行中”。时间(TIME)一栏显示为运行的时间。此教程任务非常简单, 它将在约运行20秒以后完成运行。你可以反复执行 squeue 命令监视其状态。 如果任务较多,你也可以使用

$ squeue -u yourusername

来单独查看你提交的任务的状态(将上述命令中的yourusername替换成你的账号即可)。 一旦你发现你刚才提交的任务不再出现在任务列表中,说明它已经运行完成。此时,你再此运行 ls 命令, 你将在文件列表中发现两个新的文件,error.erroutput.out。它们是此任务的输出文件,分别包含错误信息和输出信息。

如果你刷新终端左侧的文件导航界面(上传功能右侧的按键),你也将在文件导航界面看到 error.erroutput.out 文件。 你可以双击它们中任意一个打开查看文件内容。第一次打开时,你的设备可能会询问你使用何种程序打开,你只需要选择你最常用的文本程序即可。

查看 error.err 文件你将发现此文件为空文件,即表示程序运行一切正常,未产生任何错误信息或警告信息。查看 output.out 你将看到如下输出信息:

Start....
1
2
3
4
5
6
7
8
9
10
Hello world. Hello, GigaRiver.

下面,我们将解释为什么你会看到这个此输出信息。

🛎️ 任务解释

如果你双击打开刚才提交的任务配置文件 my_job.sh,我们将看到它包含如下内容:

#!/bin/bash

#SBATCH --job-name=testjob
#SBATCH --partition=P0
#SBATCH --nodes=1
#SBATCH --ntasks=1
#SBATCH --time=6-23:59:59
#SBATCH --output=output.out
#SBATCH --error=error.err

python3 my_example_program.py

其中第一行 #!/bin/bash 是指定Linux使用的脚本解释器,暂时无需了解,也不需要修改。接下来,我们能看到多行以 #SBATCH 开头的代码。 这些代码就是此任务的配置信息。每一行代表了一项配置,我们现在从上往下对每一条配置进行解释。

  • --job-name=testjob: 此任务的任务名为 testjob

  • --partition=P0: 此任务将被分配至分区P0。你可以通过查看GigaRiver的硬件信息(⚙️ Hardware)或运行 sinfo 命令查看当前的分区情况。如果你不指定分区,任务将被分配至默认分区。

  • --nodes=1: 此任务要求使用一个节点。

  • --ntasks=1: 此任务需要启用1个线程。即说明它是一个单线程任务,没有并行运算需求。

  • --time=6-23:59:59: 此任务所需的最大时间。从任务开始计算时启动计时,如果超出了此时间任务仍然没有计算完成,GigaRiver将自动终止此任务。这里的时间格式是:天-时:分:秒。

  • --output=output.out: 输出文件目录。程序的输出结果将被写入此文件。

  • --error=error.err: 错误信息文件目录。程序运行过程中产生的错误信息和警告信息将被写入此文件。一般而言,一旦产生错误信息,程序运行将立即终止。

在这之后的代码将都将是发送给GigaRiver执行的代码。这里我们只有一行代码:

python3 my_example_program.py

也就是说,我们要求GigaRiver调用python3程序运行 my_example_program.py 文件。如果我们双击打开 my_example_program.py 文件, 我们将看到如下内容:

from time import sleep

print(f"Start....")

for i in range(10):
    sleep(2)
    print(i+1)

print(f"Hello world. Hello, GigaRiver.")

可以看到,这是一个简单输出程序。开始时,程序将输出 Start....。 此后每隔两秒钟,它将输出一个递增整数。 并且在输出完10个数字(即20秒)后,它将输出 Hello world. Hello, GigaRiver. 作为结尾。这也就解释了之前查看 output.out 时看到的内容。

📥️ 结果下载

假如上述 output.out 文件是你需要下载到本地进行进一步分析的计算结果, 你可以通过MobaXterm文件导航界面顶端的第二个按钮(符号为一个向下的箭头)将GigaRiver里的文件下载到本地。 你只需要选择好需要下载的文件然后点击此下载按钮即可。另外,你也可以通过鼠标右击菜单里的下载选项下载所需的文件。

如果你的程序在执行过程中生成了其他的文件,如图片,数据文件等。根据你程序中设定的保存路径,你可以在GigaRiver中找到它们并使用相同方法下载到本地。

但是,需要注意的一点是,GigaRiver不能进行图形界面交互。 也就是说,假如你的程序实时生成图片显示的话(比如代码中使用了 matplotlib 制图并调用了 .show() 函数进行实时显示)系统将报错终止。 你应该将此部分设定成保存图片文件然后可以用上述方法下载查看。

换句话说就是,GigaRiver不适合用于程序的调试。你应该在本地完成你的程序调试。调试完成后,在进行大规模、长时间运算时你再使用GigaRiver。

🎀 总结

简单而言,你只需要在本地编写好你的代码,将它们上传至GigaRiver,然后修改任务配置文件要求GigaRiver分配足够的资源,最后使用 sbatch 提交任务即可。

以Python为例,我们已经为GigaRiver安装好了常用的包, 并且已经配置好了DGMP组使用的 phyem (https://phyem.org/) 库, 你可以直接使用上述方法运行大负荷普通或phyem程序。

GigaRiver使用Slurm进行任务管理。已经介绍过的 sinfo, sbatchsqueue 等命令均为Slurm标准命令。 Slurm是一款强大的任务调度软件,在全世界范围内使用广泛,你可以轻易搜索到它的各种命令及使用方法。 我们将关于Slurm一些有用信息(包含常用命令, sbatch 配置选项等)总结在了 🚩 slurm命令

这里演示的内容仅仅是单线程任务,如果你需要执行并行任务,请参看 🖇️ 并行运算

特别地,如果你使用phyem进行大规模并行运算,请参看 🅿️ phyem任务


↩️ Back to ✅ Tutorial.

🌊 Back to GigaRiver.