我对 PBS 不是很熟悉(我们在这里安装了扭矩),到目前为止,我只用它来为每个作业运行一个进程,所以请多多包涵。
实际问题
我正在尝试在集群上使用 Mathematica。Mathematica 的并行处理是通过启动多个工作进程(称为子内核)并向它们发送命令以运行来实现的。
Mathematica 对 PBS 有一些支持,并且能够将子内核作为 PBS 作业启动。它使用qsub
命令执行此操作。
虽然做大部分工作的是子内核(实际上我有一些 C 代码链接到它们),但收集结果的是主 Mathematica 内核。因此主内核也使用少量但非零的 CPU 时间。这意味着我无法在头节点上启动主内核,因为在它用完一定量的 CPU 时间后,它将自动终止(不允许在头节点上手动启动,只能通过qsub
)。所以我也需要使用启动主内核qsub
。这将导致作业启动更多作业(qsub
从提交的作业中调用qsub
),这显然不起作用。
可以像这样轻松测试:
启动一个“交互式作业”(qsub -I
这实际上是我更喜欢启动主内核的方式,以便我可以手动监控计算的进度),然后在您尝试提交另一个作业的 shell 中qsub
:这些嵌套qsub
的导致qsub: Job rejected by all possible destinations
错误。
问题 1: 有没有办法让嵌套qsub
的 s 工作?一个作业可以排队更多作业吗?这将是理想的解决方案。
问题 2:如果不允许这样做,那么从一个作业启动多个进程并将它们分布在空闲集群节点上的正确方法是什么?我假设我需要以某种方式通过 PBS,询问哪些机器是空闲的,在这些机器上启动进程(如何?用ssh executablename
?),然后告诉 PBS 我实际上在哪台机器上启动了多少进程。这个对吗?如果是,如何实施细节?
我宁愿不必走第二条路线,因为这将涉及使用不同的机制重新实现 Mathematica 的子内核启动qsub
。这是很多额外的工作。