Slurm 多处理 Python 作业
Slurm Multiprocessing Python Job
我有一个 4 节点的 Slurm 集群,每个节点有 6 个核心。我想提交一个测试 Python 脚本(它生成打印它正在 运行 的节点的主机名的进程),如下所示:
def print_something():
print gethostname()
# number of processes allowed to run on the cluster at a given time
n_procs = int(environ['SLURM_JOB_CPUS_PER_NODE']) * int(environ['SLURM_JOB_NUM_NODES'])
# tell Python how many processes can run at a time
pool = Pool(n_procs)
# spawn an arbitrary number of processes
for i in range(200):
pool.apply_async(print_something)
pool.close()
pool.join()
我使用 SBATCH 脚本提交此文件,该脚本指定 nodes=4 和 ntasks-per-node=6,但我发现 Python 脚本执行了 4*6 次。我只希望作业执行一次脚本,并允许 Slurm 在集群中分发进程生成。
我显然不明白这里的东西......?
好的,我明白了。
我需要更好地理解SBATCH和SRUN之间的关系。主要是,SBATCH 可以充当 SRUN 调用的全局作业容器。
此处最大的因素是从 Python 多处理更改为子处理。这样,SBATCH 可以执行一个 python 脚本,该脚本又可以动态调用另一个 python 脚本的 SRUN 子进程,并适当地分配集群资源。
我有一个 4 节点的 Slurm 集群,每个节点有 6 个核心。我想提交一个测试 Python 脚本(它生成打印它正在 运行 的节点的主机名的进程),如下所示:
def print_something():
print gethostname()
# number of processes allowed to run on the cluster at a given time
n_procs = int(environ['SLURM_JOB_CPUS_PER_NODE']) * int(environ['SLURM_JOB_NUM_NODES'])
# tell Python how many processes can run at a time
pool = Pool(n_procs)
# spawn an arbitrary number of processes
for i in range(200):
pool.apply_async(print_something)
pool.close()
pool.join()
我使用 SBATCH 脚本提交此文件,该脚本指定 nodes=4 和 ntasks-per-node=6,但我发现 Python 脚本执行了 4*6 次。我只希望作业执行一次脚本,并允许 Slurm 在集群中分发进程生成。
我显然不明白这里的东西......?
好的,我明白了。
我需要更好地理解SBATCH和SRUN之间的关系。主要是,SBATCH 可以充当 SRUN 调用的全局作业容器。
此处最大的因素是从 Python 多处理更改为子处理。这样,SBATCH 可以执行一个 python 脚本,该脚本又可以动态调用另一个 python 脚本的 SRUN 子进程,并适当地分配集群资源。