运行实验
在 SpeechBrain 中,你可以像这样在配方中训练大多数模型
> cd recipes/<dataset>/<task>/<model>
> python train.py hparams/hyperparams.yaml
请按照每个配方的 README 中的步骤了解更多详情。
结果将保存在 yaml 文件中指定的 output_folder
中。该文件夹是通过在 train.py
中调用 sb.core.create_experiment_directory()
创建的。详细日志和实验输出都保存在那里。此外,不太详细的日志会输出到标准输出 (stdout)。
YAML 基础
SpeechBrain 使用 YAML 的扩展变体 HyperPyYAML。它提供了一种优雅的方式来指定配方的超参数。
在 SpeechBrain 中,YAML 文件不是一个简单的参数列表,而是对于每个参数,我们指定使用它的函数(或类)。这不仅使参数的指定更加透明,还允许我们通过简单地调用 load_hyperpyyaml
(来自 HyperPyYAML)来正确初始化所有条目。
安全警告
加载 HyperPyYAML 允许任意代码执行。这是一个特性:HyperPyYAML 允许你在实验中构建你需要的任何东西。但是,请务必像验证 Python 代码一样验证任何不受信任的配方的 YAML 文件。
特性
现在让我们使用一个示例快速浏览扩展的 YAML 特性
seed: !PLACEHOLDER
output_dir: !ref results/vgg_blstm/<seed>
save_dir: !ref <output_dir>/save
data_folder: !PLACEHOLDER # e.g. /path/to/TIMIT
model: !new:speechbrain.lobes.models.CRDNN.CRDNN
output_size: 40 # 39 phonemes + 1 blank symbol
cnn_blocks: 2
dnn_blocks: 2
!new:speechbrain.lobes.models.CRDNN.CRDNN
从模块speechbrain.lobes.models.CRDNN
创建一个CRDNN
实例其后的缩进关键字(如
output_size
等)作为关键字参数传递。!ref <output_dir>/save
评估尖括号中的部分,引用 YAML 本身。!PLACEHOLDER
加载时会简单地报错;每个用户都应该替换它,可以通过命令行(它会传递覆盖参数给load_hyperpyyaml
),或者在必要时手动编辑.yaml
文件。
运行参数
SpeechBrain 定义了一组运行参数,可以从命令行参数(或 YAML 文件内)设置,例如
device
:设置用于计算的设备。debug
:一个启用调试模式的标志,只运行少量迭代以验证程序不会崩溃。其他运行时参数在 Brain 类中进行了文档说明。
如果你想使用多个 GPU 进行训练,请遵循多 GPU 训练指南。
你也可以通过这种方式覆盖 YAML 中的参数
> python experiment.py params.yaml --seed 1234 --data_folder /path/to/folder --num_layers 5
这个调用将覆盖超参数 seed
、data_folder
和 num_layers
。
重要:
命令行参数将始终覆盖 hparams 文件参数。
张量格式
SpeechBrain 中的张量遵循批处理-时间-通道约定
批处理维度始终是第一个维度(即使它是
1
)。时间步维度始终是第二个。
剩余的可选维度是通道(无论你需要多少维度).
换句话说,一个张量将看起来像以下任一形式
(batch_size, time_steps)
(batch_size, time_steps, channel0)
(batch_size, time_steps, channel0, channel1, ...)
对所有类和函数使用共享格式至关重要。这使得模型组合更容易。有多种格式可能。对于 SpeechBrain,我们选择了这一种,因为它在循环神经网络中普遍使用。
对于波形,我们通常选择挤压最后一个维度(即,单声道音频没有通道维度)。
简单波形示例
采样率为 16kHz 的 3 秒单声道波形:
(1, 3*16000)
采样率为 16kHz 的 3 秒立体声波形:
(1, 3*16000, 2)
除了波形,这种格式还用于计算管道中的任何张量。例如…
单声道音频的短时傅里叶变换 (STFT) 将遵循这种形状,其中
2
对应于 STFT 的实部和虚部(复数)
(batch_size, time_steps, n_fft, 2)
如果我们处理多通道音频(例如立体声)的 STFT,它将看起来像这样
(batch_size, time_steps, n_fft, 2, n_audio_channels)
对于滤波器组 (FBanks),形状将是
(batch_size, time_steps, n_filters)
修改后的 PyTorch 全局设置和 GPU 怪癖
出于各种原因,SpeechBrain 修改了一些 PyTorch 全局配置,以解决问题或提高执行速度,这有时取决于 GPU 配置。我们这样做是因为我们认为,考虑到我们的用例,某些修改后的默认设置比 PyTorch 的默认设置更有意义。例如,我们经常遇到动态张量形状,这与某些自动调优方法冲突。
这些更改应用于标准位置 quirks.py
。它们在实验开始时会记录下来。
SB_DISABLE_QUIRKS
环境变量允许你轻松禁用怪癖。例如,要禁用 TensorFloat32 并重新启用 JIT 分析,你可以使用 SB_DISABLE_QUIRKS=allow_tf32,disable_jit_profiling
。
可复现性
为了提高实验的可复现性,SpeechBrain 支持其位于 speechbrain.utils.seed.seed_everything
的自己的 seeding 函数。此函数按照 PyTorch 建议为 NumPy、PyTorch 和 Python 等各种生成器设置种子。
然而,由于 GPU 和 CPU 执行方式的差异,即使使用相同的种子,结果也可能无法完全复现,尤其是在训练模型时。这个问题主要影响训练实验。
另一方面,使用数据准备脚本准备数据时,这些脚本的输出与全局种子无关。这确保了即使使用不同的种子,你也能在不同的设置上获得相同的输出。
在分布式实验中,可复现性变得更加复杂,因为不同的机器或进程上会设置不同的种子(由 rank 偏移)。这主要影响依赖于随机性的操作,例如数据增强。由于分布式设置中的每个进程都被分配了自己的种子,应用于数据的随机性(例如,增强)在进程之间可能有所不同,即使全局种子在所有机器上是相同的。
值得注意的是,这种种子方差不会影响实验的某些元素。例如,在分布式训练中,初始模型参数会从主进程广播到所有进程。类似地,像数据加载器这样对数据进行洗牌的组件会受到每个进程种子的影响,但底层数据管道在进程之间保持同步。