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; Workflow;
node[label="", width=0, height=0];
edge[arrowhead=none];
n1;
{rank=same; CommandLineTool; ExpressionTool; Operation; Workflow;}
Process -> n1 [arrowhead=normal, dir=back];
n1 -> CommandLineTool; n1 -> ExpressionTool; n1 -> Operation; n1 -> Workflow;
}
可用在 CWL 对象模型中的处理单元。#
“命令行工具”指的是 echo、ls 及 tar 等命令行程序的包装器 (wrapper)。从工作流中可以调用命令行工具。
“表达式工具”是 JavaScript 表达式的包装器。通过将工作流执行过程中的相同部分整理为可重用的 JavaScript 代码,像命令行工具一样接受输入并生成输出,工作流和命令行工具可以得到简化。
“操作”是一种抽象的过程,它同样可接受输入、生成输出,并用于工作流中。但是,这一类特殊操作并不十分常用。用户指南的 《操作》一节将进行讨论。
“工作流”指的是可分为步骤的流程。“步骤”可以是其他工作流(嵌套工作流),也可以是命令行工具或表达式工具。工作流的输入可以传递给它的任一步骤,而其步骤生成的输出可用作工作流的最终输出。
CWL 规约允许其实现提供额外功能,或通过 requirements (要求)指定工作流的先决条件。CWL 规约定义了诸种要求,如:
InlineJavascriptRequirement - enables JavaScript in expressions.
SubworkflowFeatureRequirement —— 启用嵌套工作流。
InitialWorkDirRequirement —— 控制输入目录中的暂存文件。
某些 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. 了解更多信息#
语义型版本 —— https://semver.org/
CWL网站上的规约页面: https://www.commonwl.org/specification/
The Command Line Tool Description Standard: https://w3id.org/cwl/CommandLineTool.html
GitHub 上的 CWL 规约当前版本: common-workflow-language/cwl-v1.2
CWL 网站所列的诸种实现:https://www.commonwl.org/implementations/
PROV-O:PROV 本体 —— https://www.w3.org/TR/prov-o/
CWL 操作 (operations) 见于本《用户指南》中《操作》一章。