QuickStart

在这个示例中,我们将从头开始构建一个简单工作流,完成工作流的节点定义、数据流动定义和运行配置定义。跟随该示例,尝试熟悉构建一个工作流应用的过程。

本示例以一个单源文件程序的编译、运行流程为例,将流程分为 2 步,分别是代码编译步骤( Compile )和测试运行步骤( Run )。

新建工作流,完成基础设置

在 “应用中心” \(\rightarrow\) “我的应用” 中 “添加新应用”,选择 工作流(新建) 选项并确定,在新打开的工作流编辑页中为它命名。

../../../_images/add_workflow_app.gif

目前为一个空白的工作流,只有 “开始” 节点和 “结束” 节点两个默认节点,分别用来控制工作流整体的 “输入参数” 和 “输出参数”。

我们将 “开始” 节点记为 root.inputs,相应的 “结束” 节点则记为 root.outputs

编辑工作流输入

工作流应用提交页的 应用表单 将依据 工作流输入 的设置生成,生成的表单格式与指定的类型有关,对应关系如下:

工作流输入项类型

应用表单控件类型

File

文件选择

string

单行文本

int、float、long、double

数字输入

boolean

开关按钮

enum

下拉列表

可以为输入参数添加 标签 属性,从而改变 应用表单 中对应项的标签名。

双击 开始(root.inputs) 节点进入 工作流输入 的编辑面板:

../../../_images/edit_workflow_inputs.gif

这里,为工作流添加了 4 个输入,分别是:

  • source:文件(File),一个 c 语言的源文件

  • target:字符串(string),编译目标的输出文件名

  • doTest:布尔值(boolean),是否在构建后进行测试

  • param:选填的(允许空值的)字符串(string?),在进行测试时需要附加的命令行参数

新建星光应用节点(Step1 Compile 编译)

新建工作流节点

从左侧节点面板选择所需类型的节点拖入右侧的布局区域,拖入后确定节点 ID 即可完成工作流节点新建( 节点 ID 确定后不可修改)。

当前支持拖入四种类型的工作流节点:

  • 星光应用:该类型节点为一个通过 应用编辑 编排好的应用,此应用可能为一个工作流应用(类型为 cwl/Workflow)或普通应用(类型为 cwl/CommandLineTool

  • 计算任务:该类型节点需要定义一个完整的执行过程,如执行的命令、参数等,类似于定义一个只用于当前工作流的普通应用。具体可参考 cwl/CommandLineTool

  • 表达式:该类型节点不需要运行程序,通过 JS 表达式代码,从输入参数计算得到输出参数,一般用于流程中的一些简单的数据处理。具体可参考 cwl/ExpressionTool

  • 子工作流:该类型节点拖入后将建立子工作流编辑区域,支持在当前工作流内部定义嵌套的工作流。具体可参考 cwl/Workflow

工作流节点 中可查看更详细的节点类型的介绍。

星光工作流可以使用已经创建好的普通应用或工作流应用作为流程节点使用,这里我们使用 示例1 单文件编译(高性能类应用) 中创建的普通应用。

首先,在左侧节点面板的 星光应用 节点上方单击鼠标左键并摁住,移动光标至右侧的编辑界面中后释放左键,在弹出的对话框中填写一个唯一的 ID “Compile”。

../../../_images/drag_in_node.gif

单击可视化编辑区域中的流程节点,会显示节点的输入(左)、输出(右)锚点,可以将当前节点输出锚点拖拽到其它节点的输入锚点上来建立节点间的关联:

../../../_images/click_node.png

完成关联创建后,节点间会显示连线,这代表下一步的节点可以访问上一步的输出。

“compile” 节点需要用到工作流输入中的 sourcetarget 这两个参数,因此从 “开始” 节点连接一条线到 “compile” 节点,如下图所示。

../../../_images/link_node.gif

定义执行过程(选择应用)

双击节点进入编辑模式,编辑 执行过程,选择 我的应用 后选择提前创建好的应用(此示例中为 “CompileOneFile” )。

../../../_images/choose_slapp.gif

绑定星光应用节点输入输出

前面的连线过程确定了节点间存在数据关联,接下来需要通过 输入关联 来对每一项数据管理进行设置:

在上一步 选择应用 后,编辑器已经导入了可进行设置的输入项,只需去除多余项 “info”,再将其它项的 输入源 设置为 开始 节点的同名参数。

同样在节点的 输出 属性中也已根据执行过程中的 输出参数 的定义自动产生了输出项,可以根据需要删除不关心的项(如 “logerr”)。

../../../_images/bind_wf_node_io.gif

新建 计算任务 节点(Step2 Run 运行)

备注

虽然平台推荐使用 星光应用 作为工作流节点,但工作流编辑器中也提供了对 计算任务 节点编辑的支持,供用户直接定义节点的 执行过程

拖动 计算任务 节点来新建一个节点 “Run” ,并连线使其依赖于 “开始” 和 “Compile” 节点:

../../../_images/add_wf_node.2.gif

编辑执行过程

类似于星光普通应用的编辑,在 执行过程 中需要定义 输入参数 列表、设置执行命令、设置 输出参数

此执行过程预计要执行的命令为:

bin [param]

根据上面的命令,该节点需要两个输入:可执行程序和参数。参数不一定是必需的,所以是可选的字符串( string? )。由于 “Run” 节点的输入锚点已经连接了 “Compile” 节点的输出锚点,在设置 “Run” 节点输入参数时可以选择下拉菜单所列出的参考项,如下图所示。

../../../_images/run_add_input.gif

接下来需要定义这两个输入如何反映到命令中。根据执行命令, “bin” 应该是命令的第一位, “params” 是命令的第二位。可以添加 输入绑定 属性把它们绑定到命令中,然后用 参数位置 定义它们的顺序,数字越小,在命令中越靠前。

../../../_images/bind_input_to_cmd.gif

接下来为该节点定义一个 输出参数 “log”,类型为 stdout,表示命令执行的 标准输出流(stdout) 被导出为一个 文件

../../../_images/run_output.gif

备注

如果有需要也可以通过 stderr 输出标准错误流

绑定计算任务节点输入输出

输入关联 栏,点击 关联 按钮,将 “bin”, “params” 参数分别关联到 “Compile” 节点和 “开始” 节点的同名参数中。

节点的 输出 保持自动填充的 “log” 即可。

../../../_images/bind_io.gif

设置执行条件

若流程节点设置了 执行条件 属性,那么会根据此属性的执行结果是否为 true 来判断此节点是否需要执行。

在这个例子中,直接使用 doTest 参数的值来控制是否执行这一步。这个参数在 执行过程 中没有用到。为了能在当前节点使用上这个参数,需要将其添加到 输入关联 中,然后在 执行条件 处通过 $(inputs.doTest) 来访问它。

../../../_images/edit_wf_node_when.gif

编辑工作流输出

为了方便当前工作流能够嵌入到其它工作流中使用,也为了方便工作流使用者管理流程最终的输出文件,可以在 结束(root.outputs) 节点定义工作流的整体输出,并关联至各节点的输出参数。

在本例中,将 “Compile” 和 “Run” 的输出锚点连线至 结束 节点,并在 结束 节点设置 工作流输出 的两个参数: “bin” 和 “log”。

../../../_images/bind_workflow_out.gif

设置工作流属性

最后为工作流定义整体属性。

点击编辑页右上角 设置 按钮,在 基本设置 中设定其作为一个星光应用的标题、图标等。

然后在 运行设置 标签页定义流程各个节点的运行环境。

在本例中为节点 “Compile” 单独指定一个运行环境。新建一个 “CompileGroup” 组,将对应的节点添加进该组,并将运行环境指定为 tianhe2c 集群的 docker_128 分区(一个具备 gcc 编译环境的分区),其它的节点(即 default 项)则指定在 HPC 环境中运行即可。

../../../_images/edit_workflow_property.gif

至此,完成了一个简单的工作流。

在 K8s 中运行

如果希望在容器环境中运行工作流节点,要完成这个切换非常简单:

  1. 补充镜像属性:对于一个需要在容器环境下运行的节点,其 节点编辑 中需要设置 镜像选择 属性,选择所需的镜像。

  2. 运行设置 中将它分配到指定容器集群中运行,或者将其类型设置为 K8s

在此例中,选择让工作流运行在容器中:

  1. 编辑节点 “run”,在 镜像选择 中设置容器镜像为 “ubuntu”

../../../_images/edit_workflow_k8s.gif
  1. 修改 运行设置 中 default 项的运行环境为容器环境 K8s

../../../_images/edit_workflow_k8s_res.gif

提交工作流任务

../../../_images/submit_workflow_job1.gif

工作流提交页面和普通应用类似,会根据工作流的 inputs 创建参数表单,根据运行设置的不同,可能会有 1 个及以上运行参数设置标签页。

部分标签页可能如上图演示的资源组 “CompileGroup” ,集群、分区、套餐选择的下拉菜单中仅有一个选项,这表示该分组的套餐已经被应用编辑者限定了,不可更改(如果用户不具备该资源的使用权限,将无法提交作业)。

查看工作流任务

完成提交后,会进入工作流运行页面。

在运行页:

  • 双击 “开始” 节点,显示提交时的输入参数;

  • 双击 “结束” 节点,显示工作流成功执行结束后的结果数据;

  • 双击 其它节点,则可显示对应节点的运行详情。

    ../../../_images/wf_step_detail.png

对于 分发执行 的嵌套子工作流,可以点击步骤图框标题栏上的下拉按钮,通过下拉列表查看不同分发流程的执行情况,点击选择列表项即可查看流程内各节点的执行详情。

../../../_images/wf_scatter_detail.gif

备注

各元素信息说明如下:

../../../_images/scatter_sub_wf.png

也可以双击节点展开 步骤详情 页,在作业列表栏中逐级查看

../../../_images/wf_scatter_jobs.png

如果查看的节点能关联到具体的作业,可以点击 作业详情 链接进行跳转查看。

对于还在执行的工作流,可以通过右上角的按钮控制流程的暂停、恢复、终止。

../../../_images/wf_job_control.png
  • 暂停:流程不再继续执行,但可以恢复

  • 恢复:流程恢复继续执行

  • 终止:流程不再继续执行,不可以恢复;等待所有仍在运行的节点步骤结束后释放所有资源

用户也可以从 工作流任务 页面主动进入运行页面。

../../../_images/get_workflow_jobs.png

点击对应工作流作业项后的 查看 按钮即可进入对应的 工作流运行 页面查看工作流运行详情。

示例文档

备注

示例对应文档(展开了 Compile 步骤),用户可通过 直接编辑 CWL 代码 功能,直接将示例文档解析为工作流应用。

class: Workflow
cwlVersion: v1.2
doc: []
inputs:
- id: source
  label: 源文件
  type: File
- id: target
  label: 目标文件名
  type: string
- id: doTest
  label: 进行测试
  type: boolean
- id: param
  label: 测试参数
  type: string?
outputs:
- id: bin
  outputSource:
    - Compile/bin
  type: File
- id: log
  outputSource:
    - Run/log
  type: File?
requirements: []
steps:
- doc: []
  id: Compile
  in:
  - id: source
    source:
    - source
  - id: target
    source:
    - target
  label: 编译
  out:
  - bin
  requirements: []
  run:
    arguments:
    - gcc
    - $(inputs.source.path)
    - "-o"
    - $(inputs.target)
    class: CommandLineTool
    inputs:
    - id: source
      type: File
    - id: target
      type: string
    outputs:
    - id: bin
      outputBinding:
        glob:
        - $(inputs.target)
      type: File
  scatter: []
  scatterMethod: ""
  when: ""
- doc: []
  id: Run
  in:
  - id: doTest
    source:
    - doTest
  - id: bin
    source:
    - Compile/bin
  - id: param
    source:
    - param
  label: 运行
  out:
    - log
  requirements: []
  run:
    arguments: []
    class: CommandLineTool
    inputs:
    - id: doTest
      label: 进行测试
      type: boolean
    - id: bin
      inputBinding:
        position: 1
      label: 可执行文件
      type: File
    - id: param
      inputBinding:
        position: 2
      label: 测试参数
      type: string?
    outputs:
    - id: log
      label: 输出日志
      type: stdout
  scatter: []
  scatterMethod: ""
  when: $(inputs.doTest)