本篇記錄如何在 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

參考資料:Cromwell DocCromwell RuntimeAttributesWDL language specificationOpenWDLWDL Draft-3