1.3. 基本概念#

本章节介绍用户开始运用通用工作流语言(CWL)所需的基本概念。读者应了解工作流管理工具和 YAML, 且能较为自如地按照文中指示操作命令行。这些概念在《用户指南》其他部分有更详尽的说明。如果您已了解 CWL, 或想查阅进阶内容,可以考虑跳过本章节。

1.3.1. CWL 规约#

CWL 的作用在于描述各种命令行工具,并且将它们连接起来,以创建工作流 (workflow)。CWL 是一种规范,而非某种特定的软件。因此,由 CWL 描述的工具和工作流能够移植到支持 CWL 标准的多种平台。

CWL 规约由 CWL 社群撰写并维护,此规约现有多个版本,本《用户指南》所涵盖的是版本 v1.2.

规约的版本号码由至多三个数字构成,以 .(圆点)分隔。第一个数字为主发布版本,用于向后不可兼容的更改,例如删除过时的功能。第二个数字是次级发布版本,用于新增功能或向后兼容的小幅调整。最后一个数字用于错误修复,例如打字错误或其他更正。

备注

规约所使用的版本标号模型称为“语义型版本”,请参阅本章结尾以了解更多相关信息。

1.3.2. 实现#

所谓 CWL 规约的某种“实现” (implementation), 指的是任何一种依照某版本的规约内容而编写的软件。然而,诸实现未必能将规约的每个方面都转化为软件实体。目前,CWL 各种实现的许可协议包括开源和商业许可。

CWL非常适用于描述集群、云计算和高性能计算 (HPC) 等多节点、任务并行调度环境中的大规模工作流。

digraph G { compound=true; rankdir="LR"; ranksep=0.75; fontname="Verdana"; fontsize="10"; graph [splines=ortho]; node [fontname="Verdana", fontsize="10", shape=box]; edge [fontname="Verdana", fontsize="10"]; subgraph cluster_0 { label="Implementations"; ranksep=0.25; cwltool; toil; Arvados; runner_others[label="..."]; label="CWL Runners"; } subgraph cluster_1 { label="Tools"; ranksep=0.25; subgraph cluster_2 { "vscode-cwl"; "vim-cwl"; benten; editor_others[label="..."]; label="Editors"; } subgraph cluster_3 { "CWL Viewer"; "vue-cwl"; viewer_others[label="..."]; label="Viewers"; } "And more"; } cwltool -> "CWL Specification" [ltail=cluster_0, dir=back]; "CWL Specification" -> "vscode-cwl" [lhead=cluster_1]; "vscode-cwl" -> "CWL Viewer" [style=invis]; "CWL Viewer" -> "And more" [style=invis]; }

CWL 规约、实现及其他工具。#

1.3.3. 流程和要求#

流程 (process) 是指接收输入并生成输出的计算单元,影响其行为的包括输入 (input)、要求 (requirement) 及提示 (hint)。CWL 规约 v1.2 版定义了如下四种流程:

  • 命令行工具。

  • 表达式工具。

  • 操作。

  • 工作流。

digraph "A GraphViz graph with the CWL processing units, e.g. Process, Workflow, CommandLineTool, etc." { rankdir="TB"; graph [splines=false]; node [fontname="Verdana", fontsize="10", shape=box]; edge [fontname="Verdana", fontsize="10"]; Process; CommandLineTool; ExpressionTool; Operation; ProcessGenerator; Workflow; node[label="", width=0, height=0]; edge[arrowhead=none]; n1; {rank=same; CommandLineTool; ExpressionTool; Operation; ProcessGenerator; Workflow;} Process -> n1 [arrowhead=normal, dir=back]; n1 -> CommandLineTool; n1 -> ExpressionTool; n1 -> Operation; n1 -> ProcessGenerator; n1 -> Workflow; }

可用在 CWL 对象模型中的处理单元。#

“命令行工具”指的是 echolstar 等命令行程序的包装器 (wrapper)。从工作流中可以调用命令行工具。

“表达式工具”是 JavaScript 表达式的包装器。通过将工作流执行过程中的相同部分整理为可重用的 JavaScript 代码,像命令行工具一样接受输入并生成输出,工作流和命令行工具可以得到简化。

“操作”是一种抽象的过程,它同样可接受输入、生成输出,并用于工作流中。但是,这一类特殊操作并不十分常用。用户指南的 《操作》一节将进行讨论。

“工作流”指的是可分为步骤的流程。“步骤”可以是其他工作流(嵌套工作流),也可以是命令行工具或表达式工具。工作流的输入可以传递给它的任一步骤,而其步骤生成的输出可用作工作流的最终输出。

CWL 规约允许其实现提供额外功能,或通过 requirements (要求)指定工作流的先决条件。CWL 规约定义了诸种要求,如:

某些 CWL 运行程序可能提供规约之外的需求。例如 cwltool 提供 cwltool:CUDARequirement 以支持GPU需求,但这不在 v1.2 版本规约之内,可能不受其他 CWL 运行程序支持。

“提示”与需求类似。其区别是,列为“需求”的功能是不可缺少的,而提示仅列出可选功能。更详细介绍请见 《需求》一章。

1.3.4. FAIR 工作流#

FAIR 为数字资源(尤其是数据)的共享和发布提供了一组基本原则。FAIR 四项原则强调“机器可读”的重要性,进而提出应使所有数字资源可发现、可访问、可互操作以及可重用 (Findable, Accessible, Interoperable, and Reusable)。工作流通过代码所描述的,正是让科学工作得以开展、数据得以创建的过程。因此,应强调工作流须支持创建 FAIR 数据,并且其自身也遵从 FAIR 原则。—— 工作流社群行动之FAIR 计算工作流

CWL 滥觞于“make”一类推定任务间依赖关系,并据此决定其执行次序的工具。但与“make”的不同在于,CWL 任务是存在于独立环境中的,其输入和输出需要明确指定。

明确而独立,其益处在于灵活、可移植及可扩缩。CWL 所描述的工具和工作流,既能无缝对接 Docker 等技术以发挥其优势,又能通用于不同供应方的 CWL 实现环境中。

同时,cwltool 将 PROV-O 标准本体 (standard ontology) 运用于数据来源的保证。

1.3.5. 了解更多信息#