[英]How to immediately submit all Snakemake jobs to slurm cluster
我正在使用snakemake
構建一個可以在 SLURM 集群上運行的變體調用管道。 集群有登錄節點和計算節點。 任何真正的計算都應該以srun
或sbatch
作業的形式在計算節點上完成。 作業的運行時間限制為 48 小時。 我的問題是,處理很多樣本,尤其是在隊列繁忙的情況下,處理每個樣本的所有規則需要超過 48 小時。 傳統的snakemake
集群執行snakemake
留下一個主線程運行,該線程僅在所有規則的依賴項運行完畢后才將規則提交到隊列。 我應該在計算節點上運行這個主程序,所以這將我的整個管道的運行時間限制為 48 小時。
我知道 SLURM 作業有依賴指令,告訴作業等待運行,直到其他作業完成。 由於snakemake
工作流是一個 DAG,是否可以一次提交所有作業,每個作業的依賴項都由 DAG 的規則依賴項定義? 提交所有作業后,主線程將完成,繞過 48 小時限制。 這是否可能與snakemake
,如果是這樣,它是如何工作的? 我找到了--immediate-submit
命令行選項,但我不確定這是否具有我正在尋找的行為以及如何使用該命令,因為我的集群在作業完成后打印Submitted batch job [id]
提交到隊列,而不僅僅是作業 ID。
不幸的是,立即提交不能開箱即用,但需要進行一些調整才能工作。 這是因為作業之間的依賴關系在集群系統之間傳遞的方式不同。 不久前,我遇到了同樣的問題。 正如立即提交文檔所說:
立即將所有作業提交到集群,而不是等待當前的輸入文件。 這將失敗,除非您讓集群知道作業依賴關系,例如通過: $ snakemake –cluster 'sbatch –dependency {dependencies}。 假設您的提交腳本(此處為 sbatch)將生成的作業 ID 輸出到第一個 stdout 行,{dependencies} 將填充此作業所依賴的以空格分隔的作業 ID。
所以問題是sbatch
不會將生成的作業 id 輸出到第一個 stdout 行。 但是,我們可以使用我們自己的 shell 腳本來規避這一點:
parseJobID.sh:
#!/bin/bash
# helper script that parses slurm output for the job ID,
# and feeds it to back to snakemake/slurm for dependencies.
# This is required when you want to use the snakemake --immediate-submit option
if [[ "Submitted batch job" =~ "$@" ]]; then
echo -n ""
else
deplist=$(grep -Eo '[0-9]{1,10}' <<< "$@" | tr '\n' ',' | sed 's/.$//')
echo -n "--dependency=aftercorr:$deplist"
fi;
並確保使用chmod +x parseJobID.sh
授予腳本執行權限。
然后我們可以像這樣調用立即提交:
snakemake --cluster 'sbatch $(./parseJobID.sh {dependencies})' --jobs 100 --notemp --immediate-submit
請注意,這將同時提交最多 100 個作業。 您可以將其增加或減少到您喜歡的任何數量,但要知道大多數集群系統不允許每個用戶同時處理超過 1000 個作業。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.