[英]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 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
“ -n”標志設置您的批處理提交將要執行的任務數,這就是腳本多次運行的原因。 您要更改的是“ -c”參數,該參數是每個任務分配了多少個CPU。 您的腳本會產生其他進程,但它們將成為父進程的子進程,並共享分配給它的CPU。 只需在腳本中添加“ #SBATCH -c 16”即可。 至於內存,每個CPU將為您的作業分配默認的內存量,因此增加CPU數量也會增加可用內存量。 如果還不夠,請添加“ #SBATCH --mem = 20000M”之類的內容以請求特定金額。
我並不是要在這里不受歡迎,但是這個問題似乎表明您實際上並不了解在此使用的工具。 Python多重處理允許單個Python程序啟動子進程,以幫助其並行執行工作。 這是特別有用的,因為由於Python的Global Interpreter Lock ,多線程(通常是您在其他編程語言中完成此任務的方式)無法在Python中獲得並行代碼執行。
Slurm(我不使用,但經過一些快速研究)似乎是一個相當高級的實用程序,它允許個人將工作提交到某種類型的計算機集群(或超級計算機,通常是類似的概念)。 它本身對啟動程序的運行方式沒有可見性。 也就是說,它與Python程序繼續啟動16個(或許多)輔助進程的事實無關。 它的工作是安排您的Python程序作為黑盒運行,然后坐下來並確保它成功完成。
您似乎有一些模糊的數據處理問題。 您將其描述為一個大型矩陣,但是您卻沒有給我足夠的信息來真正理解您要完成的任務。 無論如何,如果您實際上不了解自己在做什么以及所使用的工具是如何工作的,那么您只會之以鼻,直到最終可能幸運地使它能夠工作。 停止猜測,弄清楚這些工具的作用,瀏覽並閱讀文檔,然后弄清楚您要完成的工作以及如何以合理的方式拆分工作。
這是我的最佳猜測,但實際上我掌握的信息很少,因此可能根本沒有幫助:
Pool().map
可能是正確的方向。創建一些Python生成器以生成數據矩陣的行,然后將該生成器和func_sq
給pool.map
,然后坐下來然后等待工作完成。 聽起來這不是一個小問題,即使有,您也沒有提供足夠詳細的信息來提供可靠的答案。 您所提出的問題沒有“僅解決這一問題”的答案,但是我希望這可以幫助您了解您的工具在做什么以及如何從這里開始。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.