本篇記錄如何在 PBS Professional 的排程系統下,使用 Cromwell 執行與管理 WDL Workflow。
下載 Cromwell JAR 封裝檔
從 Cromwell 的 GitHub 網站上可以下載包裝好的 JAR 封裝檔案:
wget https://github.com/broadinstitute/cromwell/releases/download/41/cromwell-41.jar
另外建議可以同時下載 WOMtool:
wget https://github.com/broadinstitute/cromwell/releases/download/41/womtool-41.jar
Backend 設定
參考 SGE 的設定檔範例,編寫 PBS Professional 排程系統用的 backend 設定檔,並將其儲存為 pbs_backend.conf。
# Cromwell PBS Backend 設定檔案
# Backend 設定
backend {
# 設定預設的 backend(對應下方的 PBS provider)
default = PBS
# 定義各種 providers
providers {
# 定義 PBS backend,「PBS」這個名稱是自訂的
PBS {
# 讓 Cromwell 使用下方 config 的設定來送出、管理工作
actor-factory = "cromwell.backend.impl.sfs.config.ConfigBackendLifecycleActorFactory"
# PBS backend 設定
config {
# 最大同時執行的工作數量
concurrent-job-limit = 2
# 定義 HPC 工作執行時所需要的變數
runtime-attributes = """
Int cpu = 10
Int gpu = 1
String pbs_queue = "ctest"
String pbs_project
"""
# PBS Pro 送出工作指令
submit = """
qsub \
-l select=1:ncpus=${cpu}:mpiprocs=${cpu}:ngpus=${gpu} \
-N ${job_name} \
${"-q " + pbs_queue} \
${"-P " + pbs_project} \
-j oe \
${script}
"""
# 擷取工作 ID 的正規表示法(regular expression)
job-id-regex = "(\\d+)"
# 中止工作的 PBS Pro 指令
kill = "qdel ${job_id}"
# 檢查工作是否正在執行的 PBS Pro 指令
check-alive = "qstat ${job_id}"
}
}
}
}
WDL Workflow 檔案
準備 WDL Workflow 檔案,將其儲存為 hpc_workflow.wdl。
task myTask01 {
# 輸出 NVIDIA 顯示卡資訊
command {
nvidia-smi
}
# 指定 PBS Pro 在送工作時所需要的參數
runtime {
cpu: 10
gpu: 1
pbs_queue: "gtest"
pbs_project: "GOV108018"
}
# 輸出檔案
output {
File nvidia_smi = stdout()
}
}
task myTask02 {
# 輸入檔案
File in_file
# 計算 'Tesla' 關鍵字出現次數
command {
grep 'Tesla' ${in_file} | wc -l
}
# 指定 PBS Pro 在送工作時所需要的參數
runtime {
cpu: 2
pbs_queue: "ctest"
pbs_project: "GOV108018"
}
# 輸出整數
output {
Int count = read_int(stdout())
}
}
task myTask03 {
# 輸入檔案
File in_file
# 計算文字行數
command {
cat ${in_file} | wc -l
}
# 指定 PBS Pro 在送工作時所需要的參數
runtime {
cpu: 2
pbs_queue: "ctest"
pbs_project: "GOV108018"
}
# 輸出整數
output {
Int count = read_int(stdout())
}
}
# 定義 Workflow
# +--> myTask02
# myTask01 ---+
# +--> myTask03
workflow myWorkflow {
call myTask01
call myTask02 {
input: in_file=myTask01.nvidia_smi
}
call myTask03 {
input: in_file=myTask01.nvidia_smi
}
}
送出工作
準備好 pbs_backend.conf 設定檔以及 hpc_workflow.wdl 檔案之後,送出前可以使用 WOMtool 檢查一下 WDL 檔案是否正確。
java -jar womtool-41.jar validate hpc_workflow.wdl
Success!
接著執行 Cromwell 透過 PBS Professional 排程系統,將整個 workflow 送出計算:
java -Dconfig.file=pbs_backend.conf -jar cromwell-41.jar run hpc_workflow.wdl
