簡體   English   中英

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 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程序作為黑盒運行,然后坐下來並確保它成功完成。

您似乎有一些模糊的數據處理問題。 您將其描述為一個大型矩陣,但是您卻沒有給我足夠的信息來真正理解您要完成的任務。 無論如何,如果您實際上不了解自己在做什么以及所使用的工具是如何工作的,那么您只會之以鼻,直到最終可能幸運地使它能夠工作。 停止猜測,弄清楚這些工具的作用,瀏覽並閱讀文檔,然后弄清楚您要完成的工作以及如何以合理的方式拆分工作。

這是我的最佳猜測,但實際上我掌握的信息很少,因此可能根本沒有幫助:

  • 您的Python腳本不知道它會被Slurm多次運行(我想您所指的-n 16)。 然后,有意義的是,該作業被重復了16次,因為Slurm會運行整個腳本16次,並且每次Python腳本從頭到尾都執行整個任務。 如果您希望Slurm與您的Python程序進行交互,以使Python程序期望並行運行多次,那么我不知道該如何幫助您,您只需要閱讀更多有關Slurm的內容。
  • 如果您希望將這項工作分解成幾部分,則必須能夠增量或部分讀取數據。 就是說,如果您一次只能讀取整個矩陣,或者根本無法讀取整個矩陣,那么您將不得不采用將整個矩陣讀取到內存中的解決方案,這並不是您真正的選擇。 假設您可以並且想要獨立地在每一行上執行一些工作,那么您很幸運地將您的任務稱為正式的“令人尷尬的並行”。 如果為真,這是一件非常好的事情。
  • 假設您的問題令人尷尬地是並行的(因為看起來您只是嘗試加載數據矩陣的每一行,以某種方式對其進行繪制,然后將該圖形另存為映像保存到磁盤),則可以逐步加載數據,然后繼續閱讀Python的多處理模塊, Pool().map可能是正確的方向。創建一些Python生成器以生成數據矩陣的行,然后將該生成器和func_sqpool.map ,然后坐下來然后等待工作完成。
  • 如果您真的需要跨多台計算機執行此工作,而不是破解自己的Slurm + Multiprocessing堆棧,建議您開始使用實際的數據處理工具,例如PySpark。

聽起來這不是一個小問題,即使有,您也沒有提供足夠詳細的信息來提供可靠的答案。 您所提出的問題沒有“僅解決這一問題”的答案,但是我希望這可以幫助您了解您的工具在做什么以及如何從這里開始。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM