批处理作业调度程序#

批处理作业调度器管理作业队列和计算资源的执行。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 计算机配置的调度程序中推断,您只需在 CalcJobmetadata.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_machinenum_cores_per_mpiproc 字段为可选字段,必须满足等式要求:

res.num_cores_per_mpiproc * res.num_mpiprocs_per_machine = res.num_cores_per_machine

备注

在 PBSPro 中, num_mpiprocs_per_machinenum_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)

使用 CalcJobmetadata.options 输入字典设置字段:

inputs = {
    'metadata': {
        'options': {
            resources', {'parallel_env': 'mpi', 'tot_num_mpiprocs': 64}
        }
    }
}

开发插件#

调度插件允许 AiiDA 与特定类型的调度程序通讯。插件应该子类化 Scheduler 类,并实现一些方法,这些方法将指示如何执行某些关键命令,如提交新作业或请求当前活动作业。要开始使用,您可以下载 this template 并实现以下方法:

  1. _get_joblist_command :返回报告现有工作全部信息的命令。

  2. _get_detailed_job_info_command :返回获取作业详细信息的命令,即使作业已经完成。

  3. _get_submit_script_header : 返回提交脚本头。

  4. _get_submit_command :返回提交指定脚本的字符串。

  5. _parse_joblist_output :解析队列输出字符串,如执行 _get_joblist_command 所返回的命令。

  6. _parse_submit_output :解析执行 _get_submit_command 命令返回的提交命令输出。

  7. _get_kill_command :返回杀死指定 jobid 的作业的命令。

  8. _parse_kill_output :解析杀死命令的输出。

  9. parse_output : 解析调度程序的输出。

除了 _get_detailed_job_info_commandparse_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 的说明。