运行实验

在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 使用了一种名为 HyperPyYAML 的 YAML 扩展变体。它提供了一种优雅的方式来指定配方的超参数。

在SpeechBrain中,YAML文件不是简单的参数列表,而是为每个参数指定使用它的函数(或类)。 这不仅使参数的规范更加透明,还允许我们通过简单地调用load_hyperpyyaml(来自HyperPyYAML)来正确初始化所有条目。

安全警告

加载HyperPyYAML允许任意代码执行。 这是一个特性:HyperPyYAML允许你在实验中构建任何所有你需要的东西。 然而,请务必验证任何不受信任的配方的YAML文件,就像你会验证Python代码一样。

功能

现在让我们通过一个例子快速浏览一下扩展的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 /save 评估尖括号中的部分,引用YAML本身。

  • !PLACEHOLDER 在加载时直接出错;每个用户都应该通过使用命令行(它会传递一个覆盖到 load_hyperpyyaml),或者在必要时手动编辑 .yaml 来替换它。

了解更多关于HyperPyYAML的专门教程!

运行参数

SpeechBrain 定义了一组可以从命令行参数(或在 YAML 文件中)设置的运行参数,例如:

  • device: 设置用于计算的设备。

  • debug: 一个启用调试模式的标志,仅运行几次迭代以验证程序不会崩溃。

  • 额外的运行时参数在 Brain 类中有详细说明。

如果你想使用多个GPU进行训练,请遵循多GPU训练指南

你也可以通过这种方式覆盖YAML中的参数:

> python experiment.py params.yaml --seed 1234 --data_folder /path/to/folder --num_layers 5

此调用将覆盖超参数 seeddata_folder 以及 num_layers

重要:

  • 命令行参数将始终覆盖hparams文件中的参数。

张量格式

SpeechBrain 中的张量遵循批量-时间-通道的约定:

  • 批次维度始终是第一个维度(即使它是1)。

  • 时间步长维度始终是第二个。

  • 剩下的可选维度是通道(无论你需要多少维度)

换句话说,张量将看起来像以下任何一种:

(batch_size, time_steps)
(batch_size, time_steps, channel0)
(batch_size, time_steps, channel0, channel1, ...)

为所有类和函数拥有一个共享的格式至关重要。这使得模型组合更加容易。 许多格式都是可能的。对于SpeechBrain,我们选择了这种格式,因为它在循环神经网络中常用。

对于波形,我们通常选择压缩最后一个维度(即对于单声道音频,没有通道维度)。

简单的波形示例:

  • 一个3秒钟的波形,以16kHz单声道采样:(1, 3*16000)

  • 一个3秒钟的波形,以16kHz立体声采样:(1, 3*16000, 2)

除了波形之外,这种格式还用于计算管道中的任何张量。例如…

(batch_size, time_steps, n_fft, 2)
  • 如果我们处理多声道音频(例如立体声)的STFT,它看起来会像这样:

(batch_size, time_steps, n_fft, 2, n_audio_channels)
(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。此函数根据 PyTorch 推荐 为各种生成器(如 NumPy、PyTorch 和 Python)设置种子。

然而,由于GPU和CPU执行方式的差异,即使使用相同的种子,结果也可能无法完全重现,尤其是在训练模型时。这个问题主要影响训练实验。

另一方面,当使用数据准备脚本准备数据时,这些脚本的输出与全局种子无关。这确保了即使使用不同的种子,您在不同的设置上也会得到相同的输出。

在分布式实验中,由于不同的种子(根据排名偏移)将在不同的机器或进程上设置,可重复性变得更加复杂。这主要影响依赖于随机性的操作,例如数据增强。由于分布式设置中的每个进程都被分配了自己的种子,即使全局种子在机器之间是相同的,应用于数据的随机性(例如,增强)在进程之间也可能不同。

需要注意的是,这种种子设置的差异不会影响实验的某些元素。例如,在分布式训练中,初始模型参数会从主进程广播到所有进程。同样,像数据加载器这样会打乱数据的组件会受到每个进程种子的影响,但底层的数据管道在进程之间保持同步。