批处理作业调度程序#
批处理作业调度器管理作业队列和计算资源的执行。AiiDA 提供了一系列调度程序的插件,本节将介绍这些插件的接口。
按照 these instructions 添加对自定义调度程序的支持。
PBSPro#
支持 PBSPro 调度器(已测试:12.1 版)。
该调度程序支持所有主要功能。
设置工作资源时使用 NodeNumberJobResource (PBS-like) 。
SLURM#
支持 SLURM 调度程序(已测试:版本 2.5.4)。
该调度程序支持所有主要功能。
设置工作资源时使用 NodeNumberJobResource (PBS-like) 。
SGE#
支持 SGE 调度器(Sun Grid Engine,现称为 Oracle Grid Engine)及其一些主要变体/分支(已测试:版本 GE 6.2u3)。
该调度程序支持所有主要功能。
设置工作资源时使用 ParEnvJobResource (类 SGE) 。
LSF#
支持 IBM LSF 调度器(已在欧洲核子研究中心 lxplus 集群上测试过 9.1.3 版)。
Torque#
支持 Torque (基于 OpenPBS)(已测试:Ubuntu 的 2.4.16 版)。
该调度程序支持所有主要功能。
设置工作资源时使用 NodeNumberJobResource (PBS-like) 。
直接执行(绕过调度程序)#
direct
调度器插件只需在新的 bash shell 中执行命令,将其置于后台并检查其 process ID (PID),以确定执行何时完成。
其主要用途是在本地计算机上进行调试。任何生产计算都要使用适当的批处理调度程序。
警告
与适当的批处理调度程序相比,直接执行模式比较脆弱。特别是
没有队列,即所有计算都是并行运行的。
重启时会重置 PID 编号。
警告
不要使用直接调度程序在超级计算机上运行。如果你的中心有多个登录名 node,如果后续的 SSH 连接在不同的登录名 node(导致 AiiDA 推断作业已经完成),AiiDA 可能会感到困惑。
该调度程序支持所有主要功能。
设置工作资源时使用 NodeNumberJobResource (PBS-like) 。
Job 资源#
不难理解,不同的调度程序有不同的方法来指定作业的资源(如所需的 node 数量或每个 node 的 MPI processes 数量)。
在 AiiDA 中,这些差异由 JobResource
类的子类来解释。上一节列出了特定调度程序应使用的子类。
所有子类都至少定义了 get_tot_num_mpiprocs()
方法,用于返回请求的 MPI processes 总数,但在其他方面的接口略有不同,详情如下。
备注
您可以直接通过 import 手动加载 specific JobResource
子类,例如
from aiida.schedulers.datastructures import NodeNumberJobResource
然而,在实际操作中,适当的类别将从为相关 AiiDA 计算机配置的调度程序中推断,您只需在 CalcJob
的 metadata.options
输入字典中设置相关字段即可。
对于作业资源类型为 NodeNumberJobResource
的调度程序来说,可能是这样:
from aiida.orm import load_code
inputs = {
'code': load_code('somecode@localhost'), # The configured code to be used, which also defines the computer
'metadata': {
'options': {
'resources', {'num_machines': 4, 'num_mpiprocs_per_machine': 16}
}
}
}
NodeNumberJobResource (PBS-like)#
NodeNumberJobResource
类用于在 PBS 和 SLURM 中指定作业资源。
该类具有以下属性
res.num_machines
:运行代码的机器数量(也称为 node)。res.num_mpiprocs_per_machine
:每台机器上使用的 MPI processes 数量res.tot_num_mpiprocs
:该作业请求的 MPI processes 总数res.num_cores_per_machine
:每台机器使用的内核数res.num_cores_per_mpiproc
:在每个 MPI process 上运行的核心数
您只需在上述前三个字段中指定两个字段,但它们必须在构建时定义。例如,我们建议使用前两个字段:
res = NodeNumberJobResource(num_machines=4, num_mpiprocs_per_machine=16)
要求调度程序分配 4 台机器,每台机器上有 16 个 MPI processes。这将自动要求总共 4*16=64
的 MPI processes 总数量。
备注
创建新计算机时,系统会要求您输入 default_mpiprocs_per_machine
。如果指定了该值,在为该计算机创建资源时,它将自动被用作 num_mpiprocs_per_machine
的默认值。
备注
如果您想使用 res.tot_num_mpiprocs
,请确保它是 res.num_machines
和/或 res.num_mpiprocs_per_machine
的倍数。
前三个字段通过等式相关联:
res.num_machines * res.num_mpiprocs_per_machine = res.tot_num_mpiprocs
num_cores_per_machine
和 num_cores_per_mpiproc
字段为可选字段,必须满足等式要求:
res.num_cores_per_mpiproc * res.num_mpiprocs_per_machine = res.num_cores_per_machine
备注
在 PBSPro 中, num_mpiprocs_per_machine
和 num_cores_per_machine
字段分别用于 mpiprocs 和 ppn。
在 Torque 中,除非指定了 num_mpiprocs_per_machine
,否则 num_mpiprocs_per_machine
字段将用于 ppn。
ParEnvJobResource (类 SGE)#
The ParEnvJobResource
class is used for specifying the resources of SGE and similar schedulers, which require specifying a parallel environment and the total number of CPUs requested.
该类具有以下属性
res.parallel_env
:运行作业的并行环境(字符串)res.tot_num_mpiprocs
:该作业请求的 MPI processes 总数
这两个属性都是必需的。我们不会检查指定并行环境与所请求的 MPI processes 总数之间的一致性(例如,某些并行环境可能已被集群管理员配置为在单机上运行)。您有责任确保信息的有效性,否则提交将失败。
直接在类构造函数中设置字段:
res = ParEnvJobResource(parallel_env='mpi', tot_num_mpiprocs=64)
使用 CalcJob
的 metadata.options
输入字典设置字段:
inputs = {
'metadata': {
'options': {
resources', {'parallel_env': 'mpi', 'tot_num_mpiprocs': 64}
}
}
}
开发插件#
调度插件允许 AiiDA 与特定类型的调度程序通讯。插件应该子类化 Scheduler
类,并实现一些方法,这些方法将指示如何执行某些关键命令,如提交新作业或请求当前活动作业。要开始使用,您可以下载 this template
并实现以下方法:
_get_joblist_command
:返回报告现有工作全部信息的命令。_get_detailed_job_info_command
:返回获取作业详细信息的命令,即使作业已经完成。_get_submit_script_header
: 返回提交脚本头。_get_submit_command
:返回提交指定脚本的字符串。_parse_joblist_output
:解析队列输出字符串,如执行 _get_joblist_command 所返回的命令。_parse_submit_output
:解析执行 _get_submit_command 命令返回的提交命令输出。_get_kill_command
:返回杀死指定 jobid 的作业的命令。_parse_kill_output
:解析杀死命令的输出。parse_output
: 解析调度程序的输出。
除了 _get_detailed_job_info_command
和 parse_output
这两个方法是可选的之外,所有这些方法都**必须执行。除了这些方法,还需要将 _job_resource_class
的类属性设置为 JobResource
的子类。对于像 SLURM、Torque 和 PBS 这样的调度程序,我们可以简单地重复使用与 aiida-core
一起提供的 NodeNumberJobResource
类。对于像 LSF 和 SGE 这样的调度程序,则可以重用 ParEnvJobResource
。如果这两种方法都行不通,我们可以实现一个自定义子类,其模板文件中已经包含了名为 TemplateJobResource
的类。
备注
要通知 AiiDA 您的新调度插件,您必须在 aiida.schedulers
entry point 组中注册一个 entry point。请参考 the section on how to register plugins 的说明。