我想使用多处理运行一个简单的任务(我认为这个任务与在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作业sumit文件,如下所示:(命名为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
然后,我在提示窗口中键入sbatchtest1.sh。
所以,如果我想使用多处理,我应该如何修改我的sh文件?我自己也试过,但似乎只是把我的-n改为16,Pool(16)让我的工作重复了16次。
或者,如果多处理不合适,有没有一种方法可以最大限度地提高我的性能(我听说过多威胁,但不知道它是如何工作的)
我如何有效地利用我的记忆,使它不会崩溃?(我的x矩阵很大)
谢谢
对于GPU来说,可以做同样的事情吗?我当前没有多处理的提交脚本是:
#!/bin/bash
#SBATCH -n 1
#SBATCH -p gpu
#SBATCH --gres=gpu:1
非常感谢
"-n"标志用于设置sbatch提交要执行的任务数,这就是脚本多次运行的原因。您想要更改的是"-c"参数,即每个任务分配了多少CPU。您的脚本会产生额外的进程,但它们将是父进程的子进程,并共享分配给它的CPU。只需在脚本中添加"#SBATCH-c 16"即可。至于内存,每个CPU将为您的作业提供默认的内存量,因此增加CPU数量也会增加可用内存量。如果你还没有得到足够的钱,可以添加一些类似"#SBATCH-mem=200000M"的内容来请求特定的金额。
我并不是不欢迎来到这里,但这个问题似乎表明你实际上并不了解这里使用的工具。Python多处理允许单个Python程序启动子进程,以帮助其并行执行工作。这特别有用,因为由于Python的全局解释器锁,多线程(在其他编程语言中通常是这样实现的)无法在Python中获得并行代码执行。
Slurm(我不使用它,但经过一些快速研究)似乎是一种相当高级的实用程序,允许个人将工作提交给某种计算机集群(或超级计算机……通常是类似的概念)。它本身并不了解它启动的程序是如何运行的;也就是说,它与Python程序继续启动16个(或多个)辅助进程这一事实无关。它的工作是安排Python程序作为黑盒运行,然后坐下来确保它成功完成。
你似乎有一些模糊的数据处理问题。你把它描述为一个大矩阵,但你没有提供足够的信息让我真正理解你想要实现的目标。无论如何,如果你真的不知道自己在做什么,也不知道你使用的工具是如何工作的,你只是在挣扎,直到你最终幸运地做到这一点。停止猜测,弄清楚这些工具的作用,四处看看并阅读文档,然后弄清楚你试图完成什么,以及如何以合理的方式分配工作。
这是我的最佳猜测,但我确实没有什么信息可以参考,所以它可能根本没有帮助:
- 您的Python脚本不知道它被Slurm(我猜您指的是-n 16)多次运行。因此,该作业重复16次是有道理的,因为Slurm会运行整个脚本16次,每次Python脚本都会从头到尾完成整个任务。如果你想让Slurm和你的Python程序交互,这样Python程序就可以并行运行多次,我不知道如何帮助你,你只需要更多地了解Slurm
- 您的数据必须能够增量读取,或者部分读取,如果您有任何希望将此工作分解为碎片的话。也就是说,如果你只能一次读取整个矩阵,或者根本无法读取,那么你就会陷入从将整个矩阵读取到内存开始的解决方案中,你指出这不是一个真正的选择。假设你可以,并且你想独立地对每一行执行一些工作,那么你就足够幸运了,你的任务被正式称为"令人尴尬的并行"。如果这是真的,这是一件非常好的事情
- 假设你的问题是令人尴尬的并行问题(因为看起来你只是试图加载数据矩阵的每一行,以某种方式绘制它,然后将该图作为图像保存到磁盘上),你可以增量加载数据,然后继续读取Python的多处理模块,
Pool().map
可能是正确的方向。创建一些生成数据矩阵行的Python生成器,然后将该生成器和func_sq
传递给pool.map
,然后坐下来等待作业完成 - 如果你真的需要在多台机器上完成这项工作,而不是破解你自己的Slurm+多处理器堆栈,我建议你开始使用实际的数据处理工具,比如PySpark
这听起来不是一个微不足道的问题,即使是,你也没有给我足够的细节来提供一个可靠的答案。你所问的问题没有"只需修复这一行"的答案,但我希望这能帮助你了解你的工具在做什么,以及如何从这里开始。