簡體   English   中英

如何立即將所有 Snakemake 作業提交到 slurm 集群

[英]How to immediately submit all Snakemake jobs to slurm cluster

我正在使用snakemake構建一個可以在 SLURM 集群上運行的變體調用管道。 集群有登錄節點和計算節點。 任何真正的計算都應該以srunsbatch作業的形式在計算節點上完成。 作業的運行時間限制為 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.

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