Python使用Slurm进行多处理

时间:2018-06-21 19:27:21

标签: python python-3.x multiprocessing slurm

我想使用多处理运行一个简单的任务(我认为这与在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 Job Suit文件,例如:(名为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

然后,在提示窗口中输入sbatch test1.sh。

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

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

我该如何有效地使用我的记忆,以免记忆力下降? (我的x矩阵很大)

谢谢!

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

#!/bin/bash

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

非常感谢!

2 个答案:

答案 0 :(得分:1)

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

Slurm(我不使用,但是经过一些快速研究)似乎是一个相当高级的实用程序,它允许个人将工作提交到某种类型的计算机集群(或超级计算机...通常是类似的概念) )。它本身对启动程序的运行方式没有可见性。也就是说,它与Python程序继续启动16个(或许多)辅助进程的事实无关。它的工作是安排您的Python程序作为黑匣子运行,然后坐下来并确保它成功完成。

您似乎有一些模糊的数据处理问题。您将其描述为一个大型矩阵,但是您却没有给我足够的信息来真正理解您要完成的任务。无论如何,如果您实际上不了解自己在做什么以及所使用的工具是如何工作的,那么您只会之以鼻,直到最终可能幸运地使它能够工作。停止猜测,弄清楚这些工具的作用,浏览并阅读文档,然后弄清楚您要完成的工作以及如何以合理的方式拆分工作。

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

  • 您的Python脚本不知道它会被Slurm多次运行(我想您所指的-n 16)。然后,有意义的是,该作业被重复了16次,因为Slurm会运行整个脚本16次,并且每次Python脚本从头到尾都执行整个任务。如果您希望Slurm与您的Python程序进行交互,以使Python程序希望并行运行多次,那么我不知道该如何帮助您,您只需要阅读更多有关Slurm的内容。
  • 如果您希望将这项工作分解成段,则必须能够增量或部分读取您的数据 。就是说,如果您一次只能读取整个矩阵,或者根本无法读取整个矩阵,那么您将不得不采用将整个矩阵读取到内存中的解决方案,这并不是您真正的选择。假设您可以并且想要独立地在每一行上执行一些工作,那么您很幸运地将您的任务称为正式的“令人尴尬的并行”。如果是这样,这是一件非常好的事情。
  • 假设您的问题令人尴尬地是并行的(因为看起来您只是试图加载数据矩阵的每一行,以某种方式绘制它,然后将该图作为图像保存到磁盘),然后您就可以加载数据了逐步地,然后继续阅读Python的multiprocessing模块,而Pool().map可能是前进的正确方向。创建一些Python生成器来生成数据矩阵的行,然后将该生成器和{{ 1}}到func_sq,然后坐下来等待工作完成。
  • 如果您真的需要跨多台计算机执行此工作,而不是破解自己的Slurm + Multiprocessing堆栈,建议您开始使用实际的数据处理工具,例如PySpark。

这听起来不像是一个小问题,即使有,您也没有提供足够详细的信息来提供可靠的答案。您提出的问题没有“正好解决这一问题”的答案,但是我希望这可以帮助您了解您的工具在做什么以及如何从这里开始。

答案 1 :(得分:0)

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