Python 使用 slurm 进行多处理

Python use slurm for multiprocessing

我想运行一个使用多处理的简单任务(我认为这与在 matlab 中使用 parfor 相同,对吗?)

例如:

from multiprocessing import Pool
def func_sq(i):
    fig=plt.plot(x[i,:])     #x is a ready-to-use large ndarray, just want
    fig.save(....)           #to plot each column on a separate figure

pool = Pool()
pool.map(func_sq,[1,2,3,4,5,6,7,8])

但是我很困惑如何使用 slurm 来提交我的工作。我一直在寻找答案,但找不到好的答案。 目前,虽然不使用多处理,但我正在使用这样的 slurm 作业提交文件:(名为 test1.sh)

#!/bin/bash

#SBATCH -N 1
#SBATCH -n 1
#SBATCH -p batch
#SBATCH --exclusive

module load anaconda3
source activate py36
srun python test1.py

然后,我在提示 window 中输入 sbatch test1.sh。

所以如果我想使用多处理,我应该如何修改我的sh文件?我自己尝试过,但似乎只是将我的 -n 更改为 16,而 Pool(16) 使我的工作重复了 16 次。

或者如果多处理不合适,有没有办法最大化我的性能(我听说过多线程,但不知道它是如何工作的)

我要如何有效地使用我的记忆才不会崩溃? (我的x矩阵很大)

谢谢!

对于GPU,是否可以做同样的事情?我当前没有多处理的提交脚本是:

#!/bin/bash

#SBATCH -n 1
#SBATCH -p gpu
#SBATCH --gres=gpu:1

非常感谢!

我并不是要在这里不受欢迎,但是这个问题似乎表明您实际上并不了解您在这里使用的工具。 Python 多处理允许单个 Python 程序启动子进程以帮助它并行执行工作。这特别有用,因为多线程(这通常是您在其他编程语言中完成此操作的方式)不会让您在 Python 中并行执行代码,原因是 Python's Global Interpreter Lock.

Slurm(我不使用,但通过一些快速研究)似乎是一个相当高级的实用程序,允许个人将工作提交到某种计算机集群(或超级计算机......通常相似的概念)。就其本身而言,它无法了解其启动程序的方式 运行s;也就是说,它与您的 Python 程序继续启动 16 个(或任意多个)辅助进程这一事实无关。它的工作是将你的 Python 程序安排到 运行 作为一个黑盒子,然后坐下来确保它成功完成。

您似乎遇到了一些模糊的数据处理问题。您将其描述为一个大矩阵,但您没有提供足够的信息让我真正理解您要完成的任务。无论如何,如果您实际上不了解您在做什么以及您使用的工具是如何工作的,那么您将一直犹豫不决,直到您最终可能幸运地使它起作用。停止猜测,弄清楚这些工具的作用,环顾四周并阅读文档,然后弄清楚您要完成的工作以及如何以合理的方式拆分工作。

这是我的最佳猜测,但我的工作信息确实很少,因此可能根本没有帮助:

  • 你的 Python 脚本不知道它被 Slurm 运行 多次(我猜你指的是 -n 16)。那么,该作业重复 16 次是有道理的,因为 Slurm 运行 对整个脚本执行了 16 次,并且每次 Python 脚本都会从头到尾完成整个任务。如果您希望 Slurm 和您的 Python 程序交互,以便 Python 程序期望并行获得 运行 多次,我不知道如何帮助您,您将只需要阅读更多关于 Slurm 的内容。
  • 您的数据必须能够被增量地或部分地读取,如果您希望将这项工作分解成多个部分的话。也就是说,如果您只能一次读取整个矩阵,或者根本不能读取整个矩阵,那么您就会遇到从将整个矩阵读入内存开始的解决方案,您表示这不是一个真正的选择。假设你可以,并且你想独立地对每一行执行一些工作,那么你很幸运,你的任务就是正式称为 "embarrassingly parallel" 的任务。如果属实,这是一件非常好的事情。
  • 假设你的问题是并行的(因为看起来你只是想加载数据矩阵的每一行,以某种方式绘制它,然后将该图作为图像保存到磁盘),你可以加载你的数据递增,然后继续阅读 Python 的 multiprocessing 模块,Pool().map 可能是正确的方向。创建一些生成行的 Python 生成器您的数据矩阵,然后将该生成器和 func_sq 传递给 pool.map,然后坐下来等待作业完成。
  • 如果您确实需要在多台机器上完成这项工作,而不是破解您自己的 Slurm + 多处理堆栈,我建议您开始使用实际的数据处理工具,例如 PySpark。

这听起来不像是一个微不足道的问题,即使它是微不足道的,你也没有提供足够的细节让我提供可靠的答案。没有 "just fix this one line" 回答您的问题,但我希望这有助于让您了解您的工具正在做什么以及如何从这里继续。

“-n”标志设置您的 sbatch 提交将要执行的任务数,这就是为什么您的脚本 运行 多次。您想要更改的是“-c”参数,即每个任务分配了多少 CPUs。您的脚本会生成其他进程,但它们将成为父进程的子进程并共享分配给它的 CPUs。只需将“#SBATCH -c 16”添加到您的脚本中。至于内存,每个 CPU 都会为您的作业提供默认的内存量,因此增加 CPU 的数量也会增加可用内存量。如果您还不够,请添加类似“#SBATCH --mem=20000M”的内容以请求特定数量。