2015-08-18 155 views
2

我有一個可執行文件,它需要多個選項和多個文件輸入才能運行。可執行文件可以通過可變數量的內核來運行。SLURM sbatch多個並行調用可執行文件

E.g.可執行文件-a -b -c文件fileA文件fileB ...文件fileZ -cores X

我正在嘗試創建一個sbatch文件,該文件使我可以對此可執行文件進行多次調用不同的投入。每個呼叫都應該使用X核心在不同的節點(與其他節點並行)中分配。核心層的並行處理由可執行文件來完成,而在SLURM的節點層進行。

我試過用ntasks和多個sruns,但第一個srun被多次調用。

另一個需要重新命名文件並在擴展名之前使用SLURM進程或節點號作爲文件名,但它並不實際。

對此有何見解?

+0

它必須是單個腳本還是可以是多個sbatch腳本? –

+0

我認爲單個腳本將是最有用的 – IVy

回答

0

我設法找到一個可行的解決方案,所以我張貼供參考:

我宣佈爲多任務調用可執行文件,以及節點和每個呼叫的CPU所需的號碼。

然後爲每個調用分別創建一個srun,聲明每個調用的節點和任務的數量。所有sruns都與&符號綁定(&):

srun -n 1 -N 1 - 獨佔可執行文件-a1 -b1 -c1 -file fileA1 - 文件fileB1 ... - 文件fileZ1 - 核心X1 &

SRUN -N 1 -N 1 --exclusive可執行-A2-B2-C2 -file fileA2 --file fileB2 ... --file fileZ2 --cores X2 &

....

srun -n 1 -N 1 - 獨佔可執行文件-aN -bN -cN-文件文件AN-文件文件BN ... - 文件fileZN - 核心XN

- 編輯:經過一些測試(正如我在下面的評論中提到的那樣),如果最後一個srun的過程在其他過程之前結束,它似乎結束了整個工作,其餘的未完成。

--edited由普約爾Fenoy

+1

您應該將--exclusive標誌添加到srun命令 –

+0

您可以使用[GNU並行](https://www.gnu.org/software/parallel/)和srun以減輕命令參數的產生。 – damienfrancois

+0

我對最後一個srun有問題。如果它是第一個結束,它會殺死所有剩餘的進程。即使我將nokill和-k添加到每個srun調用中。有任何想法嗎? – IVy

1

我做這些樣的工作總是與bash腳本的幫助下,我由sbatch命令來運行基於註釋。最簡單的方法是在sbatch腳本中創建一個循環,在其中使用srun指定可執行文件下的不同作業和作業步驟,即使用-w指定部分中的相應節點名稱。你也可以閱讀slurm數組作業的文檔(如果這更適合你)。或者,您也可以將所有參數組合存儲在文件中,並使用查看「數組作業」手冊頁的腳本對它們進行循環。或許下面的腳本(我只是把它包裹起來)可以幫助你感受我心中的想法(我希望它能滿足你的需求)。它沒有測試,所以不只是複製和粘貼它!

#!/bin/bash 

parameter=(10 5 2) 
node_names=(node1 node2 node3) 


# lets run one job per node each time taking one parameter 

for parameter in ${parameter[*]} 
    # asign parameter to node 
    #script some if else condition here to specify parameters 
    # -w specifies the name of the node to use 
    # -N specifies the amount of nodes 
    JOBNAME="jmyjob$node-$parameter" 
    # asign the first job to the node 
    $node=${node_names[0]} 
    #delete first node from list 
    unset node_names[0]; 
    #reinstantiate list 
    node_names=("${Unix[@]}") 
    srun -N1 -w$node -psomepartition -JJOBNAME executable.sh model_parameter & 

done; 

您將遇到需要強制您的sbatch腳本等待上一個作業步驟的問題。在這種情況下,附加while循環可能會對您有所幫助。

# Wait for the last job step to complete 
while true; 
do 
    # wait for last job to finish use the state of sacct for that 
    echo "waiting for last job to finish" 
    sleep 10 
    # sacct shows your jobs, -R only running steps 
    sacct -s R,gPD|grep "myjob*" #your job name indicator 
    # check the status code of grep (1 if nothing found) 
    if [ "$?" == "1" ]; 
    then 
    echo "found no running jobs anymore" 
    sacct -s R |grep "myjob*" 
    echo "stopping loop" 
    break; 
    fi 
done; 
+0

acct -s R,gPD未被識別。這是一個錯字還是其他版本?我已經刪除了「,gPD」,但腳本沒有結束並保持所有節點被佔用。 – IVy

+0

是的,你需要找到一個grep表達式來查找正在運行的作業的待處理作業步驟。 – PlagTag

+0

srun命令不能滿足一個簡單的等待?如此處所示http://geco.mines.edu/scripts/notes.pdf - 第62頁? – IVy