使用YAML定义工作流
更新时间:2026-03-22
百舸工作流使用YAML格式定义,通过编排YAML配置文件配置工作流任务参数、任务串行/并行/菱形等结构关系。
基本结构
工作流的定义包含三部分:
- 工作流全局配置:工作流全局生效的配置项,包括version、kind、inputs等
- 任务模板:任务的配置模板,工作流中的每个任务均作为一个分布式训练任务,任务模板中定义配置信息以及输入参数
- 任务编排:通过引用任务配置模板定义每个节点运行的内容,并编排节点的执行顺序与依赖关系
如下是一个工作流配置yaml的基本结构,其中:
inputs定义了工作流的全局输入参数taskTemplates定义任务的配置,详细参数说明参考 API参考/分布式训练相关接口/创建训练任务 接口参数tasks中编排了工作流中任务的任务执行顺序与依赖关系,并定义了每个任务节点的输入值
YAML
1version: v1
2kind: PipelineTemplate
3inputs:
4 ...
5taskTemplates:
6 ...
7tasks:
8 ...
YAML配置文件示例
- 所有示例中的queue(队列ID)等参数,使用时需要替换成工作流所在资源池下的某个队列ID
- 为了方便说明,示例中的模板(taskTemplate)使用了最小化参数,完整的任务参数模板参考下方
通用任务模板- 当前仅支持CustomTask一种工作流任务类型,即仅支持百舸分布式训练任务
创建一个单任务工作流
定义任务模板
YAML
1...
2taskTemplates:
3- name: hello_world_temp
4 type: CustomTask
5 spec: #任务参数信息,与创建分布式训练任务接口参数相同
6 queue: aihc-g8u9xas #替换为实际的队列ID
7 jobType: PyTorchJob
8 command: sleep 30s
9 jobSpec:
10 replicas: 1
11 image: registry.baidubce.com/aihc-aiak/aiak-megatron:ubuntu20.04-cu11.8-torch1.14.0-py38_v1.2.7.12_release
12 resources: []
13 envs:
14 - name: NCCL_DEBUG
15 value: DEBUG
16 - name: NCCL_IB_DISABLE
17 value: '0'
18 labels: []
19 datasources: [] #存储挂载
20 ...
21...
任务编排
YAML
1...
2tasks:
3- name: hello_world # 节点名
4 taskTemplateName: hello_world_temp # 引用的任务模板名称
5...
完整工作流YAML
以下工作流包含一个任务节点(该任务在休眠30s后自动结束)
YAML
1version: v1
2kind: PipelineTemplate
3taskTemplates:
4- name: hello_world_temp
5 type: CustomTask
6 spec:
7 queue: aihc-g8u9xas
8 jobType: PyTorchJob
9 command: /bin/bash -c "echo 'I am a aihc-workflow test job' && sleep 30s"
10 jobSpec:
11 replicas: 1
12 image: registry.baidubce.com/aihc-aiak/aiak-megatron:ubuntu20.04-cu11.8-torch1.14.0-py38_v1.2.7.12_release
13 resources: []
14 envs:
15 - name: NCCL_DEBUG
16 value: DEBUG
17 - name: NCCL_IB_DISABLE
18 value: '0'
19 labels: []
20 datasources: []
21tasks:
22- name: hello_world
23 taskTemplateName: hello_world_temp
创建任务A串联任务B的线性工作流
定义任务模板
YAML
1...
2taskTemplates:
3 - name: demo
4 type: CustomTask
5 spec:
6 queue: aihc-g8u9xas
7 jobType: PyTorchJob
8 command: /bin/bash -c "echo 'I am a aihc-workflow test job' && sleep 30s"
9 jobSpec:
10 replicas: 1
11 image: registry.baidubce.com/aihc-aiak/aiak-megatron:ubuntu20.04-cu11.8-torch1.14.0-py38_v1.2.7.12_release
12 resources: []
13 envs:
14 - name: NCCL_DEBUG
15 value: DEBUG
16 - name: NCCL_IB_DISABLE
17 value: '0'
18 labels: []
19 datasources: []
20 ...
21...
任务编排
定义每个节点引用的任务模板,以及节点间的依赖关系
YAML
1...
2tasks:
3 - name: task_a
4 taskTemplateName: demo # 引用demo中定义的任务配置
5 - name: task_b
6 taskTemplateName: demo
7 dependencies: # 指定任务上游依赖
8 - task_a # 依赖 task_a 运行结束
9...
完整工作流YAML
YAML
1version: v1
2kind: PipelineTemplate
3taskTemplates:
4 - name: demo
5 type: CustomTask
6 spec:
7 queue: aihc-g8u9xas
8 jobType: PyTorchJob
9 command: /bin/bash -c "echo 'I am a aihc-workflow test job' && sleep 30s"
10 jobSpec:
11 replicas: 1
12 image: registry.baidubce.com/aihc-aiak/aiak-megatron:ubuntu20.04-cu11.8-torch1.14.0-py38_v1.2.7.12_release
13 resources: []
14 envs:
15 - name: NCCL_DEBUG
16 value: DEBUG
17 - name: NCCL_IB_DISABLE
18 value: '0'
19 labels: []
20 datasources: []
21tasks:
22- name: task_a # A节点名称
23 taskTemplateName: demo # 引用的任务模板名称
24- name: task_b # B节点名称
25 taskTemplateName: demo # 引用的任务模板名称
26 dependencies: # 指定任务上游依赖
27 - task_a # 依赖task_a运行结束后开始执行
配置工作流输入参数
以上我们知道工作流中的每一个任务节点必须引用某个任务模板(taskTemplate),在实际业务流程中当我们基于某个任务模版向工作流中添加任务节点,尤其复杂工作流中基于相同任务模板添加多个任务时,一般需要通过个性配置全局工作流输入参数,之后可以在子任务中引用工作流的输入作为个性化参数
一般简单工作流中也可以使用taskTemplate与task一对一的关系,在taskTemplate中直接定义任务参数,复杂工作流时则可使用输入参数简化操作
定义全局输入参数
在顶层的inputs字段定义参数,可以在全局被任务模板和任务引用
YAML
1...
2# 定义 Pipeline 的输入参数
3inputs:
4- name: image_url # 参数名
5 type: string # 参数类型
6 hint: 镜像地址 # 参数描述
7 defaultValue: registry.baidubce.com/aihc-aiak/aiak-megatron:ubuntu20.04-cu11.8-torch1.14.0-py38_v1.2.7.12_release # 参数默认值
8- name: command
9 type: string
10 hint: 启动命令
11 ...
定义任务模板输入参数
在任务模板中定义任务输入参数,之后可以在不同的任务中通过输入参数设置不同的值
- 使用inputs.parameters索引模板中定义的input变量
YAML
1...
2taskTemplates:
3 ...
4 # 定义工作流中的任务模板的输入参数
5 inputs:
6 - name: queue_id # 参数名
7 type: string # 参数类型
8 hint: 队列ID # 参数描述
9 defaultValue: aihcq-xxxx # 参数默认值
10 - name: image_url
11 type: string
12 hint: 镜像地址
13 - name: command
14 type: string
15 hint: 启动命令
16 spec:
17 queue: '{{inputs.parameters.queue_id}}'
18 jobType: PyTorchJob
19 command: '{{inputs.parameters.command}}'
20 jobSpec:
21 replicas: 1
22 image: '{{inputs.parameters.image_url}}'
23 resources: []
24 envs:
25 - name: NCCL_DEBUG
26 value: DEBUG
27 - name: NCCL_IB_DISABLE
28 value: '0'
29 enableRDMA: true
30 labels: []
31 datasources: []
32 ...
33
34 ...
35
36...
任务编排
- 定义每个任务引用的任务模板,以及节点间的依赖关系
- 引用全局输入参数(使用pipeline.inputs.parameters索引全局input变量),传入子任务模版所需输入参数
YAML
1...
2tasks:
3- name: task_a
4 taskTemplateName: task_demo
5 inputs:
6 - name: image_url
7 value: '{{pipeline.inputs.parameters.image_url}}' # 引用 Pipeline 定义的 name 为 image_url 的输入参数
8 - name: command
9 value: '{{pipeline.inputs.parameters.command}}'
10 # 未声明的输入参数,将使用模板定义的默认值,如 resource_pool_id、queue_id
11- name: task_b
12 taskTemplateName: task_demo
13 dependencies:
14 - task_a
15 inputs:
16 - name: image_url
17 value: '{{pipeline.inputs.parameters.image_url}}'
18 - name: command
19 value: echo "task b!" # 使用常量 重写模板定义的 name 为 command 的输入参数
20 - name: queue_id # 重写模板定义的 name 为 queue_id 输入参数的默认值
21 value: q-xxxxx
22 ...
完整工作流YAML
YAML
1version: v1
2kind: PipelineTemplate
3# 定义全局(Pipeline)的输入参数
4inputs:
5- name: image_url # 参数名
6 type: string # 参数类型
7 hint: 镜像地址 # 参数描述
8 defaultValue: registry.baidubce.com/aihc-aiak/aiak-megatron:ubuntu20.04-cu11.8-torch1.14.0-py38_v1.2.7.12_release # 参数默认值
9- name: command
10 type: string
11 hint: 启动命令
12 defaultValue: echo "This is a globally defined command."
13taskTemplates:
14- name: task_demo
15 type: CustomTask
16 # 定义工作流中的节点模板的输入参数
17 inputs:
18 - name: queue_id # 参数名
19 type: string # 参数类型
20 hint: 队列ID # 参数描述
21 defaultValue: aihcq-xxxx # 参数默认值
22 - name: image_url
23 type: string
24 hint: 镜像地址
25 - name: command
26 type: string
27 hint: 入口命令
28 spec:
29 queue: '{{inputs.parameters.queue_id}}'
30 jobType: PyTorchJob
31 command: '{{inputs.parameters.command}}'
32 jobSpec:
33 replicas: 1
34 image: '{{inputs.parameters.image_url}}'
35 resources: []
36 envs:
37 - name: NCCL_DEBUG
38 value: DEBUG
39 - name: NCCL_IB_DISABLE
40 value: '0'
41 labels: []
42 datasources: []
43tasks:
44- name: task_a
45 taskTemplateName: task_demo
46 inputs:
47 - name: image_url
48 value: '{{pipeline.inputs.parameters.image_url}}' # 引用全局(Pipeline)定义的 name 为 image_url 的输入参数作为任务参数
49 - name: command
50 value: '{{pipeline.inputs.parameters.command}}'
51 # 未声明的输入参数,将使用模板定义的默认值,如 queue_id
52- name: task_b
53 taskTemplateName: task_demo
54 dependencies:
55 - task_a
56 inputs:
57 - name: image_url
58 value: '{{pipeline.inputs.parameters.image_url}}'
59 - name: command
60 value: echo "This is a task b's command." # 使用常量 重写模板定义的 name 为 command 的输入参数
61 - name: queue_id # 重写模板定义的 name 为 queue_id 输入参数的默认值
62 value: aihcq-xxxx2
任务编排示例
工作流支持串行、并行、菱形运行结构:
- 串行:串行关系的任务依次执行,上游任务执行完才会启动下游任务
- 并行:任务同时运行
- 菱形:上游任务执行完成开始并行执行多个任务,以上多个任务全部执行完成开始继续执行下游任务
串行任务
定义一个包含三个任务节点的工作流,三个任务节点依次串行执行
YAML
1version: v1
2kind: PipelineTemplate
3# 定义工作流中的任务模板
4taskTemplates:
5- name: demo
6 type: CustomTask
7 spec:
8 ...
9# 定义工作流中的子任务及运行结构
10tasks:
11- name: task_a
12 taskTemplateName: demo
13- name: task_b
14 taskTemplateName: demo
15 dependencies:
16 - task_a
17- name: task_c
18 taskTemplateName: demo
19 dependencies:
20 - task_b
21
22# +---------+
23# | task_a |
24# +----+----+
25# |
26# +----v----+
27# | task_b |
28# +----+----+
29# |
30# +----v----+
31# | task_c |
32# +---------+
并行任务
定义一个包含三个任务节点的工作流,三个任务节点同时并行执行
YAML
1version: v1
2kind: PipelineTemplate
3# 定义工作流中的任务模板
4taskTemplates:
5- name: demo
6 type: CustomTask
7 spec:
8 ...
9# 定义工作流中的子任务及运行结构
10tasks:
11- name: task_a
12 taskTemplateName: demo
13- name: task_b
14 taskTemplateName: demo
15- name: task_c
16 taskTemplateName: demo
17
18# +--------+ +--------+ +--------+
19# | task_a | | task_b | | task_c |
20# +--------+ +--------+ +--------+
菱形任务
定义一个包含4个节点的菱形工作流
task_a执行完之后并行执行task_b和task_c,两个并行任务都执行完之后执行task_d
YAML
1version: v1
2kind: PipelineTemplate
3# 定义工作流中的任务模板
4taskTemplates:
5- name: demo
6 type: CustomTask
7 spec:
8 ...
9# 定义工作流中的子任务及运行结构
10tasks:
11- name: task_a
12 taskTemplateName: demo
13- name: task_b
14 taskTemplateName: demo
15 dependencies:
16 - task_a
17- name: task_c
18 taskTemplateName: demo
19 dependencies:
20 - task_a
21- name: task_d
22 taskTemplateName: demo
23 dependencies:
24 - task_b
25 - task_c
26
27# +--------+
28# | task_a |
29# +--------+
30# / \
31# +--------+ +--------+
32# | task_b | | task_c |
33# +--------+ +--------+
34# \ /
35# +--------+
36# | task_d |
37# +--------+
评价此篇文章
