YAML

First Post:

Last Update:

Word Count:
1.4k

Read Time:
5 min

YAML

YAML Ain’t a Markup Language

Yet Another Markup Language

YAML是”YAML Ain’t a Markup Language”(YAML不是一种标记语言)的递归缩写。在开发的这种语言时,YAML的意思其实是:”Yet Another Markup Language”(仍是一种标记语言),但为了强调这种语言以数据为中心,而不是以标记语言为重点,而用反向缩略语重命名。YAML (wikipedia.org)

YAML特点是使用空格来表达层次结构,特别适合用来表达或编辑数据结构、各种配置文件,其文件一般以 .yaml 为后缀。

基本语法

  • k: v 的形式来表示键值对的关系

    • 冒号后面必须有一个空格
  • 只支持单行注释,注释符号:#

  • 大小写敏感

  • 通过缩进来表示层级关系

    • 缩排中空格的数目不重要,只要相同阶层的元素左侧对齐就可以了
    • 缩进只能使用空格,不能使用 tab 缩进
  • 字符串可以不用双引号

  • 一个文件中可以包含多个文件的内容

    • ---三个破折号表示一份内容的开始
    • ...三个小数点表示一份内容的结束(非必需)

数据结构与类型

对象

以键值对 key: value 形式组织数据

1. 使用**冒号+空格**来分开键与值
1. 支持多层嵌套(**用缩进表示层级关系**)
1
2
3
4
5
6
7
8
9
10
11
12
model:
base_learning_rate: 4.5e-6
target: ldm.models.autoencoder.AutoencoderKL
params:
monitor: "val/rec_loss"
embed_dim: 64
lossconfig:
target: ldm.modules.losses.LPIPSWithDiscriminator
params:
disc_start: 50001
kl_weight: 0.000001
disc_weight: 0.5
  1. 支持流式风格(Flow style)的语法:用花括号包裹,用逗号加空格分隔
1
key: {child-key1: value1, child-key2: value2 }

数组

  1. 一组以区块格式(“破折号+空格”)开头的数据组成一个数组
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
unet_config:
target: ldm.modules.diffusionmodules.openaimodel.UNetModel
params:
image_size: 64
in_channels: 3
out_channels: 3
model_channels: 224
attention_resolutions:
- 8
- 4
- 2
num_res_blocks: 2
channel_mult:
- 1
- 2
- 3
- 4
num_head_channels: 32
  1. 也支持内联格式来表达(用方括号包裹,逗号加空格分隔)
1
2
3
4
5
6
7
8
9
10
11
ddconfig:
double_z: True
z_channels: 64
resolution: 256
in_channels: 3
out_ch: 3
ch: 128
ch_mult: [1, 1, 2, 2, 4, 4]
num_res_blocks: 2
attn_resolutions: [16, 8]
dropout: 0.0
  1. 支持多维数组(用缩进表示层级关系
1
2
3
4
5
6
7
values:
- - 1
- 2
- - 3
- 4
# 等价:
values: [[1, 2], [3, 4]]

字符串

  1. 字符串一般不需要用引号包裹
  2. 字符串换行视为一个空格
  3. 单引号可以屏蔽转义
  4. 字符串中需要使用转义字符\就必须使用双引号包裹
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
strings:
- Hello world # 不用引号包裹
- Hello
world # 换行视为一个空格
- '字符串\n换行\n演示' # 单引号可以屏蔽转义
- "字符串\n换行\n演示" # 双引号使用转移符号

# 结果:
- Hello world
- Hello world
- 字符串\n换行\n演示
- '字符串

换行

演示'
  1. 保留换行:使用竖线符“ | ”来表示该语法,每行的缩进和行尾空白都会被去掉,而额外的缩进会被保留
1
2
3
4
5
6
7
8
9
lines: |
我是第一行
我是第二行
我是吴彦祖
我是第四行
我是第五行

# 结果
"我是第一行\n我是第二行\n 我是吴彦祖\n 我是第四行\n我是第五行\n"
  1. 折叠换行:使用右尖括号“ > ”来表示该语法,只有空白行才会被识别为换行,原来的换行符都会被转换成空格
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
lines: >
我是第一行
我也是第一行
我仍是第一行
我依旧是第一行

我是第二行
这么巧我也是第二行

# 结果
lines2: '我是第一行 我也是第一行 我仍是第一行 我依旧是第一行

我是第二行 这么巧我也是第二行

'

布尔值

  • “true”、“True”、“TRUE”、“yes”、“Yes”和“YES”皆为
  • “false”、“False”、“FALSE”、“no”、“No”和“NO”皆为

整数

  • 支持二进制表示
1
2
3
4
5
6
7
int:
- 666
- 0001_0000
# 结果
int:
- 666
- 4096

浮点数

  • 支持科学计数法
1
2
3
4
5
6
7
float:
- 3.14
- 6.8523015e+5 # 使用科学计数法
# 结果
float:
- 3.14
- 685230.15

空 Null

nullNull~ 和不指定值都表示空

1
2
3
4
5
6
7
8
9
10
11
nulls:
- null
- Null
- ~
-
# 结果
nulls:
- null
- null
- null
- null

强制类型转换

双感叹号+目标类型来强制转换类型

1
2
3
4
5
6
7
8
9
10
11
12
13
14
a: !!float '666' # !! 为严格类型标签
b: !!int '666' # 字符串转为整型
c: !!str 666 # 整数转为字符串
d: !!str 666.66 # 浮点数转为字符串
e: !!str true # 布尔值转为字符串
f: !!bool 'yes' # 字符串转为布尔值

# 结果
a: 666.0
b: 666
c: '666'
d: '666.66'
e: 'true'
f: true

数据复用与合并

数据复用

在key的冒号后,使用锚点符号&设定锚点,使用引用符号*引用锚点

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
model: &all_parm
base_learning_rate: 2.0e-06
target: ldm.models.diffusion.ddpm.LatentDiffusion
params: &model_parm
linear_start: 0.0015
linear_end: 0.0195
num_timesteps_cond: 1
log_every_t: 200
timesteps: 1000
first_stage_key: image
image_size: 64
channels: 3
monitor: val/loss_simple_ema

new_model: *all_parm
new_params: *model_parm

# 结果
new_model:
base_learning_rate: 2.0e-06
target: ldm.models.diffusion.ddpm.LatentDiffusion
params:
linear_start: 0.0015
linear_end: 0.0195
num_timesteps_cond: 1
log_every_t: 200
timesteps: 1000
first_stage_key: image
image_size: 64
channels: 3
monitor: val/loss_simple_ema
new_params:
linear_start: 0.0015
linear_end: 0.0195
num_timesteps_cond: 1
log_every_t: 200
timesteps: 1000
first_stage_key: image
image_size: 64
channels: 3
monitor: val/loss_simple_ema

数据合并

合并标签符号“<<”配合锚点符号和引用符号使用可以与任意数据进行合并,可以视为面向对象中的继承

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
model_location: &loc
target: ldm.models.diffusion.ddpm.LatentDiffusion

model_params: &params
params:
linear_start: 0.0015
linear_end: 0.0195
num_timesteps_cond: 1
log_every_t: 200
timesteps: 1000
first_stage_key: image
image_size: 64
channels: 3
monitor: val/loss_simple_ema

new_model:
base_learning_rate: 2.0e-06
<<: *loc
<<: *params

# 结果
new_model:
target: ldm.models.diffusion.ddpm.LatentDiffusion
params:
linear_start: 0.0015
linear_end: 0.0195
num_timesteps_cond: 1
log_every_t: 200
timesteps: 1000
first_stage_key: image
image_size: 64
channels: 3
monitor: val/loss_simple_ema
base_learning_rate: 2.0e-06

参考

一文看懂 YAML - 知乎 (zhihu.com)