更新时间:2022-04-20 GMT+08:00
分享

workflow

必选项,用于定义流程包含的各个步骤,以及步骤之间的依赖关系。一个workflow由多个步骤组成,每个步骤可以执行特定的任务,比如运行容器、执行FPGA程序,或是调用Spark服务加速等任意的华为云服务。当前支持的类型为运行容器,即:GCS.Job。未来会支持其他类型的任务。

workflow格式

workflow:
  <任务名称>:
    description: <当前步骤的描述>
    type: <任务类型>
    tool: <当前任务运行的工具+版本>
    resources: <执行任务需要的资源>
    commands: <容器中执行的命令,直接给出方式>
    commands_iter: <容器中执行的命令,变量迭代方式>
    condition: <当前步骤是否执行的条件>
    depends: <依赖的任务>
表1 GCS.Job参数属性说明

属性

是否必选

参数类型

参数描述

任务名称

String

基因容器具体步骤的任务名称。

以小写字母开始,由小写字母、数字和中划线组成,长度为[1, 40]。

description

String

当前步骤的描述信息,支持中文,长度为[0, 255 ]。

type

String

GCS支持的任务类型,当前仅支持运行容器类,此处填写“GCS.Job”。

tool

String

当前任务运行的工具及版本,格式为“tool_name: tool_version”。例如,0.7.12版本的bwa设置为“tool: bwa:0.7.12”。

须知:

指定的工具必须存在。

resources

Struct

执行任务需要的资源,参数说明参见表2 resources属性说明

commands

array[string]

容器中执行的命令,数组长度表示并发数量。每个成员表示一个容器中执行的命令。提示:可以是任意的Linux命令。如:

a) 直接写要执行的命令,如: echo helloworld; touch sample.txt

b) 把要执行的命令放入待挂载卷中,xx.sh文件,这里直接调用,如:sh /path/to/xx.sh

并发示例:

如下示例中,commands有四行,则表示容器并发数量为4,每个容器分别执行不同的命令

commands:
  - sh /obs/gcscli/run-xxx/run.sh 1 a
  - sh /obs/gcscli/run-xxx/run.sh 2 a
  - sh /obs/gcscli/run-xxx/run.sh 1 b
  - sh /obs/gcscli/run-xxx/run.sh 2 b

提示:

如果命令行是由多行组成,可以使用yaml语法中的“|”(保留换行符,整个字符串当做yaml中一个key的value)格式。这样就可以把大篇幅的命令行原封不动的拷贝过来,如:

commands:
  - |
    samtools merge -f -@ ${nthread} -b ${volume-path-sfs}/${sample}/mergelist.txt \
    ${volume-path-sfs}/${sample}/${sample}.sort.bam && \
    samtools flagstat ${volume-path-sfs}/${sample}/${sample}.sort.bam > ${volume-path-sfs}/${sample}/${sample}.sort.flagstat

详见: yaml语法

须知:

给定的command默认会使用/bin/sh解释器执行,如果需要使用其他解释器如/bin/bash执行脚本,可以通过在命令行前添加解释器来控制,例如:

commands:
  - bash /obs/gcscli/run-xxx/run.sh 1 a #方式1
  - bash -c "echo helloworld"  #方式2
说明:

此参数和commands_iter二选一。如果容器中执行的命令需要带变量,可以使用commands_iter,正常则使用commands。

commands_iter

Struct

容器中执行的命令,和commands区别为,commands_iter支持带变量的shell脚本。数组行数表示并发的数量,参数说明请参见表3 commands_iter属性说明

condition

bool

某个步骤是否执行的条件,用于流程条件分支控制。可以是引用inputs变量,也可以根据上一步的执行结果来判断当前步骤是否执行。详见 条件分支控制

depends

array[Struct]

指定当前任务所依赖的其他任务,数组格式,参数说明请参见表4 depends属性说明

表2 resources属性说明

属性

是否必选

参数类型

参数描述

memory

String

所需内存资源大小,单位为G。此处填写“数字+单位”。

  • 数字支持小数。
  • 单位为G或是g。

例如,需要内存大小为4G,则此处可填写为“4G”或是“4g”。

resources:
  memory: 4G
须知:

请确保请求内存量,小于容器集群中最大节点剩余内存大小。

cpu

String

所需CPU核数,单位为C。此处填写“数字+单位”。

  • 数字支持小数。
  • 单位为C或是c。

例如,所需CPU核数为0.5核,则此处可填写为 "0.5c" 或者 "0.5C"。

resources:
  cpu: 0.5c
须知:

请确保请求CPU核数,小于容器集群中最大节点剩余核数大小。

gpu

Number

所需GPU卡数量,仅数字,无单位。此处填写 "数字"。

  • 数字支持小数。(注:一般GPU推荐整数)

例如,需要1个GPU显卡,则此处可填写为 "1" 。

resources:
  gpu: 1
须知:

请确保请求GPU卡数,小于容器集群中最大GPU节点剩余数大小。

options

Struct

gpu的配置参数,参数说明请参见表3

例如:

options:  
    gpu-type: nvidia.com/gpu-tesla-v100-16GB
    gpu-driver: gpu-396.26
须知:

该参数只有在CCI环境中才生效。

表3 gpu的配置参数

属性

是否必选

参数类型

取值约束

gpu-type

String

gpu的类型,当前支持3种类型。

  • nvidia.com/gpu-tesla-p4:NVIDIA Tesla P4 8G显卡
  • nvidia.com/gpu-tesla-v100-16GB:NVIDIA Tesla V100 16G显卡
  • nvidia.com/gpu-tesla-v100-32GB:NVIDIA Tesla V100 32G显卡

详细说明请参见使用GPU

gpu-driver

String

gpu驱动的版本。当前支持如下两个版本。

  • gpu-460.106:460.106版本,配套CUDA 11.2.2 Update 2 及以下CUDA Toolkit版本。
  • gpu-396.26:396.26版本,配套CUDA 9.2 (9.2.88)及以下CUDA Toolkit版本。

详细说明请参见使用GPU

表4 commands_iter属性说明

属性

是否必选

参数类型

取值约束

command

String

带变量的任意Linux脚本,具体可以参考commands属性说明,变量由如下两种获取方式:

  • 从vars或者vars_iter传递过来的变量,引用方式与shell一致,如“${1}”表示取第一个参数,取第二个参数则用“${2}”,依次递增。其中vars和vars_iter参数,两个二选一填写。vars参数需要列出所有组合,vars_iter参数为自动遍历组合(详见该字段描述)。
  • 基因容器提供的内置变量“${item}”,表示容器并发执行时,当前执行到了第几个容器,该计数从零开始。例如并发4个容器时,command命令为“echo ${item}”,则将按容器执行顺序,分别打印0,1,2,3。

vars

array[array]

二维数组,做为command代入变量,表示手动列出所有组合。

说明:

vars和vars_iter二选一。如果变量变化有固定规则,推荐使用vars_iter,可自动迭代变量,不用手动列出该变量的所有组合。

  • 二维数组中,每一行的成员代表command命令中的变量${1},${2},${3}等。${1}即代表各行的第一个成员,${2}代表各行第二个成员,${3}代表各行第三个成员。
  • 二维数组中,有几行表示command命令迭代执行几次,同时也代表容器并发数量。在command命令执行过程中,先代入数组第一行,再按次序代入第二行,第三行等,直到数组代入完成。数组的行数即容器并发数量。

例如,如下示例中,vars有四行,则表示容器并发数量为4。

command: echo ${1} ${2} ${item}
vars:
  - [0, 0]  # 每行代表一个并发。成员按顺序分别传入${1}和${2}...
  - [0, 1]  # 这个并发中,0 -> ${1}; 1 -> ${2}
  - [1, 0]  # 这个并发中,1 -> ${1}; 0 -> ${2}
  - [1, 1]  # 这个并发中,1 -> ${1}; 1 -> ${2}

执行后,

启动4个容器,

第一个容器代入数组第一行,执行:

echo 0 0 0

第二个容器代入数组第二行,执行:

echo 0 1 1

第三个容器代入数组第三行,执行:

echo 1 0 2

第四个容器代入数组第四行,执行:

echo 1 1 3

vars_iter

array[array]

二维数组,做为command代入变量,表示自动遍历组合。

数组的第一行成员遍历代入command命令中的变量${1},第二行成员遍历代入命令中的变量${2},以此类推。

示例:如下示例表示4个容器并发,执行效果与vars示例相同。

command: echo ${1} ${2}
vars_iter:
  - [0, 1]   # 第一行表示${1} 的迭代范围
  - [0, 1]   # 第二行表示${2} 的迭代范围

如果某一行的数组成员很多,可以使用 range函数。range(1,4)表示数组[1, 2, 3]。前闭区间,后开区间,例如:

vars_iter:
  - range(0, 4)

等同于:

vars_iter:
  - [0, 1, 2, 3]

提示迭代范围可以使用输入变量,见inputs,如:

inputs:
  samples:  # <=== 定义数组类型的变量
    type: array
    default: [a, b, c, d]
workflow:
  job-a:
    command: echo ${1}
    vars_iter:
      - ${samples}  # <=== 使用此数组作为迭代范围

表5 depends属性说明

属性

是否必选

参数类型

取值约束

target

String

所依赖的任务名,请确保指定的任务名必需存在。

type

String

依赖方式,可取值为:

  • whole,整体依赖,此为默认值
  • iterate,迭代式依赖。

例如,如果步骤一和步骤二都并发执行100个容器。

  • 设置whole则表示步骤一全部执行结束后,才能开始执行步骤二。
  • 设置iterate则表示,步骤一的1号执行完成,就可以开始执行步骤二的1号,并行执行,可以提高整体的并发效率。

workflow配置样例

workflow:
  job-a:
    tool: nginx:latest
    type: GCS.Job
    resources:
      memory: 2G
      cpu: 1c
    commands:
      - sleep `expr 3 \* ${wait-base}`; echo ${output-prefix}job-a | tee -a ${obs}/${output}/${result};
  job-b:
    tool: nginx:latest
    type: GCS.Job
    commands_iter:
      command: sleep `expr ${1} \* ${wait-base}`; echo ${output-prefix}job-b-${item} | tee -a ${obs}/${output}/${result};
      vars_iter:
        - range(0, 4) #内置函数range,实际表示 [0, 1, 2, 3]。最终并发执行4个容器,每个使用数组成员替代
    depends:
      - target: job-a
        type: whole #可不写,whole为默认值
  job-c:
    tool: nginx:latest
    type: GCS.Job
    resources:
      memory: 8G
      cpu: 2c
    commands_iter:
      command: sleep `expr ${1} \* ${wait-base}`; echo ${output-prefix}job-c-${item} | tee -a ${obs}/${output}/${result};
      vars_iter:
        - [3, 20] #最终并发2个容器,每个使用数组成员替代
    depends:
      - target: job-a
        type: iterate
      - target: job-b

相关文档