python - 如何跨 Slurm 集群上的多个节点运行 MPI Python 脚本?错误:警告:无法在 2 个节点上运行 1 个进程,将 nnodes 设置为 1
问题描述
我正在 Slurm 集群上运行一个可以从并行处理中受益的脚本,所以我正在尝试实现 MPI。但是,它似乎不允许我在多个节点上运行进程。我不知道这是否通常是自动完成的,但是每当我在批处理文件中设置 --nodes=2 以进行提交时,我都会收到错误消息“警告:无法在 2 个节点上运行 1 个进程,将 nnodes 设置为1."
我一直试图让它与一个简单的 Hello World 脚本一起工作,但仍然遇到上述错误。我在运行 MPI 脚本时添加了 --oversubscribe 选项,但仍然出现此错误。
#SBATCH --job-name=a_test
#SBATCH --mail-type=ALL
#SBATCH --ntasks=1
#SBATCH --cpu-freq=high
#SBATCH --nodes=2
#SBATCH --cpus-per-task=2
#SBATCH --mem-per-cpu=1gb
#SBATCH --mem-bind=verbose,local
#SBATCH --time=01:00:00
#SBATCH --output=out_%x.log
module load python/3.6.2
mpirun -np 4 --oversubscribe python par_PyScript2.py
```bash
I still get the expected output, but only after the error message "Warning: can't run 1 processes on 2 nodes, setting nnodes to 1." I'm worried that without being able to run on multiple nodes, my actual script will be a lot slower.
解决方案
警告的原因是这一行:
#SBATCH --ntasks=1
您在其中指定仅在请求 2 个节点之前运行 1 个 mpi 进程。
--ntasks
设置在您的情况下要运行/排名的进程数。然后,您用等价物覆盖它,-n
这就是您看到结果的原因。
供您参考,这是我在系统上运行的脚本,
#!/bin/bash
#SBATCH -C knl
#SBATCH -q regular
#SBATCH -t 00:10:00
#SBATCH --nodes=2
module load python3
START_TIME=$SECONDS
srun -n 4 python mpi_py.py >& py_${SLURM_JOB_ID}.log
ELAPSED_TIME=$(($SECONDS - $START_TIME))
echo $ELAPSED_TIME
性能说明:
- 如果可能,在同一节点上运行代码会更快。节点间通信比节点内慢,它可能会慢一点,但也可能慢得多,这取决于集群架构等因素。
- 请查阅您的集群设置建议。例如,我应该在这个脚本中添加某些 slurm 选项——特别是
-c
和cpu_bind=
(更多在这里)。
推荐阅读
- graphql - 在 NestJS 中使用 GraphQL 模式首先生成的类型
- google-apps-script - 如何每天一次/每周/每月自动刷新谷歌表格?
- apache-kafka - java.lang.IllegalStateException:这不应该发生为 timestamp()
- python - 使用 3 个 2D numpy 数组或 3 个 1D numpy 数组创建一个 3D numpy 数组
- sql-server - 获取查询错误 - 多部分标识符 - 无法绑定到我的 SQL 代码
- angular - Angular getCurrentNavigation().extras
- javascript - 如何切换不同按钮的背景颜色并在 reactjs 中添加幻灯片?
- jestjs - 如何解决 Jest Mock 错误“找不到模块”
- android - 如何在没有查询的情况下在 Retrofit 中提取 Json 数据
- django - 如何在查询集上添加字段和值